From 5bedd3ab94e803c671975d19a7959df0aa0480ae Mon Sep 17 00:00:00 2001 From: Sorokin-Oleg Date: Tue, 20 Oct 2026 11:58:05 +0300 Subject: [PATCH 01/32] [add] what's new and migration notes for v6.0.4 --- docs/migration.md | 65 +++++++++++++++++++++++++++++++++++++++++ docs/whats_new.md | 74 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) diff --git a/docs/migration.md b/docs/migration.md index 27c718b3..3f46383c 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -6,6 +6,71 @@ description: You can learn about migration in the documentation of the DHTMLX Ja # Migration to newer versions +## 6.0.3 -> 6.0.4 + +Version 6.0.4 changes the result of several existing keys and API calls. No documented method, property, event or configuration option is removed or renamed. + +### Arrow keys stop at the edges of the sheet + +In 6.0.3, an arrow key pressed on the first or last visible row or column moved the active cell to the opposite edge of the sheet. Since 6.0.4, the active cell stays at the edge. If a range is selected, an arrow key at the edge collapses the range to the active cell. + +### deleteRow() and deleteColumn() delete the whole merged cell + +In 6.0.3, [`deleteRow()`](api/spreadsheet_deleterow_method.md) and [`deleteColumn()`](api/spreadsheet_deletecolumn_method.md) deleted only the row or column of the passed cell, even if the cell was inside a merged cell. Since 6.0.4, they delete every row or column that the merged cell spans: + +~~~jsx +spreadsheet.mergeCells("B2:B4"); + +spreadsheet.deleteRow("B3"); +// 6.0.3: row 3 is deleted +// 6.0.4: rows 2, 3 and 4 are deleted +~~~ + +The [`beforeAction`](api/spreadsheet_beforeaction_event.md) and [`afterAction`](api/spreadsheet_afteraction_event.md) handlers of the `deleteRow` and `deleteColumn` actions still receive the cell that was passed to the method, not the range that is deleted. The context menu shows the full range in the command name. + +### Read-only mode keeps navigation and selection + +In 6.0.3, a Spreadsheet with [`readonly: true`](api/spreadsheet_readonly_config.md) had no keyboard navigation, no mouse selection and no active cell. Since 6.0.4: + +- the A1 cell is active after loading, and the cells can be navigated with the keyboard and selected with the mouse; the selection events fire on these actions; +- the cells can be copied and searched; +- editing keys, typing and paste are refused and announced to screen readers as "The sheet is read-only"; +- the fill handle is hidden, and a double-click on a column border does not change the column width. + +Custom `hotkeys` from the configuration are still not registered in read-only mode. + +To keep the 6.0.3 behaviour, turn the selection off with the new `selection` option: + +~~~jsx +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, + selection: false, +}); +~~~ + +The selection can also be turned off and on at runtime with `spreadsheet.selection.disable()` and `spreadsheet.selection.enable()`. + +### The keyboard focus follows the active cell + +Since 6.0.4, [`selection.setFocusedCell()`](api/selection_setfocusedcell_method.md) and any other change of the active cell (keyboard, undo, a sheet switch) move the keyboard focus to the cell after the redraw, if the focus is on the page body or inside the Spreadsheet. The focus is not moved when it is: + +- in an element outside the Spreadsheet; +- on the toolbar, the menu or the sheet tabs reached with the keyboard; +- in an open cell editor. + +~~~jsx +// the focus is on the page body, for example right after the page is loaded +spreadsheet.selection.setFocusedCell("D4"); +// 6.0.3: the focus stays on the page body +// 6.0.4: the focus moves to the D4 cell +~~~ + +### Cell shortcuts do not act while the toolbar, the menu or the sheet tabs have focus + +In 6.0.3, the arrow keys and typing acted on the cells while the toolbar had focus. Since 6.0.4, the toolbar, the menu and the sheet tabs use the arrow keys, `Home`, `End`, `Enter` and `Space` for their own controls, and the cell shortcuts (navigation, typing, `Delete`, `Enter`, `F2` and the like) work only while the focus is in the cells or in the formula bar. + +The formatting, clipboard, undo, search and link shortcuts (`Ctrl (Cmd) + B`, `Ctrl (Cmd) + C`, `Ctrl (Cmd) + Z`, `Ctrl (Cmd) + F`, `Ctrl (Cmd) + K` and the like) still work from the toolbar and the menu. Custom `hotkeys` from the configuration are not filtered by the focus position. + ## 5.2 -> 6.0 ### Deprecated properties diff --git a/docs/whats_new.md b/docs/whats_new.md index 9afbf47e..aff6ad38 100644 --- a/docs/whats_new.md +++ b/docs/whats_new.md @@ -8,6 +8,80 @@ description: You can learn what's new in the DHTMLX JavaScript Spreadsheet libra If you are updating Spreadsheet from an older version, check [Migration to Newer Version](migration.md) for details. +## Version 6.0.4 + +Released on + +### Behaviour changes + +Some existing keys and API calls give a different result. No documented method, property, event or configuration option is removed or renamed. Check the [Migration guide](migration.md#603---604) for details. + +- The arrow keys stop at the first and last visible row and column instead of moving the active cell to the opposite edge of the sheet. At the edge, an arrow key collapses a selected range to the active cell +- The [`deleteRow()`](api/spreadsheet_deleterow_method.md) and [`deleteColumn()`](api/spreadsheet_deletecolumn_method.md) methods called for a cell inside a merged cell delete every row or column of the merge. The `beforeAction` / `afterAction` handlers still receive the original cell +- A Spreadsheet with [`readonly: true`](api/spreadsheet_readonly_config.md) can be navigated with the keyboard, selected with the mouse, copied and searched, so the selection events fire on user actions. Edits are refused and announced to screen readers. Custom `hotkeys` are still not registered in read-only mode. To keep the 6.0.3 behaviour, set `selection: false` +- The [`selection.setFocusedCell()`](api/selection_setfocusedcell_method.md) method and any other change of the active cell move the keyboard focus to the cell when the focus is on the page body or inside the Spreadsheet. The focus stays on the toolbar, the menu or the sheet tabs reached with the keyboard, and in an open cell editor +- Cell shortcuts (the arrow keys, typing, `Delete`, `Enter` and the like) don't act on the cells while the toolbar, the menu or the sheet tabs have focus. The formatting, clipboard, undo, search and link shortcuts still work there + +### New functionality + +- The ability to turn the selection off and on: + - new configuration property: `selection` + - new methods of the selection module: `selection.enable()`, `selection.disable()`, `selection.isDisabled()` +- The `announce()` method sends a status message to screen readers through a live region +- New commands of the [context menu](customization.md#context-menu): + - *Column width* and *Row height* set an exact size of the selected columns or rows in pixels, with undo + - *Open filter* opens the filter of the active cell from the keyboard + +### Updates + +- Keyboard navigation: + - The keyboard focus is on the active cell itself, and `Tab` enters the sheet on it. `Tab` on the last cell and `Tab + Shift` on the first cell move the focus out of the Spreadsheet + - `Ctrl + F6` and `Ctrl + Shift + F6` move the focus between the menu, the toolbar, the sheet and the sheet tabs + - `Ctrl + Alt + Page Down` / `Ctrl + Alt + Page Up` switch to the next / previous sheet, in addition to `Alt + Arrow Up/ Arrow Down` + - The toolbar, the menu bar and the sheet tabs are single tab stops navigated with the arrow keys, `Home` and `End`. Menus, context menus and the toolbar popups take the focus and return it when closed + - The color palette of the toolbar is a single tab stop browsed with the arrow keys, `Home` and `End` + - `Ctrl + Shift + 9` and `Ctrl + Shift + 0` reveal the hidden rows and columns of the selection + - `Alt + Enter` opens the link of the active cell + - `Esc` closes a toolbar tooltip, and a tooltip stays open while hovered + - The close button of the formula help panel works from the keyboard + - The keyboard focus indicator is visible on the cells, the cell editor, the formula bar and the toolbar buttons, and has a 3:1 contrast in the dark themes +- Screen reader support: + - The active cell is announced with its address before its value, and a selected range with its extent, for example "B2 to D7, 18 cells" + - Read-only, locked and merged cells, row numbers as row headers and the active sheet tab are reported + - Formula errors and invalid list values are described in the cell, and new errors caused by an edit are announced + - Refused edits, search results, and the start and end of import and export are announced + - The grid, the toolbars, the menus, the dialogs, the search bar, the cell editors, the formula bar and the color buttons have accessible names, and the formatting buttons report whether they are on + - The editor of a list-validated cell is presented as a combobox, and a link in a cell is rendered as a real link +- Localization: + - The new interface and screen reader strings are added to the [`spreadsheet` locale](localization.md#default-locale) + - The `grid`, `toolbar`, `window`, `message` and `colorpicker` locales used inside the Spreadsheet can be translated through `dhx.i18n.setLocale()` +- The formula reference colors have a contrast of at least 4.5:1 in the light and contrast-light themes +- React Spreadsheet: + - The new `selection` prop turns the selection off and on without recreating the Spreadsheet + - The [`readonly`](react/props.md#init-only-props) prop is init-only: changing it recreates the Spreadsheet. The data is kept, the undo/redo history and the UI state are reset + - The bundled types include `selection.enable()`, `selection.disable()`, `selection.isDisabled()` and `announce()`, and the `ISelection` type is exported + +### Fixes + +- A merged cell was dropped instead of shifted when a row or column before it was deleted +- Deleting a row or column through a merged cell removed only one line of the merge +- Rows were not deleted when they covered the whole filtered range +- The frozen area didn't shrink when frozen rows or columns were deleted +- Autofill threw an error when the dragged cells held no plain number +- The page froze on `Home`, `End` and `Ctrl (Cmd) + Arrow` keys when the first or last row or column was hidden +- The font size was lost when cells were copied to Excel or pasted from Excel or within the Spreadsheet +- The invalid-value tooltip appeared away from the invalid cell +- `Esc` and `Tab` didn't work in the list editor after the arrow keys were used +- The search highlighted the second match first and didn't refresh the results after an edit or a sheet switch +- A script error occurred on import or export in a browser without WebAssembly +- Document listeners and inner widgets were left behind after `destructor()` +- The keyboard focus was lost after the search bar closed +- A closed context menu reopened +- The active cell was scrolled one cell short of the viewport edge during keyboard navigation +- React Spreadsheet: the event callbacks and `onStateChange` didn't fire after the Spreadsheet was recreated by an init-only prop change +- React Spreadsheet: the event handlers of the wrapper were not removed on unmount +- React Spreadsheet: the data from `loadUrl` was loaded twice on mount and again over the kept data after the Spreadsheet was recreated + ## Version 6.0.3 Released on August 24, 2026 From 9e73886a7c11c895dcfec43ad2ef438c60f270d3 Mon Sep 17 00:00:00 2001 From: Sorokin-Oleg Date: Tue, 20 Oct 2026 12:28:35 +0300 Subject: [PATCH 02/32] [update] read-only mode, setFocusedCell(), deleting merged rows and columns, toolbar and context menu controls for v6.0.4 --- docs/api/selection_setfocusedcell_method.md | 14 ++++++++++ docs/api/spreadsheet_deletecolumn_method.md | 28 +++++++++++++++++-- docs/api/spreadsheet_deleterow_method.md | 28 +++++++++++++++++-- docs/api/spreadsheet_readonly_config.md | 31 +++++++++++++++++++++ docs/configuration.md | 17 +++++++++++ docs/customization.md | 9 ++++-- docs/merge_cells.md | 10 ++++++- docs/work_with_rows_cols.md | 8 ++++++ 8 files changed, 136 insertions(+), 9 deletions(-) diff --git a/docs/api/selection_setfocusedcell_method.md b/docs/api/selection_setfocusedcell_method.md index acf06c9b..3efe135b 100644 --- a/docs/api/selection_setfocusedcell_method.md +++ b/docs/api/selection_setfocusedcell_method.md @@ -31,4 +31,18 @@ spreadsheet.parse(data); spreadsheet.selection.setFocusedCell("D4"); ~~~ +### Details + +The method makes the specified cell active and, after the redraw, moves the keyboard focus to it. The keyboard focus isn't moved if it is: + +- in an element outside the Spreadsheet +- on the toolbar, the menu or the sheet tabs reached with the keyboard +- in an open cell editor + +If the keyboard focus is on the page body, for example, right after the page is loaded, the method moves it to the cell. + +The method does nothing while the selection is turned off with the `selection: false` configuration option or the `selection.disable()` method. + +**Change log:** Moving the keyboard focus to the cell was added in v6.0.4 + **Related article:** [Work with Spreadsheet](working_with_ssheet.md) diff --git a/docs/api/spreadsheet_deletecolumn_method.md b/docs/api/spreadsheet_deletecolumn_method.md index 6056d159..89646556 100644 --- a/docs/api/spreadsheet_deletecolumn_method.md +++ b/docs/api/spreadsheet_deletecolumn_method.md @@ -11,7 +11,9 @@ description: You can learn about the deleteColumn method in the documentation of @short: Removes a column from the spreadsheet :::info -The method finds the specified cell, selects it, removes the column where the cell is located and moves the column on the left to its position. +The method removes the column where the specified cell is located and moves the columns on the right of it to the left. + +If the cell is inside a merged cell, the method removes every column that the merged cell spans. ::: ### Usage @@ -35,7 +37,27 @@ spreadsheet.deleteColumn("G2"); ~~~ :::note -You can delete several columns by providing a range of cells' ids as a parameter of the method, for example: "A1:C3". +You can delete several columns by providing a range of cells' ids as a parameter of the method, for example: "A1:C3". If the range touches a merged cell, the columns of the whole merged cell are deleted. ::: -**Related article:** [Work with Spreadsheet](working_with_ssheet.md#addingremoving-rows-and-columns) +### Details + +When a column inside a merged cell is deleted, the whole merged cell is deleted with all its columns: + +~~~jsx +spreadsheet.mergeCells("B2:D2"); + +// removes columns B, C and D +spreadsheet.deleteColumn("C2"); +~~~ + +Merged cells on the right of the deleted columns move to the left together with their columns. If the deleted columns are frozen, the frozen area shrinks by the number of the deleted frozen columns. + +The [`beforeAction`](api/spreadsheet_beforeaction_event.md) and [`afterAction`](api/spreadsheet_afteraction_event.md) events of the `"deleteColumn"` action receive the cell that is passed to the method, not the range of the deleted columns. + +**Change log:** Deleting all the columns of a merged cell was added in v6.0.4 + +**Related articles:** +- [Work with rows and columns](work_with_rows_cols.md#removing-columns) +- [Merging cells](merge_cells.md#removing-rows-and-columns-of-merged-cells) +- [Work with Spreadsheet](working_with_ssheet.md#addingremoving-rows-and-columns) diff --git a/docs/api/spreadsheet_deleterow_method.md b/docs/api/spreadsheet_deleterow_method.md index 7e86ccd9..4bd5d12b 100644 --- a/docs/api/spreadsheet_deleterow_method.md +++ b/docs/api/spreadsheet_deleterow_method.md @@ -11,7 +11,9 @@ description: You can learn about the deleteRow method in the documentation of th @short: Removes a row from the spreadsheet :::info -The method finds the specified cell, selects it, removes the row where the cell is located and moves the row below to its position. +The method removes the row where the specified cell is located and moves the rows below it up. + +If the cell is inside a merged cell, the method removes every row that the merged cell spans. ::: ### Usage @@ -35,7 +37,27 @@ spreadsheet.deleteRow("G2"); ~~~ :::note -You can delete several rows by providing a range of cells' ids as a parameter of the method, for example: "A1:C3". +You can delete several rows by providing a range of cells' ids as a parameter of the method, for example: "A1:C3". If the range touches a merged cell, the rows of the whole merged cell are deleted. ::: -**Related article:** [Work with Spreadsheet](working_with_ssheet.md#addingremoving-rows-and-columns) +### Details + +When a row inside a merged cell is deleted, the whole merged cell is deleted with all its rows: + +~~~jsx +spreadsheet.mergeCells("B2:B4"); + +// removes rows 2, 3 and 4 +spreadsheet.deleteRow("B3"); +~~~ + +Merged cells below the deleted rows move up together with their rows. If the deleted rows are frozen, the frozen area shrinks by the number of the deleted frozen rows. + +The [`beforeAction`](api/spreadsheet_beforeaction_event.md) and [`afterAction`](api/spreadsheet_afteraction_event.md) events of the `"deleteRow"` action receive the cell that is passed to the method, not the range of the deleted rows. + +**Change log:** Deleting all the rows of a merged cell was added in v6.0.4 + +**Related articles:** +- [Work with rows and columns](work_with_rows_cols.md#removing-rows) +- [Merging cells](merge_cells.md#removing-rows-and-columns-of-merged-cells) +- [Work with Spreadsheet](working_with_ssheet.md#addingremoving-rows-and-columns) diff --git a/docs/api/spreadsheet_readonly_config.md b/docs/api/spreadsheet_readonly_config.md index ac4039d4..1b9accd8 100644 --- a/docs/api/spreadsheet_readonly_config.md +++ b/docs/api/spreadsheet_readonly_config.md @@ -31,6 +31,37 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { }); ~~~ +### Details + +In the read-only mode, the toolbar, the menu and the formula bar are hidden, and the context menu and the column menu icon are not available. The sheet tabs stay, without the button that adds a sheet. + +Users can still read and copy the data: + +- the A1 cell is active after the data is loaded +- the cells can be navigated with the keyboard and selected with the mouse, and the selection events fire on these actions +- the cells can be copied with `Ctrl (Cmd) + C` and searched with `Ctrl (Cmd) + F` +- the sheets can be switched in the sheet tabs and with the keyboard + +Changes of the data are refused: + +- the editing keys, typing, cut and paste don't change the cells, and screen readers announce "The sheet is read-only" +- the fill handle is hidden +- the columns and rows can't be resized by dragging their borders, and a double-click on a column border doesn't fit the column width to the data + +The custom `hotkeys` from the Spreadsheet configuration are not registered in the read-only mode. + +To turn off the keyboard navigation and the selection as well, set the `selection` option to `false`. In this case, the Spreadsheet has no active cell, and the cells can't be selected by the mouse, the keyboard or the API: + +~~~jsx {3} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, + selection: false, + // other config parameters +}); +~~~ + +**Change log:** The keyboard navigation, the selection, copying and search in the read-only mode were added in v6.0.4 + **Related articles:** - [Configuration](configuration.md#read-only-mode) - [Customization](customization.md#custom-read-only-mode) diff --git a/docs/configuration.md b/docs/configuration.md index ad419a74..5f2d4c11 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -49,6 +49,23 @@ The menu of the Spreadsheet is hidden by default. You can switch it on/off via t You can also enable read-only mode to prevent editing of Spreadsheet cells via the [`readonly`](api/spreadsheet_readonly_config.md) configuration option. +~~~jsx {2} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, +}); +~~~ + +In the read-only mode, the toolbar, the menu and the formula bar are hidden. Users can navigate the cells with the keyboard, select them with the mouse, copy and search them. Edits are refused and announced to screen readers as "The sheet is read-only". The fill handle is hidden, and the custom `hotkeys` from the configuration are not registered. Check the details in the [`readonly`](api/spreadsheet_readonly_config.md#details) article. + +To turn off the keyboard navigation and the selection in the read-only mode, set the `selection` option to `false`: + +~~~jsx {3} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, + selection: false, +}); +~~~ + You can also [customize the read-only behavior of Spreadsheet](customization.md#custom-read-only-mode). diff --git a/docs/customization.md b/docs/customization.md index b1833f76..9882d3c2 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -31,6 +31,8 @@ Then you can use the name of the icon as the value of the `icon` property in the You can add the following types of controls: `button`, `menuItem`, `separator`, and `spacer`. +The *Text color* and *Background color* controls of the [default toolbar](#default-controls), and the *Border color* control in the *Border* popup, are of the `navItem` type. They show the current color in their value and open a color popup. + The `button` object has the following properties: - `type` - the type of a button, set it to "button" @@ -117,8 +119,8 @@ The [default toolbar](/#toolbar) contains the following blocks of controls: - the *Undo* button (id: "undo") - the *Redo* button (id: "redo") - the **Colors** block - - the *Text color* button (id: "color") - - the *Background color* button (id: "background") + - the *Text color* navItem (id: "color") + - the *Background color* navItem (id: "background") - the **Font** block - the *Font size* combobox (id: "font-size") - the **Decoration** block @@ -380,6 +382,7 @@ The [default context menu](/#context-menu) has the following structure: - the *Add column* menuItem (id: "add-col") - the *Remove column* menuItem (id: "remove-col") - the *Fit to data* menuItem (id: "fit-col") + - the *Column width* menuItem (id: "col-width") - the separator - the *Unfreeze columns* menuItem (id: "unfreeze-cols") - the *Freeze up to column [id]* menuItem (id: "freeze-cols") @@ -388,6 +391,7 @@ The [default context menu](/#context-menu) has the following structure: - the **Rows** menuItem (id: "rows") - the *Add row* menuItem (id: "add-row") - the *Remove row* menuItem (id: "remove-row") + - the *Row height* menuItem (id: "row-height") - the separator - the *Unfreeze rows* menuItem (id: "unfreeze-rows") - the *Freeze up to row [id]* menuItem (id: "freeze-rows") @@ -396,6 +400,7 @@ The [default context menu](/#context-menu) has the following structure: - the **Sort** menuItem (id: "sort") - the *Sort A to Z* menuItem (id: "asc-sort") - the *Sort Z to A* menuItem (id: "desc-sort") +- the **Open filter** menuItem (id: "open-filter"), shown when the active cell holds the filter icon - the **Insert link** menuItem (id: "link") ### Adding controls diff --git a/docs/merge_cells.md b/docs/merge_cells.md index 8b1dbdfa..f0bd2cc9 100644 --- a/docs/merge_cells.md +++ b/docs/merge_cells.md @@ -44,4 +44,12 @@ or 2\. Go to: *Format -> Unmerge* in the menu -![DHTMLX Spreadsheet Format menu with the Unmerge option for splitting merged cells](/img/unmerge_cells_via_menu.png) \ No newline at end of file +![DHTMLX Spreadsheet Format menu with the Unmerge option for splitting merged cells](/img/unmerge_cells_via_menu.png) + +## Removing rows and columns of merged cells + +When you remove a row or a column through a merged cell, every row or column that the merged cell spans is removed. It works this way when a cell or a range of cells is selected and the row or column is removed via the toolbar, the menu, the context menu or the [`deleteRow()`](api/spreadsheet_deleterow_method.md) / [`deleteColumn()`](api/spreadsheet_deletecolumn_method.md) methods. The context menu shows the full range in the command name, for example, *Remove rows 2-4*. + +When whole rows or columns are selected by clicking their headers, only the selected rows or columns are removed. A merged cell that spans them becomes smaller, and a merged cell left with a single cell becomes an ordinary cell. + +Merged cells located below or on the right of the removed rows or columns move together with them. diff --git a/docs/work_with_rows_cols.md b/docs/work_with_rows_cols.md index caf55eb7..f23a5ee0 100644 --- a/docs/work_with_rows_cols.md +++ b/docs/work_with_rows_cols.md @@ -54,6 +54,10 @@ To remove a row, take the following steps: To remove several rows at once: select the rows, right-click to call the context menu and choose *Rows -> Remove rows [ids]*. ::: +:::info +If the selected cell is inside a merged cell, all the rows of the merged cell are removed. Check the [Merging cells](merge_cells.md#removing-rows-and-columns-of-merged-cells) article for details. +::: + ### Adding columns To add a new column, take the following steps: @@ -98,6 +102,10 @@ To remove a column, take the following steps: To remove several columns at once: select the columns, right-click to call the context menu and choose *Columns -> Remove columns [ids]*. ::: +:::info +If the selected cell is inside a merged cell, all the columns of the merged cell are removed. Check the [Merging cells](merge_cells.md#removing-rows-and-columns-of-merged-cells) article for details. +::: + ## AutoFit column width To change the column width so that it would automatically fit the longest content in the column, you can: From e11b9ce1d1c98417f1d8d0df9996c2216fb1205a Mon Sep 17 00:00:00 2001 From: Sorokin-Oleg Date: Tue, 20 Oct 2026 12:51:32 +0300 Subject: [PATCH 03/32] [add] selection config, selection enable()/disable()/isDisabled() and announce() API pages, column width, row height and open filter guides for v6.0.4 --- docs/api/api_overview.md | 5 ++ docs/api/overview/methods_overview.md | 1 + docs/api/overview/properties_overview.md | 1 + docs/api/overview/selection_overview.md | 3 + docs/api/selection_disable_method.md | 46 +++++++++++++++ docs/api/selection_enable_method.md | 41 ++++++++++++++ docs/api/selection_isdisabled_method.md | 40 +++++++++++++ docs/api/selection_setfocusedcell_method.md | 2 +- docs/api/spreadsheet_announce_method.md | 59 ++++++++++++++++++++ docs/api/spreadsheet_readonly_config.md | 2 +- docs/api/spreadsheet_selection_config.md | 62 +++++++++++++++++++++ docs/configuration.md | 16 +++++- docs/filtering_data.md | 12 ++++ docs/work_with_rows_cols.md | 30 ++++++++++ sidebars.js | 5 ++ 15 files changed, 322 insertions(+), 3 deletions(-) create mode 100644 docs/api/selection_disable_method.md create mode 100644 docs/api/selection_enable_method.md create mode 100644 docs/api/selection_isdisabled_method.md create mode 100644 docs/api/spreadsheet_announce_method.md create mode 100644 docs/api/spreadsheet_selection_config.md diff --git a/docs/api/api_overview.md b/docs/api/api_overview.md index 01947e25..563aa312 100644 --- a/docs/api/api_overview.md +++ b/docs/api/api_overview.md @@ -27,6 +27,7 @@ Parameters: | [](api/spreadsheet_addcolumn_method.md) | @getshort(api/spreadsheet_addcolumn_method.md) | | [](api/spreadsheet_addformula_method.md) | @getshort(api/spreadsheet_addformula_method.md) | | [](api/spreadsheet_addrow_method.md) | @getshort(api/spreadsheet_addrow_method.md) | +| [](api/spreadsheet_announce_method.md) | @getshort(api/spreadsheet_announce_method.md) | | [](api/spreadsheet_clear_method.md) | @getshort(api/spreadsheet_clear_method.md) | | [](api/spreadsheet_deletecolumn_method.md) | @getshort(api/spreadsheet_deletecolumn_method.md) | | [](api/spreadsheet_deleterow_method.md) | @getshort(api/spreadsheet_deleterow_method.md) | @@ -99,6 +100,7 @@ Parameters: | [](api/spreadsheet_multisheets_config.md) | @getshort(api/spreadsheet_multisheets_config.md) | | [](api/spreadsheet_readonly_config.md) | @getshort(api/spreadsheet_readonly_config.md) | | [](api/spreadsheet_rowscount_config.md) | @getshort(api/spreadsheet_rowscount_config.md) | +| [](api/spreadsheet_selection_config.md) | @getshort(api/spreadsheet_selection_config.md) | | [](api/spreadsheet_toolbarblocks_config.md) | @getshort(api/spreadsheet_toolbarblocks_config.md) | @@ -118,8 +120,11 @@ Parameters: | Name | Description | | :--------------------------------------------- | :---------------------------------------------------- | +| [](api/selection_disable_method.md) | @getshort(api/selection_disable_method.md) | +| [](api/selection_enable_method.md) | @getshort(api/selection_enable_method.md) | | [](api/selection_getfocusedcell_method.md) | @getshort(api/selection_getfocusedcell_method.md) | | [](api/selection_getselectedcell_method.md) | @getshort(api/selection_getselectedcell_method.md) | +| [](api/selection_isdisabled_method.md) | @getshort(api/selection_isdisabled_method.md) | | [](api/selection_removeselectedcell_method.md) | @getshort(api/selection_removeselectedcell_method.md) | | [](api/selection_setfocusedcell_method.md) | @getshort(api/selection_setfocusedcell_method.md) | | [](api/selection_setselectedcell_method.md) | @getshort(api/selection_setselectedcell_method.md) | diff --git a/docs/api/overview/methods_overview.md b/docs/api/overview/methods_overview.md index 2dc43702..53ed575e 100644 --- a/docs/api/overview/methods_overview.md +++ b/docs/api/overview/methods_overview.md @@ -11,6 +11,7 @@ description: You can check a Methods overview of the DHTMLX JavaScript Spreadshe | [](api/spreadsheet_addcolumn_method.md) | @getshort(../spreadsheet_addcolumn_method.md) | | [](api/spreadsheet_addformula_method.md) | @getshort(../spreadsheet_addformula_method.md) | | [](api/spreadsheet_addrow_method.md) | @getshort(../spreadsheet_addrow_method.md) | +| [](api/spreadsheet_announce_method.md) | @getshort(../spreadsheet_announce_method.md) | | [](api/spreadsheet_clear_method.md) | @getshort(../spreadsheet_clear_method.md) | | [](api/spreadsheet_deletecolumn_method.md) | @getshort(../spreadsheet_deletecolumn_method.md) | | [](api/spreadsheet_deleterow_method.md) | @getshort(../spreadsheet_deleterow_method.md) | diff --git a/docs/api/overview/properties_overview.md b/docs/api/overview/properties_overview.md index c7d84d98..2ae06129 100644 --- a/docs/api/overview/properties_overview.md +++ b/docs/api/overview/properties_overview.md @@ -18,5 +18,6 @@ description: You can check a Properties overview of the DHTMLX JavaScript Spread | [](api/spreadsheet_multisheets_config.md) | @getshort(../spreadsheet_multisheets_config.md) | | [](api/spreadsheet_readonly_config.md) | @getshort(../spreadsheet_readonly_config.md) | | [](api/spreadsheet_rowscount_config.md) | @getshort(../spreadsheet_rowscount_config.md) | +| [](api/spreadsheet_selection_config.md) | @getshort(../spreadsheet_selection_config.md) | | [](api/spreadsheet_toolbarblocks_config.md) | @getshort(../spreadsheet_toolbarblocks_config.md) | diff --git a/docs/api/overview/selection_overview.md b/docs/api/overview/selection_overview.md index 53061618..78c2ad37 100644 --- a/docs/api/overview/selection_overview.md +++ b/docs/api/overview/selection_overview.md @@ -8,8 +8,11 @@ description: You can check a Selection methods overview of the DHTMLX JavaScript | Name | Description | | :--------------------------------------------- | :---------------------------------------------------- | +| [](api/selection_disable_method.md) | @getshort(../selection_disable_method.md) | +| [](api/selection_enable_method.md) | @getshort(../selection_enable_method.md) | | [](api/selection_getfocusedcell_method.md) | @getshort(../selection_getfocusedcell_method.md) | | [](api/selection_getselectedcell_method.md) | @getshort(../selection_getselectedcell_method.md) | +| [](api/selection_isdisabled_method.md) | @getshort(../selection_isdisabled_method.md) | | [](api/selection_removeselectedcell_method.md) | @getshort(../selection_removeselectedcell_method.md) | | [](api/selection_setfocusedcell_method.md) | @getshort(../selection_setfocusedcell_method.md) | | [](api/selection_setselectedcell_method.md) | @getshort(../selection_setselectedcell_method.md) | diff --git a/docs/api/selection_disable_method.md b/docs/api/selection_disable_method.md new file mode 100644 index 00000000..4e2e1ea0 --- /dev/null +++ b/docs/api/selection_disable_method.md @@ -0,0 +1,46 @@ +--- +sidebar_label: disable() +title: disable selection method +description: You can learn about the disable selection method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +--- + +# disable() + +### Description + +@short: Turns the selection of cells off + +### Usage + +~~~jsx +disable(): void; +~~~ + +### Example + +~~~jsx {6} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + // config parameters +}); +spreadsheet.parse(data); + +spreadsheet.selection.disable(); +~~~ + +### Details + +The method: + +- ends the editing of a cell and saves the entered value +- removes the selected and the active cells on every sheet +- ignores the selection by the mouse, the keyboard and the API until the [`enable()`](api/selection_enable_method.md) method is called + +While the selection is turned off, the [`getSelectedCell()`](api/selection_getselectedcell_method.md) and [`getFocusedCell()`](api/selection_getfocusedcell_method.md) methods return `undefined`. The other effects are the same as for the [`selection: false`](api/spreadsheet_selection_config.md#details) configuration option. + +If the selection is already turned off, the method does nothing. + +**Change log:** Added in v6.0.4 + +**Related articles:** +- [`selection`](api/spreadsheet_selection_config.md) +- [`enable()`](api/selection_enable_method.md) diff --git a/docs/api/selection_enable_method.md b/docs/api/selection_enable_method.md new file mode 100644 index 00000000..def0afdb --- /dev/null +++ b/docs/api/selection_enable_method.md @@ -0,0 +1,41 @@ +--- +sidebar_label: enable() +title: enable selection method +description: You can learn about the enable selection method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +--- + +# enable() + +### Description + +@short: Turns the selection of cells on + +### Usage + +~~~jsx +enable(): void; +~~~ + +### Example + +~~~jsx {7} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, + // other config parameters +}); +spreadsheet.parse(data); + +spreadsheet.selection.enable(); +~~~ + +### Details + +The method makes the A1 cell of the active sheet active. The [`beforeSelectionSet`](api/spreadsheet_beforeselectionset_event.md), [`beforeFocusSet`](api/spreadsheet_beforefocusset_event.md), [`afterFocusSet`](api/spreadsheet_afterfocusset_event.md) and [`afterSelectionSet`](api/spreadsheet_afterselectionset_event.md) events fire for the A1 cell. + +If the selection is already turned on, the method does nothing. + +**Change log:** Added in v6.0.4 + +**Related articles:** +- [`selection`](api/spreadsheet_selection_config.md) +- [`disable()`](api/selection_disable_method.md) diff --git a/docs/api/selection_isdisabled_method.md b/docs/api/selection_isdisabled_method.md new file mode 100644 index 00000000..b18bf568 --- /dev/null +++ b/docs/api/selection_isdisabled_method.md @@ -0,0 +1,40 @@ +--- +sidebar_label: isDisabled() +title: isDisabled selection method +description: You can learn about the isDisabled selection method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +--- + +# isDisabled() + +### Description + +@short: Checks whether the selection of cells is turned off + +### Usage + +~~~jsx +isDisabled(): boolean; +~~~ + +### Returns + +The method returns `true` if the selection is turned off; otherwise, `false` + +### Example + +~~~jsx {7} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, + // other config parameters +}); +spreadsheet.parse(data); + +const disabled = spreadsheet.selection.isDisabled(); // -> true +~~~ + +**Change log:** Added in v6.0.4 + +**Related articles:** +- [`selection`](api/spreadsheet_selection_config.md) +- [`enable()`](api/selection_enable_method.md) +- [`disable()`](api/selection_disable_method.md) diff --git a/docs/api/selection_setfocusedcell_method.md b/docs/api/selection_setfocusedcell_method.md index 3efe135b..8bc69f67 100644 --- a/docs/api/selection_setfocusedcell_method.md +++ b/docs/api/selection_setfocusedcell_method.md @@ -41,7 +41,7 @@ The method makes the specified cell active and, after the redraw, moves the keyb If the keyboard focus is on the page body, for example, right after the page is loaded, the method moves it to the cell. -The method does nothing while the selection is turned off with the `selection: false` configuration option or the `selection.disable()` method. +The method does nothing while the selection is turned off with the [`selection: false`](api/spreadsheet_selection_config.md) configuration option or the [`selection.disable()`](api/selection_disable_method.md) method. **Change log:** Moving the keyboard focus to the cell was added in v6.0.4 diff --git a/docs/api/spreadsheet_announce_method.md b/docs/api/spreadsheet_announce_method.md new file mode 100644 index 00000000..4b8c9b77 --- /dev/null +++ b/docs/api/spreadsheet_announce_method.md @@ -0,0 +1,59 @@ +--- +sidebar_label: announce() +title: announce method +description: You can learn about the announce method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +--- + +# announce() + +### Description + +@short: Sends a status message to screen readers + +### Usage + +~~~jsx +announce(message: string): void; +~~~ + +### Parameters + +- `message` - (required) the text to announce. An empty string clears the message + +### Example + +In the example below, a custom menu command counts the empty cells in the selected range and announces the result: + +~~~jsx {17} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + // config parameters +}); +spreadsheet.parse(data); + +spreadsheet.menu.data.add({ + id: "count-empty", + value: "Count empty cells" +}); + +spreadsheet.menu.events.on("click", function (id) { + if (id === "count-empty") { + let count = 0; + spreadsheet.eachCell(function (cell, value) { + if (value === "" || value === undefined || value === null) count++; + }, spreadsheet.selection.getSelectedCell()); + spreadsheet.announce(count + " empty cells in the selection"); + } +}); +~~~ + +### Details + +The method puts the message into a live region with `role="status"` and `aria-live="polite"`, which is placed next to the grid and hidden visually. A screen reader reads the message after it finishes the current speech, and the keyboard focus stays where it is. + +The Spreadsheet uses the same live region for its own announcements, such as the refused edits, the search results and the progress of import and export. A message that repeats the current one is announced again. + +Call the method after the Spreadsheet is rendered on the page. Before that, the message is not announced. The method also works in the [read-only mode](api/spreadsheet_readonly_config.md) and while the [selection](api/spreadsheet_selection_config.md) is turned off. + +**Change log:** Added in v6.0.4 + +**Related article:** [Customization](customization.md#menu) diff --git a/docs/api/spreadsheet_readonly_config.md b/docs/api/spreadsheet_readonly_config.md index 1b9accd8..ed7c8158 100644 --- a/docs/api/spreadsheet_readonly_config.md +++ b/docs/api/spreadsheet_readonly_config.md @@ -50,7 +50,7 @@ Changes of the data are refused: The custom `hotkeys` from the Spreadsheet configuration are not registered in the read-only mode. -To turn off the keyboard navigation and the selection as well, set the `selection` option to `false`. In this case, the Spreadsheet has no active cell, and the cells can't be selected by the mouse, the keyboard or the API: +To turn off the keyboard navigation and the selection as well, set the [`selection`](api/spreadsheet_selection_config.md) option to `false`. In this case, the Spreadsheet has no active cell, and the cells can't be selected by the mouse, the keyboard or the API: ~~~jsx {3} const spreadsheet = new dhx.Spreadsheet("spreadsheet", { diff --git a/docs/api/spreadsheet_selection_config.md b/docs/api/spreadsheet_selection_config.md new file mode 100644 index 00000000..fc685516 --- /dev/null +++ b/docs/api/spreadsheet_selection_config.md @@ -0,0 +1,62 @@ +--- +sidebar_label: selection +title: selection config +description: You can learn about the selection config in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +--- + +# selection + +### Description + +@short: Optional. Enables/disables the selection of cells + +### Usage + +~~~jsx +selection?: boolean; +~~~ + +### Default config + +~~~jsx +selection: true +~~~ + +### Example + +~~~jsx {2} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, + // other config parameters +}); +~~~ + +### Details + +When the property is set to `false`: + +- the Spreadsheet has no active cell +- the cells can't be selected with the mouse, the keyboard or the API: the [`setSelectedCell()`](api/selection_setselectedcell_method.md) and [`setFocusedCell()`](api/selection_setfocusedcell_method.md) methods are ignored, and the [`getSelectedCell()`](api/selection_getselectedcell_method.md) and [`getFocusedCell()`](api/selection_getfocusedcell_method.md) methods return `undefined` +- the cells can't be edited from the interface, and the fill handle is hidden +- the context menu and the column menu icon are not available +- `Tab` stops on the grid once and moves the focus further, and `Ctrl + F6` skips the sheet + +The columns and rows can still be resized by dragging their borders. + +Combined with the [`readonly`](api/spreadsheet_readonly_config.md) property, the option turns off the keyboard navigation and the selection that are available in the read-only mode: + +~~~jsx {3} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, + selection: false, + // other config parameters +}); +~~~ + +To turn the selection off and on at runtime, use the [`selection.disable()`](api/selection_disable_method.md) and [`selection.enable()`](api/selection_enable_method.md) methods. + +**Change log:** Added in v6.0.4 + +**Related articles:** +- [Configuration](configuration.md#selection-of-cells) +- [Configuration](configuration.md#read-only-mode) diff --git a/docs/configuration.md b/docs/configuration.md index 5f2d4c11..c39bacf8 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -57,7 +57,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { In the read-only mode, the toolbar, the menu and the formula bar are hidden. Users can navigate the cells with the keyboard, select them with the mouse, copy and search them. Edits are refused and announced to screen readers as "The sheet is read-only". The fill handle is hidden, and the custom `hotkeys` from the configuration are not registered. Check the details in the [`readonly`](api/spreadsheet_readonly_config.md#details) article. -To turn off the keyboard navigation and the selection in the read-only mode, set the `selection` option to `false`: +To turn off the keyboard navigation and the selection in the read-only mode, set the [`selection`](api/spreadsheet_selection_config.md) option to `false`: ~~~jsx {3} const spreadsheet = new dhx.Spreadsheet("spreadsheet", { @@ -70,6 +70,20 @@ You can also [customize the read-only behavior of Spreadsheet](customization.md# +## Selection of cells + +By default, users can select cells with the mouse and the keyboard, and the Spreadsheet has an active cell. To turn the selection off, set the [`selection`](api/spreadsheet_selection_config.md) configuration option to `false`: + +~~~jsx {2} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, +}); +~~~ + +In this case, the Spreadsheet has no active cell, the cells can't be selected or edited from the interface, and the context menu is not available. + +To turn the selection off and on at runtime, use the [`selection.disable()`](api/selection_disable_method.md) and [`selection.enable()`](api/selection_enable_method.md) methods. The [`selection.isDisabled()`](api/selection_isdisabled_method.md) method checks whether the selection is turned off. + ## Custom number formats for cells You can apply 7 default formats to cell values: "Common", "Number", "Percent", "Currency", "Date", "Time", "Text". diff --git a/docs/filtering_data.md b/docs/filtering_data.md index cbaae6fb..c085d47f 100644 --- a/docs/filtering_data.md +++ b/docs/filtering_data.md @@ -20,6 +20,18 @@ To activate filtering, use one of two ways: After that, a **filter** icon appears on the right of each column header in the range. +## Opening a filter with the keyboard + +To open the filter of a column without the mouse: + +- Move the active cell to the column header cell with the **filter** icon + +- Press `Shift + F10` or the Menu key to call the context menu and choose *Open filter* + +The *Open filter* command appears in the context menu only for the cells with the **filter** icon. You can also choose it after right-clicking such a cell. + +The filter popup takes the focus, and `Tab` moves between its controls. `Esc` closes the popup and returns the focus to the cell. If a dropdown list or a date picker is open in the popup, `Esc` closes it first. + ## Filtering by condition - Click the **filter** icon of the necessary column diff --git a/docs/work_with_rows_cols.md b/docs/work_with_rows_cols.md index f23a5ee0..4b6976e5 100644 --- a/docs/work_with_rows_cols.md +++ b/docs/work_with_rows_cols.md @@ -124,6 +124,22 @@ To change the column width so that it would automatically fit the longest conten ![DHTMLX Spreadsheet Columns submenu with the Fit to data option for autofit column width](/img/column_autofit.png) +## Setting column width and row height + +To set an exact width of columns, take the following steps: + +1\. Select a column or a cell in the column. To change several columns, select a range of cells that spans them. + +2\. Right-click the selection, or press `Shift + F10` or the Menu key, and choose *Columns -> Column width*. The same command is available in the menu of the 3 dots icon of the column. + +3\. In the *Column width* dialog, enter the width in pixels and click **Apply** or press `Enter`. + +To set an exact height of rows, choose *Rows -> Row height* in the context menu and enter the height in the *Row height* dialog. + +The dialog shows the current size of the first selected column or row and applies the new size to every column or row of the selected range. The minimum width of a column is 20 px, and the minimum height of a row is 10 px: a smaller value is replaced with the minimum. The **Cancel** button or `Esc` closes the dialog without changes. Screen readers announce the new size, for example, "Column width set to 120 pixels". + +The new size can be undone with `Ctrl (Cmd) + Z`. The command runs the `resizeCol` or `resizeRow` [action](api/overview/actions_overview.md). The `config` object that the [`beforeAction`](api/spreadsheet_beforeaction_event.md) and [`afterAction`](api/spreadsheet_afteraction_event.md) events receive contains the range of the columns or rows in `cell` and the new size in `val`. Unlike a resize by dragging, the `config` object has no `mouseEvent` property. + ## Freezing/unfreezing rows and columns ### Freezing rows @@ -220,6 +236,10 @@ To hide a row, take the following steps: ![DHTMLX Spreadsheet context menu with the Rows submenu showing Hide rows](/img/hide_row_context_menu.png) +:::info +If the active cell is in a row that becomes hidden, the active cell moves to the first visible row below it. If there are no visible rows below, it moves to the last visible row above. +::: + ### Showing rows To show hidden rows, take one of the following steps: @@ -236,6 +256,8 @@ To show hidden rows, take one of the following steps: ![DHTMLX Spreadsheet context menu with the Rows submenu showing Show rows](/img/show_rows_context_menu.png) +- or select rows or several cells so that the hidden rows were included into the selection, and press `Ctrl (Cmd) + Shift + 9`. For example, select rows 2-4 to show the hidden row 3. If the selection includes no hidden rows, screen readers announce "No hidden rows in the selection" + ### Hiding columns To hide a column, take the following steps: @@ -252,6 +274,10 @@ To hide a column, take the following steps: ![DHTMLX Spreadsheet context menu with the Columns submenu showing Hide columns](/img/hide_columns_context_menu.png) +:::info +If the active cell is in a column that becomes hidden, the active cell moves to the first visible column on the right of it. If there are no visible columns on the right, it moves to the last visible column on the left. +::: + ### Showing columns To show hidden columns, take one of the following steps: @@ -268,4 +294,8 @@ To show hidden columns, take one of the following steps: ![DHTMLX Spreadsheet context menu with the Columns submenu showing Show columns](/img/show_columns_context_menu.png) +- or select columns or several cells so that the hidden columns were included into the selection, and press `Ctrl (Cmd) + Shift + 0`. If the selection includes no hidden columns, screen readers announce "No hidden columns in the selection" +:::note +Windows can reserve the `Ctrl + Shift + 0` combination for switching the input language. In this case, use the context menu. +::: diff --git a/sidebars.js b/sidebars.js index a6c0752e..d020cbf5 100644 --- a/sidebars.js +++ b/sidebars.js @@ -50,6 +50,7 @@ module.exports = { "api/spreadsheet_addcolumn_method", "api/spreadsheet_addformula_method", "api/spreadsheet_addrow_method", + "api/spreadsheet_announce_method", "api/spreadsheet_clear_method", "api/spreadsheet_deletecolumn_method", "api/spreadsheet_deleterow_method", @@ -142,6 +143,7 @@ module.exports = { "api/spreadsheet_multisheets_config", "api/spreadsheet_readonly_config", "api/spreadsheet_rowscount_config", + "api/spreadsheet_selection_config", "api/spreadsheet_toolbarblocks_config" ] }, @@ -174,8 +176,11 @@ module.exports = { id: "api/overview/selection_overview" }, items: [ + "api/selection_disable_method", + "api/selection_enable_method", "api/selection_getfocusedcell_method", "api/selection_getselectedcell_method", + "api/selection_isdisabled_method", "api/selection_removeselectedcell_method", "api/selection_setfocusedcell_method", "api/selection_setselectedcell_method" From 00f172a380f824f1f7d58e21cd83e78748da61ad Mon Sep 17 00:00:00 2001 From: Sorokin-Oleg Date: Tue, 20 Oct 2026 12:57:11 +0300 Subject: [PATCH 04/32] [update] Fixed annonce method (DHX-5299) --- docs/api/spreadsheet_announce_method.md | 2 +- docs/work_with_rows_cols.md | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/api/spreadsheet_announce_method.md b/docs/api/spreadsheet_announce_method.md index 4b8c9b77..3551f870 100644 --- a/docs/api/spreadsheet_announce_method.md +++ b/docs/api/spreadsheet_announce_method.md @@ -52,7 +52,7 @@ The method puts the message into a live region with `role="status"` and `aria-li The Spreadsheet uses the same live region for its own announcements, such as the refused edits, the search results and the progress of import and export. A message that repeats the current one is announced again. -Call the method after the Spreadsheet is rendered on the page. Before that, the message is not announced. The method also works in the [read-only mode](api/spreadsheet_readonly_config.md) and while the [selection](api/spreadsheet_selection_config.md) is turned off. +The method works in the [read-only mode](api/spreadsheet_readonly_config.md) and while the [selection](api/spreadsheet_selection_config.md) is turned off. **Change log:** Added in v6.0.4 diff --git a/docs/work_with_rows_cols.md b/docs/work_with_rows_cols.md index 4b6976e5..ba9bd619 100644 --- a/docs/work_with_rows_cols.md +++ b/docs/work_with_rows_cols.md @@ -295,7 +295,3 @@ To show hidden columns, take one of the following steps: ![DHTMLX Spreadsheet context menu with the Columns submenu showing Show columns](/img/show_columns_context_menu.png) - or select columns or several cells so that the hidden columns were included into the selection, and press `Ctrl (Cmd) + Shift + 0`. If the selection includes no hidden columns, screen readers announce "No hidden columns in the selection" - -:::note -Windows can reserve the `Ctrl + Shift + 0` combination for switching the input language. In this case, use the context menu. -::: From 7fd3e0bf25a60492d706faf7c8e3157be784563b Mon Sep 17 00:00:00 2001 From: Sorokin-Oleg Date: Tue, 20 Oct 2026 13:20:51 +0300 Subject: [PATCH 05/32] [update] hotkeys list and scope of toolbar shortcuts in what's new and migration for v6.0.4 --- docs/hotkeys.md | 193 +++++++++++++++++++++++++++++++++++++++++++--- docs/migration.md | 2 +- docs/whats_new.md | 2 +- 3 files changed, 183 insertions(+), 14 deletions(-) diff --git a/docs/hotkeys.md b/docs/hotkeys.md index b4f7e1ce..af1ece1b 100644 --- a/docs/hotkeys.md +++ b/docs/hotkeys.md @@ -8,6 +8,12 @@ description: You can learn about the hotkeys in the documentation of the DHTMLX Here is a list of hotkeys that you can use while working with DHTMLX Spreadsheet. +:::note +The shortcuts for cells work while the focus is in the cells or in the formula bar. The formatting, undo, search and link shortcuts also work while the focus is on the toolbar. On the toolbar, the menu bar and the sheet tabs, the arrow keys, **Home**, **End**, **Enter** and **Space** control the bar itself, as described in the [Moving the focus](#moving-the-focus) section. + +In the [read-only mode](api/spreadsheet_readonly_config.md), the shortcuts for navigation, selection, copying and search work, and the editing shortcuts are refused. +::: + ## Editing @@ -28,6 +34,10 @@ Here is a list of hotkeys that you can use while working with DHTMLX Spreadsheet + + + +
Esc closes editor in a cell without saving changes
Alt (Option) + Enteropens the link of the active cell in a new tab
@@ -114,43 +124,43 @@ Here is a list of hotkeys that you can use while working with DHTMLX Spreadsheet Shift + Enter - moves selection one cell up (in a column). If a range of cells is selected, moves selection one cell up within the bounds of a range. Deactivated when reaches the first cell in a column. + moves selection one cell up (in a column). If a range of cells is selected, moves selection one cell up within the bounds of a range. Tab - moves selection one cell right (in a row). If a range of cells is selected, moves selection one cell right within the bounds of a range. Deactivated when reaches the rightmost cell in a row. + moves selection one cell right (in a row). From the rightmost cell, moves selection to the first cell of the same row. If a range of cells is selected, moves selection one cell right within the bounds of a range. From the last cell of the sheet, moves the focus out of the Spreadsheet. Tab + Shift - moves selection one cell left (in a row). If a range of cells is selected, moves selection one cell left within the bounds of a range. Deactivated when reaches the leftmost cell in a row. + moves selection one cell left (in a row). From the leftmost cell, moves selection to the last cell of the same row. If a range of cells is selected, moves selection one cell left within the bounds of a range. From the first cell of the sheet, moves the focus out of the Spreadsheet. Arrow keys - provide navigation around cells in a sheet + provide navigation around cells in a sheet. Stop at the first and last visible row and column. If a range of cells is selected, an arrow key at the edge of the sheet collapses the range to the active cell Home - moves selection to the first cell in the row + moves selection to the first visible cell in the row End - moves selection to the last cell in the row + moves selection to the last visible cell in the row Ctrl (Cmd) + Left Arrow Key - moves selection to the first cell in a row + moves selection to the first visible cell in a row Ctrl (Cmd) + Right Arrow Key - moves selection to the last cell in a row + moves selection to the last visible cell in a row Ctrl (Cmd) + Up Arrow Key - moves selection to the first cell in a column + moves selection to the first visible cell in a column Ctrl (Cmd) + Down Arrow Key - moves selection to the last cell in a column + moves selection to the last visible cell in a column Ctrl (Cmd) + Home @@ -175,6 +185,59 @@ Here is a list of hotkeys that you can use while working with DHTMLX Spreadsheet +## Moving the focus + +The toolbar, the menu bar and the sheet tabs are single tab stops: Tab moves the focus into a bar and out of it, and the focus lands on the control that was used last. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ctrl + F6moves the focus to the next part of the Spreadsheet in the order: the menu, the toolbar, the sheet (the active cell), the sheet tabs. Saves the value of the edited cell first
Ctrl + Shift + F6moves the focus to the previous part of the Spreadsheet
Left Arrow/Right Arrow Keymoves the focus to the previous/next control of the toolbar, the menu bar or the sheet tabs
Home/Endmoves the focus to the first/last control of the bar
Enter/Spacepresses the focused control: runs the command, opens the dropdown, or switches to the sheet of the focused tab
Down Arrow Keyopens the dropdown of the focused control and moves the focus to its first item
Up Arrow/Down Arrow Keymoves the focus between the items of an open dropdown or menu
Right Arrow Keyopens the submenu of the focused menu item
Left Arrow Keycloses the submenu. In the first level of a dropdown, closes the dropdown and returns the focus to its control
Esccloses the dropdown or the menu and returns the focus to the control that opened it. Closes the tooltip of a toolbar control
Shift + F10 or Menu keyopens the context menu of the active cell or of the focused sheet tab and moves the focus into it. After Ctrl (Cmd) + Space, the context menu of a cell shows the commands for the column. Esc closes the context menu and returns the focus to the cell
+ ## Search @@ -191,6 +254,10 @@ Here is a list of hotkeys that you can use while working with DHTMLX Spreadsheet + + + +
Ctrl (Cmd) + Shift + G moves selection to the previous found match
Esccloses the search box and returns the focus to the active cell
@@ -234,8 +301,110 @@ Here is a list of hotkeys that you can use while working with DHTMLX Spreadsheet adds a new sheet into the spreadsheet - Alt + Arrow Up/ Arrow Down - switches to the next/previous sheet + Alt (Option) + Arrow Up + switches to the next sheet. From the last sheet, switches to the first one + + + Alt (Option) + Arrow Down + switches to the previous sheet. From the first sheet, switches to the last one + + + Ctrl (Cmd) + Alt (Option) + Page Down + switches to the next sheet + + + Ctrl (Cmd) + Alt (Option) + Page Up + switches to the previous sheet + + + + +## Work with rows and columns + + + + + + + + + + + + +
Ctrl (Cmd) + Shift + 9shows the hidden rows inside the selected range
Ctrl (Cmd) + Shift + 0shows the hidden columns inside the selected range
+ +## Toolbar popups + +The keys below work in the popups of the *Text color*, *Background color* and *Border* controls of the toolbar. The popup takes the focus when it opens. + + + + + + + + + + + + + + + + + + + + + + + + +
Arrow keysmove the focus between the colors of the palette or between the controls of the Border popup
Home/Endmoves the focus to the first/last color of the palette
Enterapplies the focused color or border. After a text or background color is applied, the focus returns to the active cell
Escreturns from the custom color mode to the palette, or closes the color or style popup opened over the Border popup. Otherwise, closes the popup and returns the focus to its toolbar control
Tab/Tab + Shiftcloses the popup and returns the focus to its toolbar control
+ +## List editor + +The keys below work in the editor of a cell with a [list of values](api/spreadsheet_setvalidation_method.md). + + + + + + + + + + + + + + + + + + + + +
Up Arrow/Down Arrow Keymoves through the list of values
Enterchooses the value and closes the editor
Esccloses the editor without saving changes
Tabsaves the value and moves selection one cell right
+ +## Filter and dialogs + +The keys below work in the popup of a [filter](filtering_data.md#opening-a-filter-with-the-keyboard) and in the [Column width and Row height](work_with_rows_cols.md#setting-column-width-and-row-height) dialogs. + + + + + + + + + + + + + +
Esccloses the filter popup and returns the focus to the cell
Enterapplies the size in the Column width and Row height dialogs
Esccloses the Column width and Row height dialogs without changes
diff --git a/docs/migration.md b/docs/migration.md index 3f46383c..20fa53a3 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -69,7 +69,7 @@ spreadsheet.selection.setFocusedCell("D4"); In 6.0.3, the arrow keys and typing acted on the cells while the toolbar had focus. Since 6.0.4, the toolbar, the menu and the sheet tabs use the arrow keys, `Home`, `End`, `Enter` and `Space` for their own controls, and the cell shortcuts (navigation, typing, `Delete`, `Enter`, `F2` and the like) work only while the focus is in the cells or in the formula bar. -The formatting, clipboard, undo, search and link shortcuts (`Ctrl (Cmd) + B`, `Ctrl (Cmd) + C`, `Ctrl (Cmd) + Z`, `Ctrl (Cmd) + F`, `Ctrl (Cmd) + K` and the like) still work from the toolbar and the menu. Custom `hotkeys` from the configuration are not filtered by the focus position. +The formatting, undo, search and link shortcuts (`Ctrl (Cmd) + B`, `Ctrl (Cmd) + Z`, `Ctrl (Cmd) + F`, `Ctrl (Cmd) + K` and the like) still work while the focus is on the toolbar. Custom `hotkeys` from the configuration are not filtered by the focus position. ## 5.2 -> 6.0 diff --git a/docs/whats_new.md b/docs/whats_new.md index aff6ad38..84261d44 100644 --- a/docs/whats_new.md +++ b/docs/whats_new.md @@ -20,7 +20,7 @@ Some existing keys and API calls give a different result. No documented method, - The [`deleteRow()`](api/spreadsheet_deleterow_method.md) and [`deleteColumn()`](api/spreadsheet_deletecolumn_method.md) methods called for a cell inside a merged cell delete every row or column of the merge. The `beforeAction` / `afterAction` handlers still receive the original cell - A Spreadsheet with [`readonly: true`](api/spreadsheet_readonly_config.md) can be navigated with the keyboard, selected with the mouse, copied and searched, so the selection events fire on user actions. Edits are refused and announced to screen readers. Custom `hotkeys` are still not registered in read-only mode. To keep the 6.0.3 behaviour, set `selection: false` - The [`selection.setFocusedCell()`](api/selection_setfocusedcell_method.md) method and any other change of the active cell move the keyboard focus to the cell when the focus is on the page body or inside the Spreadsheet. The focus stays on the toolbar, the menu or the sheet tabs reached with the keyboard, and in an open cell editor -- Cell shortcuts (the arrow keys, typing, `Delete`, `Enter` and the like) don't act on the cells while the toolbar, the menu or the sheet tabs have focus. The formatting, clipboard, undo, search and link shortcuts still work there +- Cell shortcuts (the arrow keys, typing, `Delete`, `Enter` and the like) don't act on the cells while the toolbar, the menu or the sheet tabs have focus. The formatting, undo, search and link shortcuts still work on the toolbar ### New functionality From b5bb8affcfbb586a78285e3cd94cd5f89b6954db Mon Sep 17 00:00:00 2001 From: Sorokin-Oleg Date: Tue, 20 Oct 2026 13:49:11 +0300 Subject: [PATCH 06/32] [update] localization: new locale keys and built-in widget locales for v6.0.4 --- docs/localization.md | 141 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 138 insertions(+), 3 deletions(-) diff --git a/docs/localization.md b/docs/localization.md index 7454f90f..96fbdd7d 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -23,6 +23,8 @@ const en = { textColor: "Text color", backgroundColor: "Background color", + fontSize: "Font size", + bold: "Bold", italic: "Italic", underline: "Underline", @@ -60,6 +62,10 @@ const en = { addRow: "Add row above", removeRow: "Remove row {row}", removeRows: "Remove rows {row}", + columnWidth: "Column width", + rowHeight: "Row height", + widthInPixels: "Width in pixels", + heightInPixels: "Height in pixels", row: "row", col: "col", freeze: "Freeze", @@ -82,8 +88,10 @@ const en = { text: "Text", date: "Date", time: "Time", + scientific: "Scientific", filter: "Filter", + openFilter: "Open filter", help: "Help", @@ -104,6 +112,9 @@ const en = { border_style: "Border style", // Tabbar + // the name of a new sheet is this prefix followed by a number: sheet1, sheet2 + defaultSheetName: "sheet", + addSheet: "Add sheet", deleteSheet: "Delete", renameSheet: "Rename", renameSheetAlert: "A sheet with the name $name already exists. Please enter another name. ", @@ -114,10 +125,14 @@ const en = { export: "Export", downloadAs: "Download as...", importAs: "Import as...", + xlsxFormat: "Microsoft Excel(.xlsx)", data: "Data", validation: "Data validation", search: "Search", + previousMatch: "Previous match", + nextMatch: "Next match", + closeSearch: "Close search", sort: "Sort", ascSort: "Sort A to Z", descSort: "Sort Z to A", @@ -177,17 +192,105 @@ const en = { spanUnmergeLockedError: "You can't unmerge locked cells!", spanOverFilteredRow: "You can't merge cells over a filtered row.", removeAlert: "You can't remove last $name!", + wasmNotSupported: "WebAssembly is not supported by your browser", + invalidValue: "Invalid value", + + // Accessible names, read by screen readers + // accessible name of a color button; {color} is a name from the colorpicker locale + aria_colorButton: "{label}: {color}", + // accessible names of the toolbars; the screen reader adds the word "toolbar" itself + aria_toolbarFormatting: "Formatting", + aria_toolbarBorders: "Borders", + aria_toolbarSheets: "Sheets", + aria_toolbarSearch: "Search", + aria_toolbarLink: "Link", + // accessible names of the line styles in the border style list + aria_borderStyleThin: "Thin line", + aria_borderStyleMedium: "Medium line", + aria_borderStyleThick: "Thick line", + aria_borderStyleDashed: "Dashed line", + aria_borderStyleDotted: "Dotted line", + aria_borderStyleDouble: "Double line", + // accessible names of the context menus; the screen reader adds the word "menu" itself + aria_cellMenu: "Cell", + aria_sheetMenu: "Sheet", + // accessible name of the menu bar; the screen reader adds the words "menu bar" itself + aria_menuBar: "Main", + // accessible name of the cell grid; the screen reader adds the word "grid" itself + aria_grid: "Spreadsheet", + // accessible name of the select-all corner, the first column header + aria_selectAll: "Select all", + // accessible name of the formula bar; {cell} is the address of the cell it shows, for example "B7" + aria_formulaBar: "Formula bar, {cell}", + // accessible name of the input that edits a cell; {cell} is the address of the cell, for example "B7" + aria_cellEditor: "Cell editor, {cell}", + // accessible name of the close icon of the formula help panel + aria_closeFormulaHelp: "Close formula help", + + // Cell descriptions, read with the content of the active cell + // read with the content of a cell that has a filter icon; the icon itself is hidden from assistive technology + aria_filter: "Filter", + aria_filterApplied: "Filter applied", + // read after the content of a selected cell that holds a link; Alt+Enter opens the link + aria_cellLink: "link", + // read after the content of a selected locked cell; the lock icon itself is hidden from assistive technology + aria_lockedState: "locked", + // read after the value of a cell with a formula error; the formula engine writes the error as #ERROR, #REF! or #SPILL! + aria_errorSyntax: "Syntax error. Check the formula", + aria_errorCalc: "Calculation error. Check the values and functions", + aria_errorRef: "Reference error. Check the cell references", + aria_errorSpill: "Spill error. Clear the cells the result needs", + // read after the value of a cell that breaks its list validation + aria_invalidValue: "Invalid value. Choose a value from the list", + + // Screen reader announcements + // announced when an editing key is pressed in the read-only mode + aria_readonlySheet: "The sheet is read-only", + // announced when Ctrl+Shift+9 or Ctrl+Shift+0 finds nothing to reveal + aria_noHiddenRows: "No hidden rows in the selection", + aria_noHiddenCols: "No hidden columns in the selection", + // announced when a selection of several cells changes; {range} is built from aria_rangeExtent + aria_selectedRange: "{range}, {count} cells", + aria_rangeExtent: "{start} to {end}", + // joins the ranges of a selection made with Ctrl + aria_rangeSeparator: ", ", + // announced after an action; {message} is one of the texts above + aria_cellMessage: "{cell}: {message}", + // announced when an action makes several errors appear; {first} is aria_cellMessage for the first of them + aria_newErrors: "{count} new errors. {first}", + // announced when an action puts several invalid values; {first} is aria_cellMessage for the first of them + aria_invalidValues: "{count} invalid values. {first}", + // announced once when an edit of a locked cell is refused; the second one when a range holds locked cells + aria_lockedCell: "The cell is locked", + aria_lockedCells: "Locked cells were not changed", + // announced when the search text changes; followed by aria_searchMatch for the first match + aria_searchResults: "Results: {count}.", + // announced for the current match; {cell} is its address, for example "B7" + aria_searchMatch: "{index} of {count}, {cell}", + aria_searchNoResults: "No results", + // announced when an export or an import of a file starts and ends + aria_exportStarted: "Exporting the file", + aria_exportDone: "The file is exported", + aria_importStarted: "Importing the file", + aria_importDone: "The file is imported", + // announced when the column width or the row height command is applied; {size} is the applied size + aria_columnWidthSet: "Column width set to {size} pixels", + aria_rowHeightSet: "Row height set to {size} pixels", }; ~~~ +The keys that start with `aria_` are not shown in the interface. Screen readers read them as the names of the controls, as the descriptions of the active cell, and as the messages of the live region that the [`announce()`](api/spreadsheet_announce_method.md) method also uses. The parts in curly braces, such as `{cell}` or `{count}`, are replaced with the values when the string is read. Keep them in the translated strings. + +The `defaultSheetName` key sets the prefix of the names of new sheets: with the value `"Blatt"`, new sheets are named "Blatt1", "Blatt2" and so on. + ## Custom locale To apply a different locale, you need to: -- provide translations for all text labels in Spreadsheet, for example, for the Russian locale: +- provide translations for all text labels in Spreadsheet, for example, for the German locale: ~~~jsx -const ru = { +const de = { // language settings }; ~~~ @@ -195,10 +298,42 @@ const ru = { - apply the new locale by calling the `dhx.i18n.setLocale()` method before initializing Spreadsheet: ~~~jsx -dhx.i18n.setLocale("spreadsheet", ru); +dhx.i18n.setLocale("spreadsheet", de); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); +~~~ + +## Localizing built-in widgets + +Spreadsheet uses the Colorpicker, Grid, Toolbar, Window and Message widgets of DHTMLX Suite inside. Their strings are stored in separate locales, which you can translate in the same way as the `spreadsheet` locale: + +| Locale | Strings used in Spreadsheet | +| ------ | --------------------------- | +| `colorpicker` | the labels of the custom color mode in the color popups of the toolbar, the name of the palette, and the color names that screen readers read for the swatches and the color buttons, for example, "Text color: dark gray" | +| `grid` | the announcement of the number of loaded rows | +| `toolbar` | the default accessible name of a toolbar | +| `window` | the default accessible name of a dialog | +| `message` | the accessible names of the alert and confirm dialogs and of their buttons | + +Call `dhx.i18n.setLocale()` with the name of the locale before initializing Spreadsheet, since the toolbars, the menus and the context menus read the locale when they are created: + +~~~jsx +const deColorpicker = { + cancel: "Abbrechen", + select: "Auswählen", + aria_palette: "Farbpalette", + aria_colorRed: "rot", + // other strings +}; + +dhx.i18n.setLocale("spreadsheet", de); +dhx.i18n.setLocale("colorpicker", deColorpicker); +dhx.i18n.setLocale("message", deMessage); + const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); ~~~ +The locale keys are flat: pass each key at the top level of the object. For details, check the [Localization of screen-reader strings](https://docs.dhtmlx.com/suite/common_features/accessibility_support/#localization-of-screen-reader-strings) article of the DHTMLX Suite documentation. + ## Default locale for formulas The `dhx.i18n.formulas` object contains the i18n locale for the Spreadsheet formula popup. The default locale for formulas is the following: From f907b2a149f6dfeac68d68cde45079e87e43eae9 Mon Sep 17 00:00:00 2001 From: Sorokin-Oleg Date: Tue, 20 Oct 2026 14:41:44 +0300 Subject: [PATCH 07/32] [update] search, Excel import/export, autofill, copy/paste, themes and framework integration pages for v6.0.4; remove internal hotkeys option mentions --- docs/angular_integration.md | 4 ++++ docs/api/spreadsheet_readonly_config.md | 2 -- docs/configuration.md | 2 +- docs/data_search.md | 10 +++++++++- docs/excel_import_export.md | 6 ++++++ docs/migration.md | 4 +--- docs/themes/themes.md | 24 ++++++++++++++++++------ docs/vuejs_integration.md | 4 ++++ docs/whats_new.md | 2 +- docs/work_with_cells.md | 9 +++++++++ 10 files changed, 53 insertions(+), 14 deletions(-) diff --git a/docs/angular_integration.md b/docs/angular_integration.md index 4a841f78..20b19bf4 100644 --- a/docs/angular_integration.md +++ b/docs/angular_integration.md @@ -234,6 +234,10 @@ ngOnDestroy() { } ~~~ +:::info +The `destructor()` method removes the event handlers attached with `spreadsheet.events.on()`. When a new Spreadsheet instance is created, for example, when the component is created again, attach the handlers to the new instance. +::: + ### Step 3. Adding Spreadsheet into the app To add the `SpreadsheetComponent` component into the app, open the *src/app/app.component.ts* file and replace the default code with the following one: diff --git a/docs/api/spreadsheet_readonly_config.md b/docs/api/spreadsheet_readonly_config.md index ed7c8158..e94b608b 100644 --- a/docs/api/spreadsheet_readonly_config.md +++ b/docs/api/spreadsheet_readonly_config.md @@ -48,8 +48,6 @@ Changes of the data are refused: - the fill handle is hidden - the columns and rows can't be resized by dragging their borders, and a double-click on a column border doesn't fit the column width to the data -The custom `hotkeys` from the Spreadsheet configuration are not registered in the read-only mode. - To turn off the keyboard navigation and the selection as well, set the [`selection`](api/spreadsheet_selection_config.md) option to `false`. In this case, the Spreadsheet has no active cell, and the cells can't be selected by the mouse, the keyboard or the API: ~~~jsx {3} diff --git a/docs/configuration.md b/docs/configuration.md index c39bacf8..5cce5954 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -55,7 +55,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { }); ~~~ -In the read-only mode, the toolbar, the menu and the formula bar are hidden. Users can navigate the cells with the keyboard, select them with the mouse, copy and search them. Edits are refused and announced to screen readers as "The sheet is read-only". The fill handle is hidden, and the custom `hotkeys` from the configuration are not registered. Check the details in the [`readonly`](api/spreadsheet_readonly_config.md#details) article. +In the read-only mode, the toolbar, the menu and the formula bar are hidden. Users can navigate the cells with the keyboard, select them with the mouse, copy and search them. Edits are refused and announced to screen readers as "The sheet is read-only". The fill handle is hidden. Check the details in the [`readonly`](api/spreadsheet_readonly_config.md#details) article. To turn off the keyboard navigation and the selection in the read-only mode, set the [`selection`](api/spreadsheet_selection_config.md) option to `false`: diff --git a/docs/data_search.md b/docs/data_search.md index de9a48af..f0a812ab 100644 --- a/docs/data_search.md +++ b/docs/data_search.md @@ -11,4 +11,12 @@ To open a search bar, use one of two options: - Set focus on any cell and press **Ctrl (Cmd) + F** - Or go to: *Data* -> *Search* -![DHTMLX Spreadsheet search bar with a text input for finding data](/img/search_data.png) \ No newline at end of file +![DHTMLX Spreadsheet search bar with a text input for finding data](/img/search_data.png) + +Type the text to find in the search bar. The first cell that contains the text becomes active, and the counter shows the number of matches. To move between the matches, click the arrow buttons in the search bar. + +The search results are updated after the cells are edited and after another sheet is opened. Screen readers announce the number of matches and the address of the current match, for example, "2 of 5, B7". + +To close the search bar, press **Esc** or click the close button. The focus returns to the active cell. + +To search for data with the API, use the [`search()`](api/spreadsheet_search_method.md) method. diff --git a/docs/excel_import_export.md b/docs/excel_import_export.md index 39a67c92..9dc81f03 100644 --- a/docs/excel_import_export.md +++ b/docs/excel_import_export.md @@ -37,3 +37,9 @@ Go to: *File -> Download As... -> Microsoft Excel (.xlsx)* in the menu ![DHTMLX Spreadsheet File menu with the Download As option for Microsoft Excel XLSX export](/img/file_export.png) 2\. Check your downloads directory to find the Excel file with data from Spreadsheet. + +Screen readers announce the start and the end of import and export. + +:::note +Import and export of Excel files use WebAssembly. If the browser doesn't support WebAssembly, the Import and Export commands show a message with the text of the `wasmNotSupported` [locale](localization.md#default-locale) key. The [`load()`](api/spreadsheet_load_method.md) method with the `"xlsx"` type and the [`export.xlsx()`](api/export_xlsx_method.md) method throw an `Error` with the same text, which you can catch in your code. +::: diff --git a/docs/migration.md b/docs/migration.md index 20fa53a3..b5a6c5e5 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -37,8 +37,6 @@ In 6.0.3, a Spreadsheet with [`readonly: true`](api/spreadsheet_readonly_config. - editing keys, typing and paste are refused and announced to screen readers as "The sheet is read-only"; - the fill handle is hidden, and a double-click on a column border does not change the column width. -Custom `hotkeys` from the configuration are still not registered in read-only mode. - To keep the 6.0.3 behaviour, turn the selection off with the new `selection` option: ~~~jsx @@ -69,7 +67,7 @@ spreadsheet.selection.setFocusedCell("D4"); In 6.0.3, the arrow keys and typing acted on the cells while the toolbar had focus. Since 6.0.4, the toolbar, the menu and the sheet tabs use the arrow keys, `Home`, `End`, `Enter` and `Space` for their own controls, and the cell shortcuts (navigation, typing, `Delete`, `Enter`, `F2` and the like) work only while the focus is in the cells or in the formula bar. -The formatting, undo, search and link shortcuts (`Ctrl (Cmd) + B`, `Ctrl (Cmd) + Z`, `Ctrl (Cmd) + F`, `Ctrl (Cmd) + K` and the like) still work while the focus is on the toolbar. Custom `hotkeys` from the configuration are not filtered by the focus position. +The formatting, undo, search and link shortcuts (`Ctrl (Cmd) + B`, `Ctrl (Cmd) + Z`, `Ctrl (Cmd) + F`, `Ctrl (Cmd) + K` and the like) still work while the focus is on the toolbar. ## 5.2 -> 6.0 diff --git a/docs/themes/themes.md b/docs/themes/themes.md index 00bee324..f9f9f2d3 100644 --- a/docs/themes/themes.md +++ b/docs/themes/themes.md @@ -377,14 +377,15 @@ The list of variables specific to the Spreadsheet component includes the followi --dhx-spreadsheet-range-background-8: #ecb6ff; --dhx-spreadsheet-range-color-1: #00815a; - --dhx-spreadsheet-range-color-2: #bfc000; - --dhx-spreadsheet-range-color-3: #c55933; - --dhx-spreadsheet-range-color-4: #0cc1d6; - --dhx-spreadsheet-range-color-5: #0080a3; - --dhx-spreadsheet-range-color-6: #529a0a; + --dhx-spreadsheet-range-color-2: #8b7300; + --dhx-spreadsheet-range-color-3: #a34729; + --dhx-spreadsheet-range-color-4: #007a8c; + --dhx-spreadsheet-range-color-5: #135db1; + --dhx-spreadsheet-range-color-6: #2f6500; --dhx-spreadsheet-range-color-7: #6d767b; - --dhx-spreadsheet-range-color-8: #ba38e7; + --dhx-spreadsheet-range-color-8: #b82fe5; + --dhx-spreadsheet-focus-color: var(--dhx-color-primary); } ~~~ @@ -411,6 +412,17 @@ The list of variables specific to the Spreadsheet component includes the followi --dhx-spreadsheet-range-color-7: #e4e4e4; --dhx-spreadsheet-range-color-8: #ecb6ff; + --dhx-spreadsheet-focus-color: hsl(var(--dhx-h-primary), var(--dhx-s-primary), calc(var(--dhx-l-primary) + 12% - var(--dhx-l-contrast-offset))); +} +~~~ + +The `--dhx-spreadsheet-range-color-*` and `--dhx-spreadsheet-range-background-*` variables set the colors that mark the cell references of a formula while it is edited. In the light themes, the `--dhx-spreadsheet-range-color-*` colors have a contrast of at least 4.5:1. + +The `--dhx-spreadsheet-focus-color` variable sets the color of the keyboard focus outline of the formula bar and of the toolbar, menu and sheet tab controls. In the dark themes, the color is lighter than the primary color, so that the outline keeps a contrast of at least 3:1. You can redefine the variable in a [custom theme](themes/custom_theme.md): + +~~~css +[data-dhx-theme='custom-theme-dark'] { + --dhx-spreadsheet-focus-color: #7fc8ff; } ~~~ diff --git a/docs/vuejs_integration.md b/docs/vuejs_integration.md index 978173c7..4a4dec64 100644 --- a/docs/vuejs_integration.md +++ b/docs/vuejs_integration.md @@ -260,6 +260,10 @@ export default { //... ~~~ +:::info +The `destructor()` method removes the event handlers attached with `spreadsheet.events.on()`. When a new Spreadsheet instance is created, for example, when the component is created again, attach the handlers to the new instance. +::: + After that, you can start the app to see Spreadsheet loaded with data on a page. ![DHTMLX Spreadsheet initialized with sample data in a Vue 3 application](/img/integrations/trial_spreadsheet.png) diff --git a/docs/whats_new.md b/docs/whats_new.md index 84261d44..a87be64b 100644 --- a/docs/whats_new.md +++ b/docs/whats_new.md @@ -18,7 +18,7 @@ Some existing keys and API calls give a different result. No documented method, - The arrow keys stop at the first and last visible row and column instead of moving the active cell to the opposite edge of the sheet. At the edge, an arrow key collapses a selected range to the active cell - The [`deleteRow()`](api/spreadsheet_deleterow_method.md) and [`deleteColumn()`](api/spreadsheet_deletecolumn_method.md) methods called for a cell inside a merged cell delete every row or column of the merge. The `beforeAction` / `afterAction` handlers still receive the original cell -- A Spreadsheet with [`readonly: true`](api/spreadsheet_readonly_config.md) can be navigated with the keyboard, selected with the mouse, copied and searched, so the selection events fire on user actions. Edits are refused and announced to screen readers. Custom `hotkeys` are still not registered in read-only mode. To keep the 6.0.3 behaviour, set `selection: false` +- A Spreadsheet with [`readonly: true`](api/spreadsheet_readonly_config.md) can be navigated with the keyboard, selected with the mouse, copied and searched, so the selection events fire on user actions. Edits are refused and announced to screen readers. To keep the 6.0.3 behaviour, set `selection: false` - The [`selection.setFocusedCell()`](api/selection_setfocusedcell_method.md) method and any other change of the active cell move the keyboard focus to the cell when the focus is on the page body or inside the Spreadsheet. The focus stays on the toolbar, the menu or the sheet tabs reached with the keyboard, and in an open cell editor - Cell shortcuts (the arrow keys, typing, `Delete`, `Enter` and the like) don't act on the cells while the toolbar, the menu or the sheet tabs have focus. The formatting, undo, search and link shortcuts still work on the toolbar diff --git a/docs/work_with_cells.md b/docs/work_with_cells.md index a922c78d..6ce2763b 100644 --- a/docs/work_with_cells.md +++ b/docs/work_with_cells.md @@ -145,11 +145,20 @@ You can automatically fill cells with data. This is how it works: - to make a series 1 ,3, 5, 7, 9, ... , type 1 and 3 into the first two cells. - to make a series 2 ,4, 6, 8, 10, ... , type 2 and 4 into the first two cells. - besides numbers, you can also use letters in a pattern, for example, to make a series like 1, a, 2, b, 3, a, 4, b, ..., type 1, a, 2, b into the first four cells. + - to continue a number at the end of a text, type the first values, for example, to make a series item1, item2, item3, ..., type item1 and item2 into the first two cells. + - to make a series of dates, type a date into the first cell: each next cell gets the next day. +- repeating the text + +For example, to make a series North, South, North, South, ..., type North and South into the first two cells. Numbers in the cells with the *Text* format are repeated in the same way. 3\. Drag the **Fill Handle** ![DHTMLX Spreadsheet autofill dragging the fill handle to replicate cell data](/img/autofill.gif) +## Copying cells to and from Excel + +Cells copied with **Ctrl (Cmd) + C** keep their values and styles, including the font size, when you paste them into Microsoft Excel or into another place of the Spreadsheet. Cells copied in Microsoft Excel keep the font size when you paste them into the Spreadsheet with **Ctrl (Cmd) + V**. + ## Locking cells You can lock cells to protect their values from changes. When you lock a cell, it shows a gray "key" in the top right corner. Locked cells do not respond to any attempts to edit them. From 04e261964305522562a7d39620913c71f95df597 Mon Sep 17 00:00:00 2001 From: Sorokin-Oleg Date: Tue, 20 Oct 2026 14:44:24 +0300 Subject: [PATCH 08/32] [update] React: readonly as init-only prop, selection prop, ISelection type and announce() for v6.0.4 --- docs/react/overview.md | 8 ++++++-- docs/react/props.md | 11 ++++++++++- docs/react/themes.md | 3 +++ docs/react/types.md | 8 ++++++++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/docs/react/overview.md b/docs/react/overview.md index 3f003665..bb6ab878 100644 --- a/docs/react/overview.md +++ b/docs/react/overview.md @@ -96,8 +96,8 @@ Props are categorized by how the component handles changes: | Category | Props | What happens on change | |----------|-------|----------------------| -| **Init-only** | `menu`, `editLine`, `toolbarBlocks`, `multiSheets`, `formats`, `localization`, `importModulePath`, `exportModulePath`, `spreadsheetLocale` | The widget is destroyed and recreated. Spreadsheet data is preserved, but undo/redo history and UI state (selection, scroll position) are reset. | -| **Runtime** | `readonly`, `rowsCount`, `colsCount` | Applied immediately without data loss or UI state reset. | +| **Init-only** | `menu`, `editLine`, `toolbarBlocks`, `multiSheets`, `formats`, `localization`, `importModulePath`, `exportModulePath`, `spreadsheetLocale`, `readonly` | The widget is destroyed and recreated. Spreadsheet data is preserved, but undo/redo history and UI state (selection, scroll position) are reset. | +| **Runtime** | `selection`, `rowsCount`, `colsCount` | Applied immediately without data loss or UI state reset. | | **Data** | `sheets`, `activeSheet` | Applied incrementally; only changed cells, ranges, or settings are updated. | | **Re-parse** | `styles` | Style changes require a full data reload. Spreadsheet data is preserved, but undo/redo history and UI state are reset. | | **State** | `search`, `theme`, `loadUrl` | Applied via dedicated widget APIs with no side effects. | @@ -198,6 +198,10 @@ function App() { The `instance` property is `null` before the widget initializes and after unmount. +:::info +Handlers attached with `ref.current.instance.events.on()` are removed when the widget is recreated after a change of an init-only prop and when the component is unmounted. Use the [event callback props](react/events.md), which the component attaches to every new widget instance. +::: + ## API reference | Document | Contents | diff --git a/docs/react/props.md b/docs/react/props.md index e00947a4..e8cefe45 100644 --- a/docs/react/props.md +++ b/docs/react/props.md @@ -25,6 +25,7 @@ Changing any of these props causes the widget to be destroyed and recreated. Spr | `importModulePath` | `string` | Path to the XLSX import module. See JS API: [`importModulePath`](api/spreadsheet_importmodulepath_config.md). | | `exportModulePath` | `string` | Path to the XLSX export module. See JS API: [`exportModulePath`](api/spreadsheet_exportmodulepath_config.md). | | `spreadsheetLocale` | [`SpreadsheetLocale`](react/types.md#spreadsheetlocale) | UI translations and localized formula names. Separate from `localization`. | +| `readonly` | `boolean` | Enable read-only mode. Users can navigate, select, copy and search the cells, and edits are refused. See JS API: [`readonly`](api/spreadsheet_readonly_config.md). | @@ -40,7 +41,7 @@ These props are applied immediately without destroying the widget. No data loss |------|------|-------------| | `rowsCount` | `number` | Number of rows in the grid. See JS API: [`rowsCount`](api/spreadsheet_rowscount_config.md). | | `colsCount` | `number` | Number of columns in the grid. See JS API: [`colsCount`](api/spreadsheet_colscount_config.md). | -| `readonly` | `boolean` | Enable read-only mode. See JS API: [`readonly`](api/spreadsheet_readonly_config.md). | +| `selection` | `boolean` | Turn the selection of cells on and off. Default: `true`. With `false`, the spreadsheet has no active cell, and the cells can't be selected or edited from the UI. See JS API: [`selection`](api/spreadsheet_selection_config.md). | ## Data props @@ -225,10 +226,18 @@ const [theme, setTheme] = useState("light"); ### Read-only mode +In read-only mode, users can navigate the cells with the keyboard, select them with the mouse, copy and search them. Edits are refused and announced to screen readers. Since `readonly` is an init-only prop, changing it recreates the widget. + ~~~tsx ~~~ +To turn off the keyboard navigation and the selection as well, add `selection={false}`. The `selection` prop is applied at runtime, so it can be switched without recreating the widget: + +~~~tsx + +~~~ + ### Loading data from URL ~~~tsx diff --git a/docs/react/themes.md b/docs/react/themes.md index 7091fb48..3a0545e7 100644 --- a/docs/react/themes.md +++ b/docs/react/themes.md @@ -77,6 +77,9 @@ Define a custom `data-dhx-theme` selector, override the variables you need, and /* spreadsheet range colors */ --dhx-spreadsheet-range-background-1: #bee3f8; --dhx-spreadsheet-range-color-1: #2b6cb0; + + /* keyboard focus outline of the formula bar and the toolbar controls */ + --dhx-spreadsheet-focus-color: #2b6cb0; } ~~~ diff --git a/docs/react/types.md b/docs/react/types.md index b4b5660d..d788120d 100644 --- a/docs/react/types.md +++ b/docs/react/types.md @@ -188,6 +188,13 @@ ref.current?.instance?.selection.setSelectedCell("A1:C5"); // Undo/redo ref.current?.instance?.undo(); ref.current?.instance?.redo(); + +// Turn the selection off and on +ref.current?.instance?.selection.disable(); +ref.current?.instance?.selection.enable(); + +// Send a status message to screen readers +ref.current?.instance?.announce("The report is saved"); ~~~ ## Actions enum @@ -270,6 +277,7 @@ These types are re-exported from `@dhx/ts-spreadsheet` for convenience: | `IStylesList` | Style definitions map. | | `IDataWithStyles` | Data structure with embedded styles (used by `serialize()`/`parse()`). | | `ICellInfo` | Cell information returned by widget methods. | +| `ISelection` | Selection module interface (`instance.selection`), including the [`enable()`](api/selection_enable_method.md), [`disable()`](api/selection_disable_method.md) and [`isDisabled()`](api/selection_isdisabled_method.md) methods. | | `FileFormat` | File format for data loading (for example, `"json"` or `"xlsx"`). | | `ToolbarBlocks` | Toolbar block identifiers (for example, `"default"`, `"undo"`, or `"font"`). | | `FilterConditions` | Enum of available filter condition types. | From 43b8dec3d72b445694e0e40f8fa38949779b6f3e Mon Sep 17 00:00:00 2001 From: Sorokin-Oleg Date: Tue, 20 Oct 2026 15:36:27 +0300 Subject: [PATCH 09/32] [add] accessibility guide --- docs/accessibility.md | 423 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 423 insertions(+) create mode 100644 docs/accessibility.md diff --git a/docs/accessibility.md b/docs/accessibility.md new file mode 100644 index 00000000..b295ed09 --- /dev/null +++ b/docs/accessibility.md @@ -0,0 +1,423 @@ +--- +sidebar_label: Accessibility +title: Accessibility +description: You can learn about accessibility in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +--- + +# Accessibility in DHTMLX Spreadsheet + +DHTMLX Spreadsheet can be used with the keyboard alone, with a screen reader, with screen magnification and in high-contrast themes. WAI-ARIA roles and states are part of the rendered markup, the keyboard focus stays on the active cell, and the toolbar, the menu bar and the sheet tabs are reached with one key press each. Changes that have no element of their own, such as a refused edit or a search result, are announced through a live region. + +:::info Target conformance +DHTMLX Spreadsheet is designed to meet **WCAG 2.2 Level AA**, **Section 508** of the U.S. Rehabilitation Act, and **EN 301 549** (the technical baseline of the European Accessibility Act). + +Conformance is reported criterion by criterion for DHTMLX Spreadsheet 6.0.4. The detailed **Accessibility Conformance Report (VPAT® 2.5)** is available: [Accessibility Conformance Report](accessibility_conformance_report.md). +::: + +## Capabilities + +| Area | Support | +| ---- | ------- | +| Keyboard operation | Every command on the cells has a key. The toolbar, the menu bar and the sheet tabs are single tab stops navigated with the arrow keys. The column width, the row height and the column filter have context menu commands, so they don't require dragging or a click on an icon | +| WAI-ARIA semantics | The cells are a `grid` with `columnheader`, `rowheader` and `gridcell` elements. The roles are always rendered | +| Focus model | The keyboard focus is on the active cell. Tab enters the sheet on the active cell and leaves the Spreadsheet from the last and the first cell. Ctrl + F6 moves the focus between the menu, the toolbar, the sheet and the sheet tabs | +| Selection model | The active cell, a range and several ranges are exposed through `aria-selected`, and the extent of a range is announced. The selection can be turned off with the [`selection`](api/spreadsheet_selection_config.md) option | +| Read-only mode | The sheet can be navigated, selected, copied and searched; edits are refused and announced | +| Screen readers | Tested with NVDA, JAWS and VoiceOver | +| Visual accessibility | The `contrast-light` and `contrast-dark` themes, a visible focus indicator in every theme, and cues that don't depend on color | +| Text resize and zoom | The layout stays operable at 200% and 400% zoom and with text spacing overrides | +| Customization | The public [`announce()`](api/spreadsheet_announce_method.md) method for your own messages, and translatable `aria_*` locale strings for every built-in name and announcement | +| Standards | WCAG 2.2 AA, Section 508, EN 301 549 | + +Use this page to check the component against your accessibility checklist and to configure the Spreadsheet for an accessible deployment. + +## Covered areas + +This guide covers the Spreadsheet widget: + +- the cells, the column and row headers, merged cells and frozen rows and columns +- the selection: the active cell, ranges and several ranges +- the formula bar and the cell editors, including the editor of a cell with a list of values +- the toolbar with its color and border popups, the menu bar and the context menus +- the sheet tabs +- sorting, filtering, search, data validation, links in cells, import and export +- the themes and the focus indicator + +The accessibility of the final page also depends on the host application. See [Host-page responsibilities](#host-page-responsibilities). + +## WAI-ARIA support + +WAI-ARIA roles and attributes are added to the markup automatically and can't be turned off. Each part of the widget is exposed with its own role and name, and the names come from the [locale](#localization). + +### Spreadsheet container + +The parts of the Spreadsheet are separate named controls: + +| Part | Role / attribute | Accessible name | +| ---- | ---------------- | --------------- | +| Menu bar | `role="menubar"` + `aria-label` | "Main" | +| Toolbar | `role="toolbar"` + `aria-label` | "Formatting" | +| Formula bar | `aria-label` on the input | "Formula bar, B7", with the address of the active cell | +| Cells | `role="grid"` + `aria-label` | "Spreadsheet" | +| Sheet tabs | `role="toolbar"` + `aria-label` | "Sheets" | +| Live region | `role="status"`, `aria-live="polite"`, `aria-atomic="true"` | visually hidden, placed next to the grid outside `role="grid"` | + +The root element of the Spreadsheet has no landmark role, so you can place it inside the landmark that fits your page. + +### Cell surface + +The following attributes describe the cells as a whole. They are set on the `.dhx_grid-content` element: + +| Selector | Role / attribute | Purpose | +| -------- | ---------------- | ------- | +| `.dhx_grid-content` | `role="grid"` | The interactive grid of cells | +| `.dhx_grid-content` | `aria-label` | "Spreadsheet", from the `aria_grid` locale key | +| `.dhx_grid-content` | `aria-rowcount` | The number of rows of the sheet plus the header row | +| `.dhx_grid-content` | `aria-colcount` | The number of visible columns plus the column of row numbers | +| `.dhx_grid-content` | `aria-readonly` | `"true"` in the [read-only mode](api/spreadsheet_readonly_config.md) and while the [selection](api/spreadsheet_selection_config.md) is turned off | +| `.dhx_grid-content` | `aria-multiselectable` | `"true"`; `"false"` while the selection is turned off | + +### Rows and cells + +The following table lists the roles and the position and state attributes of the rows and the cells: + +| Selector | Role / attribute | Purpose | +| -------- | ---------------- | ------- | +| Row | `role="row"` + `aria-rowindex` | A row of the sheet. Row 1 of the sheet has `aria-rowindex="2"`, since the column header is the first row | +| Cell | `role="gridcell"` + `aria-colindex` | A cell. Column A has `aria-colindex="2"`, since the row numbers are the first column | +| Row number | `role="rowheader"` | The header of the row | +| Cell | `aria-selected` | `"true"` on the active cell and on every cell of the selected ranges | +| Cell | `aria-readonly` | `"true"` in the read-only mode and on [locked cells](work_with_cells.md#locking-cells) | +| Cell | `tabindex` | `"0"` on the active cell and `"-1"` on the other cells, so the cells are one tab stop | +| Merged cell | `aria-colspan` / `aria-rowspan` | The number of columns / rows the merged cell spans. The cells it covers are hidden with `aria-hidden="true"` | +| Link in a cell | `` with `target="_blank"` and `rel="noopener noreferrer"` | A link with the `http`, `https`, `mailto`, `ftp` or `tel` scheme | + +A cell also contains visually hidden text, which screen readers read together with the value: + +| Hidden text | When | +| ----------- | ---- | +| The cell address, for example, "B7" | First, on the active cell and on the cells of a selected range | +| "link" | On a selected cell with a link. Alt + Enter opens the link | +| "locked" | On a selected locked cell | +| A description of the formula error, for example, "Reference error. Check the cell references" | On a cell with a formula error | +| "Invalid value. Choose a value from the list" | On a cell whose value is not in its [list of values](work_with_cells.md#using-drop-down-lists-in-cells) | +| "Filter" / "Filter applied" | On a cell with the filter icon | + +### Column and row headers + +| Selector | Role / attribute | Purpose | +| -------- | ---------------- | ------- | +| Column letter | `role="columnheader"` + `aria-colindex` | The header of the column | +| Select-all corner | `role="columnheader"` | Named "Select all" | +| Row number | `role="rowheader"` | The header of the row | +| Column menu icon, icons of hidden rows and columns | `aria-hidden="true"` | Decorative. The commands are in the context menu | + +The headers are not tab stops. A click on a column letter, a row number or the corner selects the lines and returns the focus to the active cell. + +### Selection + +| Part | Exposed through | +| ---- | --------------- | +| Active cell | The DOM focus, `tabindex="0"` and `aria-selected="true"` | +| Selected range | `aria-selected="true"` on every cell of the range, and an announcement of its extent, for example, "B2 to D7, 18 cells" | +| Several ranges | `aria-selected="true"` on the cells of each range. The announcement lists the ranges separated by commas | +| Selection, copy and search highlights, the fill handle | Drawn in a layer hidden with `aria-hidden="true"` | + +### Formula bar and editors + +| Selector | Role / attribute | Purpose | +| -------- | ---------------- | ------- | +| Formula bar input | `aria-label` | "Formula bar, B7", with the address of the active cell. The input is `readonly` on a locked cell, so its value can still be read | +| Cell editor input | `aria-label` | "Cell editor, B7" | +| Editor of a cell with a list of values | `role="combobox"`, `aria-controls`, `aria-expanded`, `aria-activedescendant` | The list of values is a `listbox` of `option` elements, and the highlighted option is `aria-selected` | +| Editor with an invalid value | `aria-invalid="true"` | The value is not in the list of values | +| Close icon of the formula help | `role="button"` + `aria-label` | "Close formula help" | + +### Toolbar and menus + +| Selector | Role / attribute | Purpose | +| -------- | ---------------- | ------- | +| Toolbar | `role="toolbar"` + `aria-label` | "Formatting"; the toolbars of the Border popup, the search bar and the link popup are named "Borders", "Search" and "Link" | +| Toolbar button | `aria-label` | The button value, or its tooltip for an icon button, for example, "Bold (ctrl+b)". Icons are `aria-hidden` | +| Bold, Italic, Underline, Strikethrough, Lock, Filter | `aria-pressed` | Whether the formatting or the filter is on | +| Button that opens a dropdown | `aria-haspopup="menu"`, `aria-expanded` | The dropdown is a `menu` named after its button | +| Alignment, text wrapping, number formats | `role="menuitemradio"` + `aria-checked` | One option of an exclusive set | +| Text color, Background color, Border color | `aria-label` | The name of the control and of the current color, for example, "Text color: dark gray" | +| Color palette | `role="grid"` of `gridcell` elements | Named "Color palette"; each color is named by its color name and is `aria-selected` when chosen | +| Border style list | `role="listbox"` of `option` elements | The options are named "Thin line", "Medium line", "Thick line", "Dashed line", "Dotted line", "Double line" | +| Menu bar | `role="menubar"` + `aria-label` | "Main". Its items open `menu` popups; the formatting items are `menuitemcheckbox`, the alignment and format items are `menuitemradio` | +| Context menus | `role="menu"` + `aria-label` | "Cell" for the cells and "Sheet" for the sheet tabs | + +### Sheet tabs + +| Selector | Role / attribute | Purpose | +| -------- | ---------------- | ------- | +| Sheet tab bar | `role="toolbar"` + `aria-label` | "Sheets" | +| Sheet tab | `button` + `aria-pressed` | Named by the sheet name; `aria-pressed="true"` on the active sheet | +| Add sheet button | `aria-label` | "Add sheet" | + +### Dialogs + +| Selector | Role / attribute | Purpose | +| -------- | ---------------- | ------- | +| Column width and Row height dialogs | `role="dialog"`, `aria-modal="true"`, `aria-label` | Named by the dialog title. The input is labelled "Width in pixels" / "Height in pixels" | +| Search bar, Insert link, Data validation | `role="dialog"` + `aria-label` | Named by the dialog title. The search bar buttons are named "Previous match", "Next match" and "Close search" | +| Alerts | `role="alertdialog"`, `aria-modal="true"`, `aria-labelledby`, `aria-describedby` | Named by the alert header and described by its text | + +### Hidden and decorative elements + +The lock, filter and column menu icons, the icons of hidden rows and columns, the select-all icon, the selection layer with the fill handle, the colored copy of the formula in the formula bar, and the cells covered by a merged cell are hidden from assistive technology with `aria-hidden="true"`. Layout wrappers have `role="presentation"`. The focus sentinels before and after the grid only pass the focus to the active cell. + +## Selection and editing model + +The DOM focus is on the active cell itself, so a screen reader reads the cell, not a separate input. When the active cell moves, the screen reader reads the address of the new cell first, then its value and its hidden descriptions. When a range is selected with Shift + arrow keys or with the mouse, the extent of the range is announced once the selection stops changing. + +| Situation | What the screen reader gets | +| --------- | --------------------------- | +| The active cell moves | The cell with its address, value and descriptions, for example, "B7, 120, locked" | +| A range is selected | "B2 to D7, 18 cells" | +| Several ranges are selected with Ctrl | "B2 to B4, D2 to D4, 6 cells" | +| The editor opens with Enter, F2 or typing | The editor input named "Cell editor, B7" | +| The editor of a cell with a list of values opens | A combobox with its list and the highlighted option | +| The edit is saved | New formula errors and invalid values in the edited cell and in the cells that depend on it are announced | +| An edit of a locked cell is refused | "The cell is locked" | +| An editing key is pressed in the read-only mode | "The sheet is read-only" | + +The editor is opened with Enter, F2 or by typing, and closed with Enter (save and move down), Tab (save and move right) or Esc (cancel). + +In the [read-only mode](api/spreadsheet_readonly_config.md), the cells can be navigated, selected, copied and searched. To turn the selection off completely, use the [`selection`](api/spreadsheet_selection_config.md) option. + +## Keyboard navigation + +The keyboard works as soon as the Spreadsheet is on the page; no configuration is needed. The tables below summarize the keyboard model. See [Hot keys list](hotkeys.md) for the complete set of shortcuts. + +### Cells + +| Keys | Action | +| ---- | ------ | +| Arrow keys | Move the active cell. The active cell stops at the first and last visible row and column | +| Shift + arrow keys | Extend the selected range | +| Home / End | Move to the first / last visible cell of the row | +| Ctrl + arrow keys, Ctrl + Home / End | Move to the edge of the sheet | +| Tab / Shift + Tab | Move right / left within the row. From the last / first cell of the sheet, move the focus out of the Spreadsheet | +| Enter, F2 | Open the editor | +| Esc | Close the editor without saving | +| Ctrl + Space / Shift + Space | Select the column / the row | +| Ctrl + Shift + 9 / 0 | Show the hidden rows / columns inside the selected range | +| Alt + Enter | Open the link of the active cell | +| Shift + F10 or the Menu key | Open the context menu with the commands for the cell, or for the column after Ctrl + Space | +| Alt + ↑ / ↓, Ctrl + Alt + Page Down / Page Up | Switch to the next / previous sheet | + +### Moving between the parts + +| Keys | Action | +| ---- | ------ | +| Ctrl + F6 / Ctrl + Shift + F6 | Move the focus to the next / previous part: the menu, the toolbar, the sheet, the sheet tabs. An open edit is saved first | +| Tab / Shift + Tab | Move the focus to the next / previous part in the page tab order. Each bar is one tab stop, and the focus lands on the control used last | + +### Toolbar, menu bar and sheet tabs + +| Keys | Action | +| ---- | ------ | +| ← / →, Home / End | Move between the controls of the bar | +| Enter / Space | Press the control: run the command, open the dropdown or switch to the sheet | +| ↓ | Open the dropdown and move the focus to its first item | +| ↑ / ↓ | Move between the items of an open dropdown or menu | +| → / ← | Open / close a submenu | +| Esc | Close the dropdown or the menu and return the focus to its control | + +### Popups and dialogs + +| Keys | Action | +| ---- | ------ | +| Arrow keys, Home / End | Move between the colors of the color palette | +| Enter | Apply the color, the border, or the size in the Column width and Row height dialogs | +| Esc | Close the popup, the dialog or the search bar and return the focus to the control or the cell that opened it | +| Tab / Shift + Tab | Move between the controls of a dialog; in a color popup, close it and return the focus to its button | +| ↑ / ↓, Enter | Move through the list of values of a cell and choose a value | + +:::note +The commands that are performed by dragging have keyboard alternatives. The column width and the row height are set with the *Column width* and *Row height* commands of the context menu. A filter is opened with the *Open filter* command. Hidden rows and columns are shown with Ctrl + Shift + 9 / 0 or with the *Show rows* / *Show columns* commands. +::: + +## Assistive technology + +DHTMLX Spreadsheet is tested with the following assistive technologies: + +| Screen reader | Browser | Platform | +| ------------- | ------- | -------- | +| NVDA | Firefox | Windows | +| JAWS | Chrome | Windows | +| VoiceOver | Safari | macOS | + +The state of the Spreadsheet travels on the element it belongs to: + +| State | Exposed through | Read on | +| ----- | --------------- | ------- | +| Position | `aria-rowindex`, `aria-colindex`, and the cell address in the cell text | Each cell | +| Selection | `aria-selected` | The active cell and the cells of the selected ranges | +| Editability | `aria-readonly` | The grid in the read-only mode, and locked cells | +| Merged cells | `aria-colspan`, `aria-rowspan` | The merged cell | +| Row headers | `role="rowheader"` | The row numbers | +| Toggle state | `aria-pressed` | The formatting buttons and the sheet tabs | +| Exclusive options | `aria-checked` | The alignment, wrapping and number format items | +| Errors and invalid values | Hidden text in the cell, `aria-invalid` | The cell and its editor | +| Links | `` and the hidden text "link" | The cell with a link | + +## High contrast and focus + +### Themes + +The Spreadsheet has four built-in themes: `light` (default), `dark`, `contrast-light` and `contrast-dark`. The `contrast-light` and `contrast-dark` themes meet the WCAG AA contrast of text. Switch a theme with the `dhx.setTheme()` method or with the `data-dhx-theme` attribute: + +~~~jsx +dhx.setTheme("contrast-light"); // or "contrast-dark" +~~~ + +See the [Built-in themes](themes/themes.md) article for the details. + +In the light themes, the colors that mark the cell references of a formula have a contrast of at least 4.5:1. + +### Focus indicator + +The keyboard focus is shown in every theme: + +- the active cell has a 2px solid border in the primary color of the theme +- a cell and the cell editor that have the keyboard focus get a 2px outline in the primary color of the theme +- the formula bar and the controls of the toolbar, the menu bar and the sheet tabs get a 2px outline in the color of the `--dhx-spreadsheet-focus-color` variable + +The `--dhx-spreadsheet-focus-color` variable is lighter than the primary color in the dark themes and can be redefined in a [custom theme](themes/custom_theme.md). The contrast of each indicator in each theme is given in the [Accessibility Conformance Report](accessibility_conformance_report.md). + +### Color and zoom + +- **Color is not the only signal.** The active cell and the selection have a border and a fill, an invalid value has a marker and a hidden description, and the formatting buttons report their state through `aria-pressed`. The color buttons have the name of the color in their accessible name. +- **Zoom and reflow.** The Spreadsheet stays operable at 200% and 400% zoom. The cells scroll in two directions, and the toolbar, the menu bar and the sheet tabs fit a width of 320 CSS px. +- **Text spacing.** With the WCAG text spacing overrides, no control label is cut, and the sheet tab bar scrolls when the tabs grow. +- **Scrolling into view.** The active cell is scrolled into view next to the frozen rows and columns. + +## Status announcements + +The Spreadsheet announces the changes that have no element of their own through a polite live region, so the screen reader finishes the current sentence first: + +| Event | Announced text | Locale key | +| ----- | -------------- | ---------- | +| A range is selected | "B2 to D7, 18 cells" | `aria_selectedRange`, `aria_rangeExtent`, `aria_rangeSeparator` | +| An edit causes a formula error or an invalid value | "B7: Reference error. Check the cell references" | `aria_cellMessage` | +| An edit causes several errors / invalid values | "3 new errors. B7: ..." / "3 invalid values. B7: ..." | `aria_newErrors`, `aria_invalidValues` | +| An edit of a locked cell / range is refused | "The cell is locked" / "Locked cells were not changed" | `aria_lockedCell`, `aria_lockedCells` | +| An editing key is pressed in the read-only mode | "The sheet is read-only" | `aria_readonlySheet` | +| The search text changes | "Results: 5." and the first match | `aria_searchResults`, `aria_searchNoResults` | +| The next or previous match is shown | "2 of 5, B7" | `aria_searchMatch` | +| A file is exported | "Exporting the file", "The file is exported" | `aria_exportStarted`, `aria_exportDone` | +| A file is imported | "Importing the file", "The file is imported" | `aria_importStarted`, `aria_importDone` | +| The Column width / Row height command is applied | "Column width set to 120 pixels" | `aria_columnWidthSet`, `aria_rowHeightSet` | +| Ctrl + Shift + 9 / 0 finds nothing to show | "No hidden rows in the selection" | `aria_noHiddenRows`, `aria_noHiddenCols` | + +To announce the result of your own command, call the [`announce()`](api/spreadsheet_announce_method.md) method: + +~~~jsx +spreadsheet.announce("The report is saved"); +~~~ + +## Localization + +The accessible names, the cell descriptions and the announcements are stored in the `spreadsheet` locale as keys with the `aria_` prefix, next to the interface labels. Translate them with the `dhx.i18n.setLocale()` method before the Spreadsheet is initialized: + +~~~jsx +dhx.i18n.setLocale("spreadsheet", { + // other keys of the locale + aria_grid: "Tabelle", + aria_cellEditor: "Zelleneditor, {cell}", + aria_readonlySheet: "Das Blatt ist schreibgeschützt", + aria_selectedRange: "{range}, {count} Zellen", + aria_rangeExtent: "{start} bis {end}" +}); + +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); +~~~ + +The parts in curly braces, such as `{cell}` or `{count}`, are replaced with the values and must be kept in the translated strings. The names of the colors, the dialogs and the alert buttons come from the `colorpicker`, `window` and `message` locales. See [Localization](localization.md#default-locale) for the full list of keys and [Localizing built-in widgets](localization.md#localizing-built-in-widgets) for the other locales. + +## Configuration recipes + +### Accessible default setup + +The Spreadsheet is accessible by default. For WCAG AA contrast of text, select a contrast theme: + +~~~jsx +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { + // the keyboard navigation and the WAI-ARIA output need no configuration +}); +spreadsheet.parse(data); + +dhx.setTheme("contrast-light"); // or "contrast-dark" +~~~ + +### Read-only setup + +A read-only Spreadsheet can still be navigated and read with a screen reader: + +~~~jsx +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { + readonly: true +}); +spreadsheet.parse(data); +~~~ + +To show the data without an active cell and without selection, add `selection: false`. In this case, the grid is one tab stop that the keyboard passes through. + +### Translated accessibility strings + +~~~jsx +dhx.i18n.setLocale("spreadsheet", deSpreadsheet); // includes the aria_* keys +dhx.i18n.setLocale("colorpicker", deColorpicker); // the color names +dhx.i18n.setLocale("message", deMessage); // the alert buttons + +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); +~~~ + +### Announcing a custom command + +~~~jsx +spreadsheet.menu.data.add({ id: "save", value: "Save" }); + +spreadsheet.menu.events.on("click", function (id) { + if (id === "save") { + saveToServer(spreadsheet.serialize()); + spreadsheet.announce("The spreadsheet is saved"); + } +}); +~~~ + +## Host-page responsibilities + +A few requirements live at the page level, not inside the component. Make sure that the host page: + +- sets the document language, for example, ``, and a page title +- puts a heading above the Spreadsheet and places it inside a landmark, for example, `
` +- provides a skip link, if the Spreadsheet is preceded by a long navigation +- gives a second signal, such as text or an icon, to any state that you mark with a cell color, since the colors of the cell styles are part of your data +- checks the contrast of the colors that you set in the cell styles and in a custom theme + +## Testing and methodology + +Accessibility of DHTMLX Spreadsheet 6.0.4 is validated against the component source and in the browser: + +1. **Automated testing** with [axe-core](https://github.com/dequelabs/axe-core) in the `light`, `dark`, `contrast-light` and `contrast-dark` themes, with the search bar, the list editor, the dialogs and an alert open. +2. **Manual review** of the source: the roles, states and names of each part, the keyboard handlers and the focus regions, and the theme tokens with their contrast ratios. +3. **Manual testing**: keyboard-only walkthroughs of the cells, the bars, the menus and the dialogs, screen reader passes with NVDA, JAWS and VoiceOver, 200% and 400% zoom, reflow at 320 CSS px and WCAG text spacing overrides. +4. **Conformance reporting**: the results are published criterion by criterion in the [Accessibility Conformance Report](accessibility_conformance_report.md), including the criteria that the Spreadsheet partially supports. + +## Resources + +- [Accessibility Conformance Report (VPAT 2.5)](accessibility_conformance_report.md) +- [Hot keys list](hotkeys.md) +- [`readonly`](api/spreadsheet_readonly_config.md) +- [`selection`](api/spreadsheet_selection_config.md) +- [`announce()`](api/spreadsheet_announce_method.md) +- [Localization](localization.md) +- [Built-in themes](themes/themes.md) +- [WCAG 2.2](https://www.w3.org/TR/WCAG22/) +- [WAI-ARIA 1.2](https://www.w3.org/TR/wai-aria-1.2/) +- [WAI-ARIA Authoring Practices: Grid pattern](https://www.w3.org/WAI/ARIA/apg/patterns/grid/) +- [WAI-ARIA Authoring Practices: Toolbar pattern](https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/) From 3d04db44c86fc423d372f83cbd28ffbc3fbd2114 Mon Sep 17 00:00:00 2001 From: Sorokin-Oleg Date: Tue, 20 Oct 2026 16:21:23 +0300 Subject: [PATCH 10/32] [add] accessibility guide and conformance report (VPAT 2.5 INT) as a separate sidebar section --- docs/accessibility_conformance_report.md | 215 +++++++++++++++++++++++ sidebars.js | 13 ++ 2 files changed, 228 insertions(+) create mode 100644 docs/accessibility_conformance_report.md diff --git a/docs/accessibility_conformance_report.md b/docs/accessibility_conformance_report.md new file mode 100644 index 00000000..763cd12c --- /dev/null +++ b/docs/accessibility_conformance_report.md @@ -0,0 +1,215 @@ +--- +sidebar_label: Accessibility Conformance Report +title: Accessibility Conformance Report +description: You can learn about the accessibility conformance report in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +--- + +# Accessibility Conformance Report + +This report documents how DHTMLX Spreadsheet conforms to the major accessibility standards. It follows the **VPAT® 2.5 (International Edition)** structure, so you can map it directly against your own procurement or compliance checklist. For a task-oriented overview of the accessibility features and how to configure them, see the [Accessibility](accessibility.md) guide. + +**Name of Product/Version:** + +**Report Date:** + +**Product Description:** DHTMLX Spreadsheet is a JavaScript spreadsheet component for web applications. It renders a menu bar, a toolbar, a formula bar, a grid of cells with column and row headers, and sheet tabs, and supports formulas, cell formatting, merged cells, frozen rows and columns, sorting, filtering, search, data validation, links in cells, and import and export of Excel files. It is embedded by a host web application. + +**Contact Information:** + +## Notes + +- This report evaluates DHTMLX Spreadsheet in its **recommended accessibility configuration**: the default configuration, with the WAI-ARIA output and the keyboard navigation that are always on, and an AA-conformant color scheme selected through `dhx.setTheme("contrast-light")` / `dhx.setTheme("contrast-dark")` or the equivalent `data-dhx-theme` attribute. Where a conformance level depends on this configuration, the Remarks say so. See the [Accessibility](accessibility.md) guide for setup instructions. +- DHTMLX Spreadsheet is **web content** rendered by a host application. Page-level responsibilities (the page title, ``, skip/bypass mechanisms, and site-wide navigation) belong to the host application and are reported as *Not Applicable* with an explanation. +- In the WCAG tables, only the **Web** response is populated. The *Electronic Docs*, *Software*, *Closed*, and *Authoring Tool* rows are *Not Applicable*: the product is not standalone (non-web) software, closed functionality, an authoring tool, or a piece of electronic documentation. +- Colors that an author applies to cells through cell styles are part of the document data and are not evaluated as part of the product. + +**Evaluation Methods Used:** Testing was performed using a combination of automated testing (axe-core in the `light`, `dark`, `contrast-light` and `contrast-dark` themes, with the search bar, the list editor, the dialogs and an alert open), manual code review of the component source and stylesheets (the roles and ARIA attributes emitted per part of the widget, the keyboard handlers and focus regions, the accessible names and their locale keys, and the theme color tokens, with contrast ratios computed from those tokens for the four themes), assistive-technology testing (manual passes with **NVDA + Firefox** and **JAWS + Chrome** on Windows and **VoiceOver + Safari** on macOS; versions: ), and browser overrides (200% / 400% zoom, reflow at 320 CSS px, and WCAG text-spacing overrides). + +## Applicable standards / guidelines + +| Standard / Guideline | Included in report | +|---|---| +| Web Content Accessibility Guidelines 2.0 | Level A (No) · Level AA (No) · Level AAA (No) | +| Web Content Accessibility Guidelines 2.1 | Level A (No) · Level AA (No) · Level AAA (No) | +| Web Content Accessibility Guidelines 2.2 | Level A (**Yes**) · Level AA (**Yes**) · Level AAA (No) | +| Revised Section 508 standards (published Jan 18, 2017; corrected Jan 22, 2018) | (**Yes**) | +| EN 301 549 - V3.1.1 (2019-11) and V3.2.1 (2021-03) | (**Yes**) | + +*WCAG 2.0 and 2.1 are not reported separately. Criteria that WCAG marks "2.1 and 2.2" are answered because +they are part of WCAG 2.2 and are referenced by EN 301 549.* + +## Terms + +- **Supports:** The functionality of the product has at least one method that meets the criterion without + known defects, or meets with equivalent facilitation. +- **Partially Supports:** Some functionality of the product does not meet the criterion. +- **Does Not Support:** The majority of product functionality does not meet the criterion. +- **Not Applicable:** The criterion is not relevant to the product. + +## WCAG 2.x report + +DHTMLX Spreadsheet is web content, so only the **Web** response is populated below. "Requires an AA-conformant +theme" is a configuration dependency, not a defect. Criterion 4.1.1 Parsing is removed in WCAG 2.2 and is not reported. + +### Table 1: Success Criteria, Level A + +| Criteria | Conformance level | Remarks and explanations | +|---|---|---| +| **1.1.1** Non-text Content | Supports | Icons are font glyphs. Icon-only controls take their accessible name from the locale or from their tooltip, for example "Add sheet", "Close search" and "Select all". The color buttons carry the name of the color, for example "Text color: dark gray". Decorative icons (lock, filter, column menu, hidden-line markers), the selection layer and the cells covered by a merged cell are hidden with `aria-hidden="true"`; the state they show is carried by text in the cell, such as "locked" and "Filter applied". | +| **1.2.1** Audio-only and Video-only (Prerecorded) | Not Applicable | The product contains no audio or video content. | +| **1.2.2** Captions (Prerecorded) | Not Applicable | No prerecorded multimedia. | +| **1.2.3** Audio Description or Media Alternative (Prerecorded) | Not Applicable | No prerecorded multimedia. | +| **1.3.1** Info and Relationships | Supports | The cells are a `grid` named "Spreadsheet" with `row`, `columnheader`, `rowheader` and `gridcell` roles. Position is exposed with `aria-rowindex`/`aria-colindex` against `aria-rowcount`/`aria-colcount`; the extent of a merged cell with `aria-colspan`/`aria-rowspan`; editability with `aria-readonly`; selection with `aria-selected` and `aria-multiselectable`. The toolbar, the menu bar and the sheet tabs are `toolbar` and `menubar` elements with names; exclusive formatting options are `menuitemradio` with `aria-checked`. | +| **1.3.2** Meaningful Sequence | Supports | DOM and reading order follow the visual order: the menu bar, the toolbar, the formula bar, the cells and the sheet tabs. The cells carry their position in the sheet through `aria-rowindex`/`aria-colindex`, so the sequence is preserved when rows and columns are scrolled out of the DOM. | +| **1.3.3** Sensory Characteristics | Supports | No instruction or label relies solely on shape, size, or spatial location; interactive elements carry text or an ARIA name. | +| **1.4.1** Use of Color | Supports | Color is never the only signal. The active cell, the selected range, search matches, the copied range and invalid cells each have a border, a fill, a marker or a shape, together with `aria-selected` or text in the cell. Rows hidden by a filter leave a gap in the row numbers. The color buttons show the color itself and carry its name in the accessible name. | +| **1.4.2** Audio Control | Not Applicable | The product produces no auto-playing audio. | +| **2.1.1** Keyboard | Supports | Every command on the cells has a key: the arrow keys, `Home`/`End`, `Ctrl`+arrows and `Tab` move the active cell, `Shift` combinations extend the selection, `Enter`/`F2` and typing open the editor, `Esc` cancels, `Ctrl`+`Shift`+`9`/`0` show hidden rows and columns, `Alt`+`Enter` opens a link, and `Shift`+`F10` or the Menu key opens the context menu. `Ctrl`+`F6` moves the focus between the menu, the toolbar, the sheet and the sheet tabs; the bars are navigated with the arrow keys, `Home` and `End`, and their dropdowns and popups open and close from the keyboard. The column width, the row height and the column filter have context menu commands. In the list editor the arrow keys move through the options, `Enter` writes the highlighted one and `Esc` cancels the edit. | +| **2.1.2** No Keyboard Trap | Supports | `Tab` on the last cell and `Shift`+`Tab` on the first cell of the sheet move the focus out of the Spreadsheet, and `Ctrl`+`F6` moves it between the parts at any time. In the list editor `Tab` ends the edit and `Esc` cancels it, also after the arrow keys were used. `Esc` and `Tab` close the toolbar popups and return the focus to their buttons. | +| **2.1.4** Character Key Shortcuts | Supports | Every shortcut uses a modifier key (`Ctrl`, `Alt`, `Shift`) or a non-character key (`F2`, `F6`, `F10`, `F11`, `Enter`, `Esc`, `Delete`, arrows). Typing a character on a cell enters it into the cell, which is the purpose of the cell, and doesn't run a command. | +| **2.2.1** Timing Adjustable | Not Applicable | The product sets no time limits. | +| **2.2.2** Pause, Stop, Hide | Supports | There is no auto-updating, moving, blinking or scrolling content. No animation lasts more than 5 seconds. | +| **2.3.1** Three Flashes or Below Threshold | Supports | The product contains no flashing content. | +| **2.4.1** Bypass Blocks | Not Applicable | Applies at page level; bypass mechanisms belong to the host application. | +| **2.4.2** Page Titled | Not Applicable | Page titles are the host application's responsibility. | +| **2.4.3** Focus Order | Supports | The cells are one tab stop on the active cell, and the toolbar, the menu bar and the sheet tabs are one tab stop each, in visual order. `Tab` leaves the sheet at the last and the first cell. Dialogs take the focus, keep `Tab` inside, and return the focus to the active cell when they close; menus, context menus and popups return the focus to the control that opened them. The active cell is scrolled into view when it receives the focus. | +| **2.4.4** Link Purpose (In Context) | Supports | A link in a cell is rendered as an `` element whose text is the link text set by the author, or the address. The cell text adds "link" when the cell is selected, and `Alt`+`Enter` opens it. | +| **2.5.1** Pointer Gestures | Supports | No operation requires a multipoint or path-based gesture; every drag operation has a non-drag alternative (see 2.5.7). | +| **2.5.2** Pointer Cancellation | Supports | Column and row resizing and the fill handle apply on release, and one undo reverts each of them. Commands of the toolbar, the menus and the sheet tabs run on `click`. | +| **2.5.3** Label in Name | Supports | Controls with visible text take that text as their accessible name: the menu items, the context menu commands, the sheet tabs and the dialog buttons. Icon buttons are named by their tooltip, and the color buttons by their tooltip followed by the color name. | +| **2.5.4** Motion Actuation | Not Applicable | No functionality is operated by device motion or user motion. | +| **3.1.1** Language of Page | Not Applicable | The document language (``) is set by the host application. | +| **3.2.1** On Focus | Supports | Receiving focus never changes context. A click on a column letter, a row number or the corner selects the lines and keeps the focus on the active cell. | +| **3.2.2** On Input | Supports | Changing a value does not change context. Editing a cell, choosing a value from a list or typing in the search bar updates the sheet in place, which is the documented purpose of those controls. | +| **3.2.6** Consistent Help (2.2 only) | Not Applicable | The widget provides no help mechanism; this is a page-level concern. | +| **3.3.1** Error Identification | Supports | Formula errors and invalid list values are described in the cell content, for example "Reference error. Check the cell references" and "Invalid value. Choose a value from the list". New errors caused by an edit are announced through the live region, and the editor of an invalid value has `aria-invalid="true"`. | +| **3.3.2** Labels or Instructions | Supports | The cell editor is named "Cell editor, B7" and the formula bar "Formula bar, B7", with the address of the edited cell. The dialog fields are labelled, for example "Width in pixels", and the search bar buttons are named "Previous match", "Next match" and "Close search". | +| **3.3.7** Redundant Entry (2.2 only) | Supports | The product contains no multi-step process that asks for information already entered. | +| **4.1.2** Name, Role, Value | Supports | Every structural and interactive part exposes a role, its states and an accessible name: the cells (`grid`, `row`, `gridcell`, `columnheader`, `rowheader`, `aria-selected`, `aria-readonly`), the toolbars and the menu bar (`toolbar`, `menubar`, named from the locale), the formatting buttons (`aria-pressed`), the exclusive formats (`menuitemradio` with `aria-checked`), and the sheet tabs (the active tab is `aria-pressed="true"`). Alerts are `role="alertdialog"` with `aria-modal="true"` and a name. The list editor is a `combobox` that controls a `listbox`, with `aria-expanded` and `aria-activedescendant` on the highlighted option. | + +### Table 2: Success Criteria, Level AA + +| Criteria | Conformance level | Remarks and explanations | +|---|---|---| +| **1.2.4** Captions (Live) | Not Applicable | No live multimedia. | +| **1.2.5** Audio Description (Prerecorded) | Not Applicable | No prerecorded video. | +| **1.3.4** Orientation | Supports | Content is not restricted to a single display orientation. | +| **1.3.5** Identify Input Purpose | Not Applicable | The product's editors collect document data, not the user's own personal information covered by the WCAG input-purpose list. | +| **1.4.3** Contrast (Minimum) | Supports | The `contrast-light` and `contrast-dark` themes meet AA: no product text is below 4.5:1 in either theme, with the search bar, the list editor, the column width dialog and an alert open. The formula reference colors are 4.59:1 to 7.04:1 in the light and `contrast-light` themes, and 7.62:1 to 12.26:1 in the dark themes. In the default light theme, secondary text such as dialog field labels and alert text is about 3.95:1. Meeting the criterion requires selecting one of the contrast themes, and one supported method meets it. | +| **1.4.4** Resize Text | Supports | Text can be resized to 200% without loss of content or functionality; the toolbar, the formula bar, the sheet tabs and the dialogs remain usable. | +| **1.4.5** Images of Text | Supports | All text is rendered as real text. Icons are font glyphs; the product uses no raster images. | +| **1.4.10** Reflow | Supports | The cells are two-dimensional content, which the criterion exempts from reflow, and scroll both horizontally and vertically. The toolbar, the menu bar and the sheet tabs fit a width of 320 CSS px. | +| **1.4.11** Non-text Contrast | Supports | The focus indicators are 2px wide and drawn in theme colors; the ratios below are given for the default light, `contrast-light`, dark and `contrast-dark` themes. The active cell is marked by a 2px solid border in `--dhx-color-primary`: about 3.9:1, 7.7:1, 3.4:1 and 5.3:1 against the cell background. The cell and the cell editor that have the keyboard focus get a 2px outline in the same color, with the same ratios, and about 3.3:1, 6.0:1, 3.1:1 and 4.2:1 inside a selected range. The formula bar gets a 2px outline in `--dhx-spreadsheet-focus-color`: about 3.9:1, 7.7:1, 5.3:1 and 6.5:1 against its background. The controls of the toolbar, the menu bar and the sheet tabs get the same outline: about 3.7:1, 7.2:1, 3.9:1 and 4.9:1 against the bar background. All values are above the 3:1 requirement. | +| **1.4.12** Text Spacing | Supports | With the WCAG text-spacing overrides applied, no control label is cut; the sheet tab bar scrolls when the tabs grow. | +| **1.4.13** Content on Hover or Focus | Supports | Toolbar tooltips stay open while hovered and are dismissed with `Esc` without moving the pointer or the focus. The invalid-value tooltip reports an input error, stays while the cell is active, and is removed with `Esc`. | +| **2.4.5** Multiple Ways | Not Applicable | Applies to locating pages within a set of web pages; out of scope for a single embedded component (host-application concern). | +| **2.4.6** Headings and Labels | Supports | The grid, the toolbars, the menu bar, the context menus, the sheet tab bar and the formula bar are named from the locale, for example "Spreadsheet", "Formatting", "Main", "Cell" and "Sheets". The select-all corner is named "Select all", and the dialogs are named by their titles. | +| **2.4.7** Focus Visible | Supports | The keyboard focus location is visible at all times. The active cell carries a persistent 2px solid border, and the cell or the cell editor that has the keyboard focus a 2px outline in the theme primary color. The formula bar and the controls of the toolbar, the menu bar, the sheet tabs, the search bar and the toolbar popups show a 2px focus ring in the `--dhx-spreadsheet-focus-color` color. In dropdowns, context menus and lists, the focused item is highlighted. The focus indicator is shown in every built-in theme. | +| **2.4.11** Focus Not Obscured (Minimum) (2.2 only) | Supports | The active cell is scrolled into view next to the frozen rows and columns, so it is never left behind a frozen area. | +| **2.5.7** Dragging Movements (2.2 only) | Supports | Range selection has `Shift`+arrows and `Ctrl`+`Space`/`Shift`+`Space`. Column width and row height are set with the *Column width* and *Row height* commands of the context menu, with undo. Hidden rows and columns are shown with `Ctrl`+`Shift`+`9`/`0` and the *Show rows* / *Show columns* commands. Filling cells is available through the [`groupFill`](api/spreadsheet_groupfill_event.md) event, which can be bound to a context menu command. | +| **2.5.8** Target Size (Minimum) (2.2 only) | Partially Supports | The fill handle is 12 x 12 CSS px. The column and row resizers have equivalent controls, the *Column width* and *Row height* commands. The select-all corner is the 40 x 32 CSS px corner header cell, and the toolbar and menu controls are larger than 24 x 24 CSS px. | +| **3.1.2** Language of Parts | Not Applicable | The widget does not mix languages within its content; language is host-owned. | +| **3.2.3** Consistent Navigation | Not Applicable | Applies across a set of web pages; host-application concern. | +| **3.2.4** Consistent Identification | Supports | Commands with the same function have the same names and icons in the toolbar, the menu bar and the context menu, and the same keys. | +| **3.3.3** Error Suggestion | Supports | The description of a formula error states how to correct it, for example "Check the cell references", and the description of an invalid value asks to choose a value from the list. | +| **3.3.4** Error Prevention (Legal, Financial, Data) | Supports | Every change of the data can be reverted with undo (`Ctrl`+`Z`) and repeated with redo. The host application can additionally cancel any action through the [`beforeAction`](api/spreadsheet_beforeaction_event.md) event. | +| **3.3.8** Accessible Authentication (Minimum) (2.2 only) | Not Applicable | The product performs no authentication. | +| **4.1.3** Status Messages | Supports | The Spreadsheet uses a visually hidden live region (`role="status"`, `aria-live="polite"`, `aria-atomic="true"`) outside the grid to announce changes without moving focus: the extent of a selected range once the selection settles, new formula errors and invalid values, refused edits of locked cells and of a read-only sheet, search results, the start and end of import and export, and the applied column width or row height. The same region is available to the host application through the public [`announce()`](api/spreadsheet_announce_method.md) method, and every built-in message is localizable through the `aria_*` locale keys. | + +## Revised Section 508 report + +WCAG-mapped provisions are answered in the WCAG 2.x report above and referenced here. Chapter 4 (Hardware) +is Not Applicable, because DHTMLX Spreadsheet is a software component with no hardware or physical controls. + +### Chapter 3: Functional Performance Criteria + +| Criteria | Conformance level | Remarks and explanations | +|---|---|---| +| 302.1 Without Vision | Supports | Operable with a screen reader through the `grid` model with column and row headers, the cell address and descriptions read with each cell, the named toolbars and menus, the live region, and the keyboard model. See WCAG 1.3.1, 2.1.1, 4.1.2, 4.1.3. | +| 302.2 With Limited Vision | Supports | Zoom, text resize and reflow are supported, the focus is visible in every theme, and AA contrast is met by the `contrast-light` / `contrast-dark` themes. See WCAG 1.4.3, 1.4.4, 1.4.10, 1.4.11, 2.4.7. | +| 302.3 Without Perception of Color | Supports | No information is conveyed by color alone: the active cell, the selection, search matches and invalid values each carry a border, a marker or text in the cell alongside the color, and the color buttons name the color. See WCAG 1.4.1. | +| 302.4 Without Hearing | Supports | No information is conveyed by sound. | +| 302.5 With Limited Hearing | Supports | No information is conveyed by sound. | +| 302.6 Without Speech | Supports | No speech input is required to operate the product. | +| 302.7 With Limited Manipulation | Supports | Fully keyboard-operable; no path-based gesture is required, and every drag operation has a keyboard or command alternative. See WCAG 2.1.1, 2.5.1, 2.5.7, 2.5.8. | +| 302.8 With Limited Reach and Strength | Supports | Operable by keyboard; no physical reach, force or timing requirements. | +| 302.9 With Limited Language, Cognitive, and Learning Abilities | Supports | Commands have the same names in the toolbar, the menus and the context menu, formula errors are described with a way to correct them, and every change can be reverted with undo. See WCAG 3.2.4, 3.3.3, 3.3.4. | + +### Chapter 5: Software + +| Criteria | Conformance level | Remarks and explanations | +|---|---|---| +| 501.1 Scope - Incorporation of WCAG 2.0 AA | See WCAG 2.x section | See the WCAG 2.x report above. | +| 502 Interoperability with Assistive Technology | Not Applicable | Applies to non-web (platform) software. DHTMLX Spreadsheet is web content that exposes standard DOM and ARIA to the browser accessibility tree; interoperability is covered by the WCAG results (Clause 9 / 501.1). | +| 503 Applications | Not Applicable | Applies to non-web platform software; the product is web content. | +| 504 Authoring Tools | Not Applicable | DHTMLX Spreadsheet is not an authoring tool for web content: it edits spreadsheet data, not accessibility-relevant web content. | + +### Chapter 6: Support Documentation and Services + +| Criteria | Conformance level | Remarks and explanations | +|---|---|---| +| 602.2 Accessibility and Compatibility Features | Supports | The documentation describes the product's accessibility features: the [Accessibility](accessibility.md) guide covers the WAI-ARIA model, the keyboard model, the read-only mode and the selection option, the themes and the focus indicator, the [`announce()`](api/spreadsheet_announce_method.md) API and the [localizable `aria_*` strings](accessibility.md#localization); the [Hot keys list](hotkeys.md) lists every shortcut. | +| 602.3 Electronic Support Documentation | Supports (see WCAG 2.x section) | The documentation site is delivered as web content and is maintained to meet WCAG 2.2 AA. | +| 602.4 Alternate Formats for Non-Electronic Support Documentation | Not Applicable | Documentation is delivered electronically only; there are no non-electronic (print) support documents. | +| 603.2 Information on Accessibility and Compatibility Features | Supports | The product's accessibility features are documented publicly in the [Accessibility](accessibility.md) guide and can be provided by the support channel on request. | +| 603.3 Accommodation of Communication Needs | Supports | Support is provided over a text-based email channel; users interact through their own assistive technology. | + +## EN 301 549 report + +Clause 9 (Web) maps directly to the WCAG 2.x report above and is the substantive assessment for this web +product. Telephony, video, and hardware clauses (Clauses 6, 7, 8, 13) are Not Applicable. + +### Clause 4: Functional Performance Statements + +These mirror the Section 508 Chapter 3 results (same conclusions). + +| Criteria | Conformance level | Remarks and explanations | +|---|---|---| +| 4.2.1 Usage without vision | Supports | See 508 302.1 (screen-reader operable through the grid model, the cell descriptions, the named controls, the live region and the keyboard model). | +| 4.2.2 Usage with limited vision | Supports | See 508 302.2 (AA contrast through the contrast themes, a visible focus in every theme; zoom and reflow supported). | +| 4.2.3 Usage without perception of colour | Supports | See 508 302.3 (a border, a marker or text accompanies every color cue). | +| 4.2.4 Usage without hearing | Supports | No information conveyed by sound. | +| 4.2.5 Usage with limited hearing | Supports | No information conveyed by sound. | +| 4.2.6 Usage with no or limited vocal capability | Supports | No speech input required. | +| 4.2.7 Usage with limited manipulation or strength | Supports | See 508 302.7 (keyboard-operable, no gestures, alternatives for every drag operation). | +| 4.2.8 Usage with limited reach | Supports | No physical reach requirements (software component). | +| 4.2.9 Minimize photosensitive seizure triggers | Supports | No flashing content (see WCAG 2.3.1). | +| 4.2.10 Usage with limited cognition, language or learning | Supports | See 508 302.9 (consistent command names, described errors, reversible changes). | +| 4.2.11 Privacy | Supports | Accessibility features use the same interface as everyone else; there is no separate, less-private mode. | + +### Clause 5: Generic Requirements + +**Mostly Not Applicable.** Clause 5 addresses closed functionality and hardware-style requirements. DHTMLX +Spreadsheet is open web software that works with the platform and browser assistive technology, so the +closed-functionality sub-clauses, biometrics (5.3), operable parts (5.5), and locking/toggle-control status +(5.6) are Not Applicable. Where a generic requirement is met through normal assistive-technology support, it +is covered by Clause 9 (Web) and the WCAG results. + +### Clause 9: Web + +**See the WCAG 2.x section.** Clauses 9.1.1.1-9.4.1.3 map to the WCAG 2.2 Level A/AA results in Tables 1 +and 2 above. + +### Clause 11: Software + +**Not Applicable (assessed under Clause 9).** DHTMLX Spreadsheet is web content evaluated under Clause 9 (Web); +it is not non-web software. The WCAG-mapped software provisions (11.1.1.1-11.4.1.3) are covered by the WCAG +2.x results. 11.8 (Authoring tools) is Not Applicable, because the product is not an authoring tool. + +### Clause 12: Documentation and Support Services + +| Criteria | Conformance level | Remarks and explanations | +|---|---|---| +| 12.1.1 Accessibility and compatibility features | Supports | The [Accessibility](accessibility.md) guide documents the product's accessibility features: the WAI-ARIA model, the keyboard model, the read-only mode and the selection option, the themes, the focus indicator, the [`announce()`](api/spreadsheet_announce_method.md) API and the [localizable `aria_*` strings](accessibility.md#localization). | +| 12.1.2 Accessible documentation | Supports (see WCAG 2.x section) | The documentation site is delivered as web content and is maintained to meet WCAG 2.2 AA. | +| 12.2.2 Information on accessibility and compatibility features | Supports | Accessibility features are documented publicly and can be surfaced by support on request. | +| 12.2.3 Effective communication | Supports | Support is provided over a text-based email channel; users interact through their own assistive technology. | +| 12.2.4 Accessible documentation | Supports (see WCAG 2.x section) | Same basis as 12.1.2: the documentation site is maintained to meet WCAG 2.2 AA. | + +## Legal disclaimer + +This report is provided for informational purposes only and describes the accessibility of the named +product version as of the report date. It is provided "as is", without warranty of any kind, and does not +constitute a contractual commitment or guarantee. Accessibility support may change in subsequent releases, +and results apply to the evaluated configuration. "VPAT" and "Voluntary Product Accessibility Template" are +registered service marks of the Information Technology Industry Council (ITI). diff --git a/sidebars.js b/sidebars.js index d020cbf5..74f042f0 100644 --- a/sidebars.js +++ b/sidebars.js @@ -26,6 +26,19 @@ module.exports = { "migration" ] }, + { + type: "category", + label: "Accessibility", + collapsible: true, + collapsed: true, + link: { + type: 'doc', + id: "accessibility" + }, + items: [ + "accessibility_conformance_report" + ] + }, { type: "category", label: "API", From 2a7311e4a0576ac1aad01fdf520e758e16139c76 Mon Sep 17 00:00:00 2001 From: Sorokin-Oleg Date: Tue, 20 Oct 2026 16:42:30 +0300 Subject: [PATCH 11/32] [update] condense v6.0.4 what's new and drop the 6.0.3 -> 6.0.4 migration note --- docs/migration.md | 63 ----------------------------------------------- docs/whats_new.md | 55 +++++++++-------------------------------- 2 files changed, 12 insertions(+), 106 deletions(-) diff --git a/docs/migration.md b/docs/migration.md index b5a6c5e5..27c718b3 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -6,69 +6,6 @@ description: You can learn about migration in the documentation of the DHTMLX Ja # Migration to newer versions -## 6.0.3 -> 6.0.4 - -Version 6.0.4 changes the result of several existing keys and API calls. No documented method, property, event or configuration option is removed or renamed. - -### Arrow keys stop at the edges of the sheet - -In 6.0.3, an arrow key pressed on the first or last visible row or column moved the active cell to the opposite edge of the sheet. Since 6.0.4, the active cell stays at the edge. If a range is selected, an arrow key at the edge collapses the range to the active cell. - -### deleteRow() and deleteColumn() delete the whole merged cell - -In 6.0.3, [`deleteRow()`](api/spreadsheet_deleterow_method.md) and [`deleteColumn()`](api/spreadsheet_deletecolumn_method.md) deleted only the row or column of the passed cell, even if the cell was inside a merged cell. Since 6.0.4, they delete every row or column that the merged cell spans: - -~~~jsx -spreadsheet.mergeCells("B2:B4"); - -spreadsheet.deleteRow("B3"); -// 6.0.3: row 3 is deleted -// 6.0.4: rows 2, 3 and 4 are deleted -~~~ - -The [`beforeAction`](api/spreadsheet_beforeaction_event.md) and [`afterAction`](api/spreadsheet_afteraction_event.md) handlers of the `deleteRow` and `deleteColumn` actions still receive the cell that was passed to the method, not the range that is deleted. The context menu shows the full range in the command name. - -### Read-only mode keeps navigation and selection - -In 6.0.3, a Spreadsheet with [`readonly: true`](api/spreadsheet_readonly_config.md) had no keyboard navigation, no mouse selection and no active cell. Since 6.0.4: - -- the A1 cell is active after loading, and the cells can be navigated with the keyboard and selected with the mouse; the selection events fire on these actions; -- the cells can be copied and searched; -- editing keys, typing and paste are refused and announced to screen readers as "The sheet is read-only"; -- the fill handle is hidden, and a double-click on a column border does not change the column width. - -To keep the 6.0.3 behaviour, turn the selection off with the new `selection` option: - -~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { - readonly: true, - selection: false, -}); -~~~ - -The selection can also be turned off and on at runtime with `spreadsheet.selection.disable()` and `spreadsheet.selection.enable()`. - -### The keyboard focus follows the active cell - -Since 6.0.4, [`selection.setFocusedCell()`](api/selection_setfocusedcell_method.md) and any other change of the active cell (keyboard, undo, a sheet switch) move the keyboard focus to the cell after the redraw, if the focus is on the page body or inside the Spreadsheet. The focus is not moved when it is: - -- in an element outside the Spreadsheet; -- on the toolbar, the menu or the sheet tabs reached with the keyboard; -- in an open cell editor. - -~~~jsx -// the focus is on the page body, for example right after the page is loaded -spreadsheet.selection.setFocusedCell("D4"); -// 6.0.3: the focus stays on the page body -// 6.0.4: the focus moves to the D4 cell -~~~ - -### Cell shortcuts do not act while the toolbar, the menu or the sheet tabs have focus - -In 6.0.3, the arrow keys and typing acted on the cells while the toolbar had focus. Since 6.0.4, the toolbar, the menu and the sheet tabs use the arrow keys, `Home`, `End`, `Enter` and `Space` for their own controls, and the cell shortcuts (navigation, typing, `Delete`, `Enter`, `F2` and the like) work only while the focus is in the cells or in the formula bar. - -The formatting, undo, search and link shortcuts (`Ctrl (Cmd) + B`, `Ctrl (Cmd) + Z`, `Ctrl (Cmd) + F`, `Ctrl (Cmd) + K` and the like) still work while the focus is on the toolbar. - ## 5.2 -> 6.0 ### Deprecated properties diff --git a/docs/whats_new.md b/docs/whats_new.md index a87be64b..cf88e00d 100644 --- a/docs/whats_new.md +++ b/docs/whats_new.md @@ -12,54 +12,23 @@ If you are updating Spreadsheet from an older version, check [Migration to Newer Released on -### Behaviour changes - -Some existing keys and API calls give a different result. No documented method, property, event or configuration option is removed or renamed. Check the [Migration guide](migration.md#603---604) for details. - -- The arrow keys stop at the first and last visible row and column instead of moving the active cell to the opposite edge of the sheet. At the edge, an arrow key collapses a selected range to the active cell -- The [`deleteRow()`](api/spreadsheet_deleterow_method.md) and [`deleteColumn()`](api/spreadsheet_deletecolumn_method.md) methods called for a cell inside a merged cell delete every row or column of the merge. The `beforeAction` / `afterAction` handlers still receive the original cell -- A Spreadsheet with [`readonly: true`](api/spreadsheet_readonly_config.md) can be navigated with the keyboard, selected with the mouse, copied and searched, so the selection events fire on user actions. Edits are refused and announced to screen readers. To keep the 6.0.3 behaviour, set `selection: false` -- The [`selection.setFocusedCell()`](api/selection_setfocusedcell_method.md) method and any other change of the active cell move the keyboard focus to the cell when the focus is on the page body or inside the Spreadsheet. The focus stays on the toolbar, the menu or the sheet tabs reached with the keyboard, and in an open cell editor -- Cell shortcuts (the arrow keys, typing, `Delete`, `Enter` and the like) don't act on the cells while the toolbar, the menu or the sheet tabs have focus. The formatting, undo, search and link shortcuts still work on the toolbar - ### New functionality -- The ability to turn the selection off and on: - - new configuration property: `selection` - - new methods of the selection module: `selection.enable()`, `selection.disable()`, `selection.isDisabled()` -- The `announce()` method sends a status message to screen readers through a live region -- New commands of the [context menu](customization.md#context-menu): - - *Column width* and *Row height* set an exact size of the selected columns or rows in pixels, with undo - - *Open filter* opens the filter of the active cell from the keyboard +- Accessibility support that targets WCAG 2.2 AA, Section 508 and EN 301 549: keyboard operation of every part of the Spreadsheet, screen reader support and a visible focus in every theme. Check the [Accessibility](accessibility.md) guide and the [Accessibility Conformance Report](accessibility_conformance_report.md) +- The ability to turn the selection of cells off and on: + - new configuration property: [`selection`](api/spreadsheet_selection_config.md) + - new methods of the selection module: [`enable()`](api/selection_enable_method.md), [`disable()`](api/selection_disable_method.md), [`isDisabled()`](api/selection_isdisabled_method.md) +- The [`announce()`](api/spreadsheet_announce_method.md) method sends a status message to screen readers +- New commands of the [context menu](customization.md#context-menu): *Column width*, *Row height* and *Open filter* ### Updates -- Keyboard navigation: - - The keyboard focus is on the active cell itself, and `Tab` enters the sheet on it. `Tab` on the last cell and `Tab + Shift` on the first cell move the focus out of the Spreadsheet - - `Ctrl + F6` and `Ctrl + Shift + F6` move the focus between the menu, the toolbar, the sheet and the sheet tabs - - `Ctrl + Alt + Page Down` / `Ctrl + Alt + Page Up` switch to the next / previous sheet, in addition to `Alt + Arrow Up/ Arrow Down` - - The toolbar, the menu bar and the sheet tabs are single tab stops navigated with the arrow keys, `Home` and `End`. Menus, context menus and the toolbar popups take the focus and return it when closed - - The color palette of the toolbar is a single tab stop browsed with the arrow keys, `Home` and `End` - - `Ctrl + Shift + 9` and `Ctrl + Shift + 0` reveal the hidden rows and columns of the selection - - `Alt + Enter` opens the link of the active cell - - `Esc` closes a toolbar tooltip, and a tooltip stays open while hovered - - The close button of the formula help panel works from the keyboard - - The keyboard focus indicator is visible on the cells, the cell editor, the formula bar and the toolbar buttons, and has a 3:1 contrast in the dark themes -- Screen reader support: - - The active cell is announced with its address before its value, and a selected range with its extent, for example "B2 to D7, 18 cells" - - Read-only, locked and merged cells, row numbers as row headers and the active sheet tab are reported - - Formula errors and invalid list values are described in the cell, and new errors caused by an edit are announced - - Refused edits, search results, and the start and end of import and export are announced - - The grid, the toolbars, the menus, the dialogs, the search bar, the cell editors, the formula bar and the color buttons have accessible names, and the formatting buttons report whether they are on - - The editor of a list-validated cell is presented as a combobox, and a link in a cell is rendered as a real link -- Localization: - - The new interface and screen reader strings are added to the [`spreadsheet` locale](localization.md#default-locale) - - The `grid`, `toolbar`, `window`, `message` and `colorpicker` locales used inside the Spreadsheet can be translated through `dhx.i18n.setLocale()` -- The formula reference colors have a contrast of at least 4.5:1 in the light and contrast-light themes -- React Spreadsheet: - - The new `selection` prop turns the selection off and on without recreating the Spreadsheet - - The [`readonly`](react/props.md#init-only-props) prop is init-only: changing it recreates the Spreadsheet. The data is kept, the undo/redo history and the UI state are reset - - The bundled types include `selection.enable()`, `selection.disable()`, `selection.isDisabled()` and `announce()`, and the `ISelection` type is exported +- Keyboard navigation: the focus stays on the active cell, `Ctrl + F6` moves it between the menu, the toolbar, the sheet and the sheet tabs, and new shortcuts are added. Check the [Hot keys list](hotkeys.md) +- The [read-only mode](api/spreadsheet_readonly_config.md) keeps the keyboard navigation, the selection, copying and search. To turn the selection off, use the `selection: false` option +- Removing a row or a column through a merged cell removes all the rows or columns of the merged cell +- New interface and screen reader strings in the [`spreadsheet` locale](localization.md#default-locale), and [translation of the built-in widgets](localization.md#localizing-built-in-widgets) +- The [`--dhx-spreadsheet-focus-color`](themes/themes.md#spreadsheet-specific-styles) variable for the keyboard focus, and the formula reference colors with a higher contrast in the light themes +- React Spreadsheet: the [`selection`](react/props.md#runtime-props) prop, the [`ISelection`](react/types.md#re-exported-upstream-types) type, and [`readonly`](react/props.md#init-only-props) as an init-only prop ### Fixes From 618c4f6196cfae4e69cf2fa2a51af1fa9c10f5d8 Mon Sep 17 00:00:00 2001 From: Sorokin-Oleg Date: Tue, 20 Oct 2026 17:26:55 +0300 Subject: [PATCH 12/32] [update] accessibility guide and conformance report wording --- docs/accessibility.md | 82 +++++++++++++----------- docs/accessibility_conformance_report.md | 19 ++++-- 2 files changed, 58 insertions(+), 43 deletions(-) diff --git a/docs/accessibility.md b/docs/accessibility.md index b295ed09..db5eb7be 100644 --- a/docs/accessibility.md +++ b/docs/accessibility.md @@ -6,7 +6,9 @@ description: You can learn about accessibility in the documentation of the DHTML # Accessibility in DHTMLX Spreadsheet -DHTMLX Spreadsheet can be used with the keyboard alone, with a screen reader, with screen magnification and in high-contrast themes. WAI-ARIA roles and states are part of the rendered markup, the keyboard focus stays on the active cell, and the toolbar, the menu bar and the sheet tabs are reached with one key press each. Changes that have no element of their own, such as a refused edit or a search result, are announced through a live region. +This guide is for developers who embed DHTMLX Spreadsheet in an application that has to meet accessibility requirements. Use it to check the component against your checklist and to configure it for keyboard, screen reader and high-contrast users. + +The Spreadsheet renders WAI-ARIA roles and states as part of its markup. The keyboard focus stays on the active cell, and the toolbar, the menu bar and the sheet tabs are one tab stop each. Changes that have no element of their own, such as a refused edit or a search result, go to a live region that screen readers read aloud. :::info Target conformance DHTMLX Spreadsheet is designed to meet **WCAG 2.2 Level AA**, **Section 508** of the U.S. Rehabilitation Act, and **EN 301 549** (the technical baseline of the European Accessibility Act). @@ -29,8 +31,6 @@ Conformance is reported criterion by criterion for DHTMLX Spreadsheet 6.0.4. The | Customization | The public [`announce()`](api/spreadsheet_announce_method.md) method for your own messages, and translatable `aria_*` locale strings for every built-in name and announcement | | Standards | WCAG 2.2 AA, Section 508, EN 301 549 | -Use this page to check the component against your accessibility checklist and to configure the Spreadsheet for an accessible deployment. - ## Covered areas This guide covers the Spreadsheet widget: @@ -47,7 +47,7 @@ The accessibility of the final page also depends on the host application. See [H ## WAI-ARIA support -WAI-ARIA roles and attributes are added to the markup automatically and can't be turned off. Each part of the widget is exposed with its own role and name, and the names come from the [locale](#localization). +The Spreadsheet adds WAI-ARIA roles and attributes to its markup automatically, and you can't turn them off. Each part of the widget has its own role and name, and the names come from the [locale](#localization). ### Spreadsheet container @@ -66,7 +66,7 @@ The root element of the Spreadsheet has no landmark role, so you can place it in ### Cell surface -The following attributes describe the cells as a whole. They are set on the `.dhx_grid-content` element: +The following attributes describe the cells as a whole. The `.dhx_grid-content` element carries them: | Selector | Role / attribute | Purpose | | -------- | ---------------- | ------- | @@ -89,6 +89,7 @@ The following table lists the roles and the position and state attributes of the | Cell | `aria-selected` | `"true"` on the active cell and on every cell of the selected ranges | | Cell | `aria-readonly` | `"true"` in the read-only mode and on [locked cells](work_with_cells.md#locking-cells) | | Cell | `tabindex` | `"0"` on the active cell and `"-1"` on the other cells, so the cells are one tab stop | +| Active cell | DOM focus | The keyboard focus is on the active cell itself, not on a separate input | | Merged cell | `aria-colspan` / `aria-rowspan` | The number of columns / rows the merged cell spans. The cells it covers are hidden with `aria-hidden="true"` | | Link in a cell | `` with `target="_blank"` and `rel="noopener noreferrer"` | A link with the `http`, `https`, `mailto`, `ftp` or `tel` scheme | @@ -112,16 +113,7 @@ A cell also contains visually hidden text, which screen readers read together wi | Row number | `role="rowheader"` | The header of the row | | Column menu icon, icons of hidden rows and columns | `aria-hidden="true"` | Decorative. The commands are in the context menu | -The headers are not tab stops. A click on a column letter, a row number or the corner selects the lines and returns the focus to the active cell. - -### Selection - -| Part | Exposed through | -| ---- | --------------- | -| Active cell | The DOM focus, `tabindex="0"` and `aria-selected="true"` | -| Selected range | `aria-selected="true"` on every cell of the range, and an announcement of its extent, for example, "B2 to D7, 18 cells" | -| Several ranges | `aria-selected="true"` on the cells of each range. The announcement lists the ranges separated by commas | -| Selection, copy and search highlights, the fill handle | Drawn in a layer hidden with `aria-hidden="true"` | +The headers are not tab stops. A click on a column letter, a row number or the corner selects the rows or columns and returns the focus to the active cell. ### Formula bar and editors @@ -160,17 +152,17 @@ The headers are not tab stops. A click on a column letter, a row number or the c | Selector | Role / attribute | Purpose | | -------- | ---------------- | ------- | -| Column width and Row height dialogs | `role="dialog"`, `aria-modal="true"`, `aria-label` | Named by the dialog title. The input is labelled "Width in pixels" / "Height in pixels" | +| Column width and Row height dialogs | `role="dialog"`, `aria-modal="true"`, `aria-label` | Named by the dialog title. The input is labeled "Width in pixels" / "Height in pixels" | | Search bar, Insert link, Data validation | `role="dialog"` + `aria-label` | Named by the dialog title. The search bar buttons are named "Previous match", "Next match" and "Close search" | | Alerts | `role="alertdialog"`, `aria-modal="true"`, `aria-labelledby`, `aria-describedby` | Named by the alert header and described by its text | ### Hidden and decorative elements -The lock, filter and column menu icons, the icons of hidden rows and columns, the select-all icon, the selection layer with the fill handle, the colored copy of the formula in the formula bar, and the cells covered by a merged cell are hidden from assistive technology with `aria-hidden="true"`. Layout wrappers have `role="presentation"`. The focus sentinels before and after the grid only pass the focus to the active cell. +The Spreadsheet hides decorative parts from assistive technology with `aria-hidden="true"`: the lock, filter and column menu icons, the icons of hidden rows and columns, the select-all icon, the layer that draws the selection, copy and search highlights and the fill handle, the colored copy of the formula in the formula bar, and the cells covered by a merged cell. Layout wrappers have `role="presentation"`. The focus sentinels before and after the grid only pass the focus to the active cell. ## Selection and editing model -The DOM focus is on the active cell itself, so a screen reader reads the cell, not a separate input. When the active cell moves, the screen reader reads the address of the new cell first, then its value and its hidden descriptions. When a range is selected with Shift + arrow keys or with the mouse, the extent of the range is announced once the selection stops changing. +The DOM focus is on the active cell itself, so a screen reader reads the cell, not a separate input. When the active cell moves, the screen reader reads the address of the new cell first, then its value and its hidden descriptions. When the user selects a range with Shift + arrow keys or with the mouse, the screen reader announces the extent of the range once the selection stops changing. | Situation | What the screen reader gets | | --------- | --------------------------- | @@ -183,9 +175,7 @@ The DOM focus is on the active cell itself, so a screen reader reads the cell, n | An edit of a locked cell is refused | "The cell is locked" | | An editing key is pressed in the read-only mode | "The sheet is read-only" | -The editor is opened with Enter, F2 or by typing, and closed with Enter (save and move down), Tab (save and move right) or Esc (cancel). - -In the [read-only mode](api/spreadsheet_readonly_config.md), the cells can be navigated, selected, copied and searched. To turn the selection off completely, use the [`selection`](api/spreadsheet_selection_config.md) option. +Enter, F2 or typing opens the editor. Enter saves the value and moves down, Tab saves it and moves right, and Esc cancels the edit. ## Keyboard navigation @@ -237,12 +227,12 @@ The keyboard works as soon as the Spreadsheet is on the page; no configuration i | ↑ / ↓, Enter | Move through the list of values of a cell and choose a value | :::note -The commands that are performed by dragging have keyboard alternatives. The column width and the row height are set with the *Column width* and *Row height* commands of the context menu. A filter is opened with the *Open filter* command. Hidden rows and columns are shown with Ctrl + Shift + 9 / 0 or with the *Show rows* / *Show columns* commands. +Pointer-only actions have keyboard alternatives. The *Column width* and *Row height* commands of the context menu set an exact size without dragging, and the *Open filter* command opens a filter without a click on its icon. ::: ## Assistive technology -DHTMLX Spreadsheet is tested with the following assistive technologies: +The DHTMLX team tests the Spreadsheet with the following screen readers: | Screen reader | Browser | Platform | | ------------- | ------- | -------- | @@ -250,7 +240,7 @@ DHTMLX Spreadsheet is tested with the following assistive technologies: | JAWS | Chrome | Windows | | VoiceOver | Safari | macOS | -The state of the Spreadsheet travels on the element it belongs to: +Screen readers get each state from the element it belongs to: | State | Exposed through | Read on | | ----- | --------------- | ------- | @@ -268,7 +258,7 @@ The state of the Spreadsheet travels on the element it belongs to: ### Themes -The Spreadsheet has four built-in themes: `light` (default), `dark`, `contrast-light` and `contrast-dark`. The `contrast-light` and `contrast-dark` themes meet the WCAG AA contrast of text. Switch a theme with the `dhx.setTheme()` method or with the `data-dhx-theme` attribute: +The Spreadsheet has four built-in themes: `light` (default), `dark`, `contrast-light` and `contrast-dark`. The `contrast-light` and `contrast-dark` themes meet the WCAG AA contrast requirements for text. Switch a theme with the `dhx.setTheme()` method or with the `data-dhx-theme` attribute: ~~~jsx dhx.setTheme("contrast-light"); // or "contrast-dark" @@ -342,7 +332,7 @@ The parts in curly braces, such as `{cell}` or `{count}`, are replaced with the ### Accessible default setup -The Spreadsheet is accessible by default. For WCAG AA contrast of text, select a contrast theme: +The Spreadsheet needs no configuration for the keyboard and the WAI-ARIA output. To meet the WCAG AA contrast requirements for text, select a contrast theme. See [Built-in themes](themes/themes.md) for the other ways to set a theme: ~~~jsx const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { @@ -355,7 +345,7 @@ dhx.setTheme("contrast-light"); // or "contrast-dark" ### Read-only setup -A read-only Spreadsheet can still be navigated and read with a screen reader: +Use the [`readonly`](api/spreadsheet_readonly_config.md) option to show data that users can read and copy but not change. Keyboard and screen reader users can still move through the cells: ~~~jsx const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { @@ -364,27 +354,47 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { spreadsheet.parse(data); ~~~ -To show the data without an active cell and without selection, add `selection: false`. In this case, the grid is one tab stop that the keyboard passes through. +To show the data without an active cell and without selection, add [`selection: false`](api/spreadsheet_selection_config.md). The grid then becomes one tab stop that the keyboard passes through. ### Translated accessibility strings +Screen readers read the accessibility strings from three locales: `spreadsheet` holds the names, cell descriptions and announcements, `colorpicker` holds the color names, and `message` holds the names of the alert buttons. Set all three before you create the Spreadsheet. See [Localizing built-in widgets](localization.md#localizing-built-in-widgets) for the keys: + ~~~jsx -dhx.i18n.setLocale("spreadsheet", deSpreadsheet); // includes the aria_* keys -dhx.i18n.setLocale("colorpicker", deColorpicker); // the color names -dhx.i18n.setLocale("message", deMessage); // the alert buttons +const deSpreadsheet = { + // other keys of the locale + aria_grid: "Tabelle", + aria_readonlySheet: "Das Blatt ist schreibgeschützt" +}; +const deColorpicker = { + aria_palette: "Farbpalette", + aria_colorRed: "rot" +}; +const deMessage = { + aria_alert: "Meldung", + aria_confirm: "Bestätigen" +}; + +dhx.i18n.setLocale("spreadsheet", deSpreadsheet); +dhx.i18n.setLocale("colorpicker", deColorpicker); +dhx.i18n.setLocale("message", deMessage); const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); ~~~ ### Announcing a custom command +When your own command changes the data, tell screen reader users about the result with the [`announce()`](api/spreadsheet_announce_method.md) method. The example adds a [menu](customization.md#menu) command that clears the active sheet: + ~~~jsx -spreadsheet.menu.data.add({ id: "save", value: "Save" }); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); + +spreadsheet.menu.data.add({ id: "clear-sheet", value: "Clear sheet" }); spreadsheet.menu.events.on("click", function (id) { - if (id === "save") { - saveToServer(spreadsheet.serialize()); - spreadsheet.announce("The spreadsheet is saved"); + if (id === "clear-sheet") { + spreadsheet.sheets.clear(); + spreadsheet.announce("The sheet is cleared"); } }); ~~~ @@ -401,7 +411,7 @@ A few requirements live at the page level, not inside the component. Make sure t ## Testing and methodology -Accessibility of DHTMLX Spreadsheet 6.0.4 is validated against the component source and in the browser: +The DHTMLX team validates the accessibility of Spreadsheet 6.0.4 against the component source and in the browser: 1. **Automated testing** with [axe-core](https://github.com/dequelabs/axe-core) in the `light`, `dark`, `contrast-light` and `contrast-dark` themes, with the search bar, the list editor, the dialogs and an alert open. 2. **Manual review** of the source: the roles, states and names of each part, the keyboard handlers and the focus regions, and the theme tokens with their contrast ratios. diff --git a/docs/accessibility_conformance_report.md b/docs/accessibility_conformance_report.md index 763cd12c..3353d17d 100644 --- a/docs/accessibility_conformance_report.md +++ b/docs/accessibility_conformance_report.md @@ -6,7 +6,7 @@ description: You can learn about the accessibility conformance report in the doc # Accessibility Conformance Report -This report documents how DHTMLX Spreadsheet conforms to the major accessibility standards. It follows the **VPAT® 2.5 (International Edition)** structure, so you can map it directly against your own procurement or compliance checklist. For a task-oriented overview of the accessibility features and how to configure them, see the [Accessibility](accessibility.md) guide. +This report documents how DHTMLX Spreadsheet conforms to the major accessibility standards. It follows the **VPAT® 2.5 (International Edition)** structure. For a task-oriented overview of the accessibility features and how to configure them, see the [Accessibility](accessibility.md) guide. **Name of Product/Version:** @@ -18,12 +18,17 @@ This report documents how DHTMLX Spreadsheet conforms to the major accessibility ## Notes -- This report evaluates DHTMLX Spreadsheet in its **recommended accessibility configuration**: the default configuration, with the WAI-ARIA output and the keyboard navigation that are always on, and an AA-conformant color scheme selected through `dhx.setTheme("contrast-light")` / `dhx.setTheme("contrast-dark")` or the equivalent `data-dhx-theme` attribute. Where a conformance level depends on this configuration, the Remarks say so. See the [Accessibility](accessibility.md) guide for setup instructions. +- This report evaluates DHTMLX Spreadsheet in its **recommended accessibility configuration**: the default configuration, where the WAI-ARIA output and the keyboard navigation are always on, with the `contrast-light` or `contrast-dark` theme set through `dhx.setTheme()` or the `data-dhx-theme` attribute. The Remarks state where a conformance level depends on this configuration. See the [Accessibility](accessibility.md) guide for the setup. - DHTMLX Spreadsheet is **web content** rendered by a host application. Page-level responsibilities (the page title, ``, skip/bypass mechanisms, and site-wide navigation) belong to the host application and are reported as *Not Applicable* with an explanation. - In the WCAG tables, only the **Web** response is populated. The *Electronic Docs*, *Software*, *Closed*, and *Authoring Tool* rows are *Not Applicable*: the product is not standalone (non-web) software, closed functionality, an authoring tool, or a piece of electronic documentation. - Colors that an author applies to cells through cell styles are part of the document data and are not evaluated as part of the product. -**Evaluation Methods Used:** Testing was performed using a combination of automated testing (axe-core in the `light`, `dark`, `contrast-light` and `contrast-dark` themes, with the search bar, the list editor, the dialogs and an alert open), manual code review of the component source and stylesheets (the roles and ARIA attributes emitted per part of the widget, the keyboard handlers and focus regions, the accessible names and their locale keys, and the theme color tokens, with contrast ratios computed from those tokens for the four themes), assistive-technology testing (manual passes with **NVDA + Firefox** and **JAWS + Chrome** on Windows and **VoiceOver + Safari** on macOS; versions: ), and browser overrides (200% / 400% zoom, reflow at 320 CSS px, and WCAG text-spacing overrides). +**Evaluation Methods Used:** + +- Automated testing: axe-core in the `light`, `dark`, `contrast-light` and `contrast-dark` themes, with the search bar, the list editor, the dialogs and an alert open. +- Manual code review of the component source and stylesheets: the roles and ARIA attributes of each part of the widget, the keyboard handlers and focus regions, the accessible names and their locale keys, and the theme color tokens, with contrast ratios computed for the four themes. +- Assistive-technology testing: manual passes with **NVDA + Firefox** and **JAWS + Chrome** on Windows and **VoiceOver + Safari** on macOS. Versions: . +- Browser overrides: 200% / 400% zoom, reflow at 320 CSS px, and WCAG text-spacing overrides. ## Applicable standards / guidelines @@ -62,9 +67,9 @@ theme" is a configuration dependency, not a defect. Criterion 4.1.1 Parsing is r | **1.3.1** Info and Relationships | Supports | The cells are a `grid` named "Spreadsheet" with `row`, `columnheader`, `rowheader` and `gridcell` roles. Position is exposed with `aria-rowindex`/`aria-colindex` against `aria-rowcount`/`aria-colcount`; the extent of a merged cell with `aria-colspan`/`aria-rowspan`; editability with `aria-readonly`; selection with `aria-selected` and `aria-multiselectable`. The toolbar, the menu bar and the sheet tabs are `toolbar` and `menubar` elements with names; exclusive formatting options are `menuitemradio` with `aria-checked`. | | **1.3.2** Meaningful Sequence | Supports | DOM and reading order follow the visual order: the menu bar, the toolbar, the formula bar, the cells and the sheet tabs. The cells carry their position in the sheet through `aria-rowindex`/`aria-colindex`, so the sequence is preserved when rows and columns are scrolled out of the DOM. | | **1.3.3** Sensory Characteristics | Supports | No instruction or label relies solely on shape, size, or spatial location; interactive elements carry text or an ARIA name. | -| **1.4.1** Use of Color | Supports | Color is never the only signal. The active cell, the selected range, search matches, the copied range and invalid cells each have a border, a fill, a marker or a shape, together with `aria-selected` or text in the cell. Rows hidden by a filter leave a gap in the row numbers. The color buttons show the color itself and carry its name in the accessible name. | +| **1.4.1** Use of Color | Supports | Each state shown by color also has a border, a fill, a marker or text: the active cell, the selected range, search matches, the copied range and invalid cells, together with `aria-selected` or text in the cell. Rows hidden by a filter leave a gap in the row numbers. The color buttons carry the color name in their accessible name. | | **1.4.2** Audio Control | Not Applicable | The product produces no auto-playing audio. | -| **2.1.1** Keyboard | Supports | Every command on the cells has a key: the arrow keys, `Home`/`End`, `Ctrl`+arrows and `Tab` move the active cell, `Shift` combinations extend the selection, `Enter`/`F2` and typing open the editor, `Esc` cancels, `Ctrl`+`Shift`+`9`/`0` show hidden rows and columns, `Alt`+`Enter` opens a link, and `Shift`+`F10` or the Menu key opens the context menu. `Ctrl`+`F6` moves the focus between the menu, the toolbar, the sheet and the sheet tabs; the bars are navigated with the arrow keys, `Home` and `End`, and their dropdowns and popups open and close from the keyboard. The column width, the row height and the column filter have context menu commands. In the list editor the arrow keys move through the options, `Enter` writes the highlighted one and `Esc` cancels the edit. | +| **2.1.1** Keyboard | Supports | Every command on the cells has a key, listed in the [Hot keys list](hotkeys.md); `Shift`+`F10` or the Menu key opens the context menu. `Ctrl`+`F6` moves the focus between the menu, the toolbar, the sheet and the sheet tabs. The bars, their dropdowns and popups, and the list editor work with the arrow keys, `Home`, `End`, `Enter` and `Esc`. The column width, the row height and the column filter have context menu commands. | | **2.1.2** No Keyboard Trap | Supports | `Tab` on the last cell and `Shift`+`Tab` on the first cell of the sheet move the focus out of the Spreadsheet, and `Ctrl`+`F6` moves it between the parts at any time. In the list editor `Tab` ends the edit and `Esc` cancels it, also after the arrow keys were used. `Esc` and `Tab` close the toolbar popups and return the focus to their buttons. | | **2.1.4** Character Key Shortcuts | Supports | Every shortcut uses a modifier key (`Ctrl`, `Alt`, `Shift`) or a non-character key (`F2`, `F6`, `F10`, `F11`, `Enter`, `Esc`, `Delete`, arrows). Typing a character on a cell enters it into the cell, which is the purpose of the cell, and doesn't run a command. | | **2.2.1** Timing Adjustable | Not Applicable | The product sets no time limits. | @@ -85,7 +90,7 @@ theme" is a configuration dependency, not a defect. Criterion 4.1.1 Parsing is r | **3.3.1** Error Identification | Supports | Formula errors and invalid list values are described in the cell content, for example "Reference error. Check the cell references" and "Invalid value. Choose a value from the list". New errors caused by an edit are announced through the live region, and the editor of an invalid value has `aria-invalid="true"`. | | **3.3.2** Labels or Instructions | Supports | The cell editor is named "Cell editor, B7" and the formula bar "Formula bar, B7", with the address of the edited cell. The dialog fields are labelled, for example "Width in pixels", and the search bar buttons are named "Previous match", "Next match" and "Close search". | | **3.3.7** Redundant Entry (2.2 only) | Supports | The product contains no multi-step process that asks for information already entered. | -| **4.1.2** Name, Role, Value | Supports | Every structural and interactive part exposes a role, its states and an accessible name: the cells (`grid`, `row`, `gridcell`, `columnheader`, `rowheader`, `aria-selected`, `aria-readonly`), the toolbars and the menu bar (`toolbar`, `menubar`, named from the locale), the formatting buttons (`aria-pressed`), the exclusive formats (`menuitemradio` with `aria-checked`), and the sheet tabs (the active tab is `aria-pressed="true"`). Alerts are `role="alertdialog"` with `aria-modal="true"` and a name. The list editor is a `combobox` that controls a `listbox`, with `aria-expanded` and `aria-activedescendant` on the highlighted option. | +| **4.1.2** Name, Role, Value | Supports | Each part exposes a role, its states and a name from the locale: the cells (`grid`, `row`, `gridcell`, `columnheader`, `rowheader`, `aria-selected`, `aria-readonly`), the toolbars and the menu bar (`toolbar`, `menubar`), the formatting buttons and the sheet tabs (`aria-pressed`), and the exclusive formats (`menuitemradio`, `aria-checked`). Alerts are `alertdialog` with `aria-modal="true"`. The list editor is a `combobox` that controls a `listbox`, with `aria-expanded` and `aria-activedescendant`. | ### Table 2: Success Criteria, Level AA @@ -131,7 +136,7 @@ is Not Applicable, because DHTMLX Spreadsheet is a software component with no ha | 302.4 Without Hearing | Supports | No information is conveyed by sound. | | 302.5 With Limited Hearing | Supports | No information is conveyed by sound. | | 302.6 Without Speech | Supports | No speech input is required to operate the product. | -| 302.7 With Limited Manipulation | Supports | Fully keyboard-operable; no path-based gesture is required, and every drag operation has a keyboard or command alternative. See WCAG 2.1.1, 2.5.1, 2.5.7, 2.5.8. | +| 302.7 With Limited Manipulation | Supports | Every function works from the keyboard; no path-based gesture is required, and every drag operation has a keyboard or command alternative. See WCAG 2.1.1, 2.5.1, 2.5.7, 2.5.8. | | 302.8 With Limited Reach and Strength | Supports | Operable by keyboard; no physical reach, force or timing requirements. | | 302.9 With Limited Language, Cognitive, and Learning Abilities | Supports | Commands have the same names in the toolbar, the menus and the context menu, formula errors are described with a way to correct them, and every change can be reverted with undo. See WCAG 3.2.4, 3.3.3, 3.3.4. | From 33adb31e72c2d3462bcb4098bd9f840a3670df14 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Wed, 21 Oct 2026 16:56:31 +0300 Subject: [PATCH 13/32] [update] accessibility docs, links fixes - guides overview: Accessibility section with the guide and the VPAT report - accessibility guide: SEO description, theme links point to /themes/ - conformance report: sidebar label, description, product/version, report date and contact filled in, AT versions placeholder dropped - what's new: 6.0.4 release month set, theme variable link fixed --- docs/accessibility.md | 8 ++++---- docs/accessibility_conformance_report.md | 12 ++++++------ docs/guides.md | 7 ++++++- docs/whats_new.md | 4 ++-- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/docs/accessibility.md b/docs/accessibility.md index db5eb7be..2f501335 100644 --- a/docs/accessibility.md +++ b/docs/accessibility.md @@ -1,7 +1,7 @@ --- sidebar_label: Accessibility title: Accessibility -description: You can learn about accessibility in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Make DHTMLX Spreadsheet accessible to keyboard and screen-reader users. Learn about the WAI-ARIA support, keyboard navigation, screen-reader announcements and high-contrast themes that target WCAG 2.2 AA. --- # Accessibility in DHTMLX Spreadsheet @@ -264,7 +264,7 @@ The Spreadsheet has four built-in themes: `light` (default), `dark`, `contrast-l dhx.setTheme("contrast-light"); // or "contrast-dark" ~~~ -See the [Built-in themes](themes/themes.md) article for the details. +See the [Built-in themes](/themes/) article for the details. In the light themes, the colors that mark the cell references of a formula have a contrast of at least 4.5:1. @@ -332,7 +332,7 @@ The parts in curly braces, such as `{cell}` or `{count}`, are replaced with the ### Accessible default setup -The Spreadsheet needs no configuration for the keyboard and the WAI-ARIA output. To meet the WCAG AA contrast requirements for text, select a contrast theme. See [Built-in themes](themes/themes.md) for the other ways to set a theme: +The Spreadsheet needs no configuration for the keyboard and the WAI-ARIA output. To meet the WCAG AA contrast requirements for text, select a contrast theme. See [Built-in themes](/themes/) for the other ways to set a theme: ~~~jsx const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { @@ -426,7 +426,7 @@ The DHTMLX team validates the accessibility of Spreadsheet 6.0.4 against the com - [`selection`](api/spreadsheet_selection_config.md) - [`announce()`](api/spreadsheet_announce_method.md) - [Localization](localization.md) -- [Built-in themes](themes/themes.md) +- [Built-in themes](/themes/) - [WCAG 2.2](https://www.w3.org/TR/WCAG22/) - [WAI-ARIA 1.2](https://www.w3.org/TR/wai-aria-1.2/) - [WAI-ARIA Authoring Practices: Grid pattern](https://www.w3.org/WAI/ARIA/apg/patterns/grid/) diff --git a/docs/accessibility_conformance_report.md b/docs/accessibility_conformance_report.md index 3353d17d..b272cdfd 100644 --- a/docs/accessibility_conformance_report.md +++ b/docs/accessibility_conformance_report.md @@ -1,20 +1,20 @@ --- -sidebar_label: Accessibility Conformance Report +sidebar_label: Conformance report (VPAT) title: Accessibility Conformance Report -description: You can learn about the accessibility conformance report in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: DHTMLX Spreadsheet Accessibility Conformance Report, based on VPAT 2.5 - conformance with WCAG 2.2 AA, Section 508, and EN 301 549. --- # Accessibility Conformance Report This report documents how DHTMLX Spreadsheet conforms to the major accessibility standards. It follows the **VPAT® 2.5 (International Edition)** structure. For a task-oriented overview of the accessibility features and how to configure them, see the [Accessibility](accessibility.md) guide. -**Name of Product/Version:** +**Name of Product/Version:** DHTMLX Spreadsheet v6.0.4 -**Report Date:** +**Report Date:** October 2026 **Product Description:** DHTMLX Spreadsheet is a JavaScript spreadsheet component for web applications. It renders a menu bar, a toolbar, a formula bar, a grid of cells with column and row headers, and sheet tabs, and supports formulas, cell formatting, merged cells, frozen rows and columns, sorting, filtering, search, data validation, links in cells, and import and export of Excel files. It is embedded by a host web application. -**Contact Information:** +**Contact Information:** [info@dhtmlx.com](mailto:info@dhtmlx.com) ## Notes @@ -27,7 +27,7 @@ This report documents how DHTMLX Spreadsheet conforms to the major accessibility - Automated testing: axe-core in the `light`, `dark`, `contrast-light` and `contrast-dark` themes, with the search bar, the list editor, the dialogs and an alert open. - Manual code review of the component source and stylesheets: the roles and ARIA attributes of each part of the widget, the keyboard handlers and focus regions, the accessible names and their locale keys, and the theme color tokens, with contrast ratios computed for the four themes. -- Assistive-technology testing: manual passes with **NVDA + Firefox** and **JAWS + Chrome** on Windows and **VoiceOver + Safari** on macOS. Versions: . +- Assistive-technology testing: manual passes with **NVDA + Firefox** and **JAWS + Chrome** on Windows and **VoiceOver + Safari** on macOS. - Browser overrides: 200% / 400% zoom, reflow at 320 CSS px, and WCAG text-spacing overrides. ## Applicable standards / guidelines diff --git a/docs/guides.md b/docs/guides.md index e94b23f9..7ad0145f 100644 --- a/docs/guides.md +++ b/docs/guides.md @@ -6,7 +6,7 @@ description: You can study developer and user guides in the documentation of the # Guides -DHTMLX Spreadsheet includes a wide range of features: import and export of data in different formats, convenient work with cell content and styles, an adaptable spreadsheet structure, a read-only mode, extensive look-and-feel customization, and integration with popular frameworks. +DHTMLX Spreadsheet includes a wide range of features: import and export of data in different formats, convenient work with cell content and styles, an adaptable spreadsheet structure, a read-only mode, extensive look-and-feel customization, keyboard and screen-reader accessibility, and integration with popular frameworks. ## Developer guides @@ -38,6 +38,11 @@ Shows how to load data into Spreadsheet, handle events, and use the main functio - [Integration with Svelte](svelte_integration.md) - GitHub demo of using Spreadsheet in a Svelte app - [Integration with Vue.js](vuejs_integration.md) - GitHub demo of using Spreadsheet in a Vue app +### Accessibility + +- [Accessibility](accessibility.md) - WAI-ARIA support, keyboard navigation, screen-reader announcements, and high-contrast themes +- [Conformance report (VPAT)](accessibility_conformance_report.md) - conformance with WCAG 2.2 AA, Section 508, and EN 301 549 + ### AI-assisted development - [DHTMLX MCP server](mcp-server.md) - connect AI coding assistants to live Spreadsheet documentation diff --git a/docs/whats_new.md b/docs/whats_new.md index cf88e00d..74af3e9b 100644 --- a/docs/whats_new.md +++ b/docs/whats_new.md @@ -10,7 +10,7 @@ If you are updating Spreadsheet from an older version, check [Migration to Newer ## Version 6.0.4 -Released on +Released on October , 2026 ### New functionality @@ -27,7 +27,7 @@ Released on - The [read-only mode](api/spreadsheet_readonly_config.md) keeps the keyboard navigation, the selection, copying and search. To turn the selection off, use the `selection: false` option - Removing a row or a column through a merged cell removes all the rows or columns of the merged cell - New interface and screen reader strings in the [`spreadsheet` locale](localization.md#default-locale), and [translation of the built-in widgets](localization.md#localizing-built-in-widgets) -- The [`--dhx-spreadsheet-focus-color`](themes/themes.md#spreadsheet-specific-styles) variable for the keyboard focus, and the formula reference colors with a higher contrast in the light themes +- The [`--dhx-spreadsheet-focus-color`](/themes/#spreadsheet-specific-styles) variable for the keyboard focus, and the formula reference colors with a higher contrast in the light themes - React Spreadsheet: the [`selection`](react/props.md#runtime-props) prop, the [`ISelection`](react/types.md#re-exported-upstream-types) type, and [`readonly`](react/props.md#init-only-props) as an init-only prop ### Fixes From 079b8569d15cbc6c36618063e3d9e8c3e0a52f76 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Sat, 24 Oct 2026 00:05:18 +0300 Subject: [PATCH 14/32] [update] v6.0.4 API pages, descriptions and wording - page descriptions rewritten for the pages new or updated in v6.0.4 - announce(), deleteRow(), deleteColumn(), readonly and selection pages revised against the 6.0.4 sources - setFocusedCell(), setSelectedCell(): scroll param; getFocusedCell(): undefined return; setFocusedCell() update in what's new - accessibility guide and conformance report wording simplified - hotkeys note, defaultSheetName example and link fixes --- docs/accessibility.md | 30 ++++++++++---------- docs/accessibility_conformance_report.md | 12 ++++---- docs/angular_integration.md | 2 +- docs/api/api_overview.md | 2 +- docs/api/overview/methods_overview.md | 2 +- docs/api/overview/properties_overview.md | 2 +- docs/api/overview/selection_overview.md | 2 +- docs/api/selection_disable_method.md | 2 +- docs/api/selection_enable_method.md | 2 +- docs/api/selection_getfocusedcell_method.md | 2 +- docs/api/selection_isdisabled_method.md | 2 +- docs/api/selection_setfocusedcell_method.md | 7 +++-- docs/api/selection_setselectedcell_method.md | 3 +- docs/api/spreadsheet_announce_method.md | 19 +++++++++---- docs/api/spreadsheet_deletecolumn_method.md | 6 ++-- docs/api/spreadsheet_deleterow_method.md | 6 ++-- docs/api/spreadsheet_readonly_config.md | 8 ++++-- docs/api/spreadsheet_selection_config.md | 11 +++---- docs/configuration.md | 2 +- docs/customization.md | 2 +- docs/data_search.md | 2 +- docs/excel_import_export.md | 2 +- docs/filtering_data.md | 2 +- docs/guides.md | 2 +- docs/hotkeys.md | 6 ++-- docs/localization.md | 4 +-- docs/merge_cells.md | 2 +- docs/themes/themes.md | 2 +- docs/vuejs_integration.md | 2 +- docs/whats_new.md | 6 ++-- docs/work_with_cells.md | 4 +-- docs/work_with_rows_cols.md | 2 +- 32 files changed, 88 insertions(+), 72 deletions(-) diff --git a/docs/accessibility.md b/docs/accessibility.md index 2f501335..6c4d7ac8 100644 --- a/docs/accessibility.md +++ b/docs/accessibility.md @@ -90,14 +90,14 @@ The following table lists the roles and the position and state attributes of the | Cell | `aria-readonly` | `"true"` in the read-only mode and on [locked cells](work_with_cells.md#locking-cells) | | Cell | `tabindex` | `"0"` on the active cell and `"-1"` on the other cells, so the cells are one tab stop | | Active cell | DOM focus | The keyboard focus is on the active cell itself, not on a separate input | -| Merged cell | `aria-colspan` / `aria-rowspan` | The number of columns / rows the merged cell spans. The cells it covers are hidden with `aria-hidden="true"` | +| Merged cell | `aria-colspan` / `aria-rowspan` | The number of columns or rows that the merged cell spans. The cells it covers are hidden with `aria-hidden="true"` | | Link in a cell | `` with `target="_blank"` and `rel="noopener noreferrer"` | A link with the `http`, `https`, `mailto`, `ftp` or `tel` scheme | A cell also contains visually hidden text, which screen readers read together with the value: | Hidden text | When | | ----------- | ---- | -| The cell address, for example, "B7" | First, on the active cell and on the cells of a selected range | +| The cell address, for example, "B7" | On the active cell and on every cell of a selected range. Screen readers read the address before the value | | "link" | On a selected cell with a link. Alt + Enter opens the link | | "locked" | On a selected locked cell | | A description of the formula error, for example, "Reference error. Check the cell references" | On a cell with a formula error | @@ -130,14 +130,14 @@ The headers are not tab stops. A click on a column letter, a row number or the c | Selector | Role / attribute | Purpose | | -------- | ---------------- | ------- | | Toolbar | `role="toolbar"` + `aria-label` | "Formatting"; the toolbars of the Border popup, the search bar and the link popup are named "Borders", "Search" and "Link" | -| Toolbar button | `aria-label` | The button value, or its tooltip for an icon button, for example, "Bold (ctrl+b)". Icons are `aria-hidden` | +| Toolbar button | `aria-label` | The value of the button. An icon button is named by its tooltip, for example, "Bold (ctrl+b)". The icons are hidden with `aria-hidden="true"` | | Bold, Italic, Underline, Strikethrough, Lock, Filter | `aria-pressed` | Whether the formatting or the filter is on | | Button that opens a dropdown | `aria-haspopup="menu"`, `aria-expanded` | The dropdown is a `menu` named after its button | | Alignment, text wrapping, number formats | `role="menuitemradio"` + `aria-checked` | One option of an exclusive set | | Text color, Background color, Border color | `aria-label` | The name of the control and of the current color, for example, "Text color: dark gray" | -| Color palette | `role="grid"` of `gridcell` elements | Named "Color palette"; each color is named by its color name and is `aria-selected` when chosen | +| Color palette | `role="grid"` of `gridcell` elements | The grid is named "Color palette". Each color cell is named after its color, and the chosen one has `aria-selected="true"` | | Border style list | `role="listbox"` of `option` elements | The options are named "Thin line", "Medium line", "Thick line", "Dashed line", "Dotted line", "Double line" | -| Menu bar | `role="menubar"` + `aria-label` | "Main". Its items open `menu` popups; the formatting items are `menuitemcheckbox`, the alignment and format items are `menuitemradio` | +| Menu bar | `role="menubar"` + `aria-label` | "Main". Its items open popups with `role="menu"`. In the popups, the formatting items have `role="menuitemcheckbox"`, and the alignment and number format items have `role="menuitemradio"` | | Context menus | `role="menu"` + `aria-label` | "Cell" for the cells and "Sheet" for the sheet tabs | ### Sheet tabs @@ -145,7 +145,7 @@ The headers are not tab stops. A click on a column letter, a row number or the c | Selector | Role / attribute | Purpose | | -------- | ---------------- | ------- | | Sheet tab bar | `role="toolbar"` + `aria-label` | "Sheets" | -| Sheet tab | `button` + `aria-pressed` | Named by the sheet name; `aria-pressed="true"` on the active sheet | +| Sheet tab | `button` + `aria-pressed` | The tab is named after its sheet. The tab of the active sheet has `aria-pressed="true"` | | Add sheet button | `aria-label` | "Add sheet" | ### Dialogs @@ -158,7 +158,7 @@ The headers are not tab stops. A click on a column letter, a row number or the c ### Hidden and decorative elements -The Spreadsheet hides decorative parts from assistive technology with `aria-hidden="true"`: the lock, filter and column menu icons, the icons of hidden rows and columns, the select-all icon, the layer that draws the selection, copy and search highlights and the fill handle, the colored copy of the formula in the formula bar, and the cells covered by a merged cell. Layout wrappers have `role="presentation"`. The focus sentinels before and after the grid only pass the focus to the active cell. +The Spreadsheet hides decorative parts from assistive technology with `aria-hidden="true"`. These are the lock, filter and column menu icons, the icons of hidden rows and columns, and the select-all icon. The layer that draws the selection, the copy and search highlights and the fill handle is hidden as well. So are the colored copy of the formula in the formula bar and the cells covered by a merged cell. Layout wrappers have `role="presentation"`. The focus sentinels before and after the grid only pass the focus to the active cell. ## Selection and editing model @@ -187,23 +187,23 @@ The keyboard works as soon as the Spreadsheet is on the page; no configuration i | ---- | ------ | | Arrow keys | Move the active cell. The active cell stops at the first and last visible row and column | | Shift + arrow keys | Extend the selected range | -| Home / End | Move to the first / last visible cell of the row | +| Home / End | Move to the first or the last visible cell of the row | | Ctrl + arrow keys, Ctrl + Home / End | Move to the edge of the sheet | -| Tab / Shift + Tab | Move right / left within the row. From the last / first cell of the sheet, move the focus out of the Spreadsheet | +| Tab / Shift + Tab | Move right or left within the row. From the last or the first cell of the sheet, move the focus out of the Spreadsheet | | Enter, F2 | Open the editor | | Esc | Close the editor without saving | -| Ctrl + Space / Shift + Space | Select the column / the row | -| Ctrl + Shift + 9 / 0 | Show the hidden rows / columns inside the selected range | +| Ctrl + Space / Shift + Space | Select the column or the row | +| Ctrl + Shift + 9 / 0 | Show the hidden rows or columns inside the selected range | | Alt + Enter | Open the link of the active cell | | Shift + F10 or the Menu key | Open the context menu with the commands for the cell, or for the column after Ctrl + Space | -| Alt + ↑ / ↓, Ctrl + Alt + Page Down / Page Up | Switch to the next / previous sheet | +| Alt + ↑ / ↓, Ctrl + Alt + Page Down / Page Up | Switch to the next or the previous sheet | ### Moving between the parts | Keys | Action | | ---- | ------ | -| Ctrl + F6 / Ctrl + Shift + F6 | Move the focus to the next / previous part: the menu, the toolbar, the sheet, the sheet tabs. An open edit is saved first | -| Tab / Shift + Tab | Move the focus to the next / previous part in the page tab order. Each bar is one tab stop, and the focus lands on the control used last | +| Ctrl + F6 / Ctrl + Shift + F6 | Move the focus to the next or the previous part: the menu, the toolbar, the sheet, the sheet tabs. An open edit is saved first | +| Tab / Shift + Tab | Move the focus to the next or the previous part in the page tab order. Each bar is one tab stop, and the focus lands on the control used last | ### Toolbar, menu bar and sheet tabs @@ -213,7 +213,7 @@ The keyboard works as soon as the Spreadsheet is on the page; no configuration i | Enter / Space | Press the control: run the command, open the dropdown or switch to the sheet | | ↓ | Open the dropdown and move the focus to its first item | | ↑ / ↓ | Move between the items of an open dropdown or menu | -| → / ← | Open / close a submenu | +| → / ← | Open or close a submenu | | Esc | Close the dropdown or the menu and return the focus to its control | ### Popups and dialogs diff --git a/docs/accessibility_conformance_report.md b/docs/accessibility_conformance_report.md index b272cdfd..9472a283 100644 --- a/docs/accessibility_conformance_report.md +++ b/docs/accessibility_conformance_report.md @@ -12,7 +12,7 @@ This report documents how DHTMLX Spreadsheet conforms to the major accessibility **Report Date:** October 2026 -**Product Description:** DHTMLX Spreadsheet is a JavaScript spreadsheet component for web applications. It renders a menu bar, a toolbar, a formula bar, a grid of cells with column and row headers, and sheet tabs, and supports formulas, cell formatting, merged cells, frozen rows and columns, sorting, filtering, search, data validation, links in cells, and import and export of Excel files. It is embedded by a host web application. +**Product Description:** DHTMLX Spreadsheet is a JavaScript spreadsheet component for web applications. Its interface consists of a menu bar, a toolbar, a formula bar, a cell grid with row and column headers, and sheet tabs. Its features include formulas, cell formatting, merged cells, frozen rows and columns, sorting, filtering, search, data validation, cell links, and Excel import and export. It is embedded by a host web application. **Contact Information:** [info@dhtmlx.com](mailto:info@dhtmlx.com) @@ -108,18 +108,18 @@ theme" is a configuration dependency, not a defect. Criterion 4.1.1 Parsing is r | **1.4.12** Text Spacing | Supports | With the WCAG text-spacing overrides applied, no control label is cut; the sheet tab bar scrolls when the tabs grow. | | **1.4.13** Content on Hover or Focus | Supports | Toolbar tooltips stay open while hovered and are dismissed with `Esc` without moving the pointer or the focus. The invalid-value tooltip reports an input error, stays while the cell is active, and is removed with `Esc`. | | **2.4.5** Multiple Ways | Not Applicable | Applies to locating pages within a set of web pages; out of scope for a single embedded component (host-application concern). | -| **2.4.6** Headings and Labels | Supports | The grid, the toolbars, the menu bar, the context menus, the sheet tab bar and the formula bar are named from the locale, for example "Spreadsheet", "Formatting", "Main", "Cell" and "Sheets". The select-all corner is named "Select all", and the dialogs are named by their titles. | -| **2.4.7** Focus Visible | Supports | The keyboard focus location is visible at all times. The active cell carries a persistent 2px solid border, and the cell or the cell editor that has the keyboard focus a 2px outline in the theme primary color. The formula bar and the controls of the toolbar, the menu bar, the sheet tabs, the search bar and the toolbar popups show a 2px focus ring in the `--dhx-spreadsheet-focus-color` color. In dropdowns, context menus and lists, the focused item is highlighted. The focus indicator is shown in every built-in theme. | +| **2.4.6** Headings and Labels | Supports | The main parts take their accessible names from the locale: "Spreadsheet" (grid), "Formatting" (toolbar), "Main" (menu bar), "Cell" (context menu), "Sheets" (sheet tab bar) and "Formula bar, B7" (formula bar). The select-all corner is named "Select all", and the dialogs are named by their titles. | +| **2.4.7** Focus Visible | Supports | The keyboard focus location is visible at all times. The active cell always has a 2px solid border, and the focused cell or cell editor has a 2px outline, both in the primary color of the theme. The formula bar and the controls of the toolbar, the menu bar, the sheet tabs, the search bar and the toolbar popups show a 2px focus ring in the `--dhx-spreadsheet-focus-color` color. In dropdowns, context menus and lists, the focused item is highlighted. The focus indicator is shown in every built-in theme. | | **2.4.11** Focus Not Obscured (Minimum) (2.2 only) | Supports | The active cell is scrolled into view next to the frozen rows and columns, so it is never left behind a frozen area. | -| **2.5.7** Dragging Movements (2.2 only) | Supports | Range selection has `Shift`+arrows and `Ctrl`+`Space`/`Shift`+`Space`. Column width and row height are set with the *Column width* and *Row height* commands of the context menu, with undo. Hidden rows and columns are shown with `Ctrl`+`Shift`+`9`/`0` and the *Show rows* / *Show columns* commands. Filling cells is available through the [`groupFill`](api/spreadsheet_groupfill_event.md) event, which can be bound to a context menu command. | +| **2.5.7** Dragging Movements (2.2 only) | Supports | Range selection has `Shift`+arrows and `Ctrl`+`Space`/`Shift`+`Space`. Column width and row height are set with the *Column width* and *Row height* commands of the context menu, with undo. Hidden rows and columns are shown with `Ctrl`+`Shift`+`9`/`0` and the *Show rows*/*Show columns* commands. Filling cells is available through the [`groupFill`](api/spreadsheet_groupfill_event.md) event, which can be bound to a context menu command. | | **2.5.8** Target Size (Minimum) (2.2 only) | Partially Supports | The fill handle is 12 x 12 CSS px. The column and row resizers have equivalent controls, the *Column width* and *Row height* commands. The select-all corner is the 40 x 32 CSS px corner header cell, and the toolbar and menu controls are larger than 24 x 24 CSS px. | | **3.1.2** Language of Parts | Not Applicable | The widget does not mix languages within its content; language is host-owned. | | **3.2.3** Consistent Navigation | Not Applicable | Applies across a set of web pages; host-application concern. | | **3.2.4** Consistent Identification | Supports | Commands with the same function have the same names and icons in the toolbar, the menu bar and the context menu, and the same keys. | -| **3.3.3** Error Suggestion | Supports | The description of a formula error states how to correct it, for example "Check the cell references", and the description of an invalid value asks to choose a value from the list. | +| **3.3.3** Error Suggestion | Supports | Error descriptions suggest a fix: "Check the cell references" for a reference error and "Choose a value from the list" for an invalid list value. | | **3.3.4** Error Prevention (Legal, Financial, Data) | Supports | Every change of the data can be reverted with undo (`Ctrl`+`Z`) and repeated with redo. The host application can additionally cancel any action through the [`beforeAction`](api/spreadsheet_beforeaction_event.md) event. | | **3.3.8** Accessible Authentication (Minimum) (2.2 only) | Not Applicable | The product performs no authentication. | -| **4.1.3** Status Messages | Supports | The Spreadsheet uses a visually hidden live region (`role="status"`, `aria-live="polite"`, `aria-atomic="true"`) outside the grid to announce changes without moving focus: the extent of a selected range once the selection settles, new formula errors and invalid values, refused edits of locked cells and of a read-only sheet, search results, the start and end of import and export, and the applied column width or row height. The same region is available to the host application through the public [`announce()`](api/spreadsheet_announce_method.md) method, and every built-in message is localizable through the `aria_*` locale keys. | +| **4.1.3** Status Messages | Supports | Status changes are announced without moving focus through a visually hidden live region outside the grid (`role="status"`, `aria-live="polite"`, `aria-atomic="true"`). It reports the selected range, new formula errors and invalid values, refused edits of locked cells or a read-only sheet, search results, the start and end of import and export, and new column widths and row heights. The same region is available to the host application through the public [`announce()`](api/spreadsheet_announce_method.md) method, and every built-in message is localizable through the `aria_*` locale keys. | ## Revised Section 508 report diff --git a/docs/angular_integration.md b/docs/angular_integration.md index 20b19bf4..658c9423 100644 --- a/docs/angular_integration.md +++ b/docs/angular_integration.md @@ -1,7 +1,7 @@ --- sidebar_label: Integration with Angular title: Angular Integration -description: You can learn about the Angular integration of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Use DHTMLX Spreadsheet in an Angular application. Create a project, add Spreadsheet as an Angular component, load data and handle events. --- # Integration with Angular diff --git a/docs/api/api_overview.md b/docs/api/api_overview.md index 563aa312..10d686a2 100644 --- a/docs/api/api_overview.md +++ b/docs/api/api_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: API overview title: API Overview -description: You can check an API overview of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Overview of the DHTMLX Spreadsheet API, covering the constructor, methods, events, properties, and the sheet manager, selection, event bus and export modules. --- # API overview diff --git a/docs/api/overview/methods_overview.md b/docs/api/overview/methods_overview.md index 53ed575e..d27cb4b9 100644 --- a/docs/api/overview/methods_overview.md +++ b/docs/api/overview/methods_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Methods overview title: Methods Overview -description: You can check a Methods overview of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: List of the DHTMLX Spreadsheet methods for loading and saving data, editing cells, styling, merging, sorting, filtering and managing sheets. --- # Methods overview diff --git a/docs/api/overview/properties_overview.md b/docs/api/overview/properties_overview.md index 2ae06129..fcd96323 100644 --- a/docs/api/overview/properties_overview.md +++ b/docs/api/overview/properties_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Properties overview title: Properties Overview -description: You can check a Properties overview of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: List of the DHTMLX Spreadsheet configuration properties that set up the toolbar, the menu, the read-only mode, the selection, the grid size and more. --- # Properties overview diff --git a/docs/api/overview/selection_overview.md b/docs/api/overview/selection_overview.md index 78c2ad37..3da7ce72 100644 --- a/docs/api/overview/selection_overview.md +++ b/docs/api/overview/selection_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Selection methods overview title: Selection Methods Overview -description: You can check a Selection methods overview of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: List of the DHTMLX Spreadsheet selection module methods that select cells, set focus and turn the selection of cells off and on. --- # Selection methods overview diff --git a/docs/api/selection_disable_method.md b/docs/api/selection_disable_method.md index 4e2e1ea0..ee20550d 100644 --- a/docs/api/selection_disable_method.md +++ b/docs/api/selection_disable_method.md @@ -1,7 +1,7 @@ --- sidebar_label: disable() title: disable selection method -description: You can learn about the disable selection method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Turn the selection of cells off in DHTMLX Spreadsheet at runtime with the selection.disable() method, which removes the active cell and ignores selection by the mouse, the keyboard and the API. --- # disable() diff --git a/docs/api/selection_enable_method.md b/docs/api/selection_enable_method.md index def0afdb..8e15f2ba 100644 --- a/docs/api/selection_enable_method.md +++ b/docs/api/selection_enable_method.md @@ -1,7 +1,7 @@ --- sidebar_label: enable() title: enable selection method -description: You can learn about the enable selection method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Turn the selection of cells back on in DHTMLX Spreadsheet with the selection.enable() method, which makes the A1 cell active and fires the selection events. --- # enable() diff --git a/docs/api/selection_getfocusedcell_method.md b/docs/api/selection_getfocusedcell_method.md index 1142c280..c429523d 100644 --- a/docs/api/selection_getfocusedcell_method.md +++ b/docs/api/selection_getfocusedcell_method.md @@ -18,7 +18,7 @@ getFocusedCell(): string; ### Returns -The method returns the id of the focused cell +The method returns the id of the focused cell, or `undefined` if there is no focused cell, for example, while the selection is turned off with the [`selection: false`](api/spreadsheet_selection_config.md) configuration option or the [`selection.disable()`](api/selection_disable_method.md) method ### Example diff --git a/docs/api/selection_isdisabled_method.md b/docs/api/selection_isdisabled_method.md index b18bf568..68c5b152 100644 --- a/docs/api/selection_isdisabled_method.md +++ b/docs/api/selection_isdisabled_method.md @@ -1,7 +1,7 @@ --- sidebar_label: isDisabled() title: isDisabled selection method -description: You can learn about the isDisabled selection method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Check whether the selection of cells is turned off in DHTMLX Spreadsheet with the selection.isDisabled() method. --- # isDisabled() diff --git a/docs/api/selection_setfocusedcell_method.md b/docs/api/selection_setfocusedcell_method.md index 8bc69f67..5a1e131d 100644 --- a/docs/api/selection_setfocusedcell_method.md +++ b/docs/api/selection_setfocusedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setFocusedCell() title: setFocusedCell selection method -description: You can learn about the setFocusedCell selection method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Make a cell active and move the keyboard focus to it in DHTMLX Spreadsheet with the selection.setFocusedCell() method. --- # setFocusedCell() @@ -13,12 +13,13 @@ description: You can learn about the setFocusedCell selection method in the docu ### Usage ~~~jsx -setFocusedCell(cell: string): void; +setFocusedCell(cell: string, scroll?: boolean): void; ~~~ ### Parameters - `cell` - (required) the id of a cell to set focus on +- `scroll` - (optional) whether to scroll the Spreadsheet to the cell, `true` by default ### Example @@ -41,6 +42,8 @@ The method makes the specified cell active and, after the redraw, moves the keyb If the keyboard focus is on the page body, for example, right after the page is loaded, the method moves it to the cell. +If the [`beforeFocusSet`](api/spreadsheet_beforefocusset_event.md) event handler returns `false`, the active cell isn't changed and the keyboard focus isn't moved. + The method does nothing while the selection is turned off with the [`selection: false`](api/spreadsheet_selection_config.md) configuration option or the [`selection.disable()`](api/selection_disable_method.md) method. **Change log:** Moving the keyboard focus to the cell was added in v6.0.4 diff --git a/docs/api/selection_setselectedcell_method.md b/docs/api/selection_setselectedcell_method.md index e23a855a..b0783797 100644 --- a/docs/api/selection_setselectedcell_method.md +++ b/docs/api/selection_setselectedcell_method.md @@ -13,12 +13,13 @@ description: You can learn about the setSelectedCell selection method in the doc ### Usage ~~~jsx -setSelectedCell(cell: string): void; +setSelectedCell(cell: string, scroll?: boolean): void; ~~~ ### Parameters - `cell` - (required) the id(s) or a range of selected cell(s) +- `scroll` - (optional) whether to scroll the Spreadsheet to the cell, `true` by default ### Example diff --git a/docs/api/spreadsheet_announce_method.md b/docs/api/spreadsheet_announce_method.md index 3551f870..3b4246e8 100644 --- a/docs/api/spreadsheet_announce_method.md +++ b/docs/api/spreadsheet_announce_method.md @@ -1,14 +1,14 @@ --- sidebar_label: announce() title: announce method -description: You can learn about the announce method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Send a status message to screen reader users of DHTMLX Spreadsheet with the announce() method, for example, to report the result of a custom toolbar or menu command. --- # announce() ### Description -@short: Sends a status message to screen readers +@short: Announces a message to screen reader users ### Usage @@ -48,12 +48,19 @@ spreadsheet.menu.events.on("click", function (id) { ### Details -The method puts the message into a live region with `role="status"` and `aria-live="polite"`, which is placed next to the grid and hidden visually. A screen reader reads the message after it finishes the current speech, and the keyboard focus stays where it is. +Use the method to tell screen reader users about the result of an action that has no visible element of its own, such as a custom toolbar or menu command. -The Spreadsheet uses the same live region for its own announcements, such as the refused edits, the search results and the progress of import and export. A message that repeats the current one is announced again. +The message goes to a visually hidden live region placed right after the grid element (`role="status"`, `aria-live="polite"`, `aria-atomic="true"`). The screen reader reads it after finishing its current speech, and the keyboard focus doesn't move. -The method works in the [read-only mode](api/spreadsheet_readonly_config.md) and while the [selection](api/spreadsheet_selection_config.md) is turned off. +The Spreadsheet announces its own messages through the same region: the selected range, new formula errors and invalid values, refused edits, search results, the start and end of import and export, and new column widths and row heights (see the [list of status announcements](accessibility.md#status-announcements)). The region holds one message at a time, so a later message, your own or a built-in one, replaces the previous one. + +If you pass the text that is currently in the region, the screen reader reads it again. + +The method also works in the [read-only mode](api/spreadsheet_readonly_config.md) and while the [selection](api/spreadsheet_selection_config.md) is turned off. It does nothing before the Spreadsheet is attached to the page and after the `destructor()` method is called. **Change log:** Added in v6.0.4 -**Related article:** [Customization](customization.md#menu) +**Related articles:** +- [Status announcements](accessibility.md#status-announcements) +- [Announcing a custom command](accessibility.md#announcing-a-custom-command) +- [Customizing the menu](customization.md#menu) diff --git a/docs/api/spreadsheet_deletecolumn_method.md b/docs/api/spreadsheet_deletecolumn_method.md index 89646556..2c9fee5a 100644 --- a/docs/api/spreadsheet_deletecolumn_method.md +++ b/docs/api/spreadsheet_deletecolumn_method.md @@ -1,7 +1,7 @@ --- sidebar_label: deleteColumn() title: deleteColumn method -description: You can learn about the deleteColumn method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Remove a column or a range of columns from DHTMLX Spreadsheet with the deleteColumn() method, including all the columns of a merged cell. --- # deleteColumn() @@ -37,7 +37,7 @@ spreadsheet.deleteColumn("G2"); ~~~ :::note -You can delete several columns by providing a range of cells' ids as a parameter of the method, for example: "A1:C3". If the range touches a merged cell, the columns of the whole merged cell are deleted. +You can delete several columns by providing a range of cells' ids as a parameter of the method, for example: "A1:C3". If the range touches a merged cell, the columns of the whole merged cell are deleted. A range that covers whole columns, for example, "B1:C100" in a sheet with 100 rows, is deleted as is. ::: ### Details @@ -51,7 +51,7 @@ spreadsheet.mergeCells("B2:D2"); spreadsheet.deleteColumn("C2"); ~~~ -Merged cells on the right of the deleted columns move to the left together with their columns. If the deleted columns are frozen, the frozen area shrinks by the number of the deleted frozen columns. +When whole columns are deleted, a merged cell that spans them becomes smaller. Merged cells on the right of the deleted columns move to the left together with their columns. If the deleted columns are frozen, the frozen area shrinks by the number of the deleted frozen columns. The [`beforeAction`](api/spreadsheet_beforeaction_event.md) and [`afterAction`](api/spreadsheet_afteraction_event.md) events of the `"deleteColumn"` action receive the cell that is passed to the method, not the range of the deleted columns. diff --git a/docs/api/spreadsheet_deleterow_method.md b/docs/api/spreadsheet_deleterow_method.md index 4bd5d12b..5ea9e4ed 100644 --- a/docs/api/spreadsheet_deleterow_method.md +++ b/docs/api/spreadsheet_deleterow_method.md @@ -1,7 +1,7 @@ --- sidebar_label: deleteRow() title: deleteRow method -description: You can learn about the deleteRow method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Remove a row or a range of rows from DHTMLX Spreadsheet with the deleteRow() method, including all the rows of a merged cell. --- # deleteRow() @@ -37,7 +37,7 @@ spreadsheet.deleteRow("G2"); ~~~ :::note -You can delete several rows by providing a range of cells' ids as a parameter of the method, for example: "A1:C3". If the range touches a merged cell, the rows of the whole merged cell are deleted. +You can delete several rows by providing a range of cells' ids as a parameter of the method, for example: "A1:C3". If the range touches a merged cell, the rows of the whole merged cell are deleted. A range that covers whole rows, for example, "A2:Z3" in a sheet with columns A to Z, is deleted as is. ::: ### Details @@ -51,7 +51,7 @@ spreadsheet.mergeCells("B2:B4"); spreadsheet.deleteRow("B3"); ~~~ -Merged cells below the deleted rows move up together with their rows. If the deleted rows are frozen, the frozen area shrinks by the number of the deleted frozen rows. +When whole rows are deleted, a merged cell that spans them becomes smaller. Merged cells below the deleted rows move up together with their rows. If the deleted rows are frozen, the frozen area shrinks by the number of the deleted frozen rows. The [`beforeAction`](api/spreadsheet_beforeaction_event.md) and [`afterAction`](api/spreadsheet_afteraction_event.md) events of the `"deleteRow"` action receive the cell that is passed to the method, not the range of the deleted rows. diff --git a/docs/api/spreadsheet_readonly_config.md b/docs/api/spreadsheet_readonly_config.md index e94b608b..fecfccd9 100644 --- a/docs/api/spreadsheet_readonly_config.md +++ b/docs/api/spreadsheet_readonly_config.md @@ -1,7 +1,7 @@ --- sidebar_label: readonly title: readonly config -description: You can learn about the readonly config in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Turn on the read-only mode in DHTMLX Spreadsheet with the readonly property, which blocks data changes but keeps keyboard navigation, selection, copying and search. --- # readonly @@ -33,7 +33,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { ### Details -In the read-only mode, the toolbar, the menu and the formula bar are hidden, and the context menu and the column menu icon are not available. The sheet tabs stay, without the button that adds a sheet. +In the read-only mode, the toolbar, the menu and the formula bar are hidden, and the context menu and the column menu icon are not available. The sheet tabs stay, but without the button that adds a sheet, the sheet context menu and renaming by a double-click. Users can still read and copy the data: @@ -41,10 +41,12 @@ Users can still read and copy the data: - the cells can be navigated with the keyboard and selected with the mouse, and the selection events fire on these actions - the cells can be copied with `Ctrl (Cmd) + C` and searched with `Ctrl (Cmd) + F` - the sheets can be switched in the sheet tabs and with the keyboard +- the links in cells can be opened, but the buttons that edit and remove a link are disabled in the link popup Changes of the data are refused: -- the editing keys, typing, cut and paste don't change the cells, and screen readers announce "The sheet is read-only" +- typing, the editing keys, cut and paste, undo and redo, and the shortcuts that format cells, insert a link, add a sheet or show hidden rows and columns are ignored, and screen readers announce "The sheet is read-only" +- the methods that edit the data, for example, [`setValue()`](api/spreadsheet_setvalue_method.md), [`setStyle()`](api/spreadsheet_setstyle_method.md) and [`deleteRow()`](api/spreadsheet_deleterow_method.md), and the [`startEdit()`](api/spreadsheet_startedit_method.md) method are ignored. The [`parse()`](api/spreadsheet_parse_method.md) and [`load()`](api/spreadsheet_load_method.md) methods still load data - the fill handle is hidden - the columns and rows can't be resized by dragging their borders, and a double-click on a column border doesn't fit the column width to the data diff --git a/docs/api/spreadsheet_selection_config.md b/docs/api/spreadsheet_selection_config.md index fc685516..e8c743e8 100644 --- a/docs/api/spreadsheet_selection_config.md +++ b/docs/api/spreadsheet_selection_config.md @@ -1,7 +1,7 @@ --- sidebar_label: selection title: selection config -description: You can learn about the selection config in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Turn off the selection of cells in DHTMLX Spreadsheet with the selection property, alone or with the read-only mode, to show the data without an active cell. --- # selection @@ -37,11 +37,11 @@ When the property is set to `false`: - the Spreadsheet has no active cell - the cells can't be selected with the mouse, the keyboard or the API: the [`setSelectedCell()`](api/selection_setselectedcell_method.md) and [`setFocusedCell()`](api/selection_setfocusedcell_method.md) methods are ignored, and the [`getSelectedCell()`](api/selection_getselectedcell_method.md) and [`getFocusedCell()`](api/selection_getfocusedcell_method.md) methods return `undefined` -- the cells can't be edited from the interface, and the fill handle is hidden +- the cells can't be edited from the interface: the formula bar is locked, the fill handle is hidden, and the [`startEdit()`](api/spreadsheet_startedit_method.md) method is ignored - the context menu and the column menu icon are not available - `Tab` stops on the grid once and moves the focus further, and `Ctrl + F6` skips the sheet -The columns and rows can still be resized by dragging their borders. +The columns and rows can still be resized by dragging their borders, and the data can still be changed with the API, for example, with the [`setValue()`](api/spreadsheet_setvalue_method.md) method. Combined with the [`readonly`](api/spreadsheet_readonly_config.md) property, the option turns off the keyboard navigation and the selection that are available in the read-only mode: @@ -58,5 +58,6 @@ To turn the selection off and on at runtime, use the [`selection.disable()`](api **Change log:** Added in v6.0.4 **Related articles:** -- [Configuration](configuration.md#selection-of-cells) -- [Configuration](configuration.md#read-only-mode) +- [Selection of cells](configuration.md#selection-of-cells) +- [Read-only mode](configuration.md#read-only-mode) +- [Accessibility: read-only setup](accessibility.md#read-only-setup) diff --git a/docs/configuration.md b/docs/configuration.md index 5cce5954..de524463 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -1,7 +1,7 @@ --- sidebar_label: Configuration title: Configuration -description: You can learn about the configuration of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Configure DHTMLX Spreadsheet. Set up the toolbar, the editing bar, the menu, the number of rows and columns, the read-only mode, the selection of cells and number formats. --- # Configuration diff --git a/docs/customization.md b/docs/customization.md index 9882d3c2..65c6bc6f 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -1,7 +1,7 @@ --- sidebar_label: Customization title: Customization -description: You can learn about the customization of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Customize DHTMLX Spreadsheet. Change icons, and add, update and delete controls of the toolbar, the menu and the context menu, or build a custom read-only mode. --- # Customization diff --git a/docs/data_search.md b/docs/data_search.md index f0a812ab..f598ecd2 100644 --- a/docs/data_search.md +++ b/docs/data_search.md @@ -1,7 +1,7 @@ --- sidebar_label: Searching for data title: Searching for data -description: You can learn about data search in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Search for data in DHTMLX Spreadsheet with the search bar. Open it with Ctrl (Cmd) + F or the Data menu, move between the matches and close it with Esc. --- # Searching for data diff --git a/docs/excel_import_export.md b/docs/excel_import_export.md index 9dc81f03..03c75327 100644 --- a/docs/excel_import_export.md +++ b/docs/excel_import_export.md @@ -1,7 +1,7 @@ --- sidebar_label: Excel import/export title: Excel import and export -description: You can learn about the excel import and export in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Import data from Excel files into DHTMLX Spreadsheet and export it to .xlsx through the toolbar or the File menu. --- # Excel import/export diff --git a/docs/filtering_data.md b/docs/filtering_data.md index c085d47f..46725c4e 100644 --- a/docs/filtering_data.md +++ b/docs/filtering_data.md @@ -1,7 +1,7 @@ --- sidebar_label: Filtering data title: Filtering data -description: You can learn about data filtering in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Filter data in DHTMLX Spreadsheet by condition or by values, open a filter with the keyboard, and clear or remove filters. --- # Filtering data diff --git a/docs/guides.md b/docs/guides.md index 7ad0145f..a348715b 100644 --- a/docs/guides.md +++ b/docs/guides.md @@ -1,7 +1,7 @@ --- sidebar_label: Guides overview title: Developer and User Guides -description: You can study developer and user guides in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Developer and user guides of DHTMLX Spreadsheet, from initialization, configuration and data loading to editing cells, formatting and work with sheets. --- # Guides diff --git a/docs/hotkeys.md b/docs/hotkeys.md index af1ece1b..b92fdf06 100644 --- a/docs/hotkeys.md +++ b/docs/hotkeys.md @@ -1,7 +1,7 @@ --- sidebar_label: Hot keys list title: Hotkeys -description: You can learn about the hotkeys in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Keyboard shortcuts of DHTMLX Spreadsheet for editing, formatting, navigation, selection, search, work with sheets, rows and columns, popups and dialogs. --- # Hot keys list @@ -9,7 +9,7 @@ description: You can learn about the hotkeys in the documentation of the DHTMLX Here is a list of hotkeys that you can use while working with DHTMLX Spreadsheet. :::note -The shortcuts for cells work while the focus is in the cells or in the formula bar. The formatting, undo, search and link shortcuts also work while the focus is on the toolbar. On the toolbar, the menu bar and the sheet tabs, the arrow keys, **Home**, **End**, **Enter** and **Space** control the bar itself, as described in the [Moving the focus](#moving-the-focus) section. +The shortcuts for cells work while the focus is in the cells or in the formula bar. The formatting, undo, search and link shortcuts also work while the focus is on the toolbar. When the focus is on the toolbar, the menu bar or the sheet tabs, the arrow keys, **Home**, **End**, **Enter** and **Space** work within that bar (see [Moving the focus](#moving-the-focus)). In the [read-only mode](api/spreadsheet_readonly_config.md), the shortcuts for navigation, selection, copying and search work, and the editing shortcuts are refused. ::: @@ -24,7 +24,7 @@ In the [read-only mode](api/spreadsheet_readonly_config.md), the shortcuts for n Ctrl (Cmd) + Enter - stops cell’s editing, leaves selection on the cell + stops cell's editing, leaves selection on the cell F2 diff --git a/docs/localization.md b/docs/localization.md index 96fbdd7d..dce4c582 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -1,7 +1,7 @@ --- sidebar_label: Localization title: Localization -description: You can learn about the localization of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Localize DHTMLX Spreadsheet. Check the default locale, create a custom one, translate the built-in widgets and the formula popup, and apply a locale. --- # Localization @@ -281,7 +281,7 @@ const en = { The keys that start with `aria_` are not shown in the interface. Screen readers read them as the names of the controls, as the descriptions of the active cell, and as the messages of the live region that the [`announce()`](api/spreadsheet_announce_method.md) method also uses. The parts in curly braces, such as `{cell}` or `{count}`, are replaced with the values when the string is read. Keep them in the translated strings. -The `defaultSheetName` key sets the prefix of the names of new sheets: with the value `"Blatt"`, new sheets are named "Blatt1", "Blatt2" and so on. +The `defaultSheetName` key sets the prefix of the default sheet names. The Spreadsheet adds a number to it, so the default value `"sheet"` gives the names "sheet1", "sheet2" and so on. For example, with `"Tabelle"`, the prefix that Microsoft Excel uses in German, the sheets are named "Tabelle1", "Tabelle2" and so on. ## Custom locale diff --git a/docs/merge_cells.md b/docs/merge_cells.md index f0bd2cc9..f1cabf5e 100644 --- a/docs/merge_cells.md +++ b/docs/merge_cells.md @@ -1,7 +1,7 @@ --- sidebar_label: Merging cells title: Merging cells -description: You can learn about merging cells in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Merge and split cells in DHTMLX Spreadsheet through the toolbar or the Format menu, and learn how removing rows and columns affects merged cells. --- # Merging cells diff --git a/docs/themes/themes.md b/docs/themes/themes.md index f9f9f2d3..e9fcbeae 100644 --- a/docs/themes/themes.md +++ b/docs/themes/themes.md @@ -1,7 +1,7 @@ --- sidebar_label: Built-in themes title: Built-in Themes -description: You can learn about the built-in themes of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Built-in themes of DHTMLX Spreadsheet, light and dark with their high contrast variants. Learn the Spreadsheet-specific CSS variables and how to set a theme. --- # Built-in themes diff --git a/docs/vuejs_integration.md b/docs/vuejs_integration.md index 4a4dec64..6e630880 100644 --- a/docs/vuejs_integration.md +++ b/docs/vuejs_integration.md @@ -1,7 +1,7 @@ --- sidebar_label: Integration with Vue title: Vue Integration -description: You can learn about the Vue integration of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Use DHTMLX Spreadsheet in a Vue application. Create a project, add Spreadsheet as a Vue component, load data and handle events. --- # Integration with Vue diff --git a/docs/whats_new.md b/docs/whats_new.md index 74af3e9b..daf131c7 100644 --- a/docs/whats_new.md +++ b/docs/whats_new.md @@ -19,13 +19,14 @@ Released on October , 2026 - new configuration property: [`selection`](api/spreadsheet_selection_config.md) - new methods of the selection module: [`enable()`](api/selection_enable_method.md), [`disable()`](api/selection_disable_method.md), [`isDisabled()`](api/selection_isdisabled_method.md) - The [`announce()`](api/spreadsheet_announce_method.md) method sends a status message to screen readers -- New commands of the [context menu](customization.md#context-menu): *Column width*, *Row height* and *Open filter* +- New commands of the [context menu](customization.md#context-menu): [*Column width*, *Row height*](work_with_rows_cols.md#setting-column-width-and-row-height) and [*Open filter*](filtering_data.md#opening-a-filter-with-the-keyboard) ### Updates - Keyboard navigation: the focus stays on the active cell, `Ctrl + F6` moves it between the menu, the toolbar, the sheet and the sheet tabs, and new shortcuts are added. Check the [Hot keys list](hotkeys.md) +- The [`setFocusedCell()`](api/selection_setfocusedcell_method.md) method moves the keyboard focus to the cell - The [read-only mode](api/spreadsheet_readonly_config.md) keeps the keyboard navigation, the selection, copying and search. To turn the selection off, use the `selection: false` option -- Removing a row or a column through a merged cell removes all the rows or columns of the merged cell +- [Removing a row or a column through a merged cell](merge_cells.md#removing-rows-and-columns-of-merged-cells) removes all the rows or columns of the merged cell - New interface and screen reader strings in the [`spreadsheet` locale](localization.md#default-locale), and [translation of the built-in widgets](localization.md#localizing-built-in-widgets) - The [`--dhx-spreadsheet-focus-color`](/themes/#spreadsheet-specific-styles) variable for the keyboard focus, and the formula reference colors with a higher contrast in the light themes - React Spreadsheet: the [`selection`](react/props.md#runtime-props) prop, the [`ISelection`](react/types.md#re-exported-upstream-types) type, and [`readonly`](react/props.md#init-only-props) as an init-only prop @@ -34,6 +35,7 @@ Released on October , 2026 - A merged cell was dropped instead of shifted when a row or column before it was deleted - Deleting a row or column through a merged cell removed only one line of the merge +- The context menu labels for removing rows and columns didn't show all the rows or columns of a merged cell that would be removed - Rows were not deleted when they covered the whole filtered range - The frozen area didn't shrink when frozen rows or columns were deleted - Autofill threw an error when the dragged cells held no plain number diff --git a/docs/work_with_cells.md b/docs/work_with_cells.md index 6ce2763b..fbe508eb 100644 --- a/docs/work_with_cells.md +++ b/docs/work_with_cells.md @@ -1,7 +1,7 @@ --- sidebar_label: Editing cells title: Editing cells -description: You can learn about the work with cells in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Edit cells in DHTMLX Spreadsheet. Enter content, insert hyperlinks, use drop-down lists, fill several cells, copy cells to and from Excel and lock cells. --- # Editing cells @@ -138,7 +138,7 @@ You can automatically fill cells with data. This is how it works: - copying the value -​For example, to make a series 4,4,4,4..., type 4 in the first cell only. +For example, to make a series 4,4,4,4..., type 4 in the first cell only. - following the pattern - to make a series 1, 2, 3, 4, 5, ... , type 1 and 2 into the first two cells. diff --git a/docs/work_with_rows_cols.md b/docs/work_with_rows_cols.md index ba9bd619..14f8d2a1 100644 --- a/docs/work_with_rows_cols.md +++ b/docs/work_with_rows_cols.md @@ -1,7 +1,7 @@ --- sidebar_label: Work with rows and columns title: Work with rows and columns -description: You can learn about how to work with rows and columns in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Work with rows and columns in DHTMLX Spreadsheet. Add and remove them, autofit and set the column width and row height, freeze, hide and show them. --- # Work with rows and columns From aaf1958d317019be655f6ec31ad1de6b64d21776 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Mon, 26 Oct 2026 11:45:36 +0300 Subject: [PATCH 15/32] [update] actions config, copy/paste and a11y links - beforeAction/afterAction: config properties described, incl. the groupAction array case - actions overview: resizeCol/resizeRow cover the size commands, config details moved to a note under the table - work with rows and columns: sub-headers and steps for row height in the size section, event details replaced with a link - work with cells: copying to and from Excel revised against sources - accessibility section moved after Guides in the sidebar - links to the accessibility guide from hotkeys, localization, themes --- docs/api/overview/actions_overview.md | 11 +++++++-- docs/api/spreadsheet_afteraction_event.md | 13 ++++++++++- docs/api/spreadsheet_beforeaction_event.md | 13 ++++++++++- docs/hotkeys.md | 2 ++ docs/localization.md | 2 +- docs/themes/themes.md | 2 +- docs/work_with_cells.md | 6 ++++- docs/work_with_rows_cols.md | 20 +++++++++++++++-- sidebars.js | 26 +++++++++++----------- 9 files changed, 73 insertions(+), 22 deletions(-) diff --git a/docs/api/overview/actions_overview.md b/docs/api/overview/actions_overview.md index 3a7d2d88..0f811e10 100644 --- a/docs/api/overview/actions_overview.md +++ b/docs/api/overview/actions_overview.md @@ -67,8 +67,8 @@ spreadsheet.events.on("beforeColumnAdd", function(cell){ | **merge** | The action is executed when merging a range of cells | | **removeCellStyles** | The action is executed when clearing styles of a cell | | **renameSheet** | The action is executed when renaming a sheet | -| **resizeCol** | The action is executed when resizing a column | -| **resizeRow** | The action is executed when resizing a row | +| **resizeCol** | The action is executed when resizing a column by dragging its border or with the *Column width* command | +| **resizeRow** | The action is executed when resizing a row by dragging its border or with the *Row height* command | | **setCellFormat** | The action is executed when changing the format of a cell | | **setCellValue** | The action is executed when changing or removing the value of a cell | | **setValidation** | The action is executed when setting data validation for a cell | @@ -78,6 +78,13 @@ spreadsheet.events.on("beforeColumnAdd", function(cell){ | **toggleFreeze** | The action is executed when freezing/unfreezing columns/rows | | **unmerge** | The action is executed when splitting cells | +:::note +In the `config` object of the [`beforeAction`](api/spreadsheet_beforeaction_event.md) and [`afterAction`](api/spreadsheet_afteraction_event.md) events, the **resizeCol** and **resizeRow** actions pass: + +- `cell` - the cell or range of cells whose columns or rows are resized +- `val` - the new width or height in pixels. It is set only for the *Column width* and *Row height* commands, not for resizing by dragging +::: + **Change log:** - The **toggleFreeze** and **toggleVisibility** actions were added in v5.2 diff --git a/docs/api/spreadsheet_afteraction_event.md b/docs/api/spreadsheet_afteraction_event.md index 26fb7645..bab4cf67 100644 --- a/docs/api/spreadsheet_afteraction_event.md +++ b/docs/api/spreadsheet_afteraction_event.md @@ -21,7 +21,18 @@ afterAction: (action: string, config: object) => void; The callback of the event takes the following parameters: - `action` - (required) the name of the action. Check the full list of available actions [here](api/overview/actions_overview.md#list-of-actions) -- `config` - (required) an object with parameters of the action +- `config` - (required) an object with parameters of the action. The set of properties depends on the action. The object can include: + - `action` - (string) the name of the action + - `cell` - (string) the id of the cell or the range of cells the action is applied to, for example, `"A1"` or `"B2:D5"` + - `row` - (number) the zero-based index of the row of the cell + - `col` - (number) the zero-based index of the column of the cell + - `val` - (any) the new value that the action applies, for example, a cell value, a style or a size + - `prev` - (any) the previous value + - `groupAction` - (string) the name of the group action, if the action is applied to a range of cells + - `pageId` - (string | number) the id of the sheet + - `pageName` - (string) the name of the sheet + + When several actions are executed together, for example, on paste, the `action` parameter is `"groupAction"`, and `config` is an array of such objects. ### Example diff --git a/docs/api/spreadsheet_beforeaction_event.md b/docs/api/spreadsheet_beforeaction_event.md index 5f6a63b7..e57b1ff8 100644 --- a/docs/api/spreadsheet_beforeaction_event.md +++ b/docs/api/spreadsheet_beforeaction_event.md @@ -21,7 +21,18 @@ beforeAction: (action: string, config: object) => void | boolean; The callback of the event takes the following parameters: - `action` - (required) the name of the action. Check the full list of available actions [here](api/overview/actions_overview.md#list-of-actions) -- `config` - (required) an object with parameters of the action +- `config` - (required) an object with parameters of the action. The set of properties depends on the action. The object can include: + - `action` - (string) the name of the action + - `cell` - (string) the id of the cell or the range of cells the action is applied to, for example, `"A1"` or `"B2:D5"` + - `row` - (number) the zero-based index of the row of the cell + - `col` - (number) the zero-based index of the column of the cell + - `val` - (any) the new value that the action applies, for example, a cell value, a style or a size + - `prev` - (any) the previous value + - `groupAction` - (string) the name of the group action, if the action is applied to a range of cells + - `pageId` - (string | number) the id of the sheet + - `pageName` - (string) the name of the sheet + + When several actions are executed together, for example, on paste, the `action` parameter is `"groupAction"`, and `config` is an array of such objects. ### Returns diff --git a/docs/hotkeys.md b/docs/hotkeys.md index b92fdf06..caaed6c5 100644 --- a/docs/hotkeys.md +++ b/docs/hotkeys.md @@ -12,6 +12,8 @@ Here is a list of hotkeys that you can use while working with DHTMLX Spreadsheet The shortcuts for cells work while the focus is in the cells or in the formula bar. The formatting, undo, search and link shortcuts also work while the focus is on the toolbar. When the focus is on the toolbar, the menu bar or the sheet tabs, the arrow keys, **Home**, **End**, **Enter** and **Space** work within that bar (see [Moving the focus](#moving-the-focus)). In the [read-only mode](api/spreadsheet_readonly_config.md), the shortcuts for navigation, selection, copying and search work, and the editing shortcuts are refused. + +To learn how the keyboard navigation works with screen readers, check the [Accessibility](accessibility.md#keyboard-navigation) guide. ::: ## Editing diff --git a/docs/localization.md b/docs/localization.md index dce4c582..bf29cc7a 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -279,7 +279,7 @@ const en = { }; ~~~ -The keys that start with `aria_` are not shown in the interface. Screen readers read them as the names of the controls, as the descriptions of the active cell, and as the messages of the live region that the [`announce()`](api/spreadsheet_announce_method.md) method also uses. The parts in curly braces, such as `{cell}` or `{count}`, are replaced with the values when the string is read. Keep them in the translated strings. +The keys that start with `aria_` are not shown in the interface. Screen readers read them as the names of the controls, as the descriptions of the active cell, and as the messages of the live region that the [`announce()`](api/spreadsheet_announce_method.md) method also uses. The parts in curly braces, such as `{cell}` or `{count}`, are replaced with the values when the string is read. Keep them in the translated strings. For an example of translated accessibility strings, check the [Accessibility](accessibility.md#translated-accessibility-strings) guide. The `defaultSheetName` key sets the prefix of the default sheet names. The Spreadsheet adds a number to it, so the default value `"sheet"` gives the names "sheet1", "sheet2" and so on. For example, with `"Tabelle"`, the prefix that Microsoft Excel uses in German, the sheets are named "Tabelle1", "Tabelle2" and so on. diff --git a/docs/themes/themes.md b/docs/themes/themes.md index e9fcbeae..aa5660e0 100644 --- a/docs/themes/themes.md +++ b/docs/themes/themes.md @@ -13,7 +13,7 @@ The DHTMLX Spreadsheet library provides 4 predefined themes: - [light high contrast theme](#light-high-contrast-theme) ("contrast-light") - [dark high contrast theme](#dark-high-contrast-theme) ("contrast-dark") -The Spreadsheet themes are developed in accordance with international standards. The high contrast themes help users with vision impairment. For more details, read the [Accessibility support](https://docs.dhtmlx.com/suite/common_features/accessibility_support/) article. +The Spreadsheet themes are developed in accordance with international standards. The high contrast themes help users with vision impairment. For the contrast of the themes and the keyboard focus indicator in Spreadsheet, check the [High contrast and focus](accessibility.md#high-contrast-and-focus) section of the Accessibility guide. For the accessibility of the DHTMLX Suite widgets, read the [Accessibility support](https://docs.dhtmlx.com/suite/common_features/accessibility_support/) article. You can try all themes in the example below: diff --git a/docs/work_with_cells.md b/docs/work_with_cells.md index fbe508eb..927b7698 100644 --- a/docs/work_with_cells.md +++ b/docs/work_with_cells.md @@ -157,7 +157,11 @@ For example, to make a series North, South, North, South, ..., type North and So ## Copying cells to and from Excel -Cells copied with **Ctrl (Cmd) + C** keep their values and styles, including the font size, when you paste them into Microsoft Excel or into another place of the Spreadsheet. Cells copied in Microsoft Excel keep the font size when you paste them into the Spreadsheet with **Ctrl (Cmd) + V**. +You can copy cells with **Ctrl (Cmd) + C** and paste them with **Ctrl (Cmd) + V** within the Spreadsheet and between the Spreadsheet and Microsoft Excel: + +- within the Spreadsheet, the cells keep their values, formulas, styles, number formats and links. The cell references in the formulas are shifted to the new position +- in Excel, the pasted cells get the values (the results of the formulas, not the formulas), the styles (including the font size), merged cells and links. The rows hidden by a filter are skipped +- cells copied from Excel keep their values, styles (including the font size), number formats, merged cells and links when you paste them into the Spreadsheet ## Locking cells diff --git a/docs/work_with_rows_cols.md b/docs/work_with_rows_cols.md index 14f8d2a1..3132f24f 100644 --- a/docs/work_with_rows_cols.md +++ b/docs/work_with_rows_cols.md @@ -126,6 +126,8 @@ To change the column width so that it would automatically fit the longest conten ## Setting column width and row height +### Setting column width + To set an exact width of columns, take the following steps: 1\. Select a column or a cell in the column. To change several columns, select a range of cells that spans them. @@ -134,11 +136,25 @@ To set an exact width of columns, take the following steps: 3\. In the *Column width* dialog, enter the width in pixels and click **Apply** or press `Enter`. -To set an exact height of rows, choose *Rows -> Row height* in the context menu and enter the height in the *Row height* dialog. +### Setting row height + +To set an exact height of rows, take the following steps: + +1\. Select a row or a cell in the row. To change several rows, select a range of cells that spans them. + +2\. Right-click the selection, or press `Shift + F10` or the Menu key, and choose *Rows -> Row height*. + +3\. In the *Row height* dialog, enter the height in pixels and click **Apply** or press `Enter`. + +### How the new size is applied The dialog shows the current size of the first selected column or row and applies the new size to every column or row of the selected range. The minimum width of a column is 20 px, and the minimum height of a row is 10 px: a smaller value is replaced with the minimum. The **Cancel** button or `Esc` closes the dialog without changes. Screen readers announce the new size, for example, "Column width set to 120 pixels". -The new size can be undone with `Ctrl (Cmd) + Z`. The command runs the `resizeCol` or `resizeRow` [action](api/overview/actions_overview.md). The `config` object that the [`beforeAction`](api/spreadsheet_beforeaction_event.md) and [`afterAction`](api/spreadsheet_afteraction_event.md) events receive contains the range of the columns or rows in `cell` and the new size in `val`. Unlike a resize by dragging, the `config` object has no `mouseEvent` property. +### Undoing the change + +The new size can be undone with `Ctrl (Cmd) + Z`. + +To handle the change in code, use the `resizeCol` and `resizeRow` [actions](api/overview/actions_overview.md#list-of-actions). ## Freezing/unfreezing rows and columns diff --git a/sidebars.js b/sidebars.js index 74f042f0..4d586df4 100644 --- a/sidebars.js +++ b/sidebars.js @@ -26,19 +26,6 @@ module.exports = { "migration" ] }, - { - type: "category", - label: "Accessibility", - collapsible: true, - collapsed: true, - link: { - type: 'doc', - id: "accessibility" - }, - items: [ - "accessibility_conformance_report" - ] - }, { type: "category", label: "API", @@ -339,6 +326,19 @@ module.exports = { } ] }, + { + type: "category", + label: "Accessibility", + collapsible: true, + collapsed: true, + link: { + type: 'doc', + id: "accessibility" + }, + items: [ + "accessibility_conformance_report" + ] + }, { type: "category", label: "Frameworks & integrations", From 7f44f5f5479423a49e0aefab35a0d6e096179206 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Mon, 26 Oct 2026 12:01:00 +0300 Subject: [PATCH 16/32] [update] add links to the accessibility guide - readonly, selection enable/disable/isDisabled: read-only setup in related articles - setFocusedCell: keyboard navigation in related articles - configuration: read-only mode and selection of cells sections - guides overview: setting up an accessible Spreadsheet entry --- docs/api/selection_disable_method.md | 1 + docs/api/selection_enable_method.md | 1 + docs/api/selection_isdisabled_method.md | 1 + docs/api/selection_setfocusedcell_method.md | 4 +++- docs/api/spreadsheet_readonly_config.md | 1 + docs/configuration.md | 4 +++- docs/guides.md | 1 + 7 files changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/api/selection_disable_method.md b/docs/api/selection_disable_method.md index ee20550d..8c6b6370 100644 --- a/docs/api/selection_disable_method.md +++ b/docs/api/selection_disable_method.md @@ -44,3 +44,4 @@ If the selection is already turned off, the method does nothing. **Related articles:** - [`selection`](api/spreadsheet_selection_config.md) - [`enable()`](api/selection_enable_method.md) +- [Accessibility: read-only setup](accessibility.md#read-only-setup) diff --git a/docs/api/selection_enable_method.md b/docs/api/selection_enable_method.md index 8e15f2ba..f8dcb156 100644 --- a/docs/api/selection_enable_method.md +++ b/docs/api/selection_enable_method.md @@ -39,3 +39,4 @@ If the selection is already turned on, the method does nothing. **Related articles:** - [`selection`](api/spreadsheet_selection_config.md) - [`disable()`](api/selection_disable_method.md) +- [Accessibility: read-only setup](accessibility.md#read-only-setup) diff --git a/docs/api/selection_isdisabled_method.md b/docs/api/selection_isdisabled_method.md index 68c5b152..654dca2a 100644 --- a/docs/api/selection_isdisabled_method.md +++ b/docs/api/selection_isdisabled_method.md @@ -38,3 +38,4 @@ const disabled = spreadsheet.selection.isDisabled(); // -> true - [`selection`](api/spreadsheet_selection_config.md) - [`enable()`](api/selection_enable_method.md) - [`disable()`](api/selection_disable_method.md) +- [Accessibility: read-only setup](accessibility.md#read-only-setup) diff --git a/docs/api/selection_setfocusedcell_method.md b/docs/api/selection_setfocusedcell_method.md index 5a1e131d..e08037db 100644 --- a/docs/api/selection_setfocusedcell_method.md +++ b/docs/api/selection_setfocusedcell_method.md @@ -48,4 +48,6 @@ The method does nothing while the selection is turned off with the [`selection: **Change log:** Moving the keyboard focus to the cell was added in v6.0.4 -**Related article:** [Work with Spreadsheet](working_with_ssheet.md) +**Related articles:** +- [Work with Spreadsheet](working_with_ssheet.md) +- [Accessibility: keyboard navigation](accessibility.md#keyboard-navigation) diff --git a/docs/api/spreadsheet_readonly_config.md b/docs/api/spreadsheet_readonly_config.md index fecfccd9..c6f428f8 100644 --- a/docs/api/spreadsheet_readonly_config.md +++ b/docs/api/spreadsheet_readonly_config.md @@ -65,6 +65,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { **Related articles:** - [Configuration](configuration.md#read-only-mode) - [Customization](customization.md#custom-read-only-mode) +- [Accessibility: read-only setup](accessibility.md#read-only-setup) **Related sample:** [Spreadsheet. Readonly](https://snippet.dhtmlx.com/2w959gx2) diff --git a/docs/configuration.md b/docs/configuration.md index de524463..cfe31a3a 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -55,7 +55,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { }); ~~~ -In the read-only mode, the toolbar, the menu and the formula bar are hidden. Users can navigate the cells with the keyboard, select them with the mouse, copy and search them. Edits are refused and announced to screen readers as "The sheet is read-only". The fill handle is hidden. Check the details in the [`readonly`](api/spreadsheet_readonly_config.md#details) article. +In the read-only mode, the toolbar, the menu and the formula bar are hidden. Users can navigate the cells with the keyboard, select them with the mouse, copy and search them. Edits are refused and announced to screen readers as "The sheet is read-only". The fill handle is hidden. Check the details in the [`readonly`](api/spreadsheet_readonly_config.md#details) article. To learn how keyboard and screen reader users work with a read-only Spreadsheet, check the [Read-only setup](accessibility.md#read-only-setup) section of the Accessibility guide. To turn off the keyboard navigation and the selection in the read-only mode, set the [`selection`](api/spreadsheet_selection_config.md) option to `false`: @@ -84,6 +84,8 @@ In this case, the Spreadsheet has no active cell, the cells can't be selected or To turn the selection off and on at runtime, use the [`selection.disable()`](api/selection_disable_method.md) and [`selection.enable()`](api/selection_enable_method.md) methods. The [`selection.isDisabled()`](api/selection_isdisabled_method.md) method checks whether the selection is turned off. +Without the selection, the grid becomes one tab stop that the keyboard passes through. Check the [Read-only setup](accessibility.md#read-only-setup) section of the Accessibility guide. + ## Custom number formats for cells You can apply 7 default formats to cell values: "Common", "Number", "Percent", "Currency", "Date", "Time", "Text". diff --git a/docs/guides.md b/docs/guides.md index a348715b..3a20b0ea 100644 --- a/docs/guides.md +++ b/docs/guides.md @@ -41,6 +41,7 @@ Shows how to load data into Spreadsheet, handle events, and use the main functio ### Accessibility - [Accessibility](accessibility.md) - WAI-ARIA support, keyboard navigation, screen-reader announcements, and high-contrast themes +- [Setting up an accessible Spreadsheet](accessibility.md#configuration-recipes) - configurations for keyboard and screen-reader users, including the read-only mode - [Conformance report (VPAT)](accessibility_conformance_report.md) - conformance with WCAG 2.2 AA, Section 508, and EN 301 549 ### AI-assisted development From 0baf2dde34ebbab418fbcb6dceec4f6e83614466 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Mon, 26 Oct 2026 16:40:44 +0300 Subject: [PATCH 17/32] [update] v6.0.4 what's new, a11y and keyboard details - what's new: keyboard navigation split into sub-items (Tab, Ctrl + F6, single tab stops, new shortcuts), arrow keys at the edge, toolbar popups focus, IME, read-only announcements, new fixes - accessibility guide and conformance report: focus model, aria-readonly with selection off, search bar dialog, popups keys, focus indicator of popups and palette, announcements wording - hotkeys: Tab/Ctrl + F6 details, Border and color popups keys, read-only shortcuts, toolbar tooltip on hover - setFocusedCell(): other changes of the active cell follow the same focus rules - startEdit(): details on starting the edit with IME text - react readonly prop: data kept, undo/redo history and UI state reset on recreation - formula help close icon works from the keyboard - wording fixes in customization, search, import/export, localization, themes, cells and rows/cols guides --- docs/accessibility.md | 53 +++++++++++---------- docs/accessibility_conformance_report.md | 16 +++---- docs/api/selection_setfocusedcell_method.md | 2 + docs/api/spreadsheet_startedit_method.md | 6 +++ docs/customization.md | 4 +- docs/data_search.md | 2 +- docs/excel_import_export.md | 4 +- docs/hotkeys.md | 16 +++---- docs/localization.md | 6 ++- docs/react/props.md | 2 +- docs/themes/themes.md | 4 +- docs/whats_new.md | 19 ++++++-- docs/work_with_cells.md | 2 +- docs/work_with_rows_cols.md | 6 +-- 14 files changed, 82 insertions(+), 60 deletions(-) diff --git a/docs/accessibility.md b/docs/accessibility.md index 6c4d7ac8..0d93ec2d 100644 --- a/docs/accessibility.md +++ b/docs/accessibility.md @@ -22,7 +22,7 @@ Conformance is reported criterion by criterion for DHTMLX Spreadsheet 6.0.4. The | ---- | ------- | | Keyboard operation | Every command on the cells has a key. The toolbar, the menu bar and the sheet tabs are single tab stops navigated with the arrow keys. The column width, the row height and the column filter have context menu commands, so they don't require dragging or a click on an icon | | WAI-ARIA semantics | The cells are a `grid` with `columnheader`, `rowheader` and `gridcell` elements. The roles are always rendered | -| Focus model | The keyboard focus is on the active cell. Tab enters the sheet on the active cell and leaves the Spreadsheet from the last and the first cell. Ctrl + F6 moves the focus between the menu, the toolbar, the sheet and the sheet tabs | +| Focus model | The keyboard focus is on the active cell. Tab enters the sheet on the active cell and leaves it from the last and the first cell. Ctrl + F6 moves the focus between the menu, the toolbar, the sheet and the sheet tabs | | Selection model | The active cell, a range and several ranges are exposed through `aria-selected`, and the extent of a range is announced. The selection can be turned off with the [`selection`](api/spreadsheet_selection_config.md) option | | Read-only mode | The sheet can be navigated, selected, copied and searched; edits are refused and announced | | Screen readers | Tested with NVDA, JAWS and VoiceOver | @@ -87,9 +87,9 @@ The following table lists the roles and the position and state attributes of the | Cell | `role="gridcell"` + `aria-colindex` | A cell. Column A has `aria-colindex="2"`, since the row numbers are the first column | | Row number | `role="rowheader"` | The header of the row | | Cell | `aria-selected` | `"true"` on the active cell and on every cell of the selected ranges | -| Cell | `aria-readonly` | `"true"` in the read-only mode and on [locked cells](work_with_cells.md#locking-cells) | +| Cell | `aria-readonly` | `"true"` in the read-only mode, while the [selection](api/spreadsheet_selection_config.md) is turned off, and on [locked cells](work_with_cells.md#locking-cells) | | Cell | `tabindex` | `"0"` on the active cell and `"-1"` on the other cells, so the cells are one tab stop | -| Active cell | DOM focus | The keyboard focus is on the active cell itself, not on a separate input | +| Active cell | DOM focus | The keyboard focus is on the active cell itself, not on a separate input. While the cell is edited, the focus is on the cell editor | | Merged cell | `aria-colspan` / `aria-rowspan` | The number of columns or rows that the merged cell spans. The cells it covers are hidden with `aria-hidden="true"` | | Link in a cell | `` with `target="_blank"` and `rel="noopener noreferrer"` | A link with the `http`, `https`, `mailto`, `ftp` or `tel` scheme | @@ -119,11 +119,11 @@ The headers are not tab stops. A click on a column letter, a row number or the c | Selector | Role / attribute | Purpose | | -------- | ---------------- | ------- | -| Formula bar input | `aria-label` | "Formula bar, B7", with the address of the active cell. The input is `readonly` on a locked cell, so its value can still be read | +| Formula bar input | `aria-label` | "Formula bar, B7", with the address of the active cell. The input is `readonly` on a locked cell and while the selection is turned off, so its value can still be read | | Cell editor input | `aria-label` | "Cell editor, B7" | | Editor of a cell with a list of values | `role="combobox"`, `aria-controls`, `aria-expanded`, `aria-activedescendant` | The list of values is a `listbox` of `option` elements, and the highlighted option is `aria-selected` | -| Editor with an invalid value | `aria-invalid="true"` | The value is not in the list of values | -| Close icon of the formula help | `role="button"` + `aria-label` | "Close formula help" | +| Editor with an invalid value | `aria-invalid="true"` | The saved value of the cell is not in its list of values. The attribute is updated after the value is saved, not while the user types | +| Close icon of the formula help | `role="button"` + `aria-label` | "Close formula help". The icon is focusable and closes the help on Enter or Space | ### Toolbar and menus @@ -137,7 +137,7 @@ The headers are not tab stops. A click on a column letter, a row number or the c | Text color, Background color, Border color | `aria-label` | The name of the control and of the current color, for example, "Text color: dark gray" | | Color palette | `role="grid"` of `gridcell` elements | The grid is named "Color palette". Each color cell is named after its color, and the chosen one has `aria-selected="true"` | | Border style list | `role="listbox"` of `option` elements | The options are named "Thin line", "Medium line", "Thick line", "Dashed line", "Dotted line", "Double line" | -| Menu bar | `role="menubar"` + `aria-label` | "Main". Its items open popups with `role="menu"`. In the popups, the formatting items have `role="menuitemcheckbox"`, and the alignment and number format items have `role="menuitemradio"` | +| Menu bar | `role="menubar"` + `aria-label` | "Main". Its items open popups with `role="menu"`. In the popups, the formatting items have `role="menuitemcheckbox"`, and the alignment, text wrapping and number format items have `role="menuitemradio"`. Both report their state with `aria-checked` | | Context menus | `role="menu"` + `aria-label` | "Cell" for the cells and "Sheet" for the sheet tabs | ### Sheet tabs @@ -153,7 +153,8 @@ The headers are not tab stops. A click on a column letter, a row number or the c | Selector | Role / attribute | Purpose | | -------- | ---------------- | ------- | | Column width and Row height dialogs | `role="dialog"`, `aria-modal="true"`, `aria-label` | Named by the dialog title. The input is labeled "Width in pixels" / "Height in pixels" | -| Search bar, Insert link, Data validation | `role="dialog"` + `aria-label` | Named by the dialog title. The search bar buttons are named "Previous match", "Next match" and "Close search" | +| Search bar | `role="dialog"` + `aria-label` | Named "Search". The search input is labeled "Search", and the buttons are named "Previous match", "Next match" and "Close search" | +| Insert link, Data validation | `role="dialog"` + `aria-label` | Named by the dialog title | | Alerts | `role="alertdialog"`, `aria-modal="true"`, `aria-labelledby`, `aria-describedby` | Named by the alert header and described by its text | ### Hidden and decorative elements @@ -162,7 +163,7 @@ The Spreadsheet hides decorative parts from assistive technology with `aria-hidd ## Selection and editing model -The DOM focus is on the active cell itself, so a screen reader reads the cell, not a separate input. When the active cell moves, the screen reader reads the address of the new cell first, then its value and its hidden descriptions. When the user selects a range with Shift + arrow keys or with the mouse, the screen reader announces the extent of the range once the selection stops changing. +The DOM focus is on the active cell itself, so a screen reader reads the cell, not a separate input. When the active cell moves, the screen reader reads the address of the new cell first, then its value and its hidden descriptions. When the user selects a range with the keyboard or the mouse, the screen reader announces the extent of the range once the selection stops changing. A cell shared by several ranges is counted once, and the cells of hidden rows and columns are counted. Nothing is announced while a cell is edited. When a range is reduced to the active cell, the address of the cell is announced. | Situation | What the screen reader gets | | --------- | --------------------------- | @@ -170,12 +171,12 @@ The DOM focus is on the active cell itself, so a screen reader reads the cell, n | A range is selected | "B2 to D7, 18 cells" | | Several ranges are selected with Ctrl | "B2 to B4, D2 to D4, 6 cells" | | The editor opens with Enter, F2 or typing | The editor input named "Cell editor, B7" | -| The editor of a cell with a list of values opens | A combobox with its list and the highlighted option | -| The edit is saved | New formula errors and invalid values in the edited cell and in the cells that depend on it are announced | +| The editor of a cell with a list of values opens | An expanded combobox. After ↑ or ↓, the highlighted option of the list is read | +| The edit is saved | New formula errors in the edited cells and in the cells that depend on them, and invalid values in the edited cells, are announced | | An edit of a locked cell is refused | "The cell is locked" | | An editing key is pressed in the read-only mode | "The sheet is read-only" | -Enter, F2 or typing opens the editor. Enter saves the value and moves down, Tab saves it and moves right, and Esc cancels the edit. +Enter, F2 or typing opens the editor. Enter saves the value and moves down, Tab saves it and moves right, and Esc cancels the edit. Text composed with an input method editor (IME) is shown over the active cell from the first key and opens the editor when the composition ends. ## Keyboard navigation @@ -189,7 +190,7 @@ The keyboard works as soon as the Spreadsheet is on the page; no configuration i | Shift + arrow keys | Extend the selected range | | Home / End | Move to the first or the last visible cell of the row | | Ctrl + arrow keys, Ctrl + Home / End | Move to the edge of the sheet | -| Tab / Shift + Tab | Move right or left within the row. From the last or the first cell of the sheet, move the focus out of the Spreadsheet | +| Tab / Shift + Tab | Move right or left within the row. From the last or the first cell of the sheet, move the focus out of the cells to the next or the previous part of the page, for example, the sheet tabs or the formula bar | | Enter, F2 | Open the editor | | Esc | Close the editor without saving | | Ctrl + Space / Shift + Space | Select the column or the row | @@ -202,7 +203,7 @@ The keyboard works as soon as the Spreadsheet is on the page; no configuration i | Keys | Action | | ---- | ------ | -| Ctrl + F6 / Ctrl + Shift + F6 | Move the focus to the next or the previous part: the menu, the toolbar, the sheet, the sheet tabs. An open edit is saved first | +| Ctrl + F6 / Ctrl + Shift + F6 | Move the focus to the next or the previous part: the menu, the toolbar, the sheet, the sheet tabs. The formula bar and hidden parts are skipped. An open edit is saved first | | Tab / Shift + Tab | Move the focus to the next or the previous part in the page tab order. Each bar is one tab stop, and the focus lands on the control used last | ### Toolbar, menu bar and sheet tabs @@ -222,8 +223,8 @@ The keyboard works as soon as the Spreadsheet is on the page; no configuration i | ---- | ------ | | Arrow keys, Home / End | Move between the colors of the color palette | | Enter | Apply the color, the border, or the size in the Column width and Row height dialogs | -| Esc | Close the popup, the dialog or the search bar and return the focus to the control or the cell that opened it | -| Tab / Shift + Tab | Move between the controls of a dialog; in a color popup, close it and return the focus to its button | +| Esc | Close the popup, the dialog or the search bar and return the focus to the control or the cell that opened it. In the custom color mode, return to the palette. In a color or style popup opened from the Border popup, close it and return the focus to its button in the Border popup | +| Tab / Shift + Tab | Move between the controls of a dialog or of the custom color mode. In a color popup or the Border popup, close it and return the focus to its toolbar button | | ↑ / ↓, Enter | Move through the list of values of a cell and choose a value | :::note @@ -244,13 +245,13 @@ Screen readers get each state from the element it belongs to: | State | Exposed through | Read on | | ----- | --------------- | ------- | -| Position | `aria-rowindex`, `aria-colindex`, and the cell address in the cell text | Each cell | +| Position | `aria-rowindex`, `aria-colindex`, and the cell address in the cell text | Each cell. The address is in the text of the active cell and of the cells of the selected ranges | | Selection | `aria-selected` | The active cell and the cells of the selected ranges | -| Editability | `aria-readonly` | The grid in the read-only mode, and locked cells | +| Editability | `aria-readonly` | The grid and the cells in the read-only mode and while the selection is turned off, and locked cells | | Merged cells | `aria-colspan`, `aria-rowspan` | The merged cell | | Row headers | `role="rowheader"` | The row numbers | -| Toggle state | `aria-pressed` | The formatting buttons and the sheet tabs | -| Exclusive options | `aria-checked` | The alignment, wrapping and number format items | +| Toggle state | `aria-pressed` | The Bold, Italic, Underline, Strikethrough, Lock and Filter buttons and the sheet tabs | +| Checked state | `aria-checked` | The formatting items of the menu bar, and the alignment, text wrapping and number format items | | Errors and invalid values | Hidden text in the cell, `aria-invalid` | The cell and its editor | | Links | `` and the hidden text "link" | The cell with a link | @@ -274,7 +275,8 @@ The keyboard focus is shown in every theme: - the active cell has a 2px solid border in the primary color of the theme - a cell and the cell editor that have the keyboard focus get a 2px outline in the primary color of the theme -- the formula bar and the controls of the toolbar, the menu bar and the sheet tabs get a 2px outline in the color of the `--dhx-spreadsheet-focus-color` variable +- the formula bar and the controls of the toolbar, the menu bar, the sheet tabs, the Border popup, the link popup and the search bar get a 2px outline in the color of the `--dhx-spreadsheet-focus-color` variable +- in the color palette and the border style list, the focused item gets a 1px dashed outline in the `--dhx-color-focused` color The `--dhx-spreadsheet-focus-color` variable is lighter than the primary color in the dark themes and can be redefined in a [custom theme](themes/custom_theme.md). The contrast of each indicator in each theme is given in the [Accessibility Conformance Report](accessibility_conformance_report.md). @@ -296,10 +298,10 @@ The Spreadsheet announces the changes that have no element of their own through | An edit causes several errors / invalid values | "3 new errors. B7: ..." / "3 invalid values. B7: ..." | `aria_newErrors`, `aria_invalidValues` | | An edit of a locked cell / range is refused | "The cell is locked" / "Locked cells were not changed" | `aria_lockedCell`, `aria_lockedCells` | | An editing key is pressed in the read-only mode | "The sheet is read-only" | `aria_readonlySheet` | -| The search text changes | "Results: 5." and the first match | `aria_searchResults`, `aria_searchNoResults` | +| The search text is typed | "Results: 5. 1 of 5, B2" or "No results" | `aria_searchResults`, `aria_searchMatch`, `aria_searchNoResults` | | The next or previous match is shown | "2 of 5, B7" | `aria_searchMatch` | -| A file is exported | "Exporting the file", "The file is exported" | `aria_exportStarted`, `aria_exportDone` | -| A file is imported | "Importing the file", "The file is imported" | `aria_importStarted`, `aria_importDone` | +| An Excel file is exported | "Exporting the file", "The file is exported" | `aria_exportStarted`, `aria_exportDone` | +| A file chosen in the file dialog is imported | "Importing the file", "The file is imported" | `aria_importStarted`, `aria_importDone` | | The Column width / Row height command is applied | "Column width set to 120 pixels" | `aria_columnWidthSet`, `aria_rowHeightSet` | | Ctrl + Shift + 9 / 0 finds nothing to show | "No hidden rows in the selection" | `aria_noHiddenRows`, `aria_noHiddenCols` | @@ -326,7 +328,7 @@ dhx.i18n.setLocale("spreadsheet", { const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); ~~~ -The parts in curly braces, such as `{cell}` or `{count}`, are replaced with the values and must be kept in the translated strings. The names of the colors, the dialogs and the alert buttons come from the `colorpicker`, `window` and `message` locales. See [Localization](localization.md#default-locale) for the full list of keys and [Localizing built-in widgets](localization.md#localizing-built-in-widgets) for the other locales. +The parts in curly braces, such as `{cell}` or `{count}`, are replaced with the values and must be kept in the translated strings. The names of the colors and of the alert buttons come from the `colorpicker` and `message` locales. See [Localization](localization.md#default-locale) for the full list of keys and [Localizing built-in widgets](localization.md#localizing-built-in-widgets) for the other locales. ## Configuration recipes @@ -371,7 +373,6 @@ const deColorpicker = { aria_colorRed: "rot" }; const deMessage = { - aria_alert: "Meldung", aria_confirm: "Bestätigen" }; diff --git a/docs/accessibility_conformance_report.md b/docs/accessibility_conformance_report.md index 9472a283..e6e56435 100644 --- a/docs/accessibility_conformance_report.md +++ b/docs/accessibility_conformance_report.md @@ -64,20 +64,20 @@ theme" is a configuration dependency, not a defect. Criterion 4.1.1 Parsing is r | **1.2.1** Audio-only and Video-only (Prerecorded) | Not Applicable | The product contains no audio or video content. | | **1.2.2** Captions (Prerecorded) | Not Applicable | No prerecorded multimedia. | | **1.2.3** Audio Description or Media Alternative (Prerecorded) | Not Applicable | No prerecorded multimedia. | -| **1.3.1** Info and Relationships | Supports | The cells are a `grid` named "Spreadsheet" with `row`, `columnheader`, `rowheader` and `gridcell` roles. Position is exposed with `aria-rowindex`/`aria-colindex` against `aria-rowcount`/`aria-colcount`; the extent of a merged cell with `aria-colspan`/`aria-rowspan`; editability with `aria-readonly`; selection with `aria-selected` and `aria-multiselectable`. The toolbar, the menu bar and the sheet tabs are `toolbar` and `menubar` elements with names; exclusive formatting options are `menuitemradio` with `aria-checked`. | +| **1.3.1** Info and Relationships | Supports | The cells are a `grid` named "Spreadsheet" with `row`, `columnheader`, `rowheader` and `gridcell` roles. Position is exposed with `aria-rowindex`/`aria-colindex` against `aria-rowcount`/`aria-colcount`; the extent of a merged cell with `aria-colspan`/`aria-rowspan`; editability with `aria-readonly`; selection with `aria-selected` and `aria-multiselectable`. The toolbar, the menu bar and the sheet tabs are `toolbar` and `menubar` elements with names; the formatting toggles have `aria-pressed` on the toolbar and are `menuitemcheckbox` in the menu bar, and exclusive formatting options are `menuitemradio` with `aria-checked`. | | **1.3.2** Meaningful Sequence | Supports | DOM and reading order follow the visual order: the menu bar, the toolbar, the formula bar, the cells and the sheet tabs. The cells carry their position in the sheet through `aria-rowindex`/`aria-colindex`, so the sequence is preserved when rows and columns are scrolled out of the DOM. | | **1.3.3** Sensory Characteristics | Supports | No instruction or label relies solely on shape, size, or spatial location; interactive elements carry text or an ARIA name. | | **1.4.1** Use of Color | Supports | Each state shown by color also has a border, a fill, a marker or text: the active cell, the selected range, search matches, the copied range and invalid cells, together with `aria-selected` or text in the cell. Rows hidden by a filter leave a gap in the row numbers. The color buttons carry the color name in their accessible name. | | **1.4.2** Audio Control | Not Applicable | The product produces no auto-playing audio. | | **2.1.1** Keyboard | Supports | Every command on the cells has a key, listed in the [Hot keys list](hotkeys.md); `Shift`+`F10` or the Menu key opens the context menu. `Ctrl`+`F6` moves the focus between the menu, the toolbar, the sheet and the sheet tabs. The bars, their dropdowns and popups, and the list editor work with the arrow keys, `Home`, `End`, `Enter` and `Esc`. The column width, the row height and the column filter have context menu commands. | -| **2.1.2** No Keyboard Trap | Supports | `Tab` on the last cell and `Shift`+`Tab` on the first cell of the sheet move the focus out of the Spreadsheet, and `Ctrl`+`F6` moves it between the parts at any time. In the list editor `Tab` ends the edit and `Esc` cancels it, also after the arrow keys were used. `Esc` and `Tab` close the toolbar popups and return the focus to their buttons. | +| **2.1.2** No Keyboard Trap | Supports | `Tab` on the last cell and `Shift`+`Tab` on the first cell of the sheet move the focus out of the cells to the next or the previous part of the page, and `Ctrl`+`F6` moves it between the parts of the Spreadsheet. In the list editor `Tab` ends the edit and `Esc` cancels it, also after the arrow keys were used. `Esc` and `Tab` close the toolbar popups and return the focus to their buttons. | | **2.1.4** Character Key Shortcuts | Supports | Every shortcut uses a modifier key (`Ctrl`, `Alt`, `Shift`) or a non-character key (`F2`, `F6`, `F10`, `F11`, `Enter`, `Esc`, `Delete`, arrows). Typing a character on a cell enters it into the cell, which is the purpose of the cell, and doesn't run a command. | | **2.2.1** Timing Adjustable | Not Applicable | The product sets no time limits. | | **2.2.2** Pause, Stop, Hide | Supports | There is no auto-updating, moving, blinking or scrolling content. No animation lasts more than 5 seconds. | | **2.3.1** Three Flashes or Below Threshold | Supports | The product contains no flashing content. | | **2.4.1** Bypass Blocks | Not Applicable | Applies at page level; bypass mechanisms belong to the host application. | | **2.4.2** Page Titled | Not Applicable | Page titles are the host application's responsibility. | -| **2.4.3** Focus Order | Supports | The cells are one tab stop on the active cell, and the toolbar, the menu bar and the sheet tabs are one tab stop each, in visual order. `Tab` leaves the sheet at the last and the first cell. Dialogs take the focus, keep `Tab` inside, and return the focus to the active cell when they close; menus, context menus and popups return the focus to the control that opened them. The active cell is scrolled into view when it receives the focus. | +| **2.4.3** Focus Order | Supports | The cells are one tab stop on the active cell, and the toolbar, the menu bar and the sheet tabs are one tab stop each, in visual order. `Tab` leaves the sheet at the last and the first cell. Dialogs take the focus, keep `Tab` inside, and return the focus to the active cell when they close; menus, context menus and popups return the focus to the control that opened them, and after a text or background color is applied, the focus returns to the active cell. The active cell is scrolled into view when it receives the focus. | | **2.4.4** Link Purpose (In Context) | Supports | A link in a cell is rendered as an `` element whose text is the link text set by the author, or the address. The cell text adds "link" when the cell is selected, and `Alt`+`Enter` opens it. | | **2.5.1** Pointer Gestures | Supports | No operation requires a multipoint or path-based gesture; every drag operation has a non-drag alternative (see 2.5.7). | | **2.5.2** Pointer Cancellation | Supports | Column and row resizing and the fill handle apply on release, and one undo reverts each of them. Commands of the toolbar, the menus and the sheet tabs run on `click`. | @@ -87,10 +87,10 @@ theme" is a configuration dependency, not a defect. Criterion 4.1.1 Parsing is r | **3.2.1** On Focus | Supports | Receiving focus never changes context. A click on a column letter, a row number or the corner selects the lines and keeps the focus on the active cell. | | **3.2.2** On Input | Supports | Changing a value does not change context. Editing a cell, choosing a value from a list or typing in the search bar updates the sheet in place, which is the documented purpose of those controls. | | **3.2.6** Consistent Help (2.2 only) | Not Applicable | The widget provides no help mechanism; this is a page-level concern. | -| **3.3.1** Error Identification | Supports | Formula errors and invalid list values are described in the cell content, for example "Reference error. Check the cell references" and "Invalid value. Choose a value from the list". New errors caused by an edit are announced through the live region, and the editor of an invalid value has `aria-invalid="true"`. | +| **3.3.1** Error Identification | Supports | Formula errors and invalid list values are described in the cell content, for example "Reference error. Check the cell references" and "Invalid value. Choose a value from the list". New formula errors and invalid values caused by an edit are announced through the live region, and the editor of an invalid value has `aria-invalid="true"`. | | **3.3.2** Labels or Instructions | Supports | The cell editor is named "Cell editor, B7" and the formula bar "Formula bar, B7", with the address of the edited cell. The dialog fields are labelled, for example "Width in pixels", and the search bar buttons are named "Previous match", "Next match" and "Close search". | | **3.3.7** Redundant Entry (2.2 only) | Supports | The product contains no multi-step process that asks for information already entered. | -| **4.1.2** Name, Role, Value | Supports | Each part exposes a role, its states and a name from the locale: the cells (`grid`, `row`, `gridcell`, `columnheader`, `rowheader`, `aria-selected`, `aria-readonly`), the toolbars and the menu bar (`toolbar`, `menubar`), the formatting buttons and the sheet tabs (`aria-pressed`), and the exclusive formats (`menuitemradio`, `aria-checked`). Alerts are `alertdialog` with `aria-modal="true"`. The list editor is a `combobox` that controls a `listbox`, with `aria-expanded` and `aria-activedescendant`. | +| **4.1.2** Name, Role, Value | Supports | Each part exposes a role, its states and a name from the locale: the cells (`grid`, `row`, `gridcell`, `columnheader`, `rowheader`, `aria-selected`, `aria-readonly`), the toolbars and the menu bar (`toolbar`, `menubar`), the formatting, Lock and Filter buttons and the sheet tabs (`aria-pressed`), the formatting items of the menu bar (`menuitemcheckbox`, `aria-checked`), and the exclusive formats (`menuitemradio`, `aria-checked`). Alerts are `alertdialog` with `aria-modal="true"`. The list editor is a `combobox` that controls a `listbox`, with `aria-expanded` and `aria-activedescendant`. | ### Table 2: Success Criteria, Level AA @@ -108,8 +108,8 @@ theme" is a configuration dependency, not a defect. Criterion 4.1.1 Parsing is r | **1.4.12** Text Spacing | Supports | With the WCAG text-spacing overrides applied, no control label is cut; the sheet tab bar scrolls when the tabs grow. | | **1.4.13** Content on Hover or Focus | Supports | Toolbar tooltips stay open while hovered and are dismissed with `Esc` without moving the pointer or the focus. The invalid-value tooltip reports an input error, stays while the cell is active, and is removed with `Esc`. | | **2.4.5** Multiple Ways | Not Applicable | Applies to locating pages within a set of web pages; out of scope for a single embedded component (host-application concern). | -| **2.4.6** Headings and Labels | Supports | The main parts take their accessible names from the locale: "Spreadsheet" (grid), "Formatting" (toolbar), "Main" (menu bar), "Cell" (context menu), "Sheets" (sheet tab bar) and "Formula bar, B7" (formula bar). The select-all corner is named "Select all", and the dialogs are named by their titles. | -| **2.4.7** Focus Visible | Supports | The keyboard focus location is visible at all times. The active cell always has a 2px solid border, and the focused cell or cell editor has a 2px outline, both in the primary color of the theme. The formula bar and the controls of the toolbar, the menu bar, the sheet tabs, the search bar and the toolbar popups show a 2px focus ring in the `--dhx-spreadsheet-focus-color` color. In dropdowns, context menus and lists, the focused item is highlighted. The focus indicator is shown in every built-in theme. | +| **2.4.6** Headings and Labels | Supports | The main parts take their accessible names from the locale: "Spreadsheet" (grid), "Formatting" (toolbar), "Borders", "Search" and "Link" (the toolbars of the Border popup, the search bar and the link popup), "Main" (menu bar), "Cell" and "Sheet" (context menus of the cells and the sheet tabs), "Sheets" (sheet tab bar), "Formula bar, B7" (formula bar) and "Cell editor, B7" (cell editor). The select-all corner is named "Select all", the search bar is named "Search" and its buttons "Previous match", "Next match" and "Close search", the button that adds a sheet is named "Add sheet", and the other dialogs are named by their titles. | +| **2.4.7** Focus Visible | Supports | The keyboard focus location is visible at all times. The active cell always has a 2px solid border, and the focused cell or cell editor has a 2px outline, both in the primary color of the theme. The formula bar and the controls of the toolbar, the menu bar, the sheet tabs, the search bar and the Border popup show a 2px focus ring in the `--dhx-spreadsheet-focus-color` color. In the color palette and the border style list, the focused item has a 1px dashed outline. In dropdowns, context menus and lists, the focused item is highlighted. The focus indicator is shown in every built-in theme. | | **2.4.11** Focus Not Obscured (Minimum) (2.2 only) | Supports | The active cell is scrolled into view next to the frozen rows and columns, so it is never left behind a frozen area. | | **2.5.7** Dragging Movements (2.2 only) | Supports | Range selection has `Shift`+arrows and `Ctrl`+`Space`/`Shift`+`Space`. Column width and row height are set with the *Column width* and *Row height* commands of the context menu, with undo. Hidden rows and columns are shown with `Ctrl`+`Shift`+`9`/`0` and the *Show rows*/*Show columns* commands. Filling cells is available through the [`groupFill`](api/spreadsheet_groupfill_event.md) event, which can be bound to a context menu command. | | **2.5.8** Target Size (Minimum) (2.2 only) | Partially Supports | The fill handle is 12 x 12 CSS px. The column and row resizers have equivalent controls, the *Column width* and *Row height* commands. The select-all corner is the 40 x 32 CSS px corner header cell, and the toolbar and menu controls are larger than 24 x 24 CSS px. | @@ -119,7 +119,7 @@ theme" is a configuration dependency, not a defect. Criterion 4.1.1 Parsing is r | **3.3.3** Error Suggestion | Supports | Error descriptions suggest a fix: "Check the cell references" for a reference error and "Choose a value from the list" for an invalid list value. | | **3.3.4** Error Prevention (Legal, Financial, Data) | Supports | Every change of the data can be reverted with undo (`Ctrl`+`Z`) and repeated with redo. The host application can additionally cancel any action through the [`beforeAction`](api/spreadsheet_beforeaction_event.md) event. | | **3.3.8** Accessible Authentication (Minimum) (2.2 only) | Not Applicable | The product performs no authentication. | -| **4.1.3** Status Messages | Supports | Status changes are announced without moving focus through a visually hidden live region outside the grid (`role="status"`, `aria-live="polite"`, `aria-atomic="true"`). It reports the selected range, new formula errors and invalid values, refused edits of locked cells or a read-only sheet, search results, the start and end of import and export, and new column widths and row heights. The same region is available to the host application through the public [`announce()`](api/spreadsheet_announce_method.md) method, and every built-in message is localizable through the `aria_*` locale keys. | +| **4.1.3** Status Messages | Supports | Status changes are announced without moving focus through a visually hidden live region outside the grid (`role="status"`, `aria-live="polite"`, `aria-atomic="true"`). It reports the selected range, new formula errors and invalid values, refused edits of locked cells or a read-only sheet, search results, the start and end of import and export, new column widths and row heights, and a selection with no hidden rows or columns to show. The same region is available to the host application through the public [`announce()`](api/spreadsheet_announce_method.md) method, and every built-in message is localizable through the `aria_*` locale keys. | ## Revised Section 508 report diff --git a/docs/api/selection_setfocusedcell_method.md b/docs/api/selection_setfocusedcell_method.md index e08037db..04d486b3 100644 --- a/docs/api/selection_setfocusedcell_method.md +++ b/docs/api/selection_setfocusedcell_method.md @@ -42,6 +42,8 @@ The method makes the specified cell active and, after the redraw, moves the keyb If the keyboard focus is on the page body, for example, right after the page is loaded, the method moves it to the cell. +The same rules apply to any other change of the active cell, for example, by another API method. + If the [`beforeFocusSet`](api/spreadsheet_beforefocusset_event.md) event handler returns `false`, the active cell isn't changed and the keyboard focus isn't moved. The method does nothing while the selection is turned off with the [`selection: false`](api/spreadsheet_selection_config.md) configuration option or the [`selection.disable()`](api/selection_disable_method.md) method. diff --git a/docs/api/spreadsheet_startedit_method.md b/docs/api/spreadsheet_startedit_method.md index 033f570f..d80f3a9a 100644 --- a/docs/api/spreadsheet_startedit_method.md +++ b/docs/api/spreadsheet_startedit_method.md @@ -35,4 +35,10 @@ spreadsheet.parse(data); spreadsheet.startEdit(); ~~~ +### Details + +Typing in the active cell starts editing through this method. Text composed with an input method editor (IME) is passed as `initialValue` when the composition ends. So the [`beforeEditStart`](api/spreadsheet_beforeeditstart_event.md) and [`afterEditStart`](api/spreadsheet_aftereditstart_event.md) events receive the typed or the composed text, and `beforeEditStart` can cancel the edit. + +**Change log:** Starting the edit with the text composed with an IME was added in v6.0.4 + **Related article:** [Work with Spreadsheet](working_with_cells.md#editing-a-cell) diff --git a/docs/customization.md b/docs/customization.md index 65c6bc6f..d6af6aab 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -31,7 +31,7 @@ Then you can use the name of the icon as the value of the `icon` property in the You can add the following types of controls: `button`, `menuItem`, `separator`, and `spacer`. -The *Text color* and *Background color* controls of the [default toolbar](#default-controls), and the *Border color* control in the *Border* popup, are of the `navItem` type. They show the current color in their value and open a color popup. +The *Text color* and *Background color* controls of the [default toolbar](#default-controls), and the *Border color* control in the *Border* popup, are of the `navItem` type. They draw the current color with the `html` property, take their accessible name from the `value` property, for example, "Text color: dark gray", and open a color popup. The Spreadsheet updates both properties when the active cell changes. The `button` object has the following properties: @@ -381,7 +381,7 @@ The [default context menu](/#context-menu) has the following structure: - the **Columns** menuItem (id: "columns") - the *Add column* menuItem (id: "add-col") - the *Remove column* menuItem (id: "remove-col") - - the *Fit to data* menuItem (id: "fit-col") + - the *Fit to data* menuItem (id: "fit-col"), shown in the column menu and when whole columns are selected - the *Column width* menuItem (id: "col-width") - the separator - the *Unfreeze columns* menuItem (id: "unfreeze-cols") diff --git a/docs/data_search.md b/docs/data_search.md index f598ecd2..f8686d63 100644 --- a/docs/data_search.md +++ b/docs/data_search.md @@ -15,7 +15,7 @@ To open a search bar, use one of two options: Type the text to find in the search bar. The first cell that contains the text becomes active, and the counter shows the number of matches. To move between the matches, click the arrow buttons in the search bar. -The search results are updated after the cells are edited and after another sheet is opened. Screen readers announce the number of matches and the address of the current match, for example, "2 of 5, B7". +The search results are updated after the cells are edited and after another sheet is opened. Screen readers announce the number of matches and the address of the first match after you stop typing, for example, "Results: 5. 1 of 5, B2", or "No results". When you move to another match, they announce its position and address, for example, "2 of 5, B7". To close the search bar, press **Esc** or click the close button. The focus returns to the active cell. diff --git a/docs/excel_import_export.md b/docs/excel_import_export.md index 03c75327..b9424017 100644 --- a/docs/excel_import_export.md +++ b/docs/excel_import_export.md @@ -38,8 +38,8 @@ Go to: *File -> Download As... -> Microsoft Excel (.xlsx)* in the menu 2\. Check your downloads directory to find the Excel file with data from Spreadsheet. -Screen readers announce the start and the end of import and export. +Screen readers announce the start and the end of the export to Excel, and of the import of a file chosen in the file dialog. Loading a file by URL is not announced. :::note -Import and export of Excel files use WebAssembly. If the browser doesn't support WebAssembly, the Import and Export commands show a message with the text of the `wasmNotSupported` [locale](localization.md#default-locale) key. The [`load()`](api/spreadsheet_load_method.md) method with the `"xlsx"` type and the [`export.xlsx()`](api/export_xlsx_method.md) method throw an `Error` with the same text, which you can catch in your code. +Import and export of Excel files use WebAssembly. If the browser doesn't support WebAssembly, the Import and Export commands show a message with the text of the `wasmNotSupported` [locale](localization.md#default-locale) key. The [`load()`](api/spreadsheet_load_method.md) method with the `"xlsx"` type, or with the `"json"` type and no URL, and the [`export.xlsx()`](api/export_xlsx_method.md) method throw an `Error` with the same text. The error is thrown when the method is called, so catch it with `try...catch`. ::: diff --git a/docs/hotkeys.md b/docs/hotkeys.md index caaed6c5..4c5bb597 100644 --- a/docs/hotkeys.md +++ b/docs/hotkeys.md @@ -9,9 +9,9 @@ description: Keyboard shortcuts of DHTMLX Spreadsheet for editing, formatting, n Here is a list of hotkeys that you can use while working with DHTMLX Spreadsheet. :::note -The shortcuts for cells work while the focus is in the cells or in the formula bar. The formatting, undo, search and link shortcuts also work while the focus is on the toolbar. When the focus is on the toolbar, the menu bar or the sheet tabs, the arrow keys, **Home**, **End**, **Enter** and **Space** work within that bar (see [Moving the focus](#moving-the-focus)). +The shortcuts for cells work while the focus is in the cells or in the formula bar. The formatting, undo, search, link and add-sheet shortcuts also work while the focus is on the toolbar. When the focus is on the toolbar, the menu bar or the sheet tabs, the arrow keys, **Home**, **End**, **Enter** and **Space** work within that bar (see [Moving the focus](#moving-the-focus)). -In the [read-only mode](api/spreadsheet_readonly_config.md), the shortcuts for navigation, selection, copying and search work, and the editing shortcuts are refused. +In the [read-only mode](api/spreadsheet_readonly_config.md), the shortcuts for navigation, selection, copying and search work. The shortcuts that change the sheet, including **Ctrl (Cmd) + Shift + 9**, **Ctrl (Cmd) + Shift + 0** and **Shift + F11**, are refused, and screen readers announce "The sheet is read-only". To learn how the keyboard navigation works with screen readers, check the [Accessibility](accessibility.md#keyboard-navigation) guide. ::: @@ -130,11 +130,11 @@ To learn how the keyboard navigation works with screen readers, check the [Acces Tab - moves selection one cell right (in a row). From the rightmost cell, moves selection to the first cell of the same row. If a range of cells is selected, moves selection one cell right within the bounds of a range. From the last cell of the sheet, moves the focus out of the Spreadsheet. + moves selection one cell right (in a row). From the rightmost cell, moves selection to the first cell of the same row. If a range of cells is selected, moves selection one cell right within the bounds of a range. From the last cell of the sheet, saves the edited value and moves the focus out of the cells to the next part of the page, for example, the sheet tabs. Tab + Shift - moves selection one cell left (in a row). From the leftmost cell, moves selection to the last cell of the same row. If a range of cells is selected, moves selection one cell left within the bounds of a range. From the first cell of the sheet, moves the focus out of the Spreadsheet. + moves selection one cell left (in a row). From the leftmost cell, moves selection to the last cell of the same row. If a range of cells is selected, moves selection one cell left within the bounds of a range. From the first cell of the sheet, saves the edited value and moves the focus out of the cells to the previous part of the page, for example, the formula bar. Arrow keys @@ -195,7 +195,7 @@ The toolbar, the menu bar and the sheet tabs are single tab stops: Tab mo Ctrl + F6 - moves the focus to the next part of the Spreadsheet in the order: the menu, the toolbar, the sheet (the active cell), the sheet tabs. Saves the value of the edited cell first + moves the focus to the next part of the Spreadsheet in the order: the menu, the toolbar, the sheet (the active cell), the sheet tabs, and then back to the menu. The formula bar and hidden parts are skipped. Saves the value of the edited cell first Ctrl + Shift + F6 @@ -231,7 +231,7 @@ The toolbar, the menu bar and the sheet tabs are single tab stops: Tab mo Esc - closes the dropdown or the menu and returns the focus to the control that opened it. Closes the tooltip of a toolbar control + closes the dropdown or the menu and returns the focus to the control that opened it. Closes the tooltip of a toolbar control. Without Esc, the tooltip stays open while the pointer is over it Shift + F10 or Menu key @@ -356,11 +356,11 @@ The keys below work in the popups of the *Text color*, *Background color* and *B Esc - returns from the custom color mode to the palette, or closes the color or style popup opened over the Border popup. Otherwise, closes the popup and returns the focus to its toolbar control + returns from the custom color mode to the palette. In a color or style popup opened over the Border popup, closes it and returns the focus to its button in the Border popup. Otherwise, closes the popup and returns the focus to its toolbar control Tab/Tab + Shift - closes the popup and returns the focus to its toolbar control + closes the popup and returns the focus to its toolbar control. In the Border popup and the popups opened over it, closes them all and returns the focus to the Border control. In the custom color mode, moves the focus between the controls of the color picker diff --git a/docs/localization.md b/docs/localization.md index bf29cc7a..2c122a1d 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -196,7 +196,7 @@ const en = { invalidValue: "Invalid value", // Accessible names, read by screen readers - // accessible name of a color button; {color} is a name from the colorpicker locale + // accessible name of a color button; {label} is the name of the control, {color} is a name from the colorpicker locale aria_colorButton: "{label}: {color}", // accessible names of the toolbars; the screen reader adds the word "toolbar" itself aria_toolbarFormatting: "Formatting", @@ -325,6 +325,10 @@ const deColorpicker = { // other strings }; +const deMessage = { + aria_confirm: "Bestätigen" +}; + dhx.i18n.setLocale("spreadsheet", de); dhx.i18n.setLocale("colorpicker", deColorpicker); dhx.i18n.setLocale("message", deMessage); diff --git a/docs/react/props.md b/docs/react/props.md index e8cefe45..1a901d33 100644 --- a/docs/react/props.md +++ b/docs/react/props.md @@ -226,7 +226,7 @@ const [theme, setTheme] = useState("light"); ### Read-only mode -In read-only mode, users can navigate the cells with the keyboard, select them with the mouse, copy and search them. Edits are refused and announced to screen readers. Since `readonly` is an init-only prop, changing it recreates the widget. +In read-only mode, users can navigate the cells with the keyboard, select them with the mouse, copy and search them. Edits are refused and announced to screen readers. Since `readonly` is an init-only prop, changing it recreates the widget. The data is kept, while the undo/redo history and the UI state (selection, scroll position) are reset. ~~~tsx diff --git a/docs/themes/themes.md b/docs/themes/themes.md index aa5660e0..08b88d16 100644 --- a/docs/themes/themes.md +++ b/docs/themes/themes.md @@ -416,9 +416,9 @@ The list of variables specific to the Spreadsheet component includes the followi } ~~~ -The `--dhx-spreadsheet-range-color-*` and `--dhx-spreadsheet-range-background-*` variables set the colors that mark the cell references of a formula while it is edited. In the light themes, the `--dhx-spreadsheet-range-color-*` colors have a contrast of at least 4.5:1. +The `--dhx-spreadsheet-range-color-*` and `--dhx-spreadsheet-range-background-*` variables set the colors that mark the cell references of a formula while it is edited. In the light themes, the `--dhx-spreadsheet-range-color-*` colors have a contrast of at least 4.5:1 against the background of the formula bar. -The `--dhx-spreadsheet-focus-color` variable sets the color of the keyboard focus outline of the formula bar and of the toolbar, menu and sheet tab controls. In the dark themes, the color is lighter than the primary color, so that the outline keeps a contrast of at least 3:1. You can redefine the variable in a [custom theme](themes/custom_theme.md): +The `--dhx-spreadsheet-focus-color` variable sets the color of the keyboard focus outline of the formula bar and of the controls of the toolbar, the menu bar, the sheet tabs, the Border popup, the link popup and the search bar. In the dark themes, the color is lighter than the primary color, so that the outline keeps a contrast of at least 3:1. You can redefine the variable in a [custom theme](themes/custom_theme.md): ~~~css [data-dhx-theme='custom-theme-dark'] { diff --git a/docs/whats_new.md b/docs/whats_new.md index daf131c7..c4093ee4 100644 --- a/docs/whats_new.md +++ b/docs/whats_new.md @@ -23,9 +23,15 @@ Released on October , 2026 ### Updates -- Keyboard navigation: the focus stays on the active cell, `Ctrl + F6` moves it between the menu, the toolbar, the sheet and the sheet tabs, and new shortcuts are added. Check the [Hot keys list](hotkeys.md) +- Keyboard navigation (check the [Hot keys list](hotkeys.md)): + - the focus stays on the active cell, `Tab` and `Shift + Tab` leave the cells from the last and the first cell of the sheet, and `Ctrl + F6` moves the focus between the menu, the toolbar, the sheet and the sheet tabs + - the toolbar, the menu bar and the sheet tabs are single tab stops navigated with the arrow keys + - new shortcuts are added, for example, `Shift + F10` for the context menu and `Ctrl (Cmd) + Shift + 9` / `Ctrl (Cmd) + Shift + 0` for showing hidden rows and columns +- The arrow keys stop at the first and last visible row and column instead of moving to the opposite edge, and an arrow key at the edge reduces a selected range to the active cell +- The toolbar color and border popups take the keyboard focus when they open and close with `Esc` and `Tab` +- Text composed with an input method editor (IME) is shown in the active cell and starts the edit through the [`startEdit()`](api/spreadsheet_startedit_method.md) method, so the `beforeEditStart` and `afterEditStart` events fire for it - The [`setFocusedCell()`](api/selection_setfocusedcell_method.md) method moves the keyboard focus to the cell -- The [read-only mode](api/spreadsheet_readonly_config.md) keeps the keyboard navigation, the selection, copying and search. To turn the selection off, use the `selection: false` option +- The [read-only mode](api/spreadsheet_readonly_config.md) keeps the keyboard navigation, the selection, copying and search, and screen readers announce the refused edits. To turn the selection off, use the `selection: false` option - [Removing a row or a column through a merged cell](merge_cells.md#removing-rows-and-columns-of-merged-cells) removes all the rows or columns of the merged cell - New interface and screen reader strings in the [`spreadsheet` locale](localization.md#default-locale), and [translation of the built-in widgets](localization.md#localizing-built-in-widgets) - The [`--dhx-spreadsheet-focus-color`](/themes/#spreadsheet-specific-styles) variable for the keyboard focus, and the formula reference colors with a higher contrast in the light themes @@ -33,15 +39,17 @@ Released on October , 2026 ### Fixes -- A merged cell was dropped instead of shifted when a row or column before it was deleted +- The keyboard focus indicator wasn't shown on the cells, the toolbar and the formula bar +- The active cell stayed in a row or column after it was hidden +- A merged cell was dropped instead of shifted when a row or column before it was deleted. Now a merged cell left with a single cell becomes an ordinary cell and keeps its value - Deleting a row or column through a merged cell removed only one line of the merge - The context menu labels for removing rows and columns didn't show all the rows or columns of a merged cell that would be removed - Rows were not deleted when they covered the whole filtered range - The frozen area didn't shrink when frozen rows or columns were deleted - Autofill threw an error when the dragged cells held no plain number -- The page froze on `Home`, `End` and `Ctrl (Cmd) + Arrow` keys when the first or last row or column was hidden +- The page froze on `Home`, `End`, `Ctrl (Cmd) + Home`, `Ctrl (Cmd) + End` and `Ctrl (Cmd) + Arrow` keys when the first or last row or column was hidden - The font size was lost when cells were copied to Excel or pasted from Excel or within the Spreadsheet -- The invalid-value tooltip appeared away from the invalid cell +- The invalid-value tooltip appeared away from the invalid cell or wasn't shown - `Esc` and `Tab` didn't work in the list editor after the arrow keys were used - The search highlighted the second match first and didn't refresh the results after an edit or a sheet switch - A script error occurred on import or export in a browser without WebAssembly @@ -49,6 +57,7 @@ Released on October , 2026 - The keyboard focus was lost after the search bar closed - A closed context menu reopened - The active cell was scrolled one cell short of the viewport edge during keyboard navigation +- Screen readers announced the cells as buttons, read wrong row positions with frozen rows, and read placeholder names of the parts of the Spreadsheet - React Spreadsheet: the event callbacks and `onStateChange` didn't fire after the Spreadsheet was recreated by an init-only prop change - React Spreadsheet: the event handlers of the wrapper were not removed on unmount - React Spreadsheet: the data from `loadUrl` was loaded twice on mount and again over the kept data after the Spreadsheet was recreated diff --git a/docs/work_with_cells.md b/docs/work_with_cells.md index 927b7698..bd5cf3b3 100644 --- a/docs/work_with_cells.md +++ b/docs/work_with_cells.md @@ -165,7 +165,7 @@ You can copy cells with **Ctrl (Cmd) + C** and paste them with **Ctrl (Cmd) + V* ## Locking cells -You can lock cells to protect their values from changes. When you lock a cell, it shows a gray "key" in the top right corner. Locked cells do not respond to any attempts to edit them. +You can lock cells to protect their values from changes. When you lock a cell, it shows a gray "key" in the top right corner. Locked cells do not respond to any attempts to edit them. Screen readers announce the refused edit: "The cell is locked" for a single cell, or "Locked cells were not changed" when the selected range holds locked cells. ![DHTMLX Spreadsheet locked cells marked with a gray key icon in the top right corner](/img/lockedcells.png) diff --git a/docs/work_with_rows_cols.md b/docs/work_with_rows_cols.md index 3132f24f..4da3dac4 100644 --- a/docs/work_with_rows_cols.md +++ b/docs/work_with_rows_cols.md @@ -148,7 +148,7 @@ To set an exact height of rows, take the following steps: ### How the new size is applied -The dialog shows the current size of the first selected column or row and applies the new size to every column or row of the selected range. The minimum width of a column is 20 px, and the minimum height of a row is 10 px: a smaller value is replaced with the minimum. The **Cancel** button or `Esc` closes the dialog without changes. Screen readers announce the new size, for example, "Column width set to 120 pixels". +The dialog shows the current size of the first column or row of the selected range and applies the new size to every column or row of this range. If several ranges are selected, the last selected range is used. The size is rounded to whole pixels. The minimum width of a column is 20 px, and the minimum height of a row is 10 px: a smaller positive value is replaced with the minimum. While the field is empty or the value isn't a positive number, the **Apply** button is disabled. The **Cancel** button or `Esc` closes the dialog without changes. Screen readers announce the new size, for example, "Column width set to 120 pixels". ### Undoing the change @@ -253,7 +253,7 @@ To hide a row, take the following steps: ![DHTMLX Spreadsheet context menu with the Rows submenu showing Hide rows](/img/hide_row_context_menu.png) :::info -If the active cell is in a row that becomes hidden, the active cell moves to the first visible row below it. If there are no visible rows below, it moves to the last visible row above. +If the active cell is in a row that becomes hidden, the active cell moves to the first visible row below it, and the selection is reduced to this cell. If there are no visible rows below, it moves to the last visible row above. ::: ### Showing rows @@ -291,7 +291,7 @@ To hide a column, take the following steps: ![DHTMLX Spreadsheet context menu with the Columns submenu showing Hide columns](/img/hide_columns_context_menu.png) :::info -If the active cell is in a column that becomes hidden, the active cell moves to the first visible column on the right of it. If there are no visible columns on the right, it moves to the last visible column on the left. +If the active cell is in a column that becomes hidden, the active cell moves to the first visible column on the right of it, and the selection is reduced to this cell. If there are no visible columns on the right, it moves to the last visible column on the left. ::: ### Showing columns From 43d8f9d87ee9f76d7e45023a024f226bf23ac103 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Mon, 26 Oct 2026 17:11:43 +0300 Subject: [PATCH 18/32] [update] correct what's new --- docs/whats_new.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/whats_new.md b/docs/whats_new.md index c4093ee4..0780dccf 100644 --- a/docs/whats_new.md +++ b/docs/whats_new.md @@ -39,8 +39,6 @@ Released on October , 2026 ### Fixes -- The keyboard focus indicator wasn't shown on the cells, the toolbar and the formula bar -- The active cell stayed in a row or column after it was hidden - A merged cell was dropped instead of shifted when a row or column before it was deleted. Now a merged cell left with a single cell becomes an ordinary cell and keeps its value - Deleting a row or column through a merged cell removed only one line of the merge - The context menu labels for removing rows and columns didn't show all the rows or columns of a merged cell that would be removed @@ -57,7 +55,6 @@ Released on October , 2026 - The keyboard focus was lost after the search bar closed - A closed context menu reopened - The active cell was scrolled one cell short of the viewport edge during keyboard navigation -- Screen readers announced the cells as buttons, read wrong row positions with frozen rows, and read placeholder names of the parts of the Spreadsheet - React Spreadsheet: the event callbacks and `onStateChange` didn't fire after the Spreadsheet was recreated by an init-only prop change - React Spreadsheet: the event handlers of the wrapper were not removed on unmount - React Spreadsheet: the data from `loadUrl` was loaded twice on mount and again over the kept data after the Spreadsheet was recreated From 38574e161e6ee12555f643fce2c86b130264bcdc Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Wed, 28 Oct 2026 12:08:16 +0300 Subject: [PATCH 19/32] [update] v6.0.4 screenshots, focus and type notation - screenshots for keyboard navigation, contrast themes, merged-cell remove command, Column width/Row height dialogs and Open filter - dashed focus outline documented for toolbar/menu dropdowns and context menus, list editor focus in the guide and the ACR - beforeAction/afterAction: config fields and types in Usage - navItem links to the Suite docs in customization - How the new size is applied split into paragraphs --- docs/accessibility.md | 13 ++++++- docs/accessibility_conformance_report.md | 2 +- docs/api/spreadsheet_afteraction_event.md | 34 ++++++++++++------ docs/api/spreadsheet_beforeaction_event.md | 34 ++++++++++++------ docs/customization.md | 2 +- docs/filtering_data.md | 2 ++ docs/merge_cells.md | 2 ++ docs/work_with_rows_cols.md | 14 +++++++- .../spreadsheet_contrast_dark.png | Bin 0 -> 49758 bytes .../spreadsheet_contrast_light.png | Bin 0 -> 56938 bytes .../accessibility/toolbar_dropdown_focus.png | Bin 0 -> 32079 bytes static/img/column_width_context_menu.png | Bin 0 -> 45428 bytes static/img/column_width_dialog.png | Bin 0 -> 8103 bytes static/img/open_filter_context_menu.png | Bin 0 -> 44116 bytes .../img/remove_merged_rows_context_menu.png | Bin 0 -> 32959 bytes static/img/row_height_context_menu.png | Bin 0 -> 46071 bytes static/img/row_height_dialog.png | Bin 0 -> 7849 bytes 17 files changed, 79 insertions(+), 24 deletions(-) create mode 100644 static/img/accessibility/spreadsheet_contrast_dark.png create mode 100644 static/img/accessibility/spreadsheet_contrast_light.png create mode 100644 static/img/accessibility/toolbar_dropdown_focus.png create mode 100644 static/img/column_width_context_menu.png create mode 100644 static/img/column_width_dialog.png create mode 100644 static/img/open_filter_context_menu.png create mode 100644 static/img/remove_merged_rows_context_menu.png create mode 100644 static/img/row_height_context_menu.png create mode 100644 static/img/row_height_dialog.png diff --git a/docs/accessibility.md b/docs/accessibility.md index 0d93ec2d..405eb322 100644 --- a/docs/accessibility.md +++ b/docs/accessibility.md @@ -182,6 +182,8 @@ The DOM focus is on the active cell itself, so a screen reader reads the cell, n The keyboard works as soon as the Spreadsheet is on the page; no configuration is needed. The tables below summarize the keyboard model. See [Hot keys list](hotkeys.md) for the complete set of shortcuts. +![The Horizontal align dropdown of the toolbar opened with the Down arrow key, with the focus on its first item](/img/accessibility/toolbar_dropdown_focus.png) + ### Cells | Keys | Action | @@ -269,6 +271,14 @@ See the [Built-in themes](/themes/) article for the details. In the light themes, the colors that mark the cell references of a formula have a contrast of at least 4.5:1. +The `contrast-light` theme draws dark text and borders on a white background. In the Spreadsheet below, the context menu of a cell with the filter icon is opened with the keyboard. Its focused command, [*Open filter*](filtering_data.md#opening-a-filter-with-the-keyboard), is marked by a dashed outline, and the active cell is marked by a solid border in the primary color of the theme: + +![Spreadsheet in the contrast-light theme](/img/accessibility/spreadsheet_contrast_light.png) + +The `contrast-dark` theme draws light text and borders on a dark background. When the focus is on a toolbar control, the control is marked by a focus ring in the `--dhx-spreadsheet-focus-color` color, which is lighter than the primary color of the active cell border in the dark themes: + +![Spreadsheet in the contrast-dark theme](/img/accessibility/spreadsheet_contrast_dark.png) + ### Focus indicator The keyboard focus is shown in every theme: @@ -276,7 +286,8 @@ The keyboard focus is shown in every theme: - the active cell has a 2px solid border in the primary color of the theme - a cell and the cell editor that have the keyboard focus get a 2px outline in the primary color of the theme - the formula bar and the controls of the toolbar, the menu bar, the sheet tabs, the Border popup, the link popup and the search bar get a 2px outline in the color of the `--dhx-spreadsheet-focus-color` variable -- in the color palette and the border style list, the focused item gets a 1px dashed outline in the `--dhx-color-focused` color +- in the color palette, the border style list, the dropdowns of the toolbar and the menu bar, and the context menus, the focused item gets a 1px dashed outline in the `--dhx-color-focused` color +- in the list editor of a cell, the focus stays in the editor, and the current item of the list is highlighted with a background color The `--dhx-spreadsheet-focus-color` variable is lighter than the primary color in the dark themes and can be redefined in a [custom theme](themes/custom_theme.md). The contrast of each indicator in each theme is given in the [Accessibility Conformance Report](accessibility_conformance_report.md). diff --git a/docs/accessibility_conformance_report.md b/docs/accessibility_conformance_report.md index e6e56435..0cd23b43 100644 --- a/docs/accessibility_conformance_report.md +++ b/docs/accessibility_conformance_report.md @@ -109,7 +109,7 @@ theme" is a configuration dependency, not a defect. Criterion 4.1.1 Parsing is r | **1.4.13** Content on Hover or Focus | Supports | Toolbar tooltips stay open while hovered and are dismissed with `Esc` without moving the pointer or the focus. The invalid-value tooltip reports an input error, stays while the cell is active, and is removed with `Esc`. | | **2.4.5** Multiple Ways | Not Applicable | Applies to locating pages within a set of web pages; out of scope for a single embedded component (host-application concern). | | **2.4.6** Headings and Labels | Supports | The main parts take their accessible names from the locale: "Spreadsheet" (grid), "Formatting" (toolbar), "Borders", "Search" and "Link" (the toolbars of the Border popup, the search bar and the link popup), "Main" (menu bar), "Cell" and "Sheet" (context menus of the cells and the sheet tabs), "Sheets" (sheet tab bar), "Formula bar, B7" (formula bar) and "Cell editor, B7" (cell editor). The select-all corner is named "Select all", the search bar is named "Search" and its buttons "Previous match", "Next match" and "Close search", the button that adds a sheet is named "Add sheet", and the other dialogs are named by their titles. | -| **2.4.7** Focus Visible | Supports | The keyboard focus location is visible at all times. The active cell always has a 2px solid border, and the focused cell or cell editor has a 2px outline, both in the primary color of the theme. The formula bar and the controls of the toolbar, the menu bar, the sheet tabs, the search bar and the Border popup show a 2px focus ring in the `--dhx-spreadsheet-focus-color` color. In the color palette and the border style list, the focused item has a 1px dashed outline. In dropdowns, context menus and lists, the focused item is highlighted. The focus indicator is shown in every built-in theme. | +| **2.4.7** Focus Visible | Supports | The keyboard focus location is visible at all times. The active cell always has a 2px solid border, and the focused cell or cell editor has a 2px outline, both in the primary color of the theme. The formula bar and the controls of the toolbar, the menu bar, the sheet tabs, the search bar and the Border popup show a 2px focus ring in the `--dhx-spreadsheet-focus-color` color. In the color palette, the border style list, the dropdowns of the toolbar and the menu bar, and the context menus, the focused item has a 1px dashed outline. In the list editor, the focused item is highlighted with a background color. The focus indicator is shown in every built-in theme. | | **2.4.11** Focus Not Obscured (Minimum) (2.2 only) | Supports | The active cell is scrolled into view next to the frozen rows and columns, so it is never left behind a frozen area. | | **2.5.7** Dragging Movements (2.2 only) | Supports | Range selection has `Shift`+arrows and `Ctrl`+`Space`/`Shift`+`Space`. Column width and row height are set with the *Column width* and *Row height* commands of the context menu, with undo. Hidden rows and columns are shown with `Ctrl`+`Shift`+`9`/`0` and the *Show rows*/*Show columns* commands. Filling cells is available through the [`groupFill`](api/spreadsheet_groupfill_event.md) event, which can be bound to a context menu command. | | **2.5.8** Target Size (Minimum) (2.2 only) | Partially Supports | The fill handle is 12 x 12 CSS px. The column and row resizers have equivalent controls, the *Column width* and *Row height* commands. The select-all corner is the 40 x 32 CSS px corner header cell, and the toolbar and menu controls are larger than 24 x 24 CSS px. | diff --git a/docs/api/spreadsheet_afteraction_event.md b/docs/api/spreadsheet_afteraction_event.md index bab4cf67..f2ca244f 100644 --- a/docs/api/spreadsheet_afteraction_event.md +++ b/docs/api/spreadsheet_afteraction_event.md @@ -13,7 +13,21 @@ description: You can learn about the afterAction event in the documentation of t ### Usage ~~~jsx -afterAction: (action: string, config: object) => void; +afterAction: ( + action: string, + config: { + action?: string, + cell?: string, + row?: number, + col?: number, + val?: any, + prev?: any, + groupAction?: string, + pageId?: string | number, + pageName?: string, + // other properties of the action + } | object[] +) => void; ~~~ ### Parameters @@ -22,15 +36,15 @@ The callback of the event takes the following parameters: - `action` - (required) the name of the action. Check the full list of available actions [here](api/overview/actions_overview.md#list-of-actions) - `config` - (required) an object with parameters of the action. The set of properties depends on the action. The object can include: - - `action` - (string) the name of the action - - `cell` - (string) the id of the cell or the range of cells the action is applied to, for example, `"A1"` or `"B2:D5"` - - `row` - (number) the zero-based index of the row of the cell - - `col` - (number) the zero-based index of the column of the cell - - `val` - (any) the new value that the action applies, for example, a cell value, a style or a size - - `prev` - (any) the previous value - - `groupAction` - (string) the name of the group action, if the action is applied to a range of cells - - `pageId` - (string | number) the id of the sheet - - `pageName` - (string) the name of the sheet + - `action` - (optional) the name of the action + - `cell` - (optional) the id of the cell or the range of cells the action is applied to, for example, `"A1"` or `"B2:D5"` + - `row` - (optional) the zero-based index of the row of the cell + - `col` - (optional) the zero-based index of the column of the cell + - `val` - (optional) the new value that the action applies, for example, a cell value, a style or a size + - `prev` - (optional) the previous value + - `groupAction` - (optional) the name of the group action, if the action is applied to a range of cells + - `pageId` - (optional) the id of the sheet + - `pageName` - (optional) the name of the sheet When several actions are executed together, for example, on paste, the `action` parameter is `"groupAction"`, and `config` is an array of such objects. diff --git a/docs/api/spreadsheet_beforeaction_event.md b/docs/api/spreadsheet_beforeaction_event.md index e57b1ff8..76995cab 100644 --- a/docs/api/spreadsheet_beforeaction_event.md +++ b/docs/api/spreadsheet_beforeaction_event.md @@ -13,7 +13,21 @@ description: You can learn about the beforeAction event in the documentation of ### Usage ~~~jsx -beforeAction: (action: string, config: object) => void | boolean; +beforeAction: ( + action: string, + config: { + action?: string, + cell?: string, + row?: number, + col?: number, + val?: any, + prev?: any, + groupAction?: string, + pageId?: string | number, + pageName?: string, + // other properties of the action + } | object[] +) => void | boolean; ~~~ ### Parameters @@ -22,15 +36,15 @@ The callback of the event takes the following parameters: - `action` - (required) the name of the action. Check the full list of available actions [here](api/overview/actions_overview.md#list-of-actions) - `config` - (required) an object with parameters of the action. The set of properties depends on the action. The object can include: - - `action` - (string) the name of the action - - `cell` - (string) the id of the cell or the range of cells the action is applied to, for example, `"A1"` or `"B2:D5"` - - `row` - (number) the zero-based index of the row of the cell - - `col` - (number) the zero-based index of the column of the cell - - `val` - (any) the new value that the action applies, for example, a cell value, a style or a size - - `prev` - (any) the previous value - - `groupAction` - (string) the name of the group action, if the action is applied to a range of cells - - `pageId` - (string | number) the id of the sheet - - `pageName` - (string) the name of the sheet + - `action` - (optional) the name of the action + - `cell` - (optional) the id of the cell or the range of cells the action is applied to, for example, `"A1"` or `"B2:D5"` + - `row` - (optional) the zero-based index of the row of the cell + - `col` - (optional) the zero-based index of the column of the cell + - `val` - (optional) the new value that the action applies, for example, a cell value, a style or a size + - `prev` - (optional) the previous value + - `groupAction` - (optional) the name of the group action, if the action is applied to a range of cells + - `pageId` - (optional) the id of the sheet + - `pageName` - (optional) the name of the sheet When several actions are executed together, for example, on paste, the `action` parameter is `"groupAction"`, and `config` is an array of such objects. diff --git a/docs/customization.md b/docs/customization.md index d6af6aab..e831e3a8 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -31,7 +31,7 @@ Then you can use the name of the icon as the value of the `icon` property in the You can add the following types of controls: `button`, `menuItem`, `separator`, and `spacer`. -The *Text color* and *Background color* controls of the [default toolbar](#default-controls), and the *Border color* control in the *Border* popup, are of the `navItem` type. They draw the current color with the `html` property, take their accessible name from the `value` property, for example, "Text color: dark gray", and open a color popup. The Spreadsheet updates both properties when the active cell changes. +The *Text color* and *Background color* controls of the [default toolbar](#default-controls), and the *Border color* control in the *Border* popup, are of the [`navItem`](https://docs.dhtmlx.com/suite/toolbar/navitem/) type. They draw the current color with the [`html`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/) property, take their accessible name from the [`value`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/) property, for example, "Text color: dark gray", and open a color popup. The Spreadsheet updates both properties when the active cell changes. The `button` object has the following properties: diff --git a/docs/filtering_data.md b/docs/filtering_data.md index 46725c4e..4664cba5 100644 --- a/docs/filtering_data.md +++ b/docs/filtering_data.md @@ -28,6 +28,8 @@ To open the filter of a column without the mouse: - Press `Shift + F10` or the Menu key to call the context menu and choose *Open filter* +![DHTMLX Spreadsheet context menu of a header cell with the filter icon and the Open filter command focused](/img/open_filter_context_menu.png) + The *Open filter* command appears in the context menu only for the cells with the **filter** icon. You can also choose it after right-clicking such a cell. The filter popup takes the focus, and `Tab` moves between its controls. `Esc` closes the popup and returns the focus to the cell. If a dropdown list or a date picker is open in the popup, `Esc` closes it first. diff --git a/docs/merge_cells.md b/docs/merge_cells.md index f1cabf5e..54e58507 100644 --- a/docs/merge_cells.md +++ b/docs/merge_cells.md @@ -50,6 +50,8 @@ or When you remove a row or a column through a merged cell, every row or column that the merged cell spans is removed. It works this way when a cell or a range of cells is selected and the row or column is removed via the toolbar, the menu, the context menu or the [`deleteRow()`](api/spreadsheet_deleterow_method.md) / [`deleteColumn()`](api/spreadsheet_deletecolumn_method.md) methods. The context menu shows the full range in the command name, for example, *Remove rows 2-4*. +![DHTMLX Spreadsheet context menu with the Rows submenu showing Remove rows 2-4 for a merged cell](/img/remove_merged_rows_context_menu.png) + When whole rows or columns are selected by clicking their headers, only the selected rows or columns are removed. A merged cell that spans them becomes smaller, and a merged cell left with a single cell becomes an ordinary cell. Merged cells located below or on the right of the removed rows or columns move together with them. diff --git a/docs/work_with_rows_cols.md b/docs/work_with_rows_cols.md index 4da3dac4..7b36492d 100644 --- a/docs/work_with_rows_cols.md +++ b/docs/work_with_rows_cols.md @@ -134,8 +134,12 @@ To set an exact width of columns, take the following steps: 2\. Right-click the selection, or press `Shift + F10` or the Menu key, and choose *Columns -> Column width*. The same command is available in the menu of the 3 dots icon of the column. +![DHTMLX Spreadsheet context menu with the Columns submenu showing Column width](/img/column_width_context_menu.png) + 3\. In the *Column width* dialog, enter the width in pixels and click **Apply** or press `Enter`. +![DHTMLX Spreadsheet Column width dialog with the width in pixels and the Cancel and Apply buttons](/img/column_width_dialog.png) + ### Setting row height To set an exact height of rows, take the following steps: @@ -144,11 +148,19 @@ To set an exact height of rows, take the following steps: 2\. Right-click the selection, or press `Shift + F10` or the Menu key, and choose *Rows -> Row height*. +![DHTMLX Spreadsheet context menu with the Rows submenu showing Row height](/img/row_height_context_menu.png) + 3\. In the *Row height* dialog, enter the height in pixels and click **Apply** or press `Enter`. +![DHTMLX Spreadsheet Row height dialog with the height in pixels and the Cancel and Apply buttons](/img/row_height_dialog.png) + ### How the new size is applied -The dialog shows the current size of the first column or row of the selected range and applies the new size to every column or row of this range. If several ranges are selected, the last selected range is used. The size is rounded to whole pixels. The minimum width of a column is 20 px, and the minimum height of a row is 10 px: a smaller positive value is replaced with the minimum. While the field is empty or the value isn't a positive number, the **Apply** button is disabled. The **Cancel** button or `Esc` closes the dialog without changes. Screen readers announce the new size, for example, "Column width set to 120 pixels". +The dialog shows the current size of the first column or row of the selected range and applies the new size to every column or row of this range. If several ranges are selected, the last selected range is used. + +The size is rounded to whole pixels. The minimum width of a column is 20 px, and the minimum height of a row is 10 px: a smaller positive value is replaced with the minimum. While the field is empty or the value isn't a positive number, the **Apply** button is disabled. + +The **Cancel** button or `Esc` closes the dialog without changes. Screen readers announce the new size, for example, "Column width set to 120 pixels". ### Undoing the change diff --git a/static/img/accessibility/spreadsheet_contrast_dark.png b/static/img/accessibility/spreadsheet_contrast_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..4b7ccfa2b905960daabc3d13f99c4de4a50cd489 GIT binary patch literal 49758 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 literal 0 HcmV?d00001 diff --git a/static/img/accessibility/spreadsheet_contrast_light.png b/static/img/accessibility/spreadsheet_contrast_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d29a9fb4f3ad0a1afbd89e0fdc64a6baf5772292 GIT binary patch literal 56938 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 a*rQ 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 literal 0 HcmV?d00001 diff --git a/static/img/accessibility/toolbar_dropdown_focus.png b/static/img/accessibility/toolbar_dropdown_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..dac3678cfb837670caf78305816e151c4fb3eab1 GIT binary patch literal 32079 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 z

7OWVCRP*`bE3hbgQrPjr5MZmrhH=LDCMh)YA5 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%0Ab@$otILDyK}9M9m|{yo3ZFlNB$AyI2@Z8S>y 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 literal 0 HcmV?d00001 diff --git a/static/img/row_height_context_menu.png b/static/img/row_height_context_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..2bffb3a7df412d1c42c06926f51ebcacbf411224 GIT binary patch literal 46071 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
` +- einen Skip-Link bereitstellt, wenn dem Spreadsheet eine lange Navigation vorausgeht +- jedem Zustand, den Sie mit einer Zellenfarbe markieren, ein zweites Signal wie Text oder ein Symbol hinzufügt, da die Farben der Zellenstile Teil Ihrer Daten sind +- den Kontrast der Farben prüft, die Sie in den Zellenstilen und in einem benutzerdefinierten Theme festlegen + +## Tests und Methodik {#testing-and-methodology} + +Das DHTMLX-Team validiert die Barrierefreiheit von Spreadsheet 6.0.4 anhand des Komponenten-Quellcodes und im Browser: + +1. **Automatisierte Tests** mit [axe-core](https://github.com/dequelabs/axe-core) in den Themes `light`, `dark`, `contrast-light` und `contrast-dark`, bei geöffneter Suchleiste, geöffnetem Listeneditor, geöffneten Dialogen und einer geöffneten Warnmeldung. +2. **Manuelle Prüfung** des Quellcodes: die Rollen, Zustände und Namen jedes Teils, die Tastatur-Handler und die Fokusbereiche sowie die Theme-Tokens mit ihren Kontrastverhältnissen. +3. **Manuelle Tests**: reine Tastatur-Durchläufe durch die Zellen, die Leisten, die Menüs und die Dialoge, Screenreader-Durchläufe mit NVDA, JAWS und VoiceOver, 200 % und 400 % Zoom, Reflow bei 320 CSS px und WCAG-Überschreibungen für Textabstände. +4. **Konformitätsbericht**: Die Ergebnisse werden Kriterium für Kriterium im [Accessibility Conformance Report](accessibility_conformance_report.md) veröffentlicht, einschließlich der Kriterien, die das Spreadsheet teilweise unterstützt. + +## Ressourcen {#resources} + +- [Accessibility Conformance Report (VPAT 2.5)](accessibility_conformance_report.md) +- [Liste der Hotkeys](hotkeys.md) +- [`readonly`](api/spreadsheet_readonly_config.md) +- [`selection`](api/spreadsheet_selection_config.md) +- [`announce()`](api/spreadsheet_announce_method.md) +- [Lokalisierung](localization.md) +- [Integrierte Themes](/themes/) +- [WCAG 2.2](https://www.w3.org/TR/WCAG22/) +- [WAI-ARIA 1.2](https://www.w3.org/TR/wai-aria-1.2/) +- [WAI-ARIA Authoring Practices: Grid pattern](https://www.w3.org/WAI/ARIA/apg/patterns/grid/) +- [WAI-ARIA Authoring Practices: Toolbar pattern](https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/accessibility_conformance_report.md b/i18n/de/docusaurus-plugin-content-docs/current/accessibility_conformance_report.md new file mode 100644 index 00000000..d6d0d932 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/accessibility_conformance_report.md @@ -0,0 +1,220 @@ +--- +sidebar_label: Konformitätsbericht (VPAT) +title: Barrierefreiheits-Konformitätsbericht +description: Barrierefreiheits-Konformitätsbericht für DHTMLX Spreadsheet auf Basis von VPAT 2.5 - Konformität mit WCAG 2.2 AA, Section 508 und EN 301 549. +--- + +# Barrierefreiheits-Konformitätsbericht + +Dieser Bericht dokumentiert, wie DHTMLX Spreadsheet die wichtigsten Standards für Barrierefreiheit erfüllt. Er folgt der Struktur von **VPAT® 2.5 (International Edition)**. Einen aufgabenorientierten Überblick über die Barrierefreiheitsfunktionen und ihre Konfiguration finden Sie im Leitfaden [Barrierefreiheit](accessibility.md). + +**Produktname/Version:** DHTMLX Spreadsheet v6.0.4 + +**Berichtsdatum:** Oktober 2026 + +**Produktbeschreibung:** DHTMLX Spreadsheet ist eine JavaScript-Tabellenkomponente für Webanwendungen. Die Oberfläche besteht aus einer Menüleiste, einer Symbolleiste, einer Formelleiste, einem Zellraster mit Zeilen- und Spaltenköpfen sowie Tabellenblatt-Registern. Zu den Funktionen gehören Formeln, Zellformatierung, verbundene Zellen, fixierte Zeilen und Spalten, Sortierung, Filterung, Suche, Datenvalidierung, Zellverknüpfungen sowie Excel-Import und -Export. Die Komponente wird von einer Host-Webanwendung eingebettet. + +**Kontaktinformationen:** [info@dhtmlx.com](mailto:info@dhtmlx.com) + +## Hinweise {#notes} + +- Dieser Bericht bewertet DHTMLX Spreadsheet in seiner **empfohlenen Barrierefreiheitskonfiguration**: die Standardkonfiguration, bei der die WAI-ARIA-Ausgabe und die Tastaturnavigation immer aktiv sind, mit dem Theme `contrast-light` oder `contrast-dark`, das über `dhx.setTheme()` oder das Attribut `data-dhx-theme` gesetzt wird. Die Anmerkungen geben an, wo eine Konformitätsstufe von dieser Konfiguration abhängt. Die Einrichtung beschreibt der Leitfaden [Barrierefreiheit](accessibility.md). +- DHTMLX Spreadsheet ist **Webinhalt**, der von einer Host-Anwendung gerendert wird. Verantwortlichkeiten auf Seitenebene (Seitentitel, ``, Skip-/Bypass-Mechanismen und seitenweite Navigation) liegen bei der Host-Anwendung und werden mit einer Erläuterung als *Nicht anwendbar* gemeldet. +- In den WCAG-Tabellen ist nur die Antwort für **Web** ausgefüllt. Die Zeilen *Electronic Docs*, *Software*, *Closed* und *Authoring Tool* sind *Nicht anwendbar*: Das Produkt ist weder eigenständige (Nicht-Web-)Software noch geschlossene Funktionalität, noch ein Authoring-Tool, noch elektronische Dokumentation. +- Farben, die ein Autor über Zellformate auf Zellen anwendet, gehören zu den Dokumentdaten und werden nicht als Teil des Produkts bewertet. + +**Verwendete Bewertungsmethoden:** + +- Automatisierte Tests: axe-core in den Themes `light`, `dark`, `contrast-light` und `contrast-dark`, bei geöffneter Suchleiste, geöffnetem Listeneditor, geöffneten Dialogen und einer geöffneten Warnmeldung. +- Manuelle Prüfung des Quellcodes und der Stylesheets der Komponente: die Rollen und ARIA-Attribute jedes Teils des Widgets, die Tastaturhandler und Fokusbereiche, die zugänglichen Namen und ihre Locale-Schlüssel sowie die Farbtokens der Themes, mit berechneten Kontrastverhältnissen für die vier Themes. +- Tests mit assistiven Technologien: manuelle Durchläufe mit **NVDA + Firefox** und **JAWS + Chrome** unter Windows sowie **VoiceOver + Safari** unter macOS. +- Browser-Überschreibungen: 200 % / 400 % Zoom, Umbruch bei 320 CSS-px und WCAG-Überschreibungen des Textabstands. + +## Anwendbare Standards / Richtlinien {#applicable-standards--guidelines} + +| Standard / Richtlinie | Im Bericht enthalten | +|---|---| +| Web Content Accessibility Guidelines 2.0 | Stufe A (Nein) · Stufe AA (Nein) · Stufe AAA (Nein) | +| Web Content Accessibility Guidelines 2.1 | Stufe A (Nein) · Stufe AA (Nein) · Stufe AAA (Nein) | +| Web Content Accessibility Guidelines 2.2 | Stufe A (**Ja**) · Stufe AA (**Ja**) · Stufe AAA (Nein) | +| Überarbeitete Section-508-Standards (veröffentlicht am 18. Januar 2017; korrigiert am 22. Januar 2018) | (**Ja**) | +| EN 301 549 - V3.1.1 (2019-11) und V3.2.1 (2021-03) | (**Ja**) | + +*WCAG 2.0 und 2.1 werden nicht separat berichtet. Kriterien, die WCAG mit „2.1 und 2.2" kennzeichnet, werden beantwortet, +weil sie Teil von WCAG 2.2 sind und in EN 301 549 referenziert werden.* + +## Begriffe {#terms} + +- **Unterstützt:** Die Funktionalität des Produkts verfügt über mindestens eine Methode, die das Kriterium ohne + bekannte Mängel erfüllt oder mit gleichwertiger Erleichterung erfüllt. +- **Teilweise unterstützt:** Einige Funktionen des Produkts erfüllen das Kriterium nicht. +- **Wird nicht unterstützt:** Der Großteil der Produktfunktionalität erfüllt das Kriterium nicht. +- **Nicht anwendbar:** Das Kriterium ist für das Produkt nicht relevant. + +## WCAG-2.x-Bericht {#wcag-2x-report} + +DHTMLX Spreadsheet ist Webinhalt, daher ist unten nur die Antwort für **Web** ausgefüllt. „Erfordert ein AA-konformes +Theme" ist eine Konfigurationsabhängigkeit, kein Mangel. Das Erfolgskriterium 4.1.1 Parsing wurde in WCAG 2.2 entfernt und wird nicht berichtet. + +### Tabelle 1: Erfolgskriterien, Stufe A {#table-1-success-criteria-level-a} + +| Kriterien | Konformitätsstufe | Anmerkungen und Erläuterungen | +|---|---|---| +| **1.1.1** Nicht-Text-Inhalt | Unterstützt | Icons sind Schriftglyphen. Steuerelemente, die nur aus einem Icon bestehen, beziehen ihren zugänglichen Namen aus der Locale oder aus ihrem Tooltip, zum Beispiel "Add sheet", "Close search" und "Select all". Die Farbschaltflächen tragen den Namen der Farbe, zum Beispiel "Text color: dark gray". Dekorative Icons (Sperre, Filter, Spaltenmenü, Marker für ausgeblendete Zeilen), die Auswahlebene und die von einer verbundenen Zelle überdeckten Zellen sind mit `aria-hidden="true"` ausgeblendet; der Zustand, den sie anzeigen, wird durch Text in der Zelle vermittelt, etwa "locked" und "Filter applied". | +| **1.2.1** Reine Audio- und reine Videoinhalte (aufgezeichnet) | Nicht anwendbar | Das Produkt enthält keine Audio- oder Videoinhalte. | +| **1.2.2** Untertitel (aufgezeichnet) | Nicht anwendbar | Keine aufgezeichneten Multimediainhalte. | +| **1.2.3** Audiodeskription oder Medienalternative (aufgezeichnet) | Nicht anwendbar | Keine aufgezeichneten Multimediainhalte. | +| **1.3.1** Info und Beziehungen | Unterstützt | Die Zellen bilden ein `grid` mit dem Namen "Spreadsheet" und den Rollen `row`, `columnheader`, `rowheader` und `gridcell`. Die Position wird mit `aria-rowindex`/`aria-colindex` gegenüber `aria-rowcount`/`aria-colcount` bereitgestellt, die Ausdehnung einer verbundenen Zelle mit `aria-colspan`/`aria-rowspan`, die Bearbeitbarkeit mit `aria-readonly` und die Auswahl mit `aria-selected` und `aria-multiselectable`. Die Symbolleiste, die Menüleiste und die Tabellenblatt-Register sind `toolbar`- und `menubar`-Elemente mit Namen; die Formatierungsschalter haben in der Symbolleiste `aria-pressed` und sind in der Menüleiste `menuitemcheckbox`, und sich gegenseitig ausschließende Formatierungsoptionen sind `menuitemradio` mit `aria-checked`. | +| **1.3.2** Bedeutungstragende Reihenfolge | Unterstützt | DOM- und Lesereihenfolge folgen der visuellen Reihenfolge: Menüleiste, Symbolleiste, Formelleiste, Zellen und Tabellenblatt-Register. Die Zellen tragen ihre Position im Tabellenblatt über `aria-rowindex`/`aria-colindex`, sodass die Reihenfolge erhalten bleibt, wenn Zeilen und Spalten aus dem DOM herausgescrollt werden. | +| **1.3.3** Sensorische Eigenschaften | Unterstützt | Keine Anweisung und keine Beschriftung beruht allein auf Form, Größe oder räumlicher Lage; interaktive Elemente tragen Text oder einen ARIA-Namen. | +| **1.4.1** Verwendung von Farbe | Unterstützt | Jeder Zustand, der durch Farbe dargestellt wird, hat zusätzlich einen Rahmen, eine Füllung, einen Marker oder Text: die aktive Zelle, der ausgewählte Bereich, Suchtreffer, der kopierte Bereich und ungültige Zellen, zusammen mit `aria-selected` oder Text in der Zelle. Durch einen Filter ausgeblendete Zeilen hinterlassen eine Lücke in der Zeilennummerierung. Die Farbschaltflächen tragen den Farbnamen in ihrem zugänglichen Namen. | +| **1.4.2** Audiosteuerung | Nicht anwendbar | Das Produkt gibt keinen automatisch abgespielten Ton aus. | +| **2.1.1** Tastatur | Unterstützt | Jeder Befehl auf den Zellen hat eine Taste, aufgeführt in der [Liste der Hotkeys](hotkeys.md); `Shift`+`F10` oder die Menütaste öffnet das Kontextmenü. `Ctrl`+`F6` verschiebt den Fokus zwischen Menü, Symbolleiste, Tabellenblatt und Tabellenblatt-Registern. Die Leisten, ihre Dropdown-Listen und Popups sowie der Listeneditor funktionieren mit den Pfeiltasten, `Home`, `End`, `Enter` und `Esc`. Für Spaltenbreite, Zeilenhöhe und den Spaltenfilter gibt es Kontextmenübefehle. | +| **2.1.2** Keine Tastaturfalle | Unterstützt | `Tab` in der letzten Zelle und `Shift`+`Tab` in der ersten Zelle des Tabellenblatts verschieben den Fokus aus den Zellen zum nächsten bzw. vorherigen Teil der Seite, und `Ctrl`+`F6` verschiebt ihn zwischen den Teilen von Spreadsheet. Im Listeneditor beendet `Tab` die Bearbeitung und `Esc` bricht sie ab, auch nach der Verwendung der Pfeiltasten. `Esc` und `Tab` schließen die Popups der Symbolleiste und setzen den Fokus auf deren Schaltflächen zurück. | +| **2.1.4** Zeichentasten-Kurzbefehle | Unterstützt | Jeder Kurzbefehl verwendet eine Modifikatortaste (`Ctrl`, `Alt`, `Shift`) oder eine Nicht-Zeichentaste (`F2`, `F6`, `F10`, `F11`, `Enter`, `Esc`, `Delete`, Pfeile). Die Eingabe eines Zeichens in einer Zelle trägt es in die Zelle ein, was der Zweck der Zelle ist, und führt keinen Befehl aus. | +| **2.2.1** Zeitvorgaben anpassbar | Nicht anwendbar | Das Produkt setzt keine Zeitlimits. | +| **2.2.2** Pausieren, Beenden, Ausblenden | Unterstützt | Es gibt keine sich automatisch aktualisierenden, bewegten, blinkenden oder scrollenden Inhalte. Keine Animation dauert länger als 5 Sekunden. | +| **2.3.1** Grenzwert von drei Blitzen oder darunter | Unterstützt | Das Produkt enthält keine blinkenden Inhalte. | +| **2.4.1** Blöcke umgehen | Nicht anwendbar | Gilt auf Seitenebene; Mechanismen zum Umgehen von Blöcken liegen bei der Host-Anwendung. | +| **2.4.2** Seite mit Titel | Nicht anwendbar | Seitentitel liegen in der Verantwortung der Host-Anwendung. | +| **2.4.3** Fokus-Reihenfolge | Unterstützt | Die Zellen bilden einen Tab-Stopp auf der aktiven Zelle, und die Symbolleiste, die Menüleiste und die Tabellenblatt-Register bilden je einen Tab-Stopp, in visueller Reihenfolge. `Tab` verlässt das Tabellenblatt an der letzten und der ersten Zelle. Dialoge übernehmen den Fokus, halten `Tab` innerhalb und setzen den Fokus beim Schließen auf die aktive Zelle zurück; Menüs, Kontextmenüs und Popups setzen den Fokus auf das Steuerelement zurück, das sie geöffnet hat, und nach dem Anwenden einer Text- oder Hintergrundfarbe kehrt der Fokus zur aktiven Zelle zurück. Die aktive Zelle wird in den sichtbaren Bereich gescrollt, wenn sie den Fokus erhält. | +| **2.4.4** Linkzweck (im Kontext) | Unterstützt | Ein Link in einer Zelle wird als ``-Element gerendert, dessen Text der vom Autor festgelegte Linktext oder die Adresse ist. Der Zellentext ergänzt "link", wenn die Zelle ausgewählt ist, und `Alt`+`Enter` öffnet ihn. | +| **2.5.1** Zeigergesten | Unterstützt | Kein Vorgang erfordert eine Multipoint- oder pfadbasierte Geste; jeder Ziehvorgang hat eine Alternative ohne Ziehen (siehe 2.5.7). | +| **2.5.2** Zeiger-Abbruch | Unterstützt | Das Ändern von Spalten- und Zeilengrößen sowie das Ausfüllkästchen wirken beim Loslassen, und ein Rückgängig-Schritt macht jeden davon rückgängig. Befehle der Symbolleiste, der Menüs und der Tabellenblatt-Register werden bei `click` ausgeführt. | +| **2.5.3** Beschriftung im Namen | Unterstützt | Steuerelemente mit sichtbarem Text übernehmen diesen Text als zugänglichen Namen: die Menüeinträge, die Kontextmenübefehle, die Tabellenblatt-Register und die Dialogschaltflächen. Icon-Schaltflächen werden durch ihren Tooltip benannt, die Farbschaltflächen durch ihren Tooltip gefolgt vom Farbnamen. | +| **2.5.4** Bewegungsaktivierung | Nicht anwendbar | Keine Funktion wird durch Gerätebewegung oder Benutzerbewegung bedient. | +| **3.1.1** Sprache der Seite | Nicht anwendbar | Die Dokumentsprache (``) wird von der Host-Anwendung festgelegt. | +| **3.2.1** Bei Fokus | Unterstützt | Das Erhalten des Fokus ändert nie den Kontext. Ein Klick auf einen Spaltenbuchstaben, eine Zeilennummer oder die Ecke wählt die Zeilen bzw. Spalten aus und lässt den Fokus auf der aktiven Zelle. | +| **3.2.2** Bei Eingabe | Unterstützt | Das Ändern eines Werts ändert den Kontext nicht. Das Bearbeiten einer Zelle, das Auswählen eines Werts aus einer Liste oder die Eingabe in der Suchleiste aktualisiert das Tabellenblatt an Ort und Stelle, was der dokumentierte Zweck dieser Steuerelemente ist. | +| **3.2.6** Konsistente Hilfe (nur 2.2) | Nicht anwendbar | Das Widget stellt keinen Hilfemechanismus bereit; dies ist ein Thema auf Seitenebene. | +| **3.3.1** Fehlererkennung | Unterstützt | Formelfehler und ungültige Listenwerte werden im Zelleninhalt beschrieben, zum Beispiel "Reference error. Check the cell references" und "Invalid value. Choose a value from the list". Neue Formelfehler und durch eine Bearbeitung verursachte ungültige Werte werden über die Live-Region angekündigt, und der Editor eines ungültigen Werts hat `aria-invalid="true"`. | +| **3.3.2** Beschriftungen oder Anweisungen | Unterstützt | Der Zelleneditor heißt "Cell editor, B7" und die Formelleiste "Formula bar, B7", mit der Adresse der bearbeiteten Zelle. Die Dialogfelder sind beschriftet, zum Beispiel "Width in pixels", und die Schaltflächen der Suchleiste heißen "Previous match", "Next match" und "Close search". | +| **3.3.7** Redundante Eingabe (nur 2.2) | Unterstützt | Das Produkt enthält keinen mehrstufigen Prozess, der bereits eingegebene Informationen erneut abfragt. | +| **4.1.2** Name, Rolle, Wert | Unterstützt | Jeder Teil stellt eine Rolle, seine Zustände und einen Namen aus der Locale bereit: die Zellen (`grid`, `row`, `gridcell`, `columnheader`, `rowheader`, `aria-selected`, `aria-readonly`), die Symbolleisten und die Menüleiste (`toolbar`, `menubar`), die Schaltflächen für Formatierung, Sperren und Filter sowie die Tabellenblatt-Register (`aria-pressed`), die Formatierungseinträge der Menüleiste (`menuitemcheckbox`, `aria-checked`) und die sich gegenseitig ausschließenden Formate (`menuitemradio`, `aria-checked`). Warnmeldungen sind `alertdialog` mit `aria-modal="true"`. Der Listeneditor ist eine `combobox`, die eine `listbox` steuert, mit `aria-expanded` und `aria-activedescendant`. | + +### Tabelle 2: Erfolgskriterien, Stufe AA {#table-2-success-criteria-level-aa} + +| Kriterien | Konformitätsstufe | Anmerkungen und Erläuterungen | +|---|---|---| +| **1.2.4** Untertitel (live) | Nicht anwendbar | Keine Live-Multimediainhalte. | +| **1.2.5** Audiodeskription (aufgezeichnet) | Nicht anwendbar | Keine aufgezeichneten Videoinhalte. | +| **1.3.4** Ausrichtung | Unterstützt | Der Inhalt ist nicht auf eine einzelne Anzeigeausrichtung beschränkt. | +| **1.3.5** Eingabezweck bestimmen | Nicht anwendbar | Die Editoren des Produkts erfassen Dokumentdaten, nicht die persönlichen Informationen des Benutzers, die von der WCAG-Liste der Eingabezwecke abgedeckt werden. | +| **1.4.3** Kontrast (Minimum) | Unterstützt | Die Themes `contrast-light` und `contrast-dark` erfüllen AA: Kein Produkttext liegt in einem der beiden Themes unter 4,5:1, bei geöffneter Suchleiste, geöffnetem Listeneditor, geöffnetem Dialog für die Spaltenbreite und geöffneter Warnmeldung. Die Farben der Formelreferenzen liegen in den Themes light und `contrast-light` bei 4,59:1 bis 7,04:1 und in den dunklen Themes bei 7,62:1 bis 12,26:1. Im Standard-Theme light liegt sekundärer Text wie Dialogfeldbeschriftungen und Text von Warnmeldungen bei etwa 3,95:1. Zur Erfüllung des Kriteriums muss eines der Kontrast-Themes ausgewählt werden; damit erfüllt eine unterstützte Methode das Kriterium. | +| **1.4.4** Textgröße ändern | Unterstützt | Der Text kann ohne Verlust von Inhalt oder Funktionalität auf 200 % vergrößert werden; die Symbolleiste, die Formelleiste, die Tabellenblatt-Register und die Dialoge bleiben bedienbar. | +| **1.4.5** Schriftbilder | Unterstützt | Aller Text wird als echter Text dargestellt. Icons sind Schriftglyphen; das Produkt verwendet keine Rasterbilder. | +| **1.4.10** Umbruch | Unterstützt | Die Zellen sind zweidimensionaler Inhalt, der vom Kriterium vom Umbruch ausgenommen ist, und scrollen horizontal und vertikal. Die Symbolleiste, die Menüleiste und die Tabellenblatt-Register passen in eine Breite von 320 CSS-px. | +| **1.4.11** Nicht-Text-Kontrast | Unterstützt | Die Fokusindikatoren der Zellen, der Formelleiste und der Steuerelemente der Leisten sind 2 px breit und in Theme-Farben gezeichnet; die folgenden Verhältnisse gelten für die Themes light (Standard), `contrast-light`, dark und `contrast-dark`. Die aktive Zelle ist durch einen durchgehenden 2-px-Rahmen in `--dhx-color-primary` markiert: etwa 3,9:1, 7,7:1, 3,4:1 und 5,3:1 gegenüber dem Zellenhintergrund. Die Zelle und der Zelleneditor, die den Tastaturfokus haben, erhalten eine 2-px-Kontur in derselben Farbe, mit denselben Verhältnissen, und innerhalb eines ausgewählten Bereichs etwa 3,3:1, 6,0:1, 3,1:1 und 4,2:1. Die Formelleiste erhält eine 2-px-Kontur in `--dhx-spreadsheet-focus-color`: etwa 3,9:1, 7,7:1, 5,3:1 und 6,5:1 gegenüber ihrem Hintergrund. Die Steuerelemente der Symbolleiste, der Menüleiste und der Tabellenblatt-Register erhalten dieselbe Kontur: etwa 3,7:1, 7,2:1, 3,9:1 und 4,9:1 gegenüber dem Hintergrund der Leiste. Alle Werte liegen über der Anforderung von 3:1. | +| **1.4.12** Textabstand | Unterstützt | Bei angewendeten WCAG-Überschreibungen des Textabstands wird keine Beschriftung eines Steuerelements abgeschnitten; die Leiste der Tabellenblatt-Register scrollt, wenn die Register wachsen. | +| **1.4.13** Inhalt bei Hover oder Fokus | Unterstützt | Tooltips der Symbolleiste bleiben geöffnet, solange der Mauszeiger darüber steht, und werden mit `Esc` geschlossen, ohne den Zeiger oder den Fokus zu bewegen. Der Tooltip für ungültige Werte meldet einen Eingabefehler, bleibt bestehen, solange die Zelle aktiv ist, und wird mit `Esc` entfernt. | +| **2.4.5** Mehrere Wege | Nicht anwendbar | Gilt für das Auffinden von Seiten innerhalb einer Gruppe von Webseiten; für eine einzelne eingebettete Komponente nicht relevant (Thema der Host-Anwendung). | +| **2.4.6** Überschriften und Beschriftungen | Unterstützt | Die Hauptbereiche beziehen ihre zugänglichen Namen aus der Locale: "Spreadsheet" (Grid), "Formatting" (Symbolleiste), "Borders", "Search" und "Link" (die Symbolleisten des Popups für Rahmen, der Suchleiste und des Link-Popups), "Main" (Menüleiste), "Cell" und "Sheet" (Kontextmenüs der Zellen und der Tabellenblatt-Register), "Sheets" (Leiste der Tabellenblatt-Register), "Formula bar, B7" (Formelleiste) und "Cell editor, B7" (Zelleneditor). Die Ecke zum Auswählen aller Zellen heißt "Select all", die Suchleiste heißt "Search" und ihre Schaltflächen "Previous match", "Next match" und "Close search", die Schaltfläche zum Hinzufügen eines Tabellenblatts heißt "Add sheet", und die übrigen Dialoge werden nach ihren Titeln benannt. | +| **2.4.7** Fokus sichtbar | Unterstützt | Die Position des Tastaturfokus ist jederzeit sichtbar. Die aktive Zelle hat immer einen durchgehenden 2-px-Rahmen, und die fokussierte Zelle oder der fokussierte Zelleneditor hat eine 2-px-Kontur, beide in der Primärfarbe des Themes. Die Formelleiste und die Steuerelemente der Symbolleiste, der Menüleiste, der Tabellenblatt-Register, des Popups für Rahmen, des Link-Popups und der Suchleiste zeigen einen 2-px-Fokusring in der Farbe `--dhx-spreadsheet-focus-color`. In der Farbpalette, der Liste der Rahmenstile, den Dropdown-Listen der Symbolleiste und der Menüleiste sowie den Kontextmenüs hat der fokussierte Eintrag eine 1-px-Kontur mit gestrichelter Linie. Im Listeneditor wird der fokussierte Eintrag mit einer Hintergrundfarbe hervorgehoben. Der Fokusindikator wird in jedem integrierten Theme angezeigt. | +| **2.4.11** Fokus nicht verdeckt (Minimum) (nur 2.2) | Unterstützt | Die aktive Zelle wird neben den fixierten Zeilen und Spalten in den sichtbaren Bereich gescrollt, sodass sie nie hinter einem fixierten Bereich zurückbleibt. | +| **2.5.7** Ziehbewegungen (nur 2.2) | Unterstützt | Die Bereichsauswahl funktioniert mit `Shift`+Pfeiltasten und `Ctrl`+`Space`/`Shift`+`Space`. Spaltenbreite und Zeilenhöhe werden mit den Kontextmenübefehlen *Column width* und *Row height* festgelegt, mit Rückgängig-Funktion. Ausgeblendete Zeilen und Spalten werden mit `Ctrl`+`Shift`+`9`/`0` und den Befehlen *Show rows*/*Show columns* eingeblendet. Das Ausfüllen von Zellen ist über das Ereignis [`groupFill`](api/spreadsheet_groupfill_event.md) möglich, das an einen Kontextmenübefehl gebunden werden kann. | +| **2.5.8** Zielgröße (Minimum) (nur 2.2) | Teilweise unterstützt | Das Ausfüllkästchen ist 12 x 12 CSS-px groß. Für die Größenänderung von Spalten und Zeilen gibt es gleichwertige Steuerelemente, die Befehle *Column width* und *Row height*. Die Ecke zum Auswählen aller Zellen ist die 40 x 32 CSS-px große Eckkopfzelle, und die Steuerelemente der Symbolleiste und der Menüs sind größer als 24 x 24 CSS-px. | +| **3.1.2** Sprache von Teilen | Nicht anwendbar | Das Widget mischt innerhalb seines Inhalts keine Sprachen; die Sprache liegt beim Host. | +| **3.2.3** Konsistente Navigation | Nicht anwendbar | Gilt für eine Gruppe von Webseiten; Thema der Host-Anwendung. | +| **3.2.4** Konsistente Erkennung | Unterstützt | Befehle mit gleicher Funktion haben in der Symbolleiste, der Menüleiste und dem Kontextmenü dieselben Namen und Icons sowie dieselben Tasten. | +| **3.3.3** Fehlervorschlag | Unterstützt | Fehlerbeschreibungen schlagen eine Korrektur vor: "Check the cell references" bei einem Referenzfehler und "Choose a value from the list" bei einem ungültigen Listenwert. | +| **3.3.4** Fehlervermeidung (rechtlich, finanziell, Daten) | Unterstützt | Jede Änderung der Daten kann mit Rückgängig (`Ctrl`+`Z`) zurückgenommen und mit Wiederholen erneut angewendet werden. Die Host-Anwendung kann zusätzlich jede Aktion über das Ereignis [`beforeAction`](api/spreadsheet_beforeaction_event.md) abbrechen. | +| **3.3.8** Barrierefreie Authentifizierung (Minimum) (nur 2.2) | Nicht anwendbar | Das Produkt führt keine Authentifizierung durch. | +| **4.1.3** Statusmeldungen | Unterstützt | Statusänderungen werden ohne Fokusverschiebung über eine visuell ausgeblendete Live-Region außerhalb des Grids angekündigt (`role="status"`, `aria-live="polite"`, `aria-atomic="true"`). Sie meldet den ausgewählten Bereich, neue Formelfehler und ungültige Werte, abgelehnte Bearbeitungen gesperrter Zellen oder eines schreibgeschützten Tabellenblatts, Suchergebnisse, Beginn und Ende von Import und Export, neue Spaltenbreiten und Zeilenhöhen sowie eine Auswahl ohne einzublendende ausgeblendete Zeilen oder Spalten. Dieselbe Region steht der Host-Anwendung über die öffentliche Methode [`announce()`](api/spreadsheet_announce_method.md) zur Verfügung, und jede integrierte Meldung ist über die `aria_*`-Locale-Schlüssel lokalisierbar. | + +## Bericht zu Revised Section 508 {#revised-section-508-report} + +WCAG-bezogene Bestimmungen werden im obigen WCAG-2.x-Bericht beantwortet und hier referenziert. Kapitel 4 (Hardware) +ist Nicht anwendbar, da DHTMLX Spreadsheet eine Softwarekomponente ohne Hardware oder physische Bedienelemente ist. + +### Kapitel 3: Funktionale Leistungskriterien {#chapter-3-functional-performance-criteria} + +| Kriterien | Konformitätsstufe | Anmerkungen und Erläuterungen | +|---|---|---| +| 302.1 Ohne Sehvermögen | Unterstützt | Mit einem Screenreader bedienbar über das `grid`-Modell mit Spalten- und Zeilenköpfen, die Zelladresse und die mit jeder Zelle vorgelesenen Beschreibungen, die benannten Symbolleisten und Menüs, die Live-Region und das Tastaturmodell. Siehe WCAG 1.3.1, 2.1.1, 4.1.2, 4.1.3. | +| 302.2 Mit eingeschränktem Sehvermögen | Unterstützt | Zoom, Textvergrößerung und Umbruch werden unterstützt, der Fokus ist in jedem Theme sichtbar, und der AA-Kontrast wird von den Themes `contrast-light` / `contrast-dark` erfüllt. Siehe WCAG 1.4.3, 1.4.4, 1.4.10, 1.4.11, 2.4.7. | +| 302.3 Ohne Farbwahrnehmung | Unterstützt | Keine Information wird allein durch Farbe vermittelt: Die aktive Zelle, die Auswahl, Suchtreffer und ungültige Werte tragen jeweils neben der Farbe einen Rahmen, einen Marker oder Text in der Zelle, und die Farbschaltflächen nennen die Farbe. Siehe WCAG 1.4.1. | +| 302.4 Ohne Hörvermögen | Unterstützt | Keine Information wird durch Ton vermittelt. | +| 302.5 Mit eingeschränktem Hörvermögen | Unterstützt | Keine Information wird durch Ton vermittelt. | +| 302.6 Ohne Sprechvermögen | Unterstützt | Für die Bedienung des Produkts ist keine Spracheingabe erforderlich. | +| 302.7 Mit eingeschränkter Handhabung | Unterstützt | Jede Funktion ist über die Tastatur bedienbar; keine pfadbasierte Geste ist erforderlich, und jeder Ziehvorgang hat eine Alternative über Tastatur oder Befehl. Siehe WCAG 2.1.1, 2.5.1, 2.5.7, 2.5.8. | +| 302.8 Mit eingeschränkter Reichweite und Kraft | Unterstützt | Über die Tastatur bedienbar; keine Anforderungen an physische Reichweite, Kraftaufwand oder Zeitvorgaben. | +| 302.9 Mit eingeschränkten sprachlichen, kognitiven und Lernfähigkeiten | Unterstützt | Befehle haben in der Symbolleiste, den Menüs und dem Kontextmenü dieselben Namen, Formelfehler werden mit einem Korrekturweg beschrieben, und jede Änderung kann mit Rückgängig zurückgenommen werden. Siehe WCAG 3.2.4, 3.3.3, 3.3.4. | + +### Kapitel 5: Software {#chapter-5-software} + +| Kriterien | Konformitätsstufe | Anmerkungen und Erläuterungen | +|---|---|---| +| 501.1 Geltungsbereich - Einbeziehung von WCAG 2.0 AA | Siehe Abschnitt WCAG 2.x | Siehe den obigen WCAG-2.x-Bericht. | +| 502 Interoperabilität mit assistiven Technologien | Nicht anwendbar | Gilt für Nicht-Web-Software (Plattformsoftware). DHTMLX Spreadsheet ist Webinhalt, der standardmäßiges DOM und ARIA für den Accessibility-Tree des Browsers bereitstellt; die Interoperabilität wird durch die WCAG-Ergebnisse abgedeckt (Klausel 9 / 501.1). | +| 503 Anwendungen | Nicht anwendbar | Gilt für Nicht-Web-Plattformsoftware; das Produkt ist Webinhalt. | +| 504 Authoring-Tools | Nicht anwendbar | DHTMLX Spreadsheet ist kein Authoring-Tool für Webinhalte: Es bearbeitet Tabellendaten, keine für die Barrierefreiheit relevanten Webinhalte. | + +### Kapitel 6: Supportdokumentation und -dienste {#chapter-6-support-documentation-and-services} + +| Kriterien | Konformitätsstufe | Anmerkungen und Erläuterungen | +|---|---|---| +| 602.2 Funktionen für Barrierefreiheit und Kompatibilität | Unterstützt | Die Dokumentation beschreibt die Barrierefreiheitsfunktionen des Produkts: Der Leitfaden [Barrierefreiheit](accessibility.md) behandelt das WAI-ARIA-Modell, das Tastaturmodell, den schreibgeschützten Modus und die Auswahloption, die Themes und den Fokusindikator, die API [`announce()`](api/spreadsheet_announce_method.md) und die [lokalisierbaren `aria_*`-Zeichenfolgen](accessibility.md#localization); die [Liste der Hotkeys](hotkeys.md) führt jeden Kurzbefehl auf. | +| 602.3 Elektronische Supportdokumentation | Unterstützt (siehe Abschnitt WCAG 2.x) | Die Dokumentationsseite wird als Webinhalt bereitgestellt und so gepflegt, dass sie WCAG 2.2 AA erfüllt. | +| 602.4 Alternative Formate für nichtelektronische Supportdokumentation | Nicht anwendbar | Die Dokumentation wird ausschließlich elektronisch bereitgestellt; es gibt keine nichtelektronische (gedruckte) Supportdokumentation. | +| 603.2 Informationen zu Funktionen für Barrierefreiheit und Kompatibilität | Unterstützt | Die Barrierefreiheitsfunktionen des Produkts sind im Leitfaden [Barrierefreiheit](accessibility.md) öffentlich dokumentiert und können auf Anfrage über den Supportkanal bereitgestellt werden. | +| 603.3 Berücksichtigung von Kommunikationsbedürfnissen | Unterstützt | Der Support erfolgt über einen textbasierten E-Mail-Kanal; Benutzer interagieren mit ihrer eigenen assistiven Technologie. | + +## Bericht zu EN 301 549 {#en-301-549-report} + +Klausel 9 (Web) entspricht direkt dem obigen WCAG-2.x-Bericht und ist die inhaltliche Bewertung für dieses Webprodukt. +Die Klauseln zu Telefonie, Video und Hardware (Klauseln 6, 7, 8, 13) sind Nicht anwendbar. + +### Klausel 4: Funktionale Leistungsangaben {#clause-4-functional-performance-statements} + +Diese spiegeln die Ergebnisse aus Section 508 Kapitel 3 wider (gleiche Schlussfolgerungen). + +| Kriterien | Konformitätsstufe | Anmerkungen und Erläuterungen | +|---|---|---| +| 4.2.1 Nutzung ohne Sehvermögen | Unterstützt | Siehe 508 302.1 (mit Screenreader bedienbar über das Grid-Modell, die Zellbeschreibungen, die benannten Steuerelemente, die Live-Region und das Tastaturmodell). | +| 4.2.2 Nutzung mit eingeschränktem Sehvermögen | Unterstützt | Siehe 508 302.2 (AA-Kontrast über die Kontrast-Themes, sichtbarer Fokus in jedem Theme; Zoom und Umbruch werden unterstützt). | +| 4.2.3 Nutzung ohne Farbwahrnehmung | Unterstützt | Siehe 508 302.3 (ein Rahmen, ein Marker oder Text begleitet jeden Farbhinweis). | +| 4.2.4 Nutzung ohne Hörvermögen | Unterstützt | Keine Information wird durch Ton vermittelt. | +| 4.2.5 Nutzung mit eingeschränktem Hörvermögen | Unterstützt | Keine Information wird durch Ton vermittelt. | +| 4.2.6 Nutzung ohne oder mit eingeschränkter Sprechfähigkeit | Unterstützt | Keine Spracheingabe erforderlich. | +| 4.2.7 Nutzung mit eingeschränkter Handhabung oder Kraft | Unterstützt | Siehe 508 302.7 (per Tastatur bedienbar, keine Gesten, Alternativen für jeden Ziehvorgang). | +| 4.2.8 Nutzung mit eingeschränkter Reichweite | Unterstützt | Keine Anforderungen an physische Reichweite (Softwarekomponente). | +| 4.2.9 Minimierung von Auslösern für photosensitive Anfälle | Unterstützt | Keine blinkenden Inhalte (siehe WCAG 2.3.1). | +| 4.2.10 Nutzung mit eingeschränkten kognitiven, sprachlichen oder Lernfähigkeiten | Unterstützt | Siehe 508 302.9 (einheitliche Befehlsnamen, beschriebene Fehler, umkehrbare Änderungen). | +| 4.2.11 Privatsphäre | Unterstützt | Die Barrierefreiheitsfunktionen nutzen dieselbe Oberfläche wie für alle anderen; es gibt keinen separaten, weniger privaten Modus. | + +### Klausel 5: Allgemeine Anforderungen {#clause-5-generic-requirements} + +**Überwiegend Nicht anwendbar.** Klausel 5 behandelt geschlossene Funktionalität und Anforderungen im Hardware-Stil. DHTMLX +Spreadsheet ist offene Websoftware, die mit der assistiven Technologie der Plattform und des Browsers zusammenarbeitet, daher sind die +Unterklauseln zu geschlossener Funktionalität, Biometrie (5.3), bedienbaren Teilen (5.5) und dem Status von Sperr-/Umschaltsteuerungen +(5.6) Nicht anwendbar. Wo eine allgemeine Anforderung durch normale Unterstützung assistiver Technologien erfüllt wird, +ist sie durch Klausel 9 (Web) und die WCAG-Ergebnisse abgedeckt. + +### Klausel 9: Web {#clause-9-web} + +**Siehe Abschnitt WCAG 2.x.** Die Klauseln 9.1.1.1-9.4.1.3 entsprechen den WCAG-2.2-Ergebnissen der Stufen A/AA in den Tabellen 1 +und 2 oben. + +### Klausel 11: Software {#clause-11-software} + +**Nicht anwendbar (bewertet unter Klausel 9).** DHTMLX Spreadsheet ist Webinhalt, der unter Klausel 9 (Web) bewertet wird; +es ist keine Nicht-Web-Software. Die WCAG-bezogenen Softwarebestimmungen (11.1.1.1-11.4.1.3) sind durch die WCAG- +2.x-Ergebnisse abgedeckt. 11.8 (Authoring-Tools) ist Nicht anwendbar, da das Produkt kein Authoring-Tool ist. + +### Klausel 12: Dokumentation und Supportdienste {#clause-12-documentation-and-support-services} + +| Kriterien | Konformitätsstufe | Anmerkungen und Erläuterungen | +|---|---|---| +| 12.1.1 Funktionen für Barrierefreiheit und Kompatibilität | Unterstützt | Der Leitfaden [Barrierefreiheit](accessibility.md) dokumentiert die Barrierefreiheitsfunktionen des Produkts: das WAI-ARIA-Modell, das Tastaturmodell, den schreibgeschützten Modus und die Auswahloption, die Themes, den Fokusindikator, die API [`announce()`](api/spreadsheet_announce_method.md) und die [lokalisierbaren `aria_*`-Zeichenfolgen](accessibility.md#localization). | +| 12.1.2 Barrierefreie Dokumentation | Unterstützt (siehe Abschnitt WCAG 2.x) | Die Dokumentationsseite wird als Webinhalt bereitgestellt und so gepflegt, dass sie WCAG 2.2 AA erfüllt. | +| 12.2.2 Informationen zu Funktionen für Barrierefreiheit und Kompatibilität | Unterstützt | Die Barrierefreiheitsfunktionen sind öffentlich dokumentiert und können vom Support auf Anfrage bereitgestellt werden. | +| 12.2.3 Wirksame Kommunikation | Unterstützt | Der Support erfolgt über einen textbasierten E-Mail-Kanal; Benutzer interagieren mit ihrer eigenen assistiven Technologie. | +| 12.2.4 Barrierefreie Dokumentation | Unterstützt (siehe Abschnitt WCAG 2.x) | Gleiche Grundlage wie bei 12.1.2: Die Dokumentationsseite wird so gepflegt, dass sie WCAG 2.2 AA erfüllt. | + +## Rechtlicher Hinweis {#legal-disclaimer} + +Dieser Bericht dient ausschließlich Informationszwecken und beschreibt die Barrierefreiheit der genannten +Produktversion zum Berichtsdatum. Er wird „wie besehen" und ohne Gewährleistung jeglicher Art bereitgestellt und stellt +keine vertragliche Verpflichtung oder Garantie dar. Die Unterstützung der Barrierefreiheit kann sich in späteren Versionen ändern, +und die Ergebnisse gelten für die bewertete Konfiguration. „VPAT" und „Voluntary Product Accessibility Template" sind +eingetragene Dienstleistungsmarken des Information Technology Industry Council (ITI). diff --git a/i18n/de/docusaurus-plugin-content-docs/current/angular_integration.md b/i18n/de/docusaurus-plugin-content-docs/current/angular_integration.md index 699a6b9f..704a3004 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/angular_integration.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/angular_integration.md @@ -1,7 +1,7 @@ --- sidebar_label: Integration mit Angular title: Angular-Integration -description: In der Dokumentation erfahren Sie mehr über die Angular-Integration der DHTMLX JavaScript Spreadsheet-Bibliothek. Lesen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: DHTMLX Spreadsheet in einer Angular-Anwendung verwenden. Erstellen Sie ein Projekt, fügen Sie Spreadsheet als Angular-Komponente hinzu, laden Sie Daten und verarbeiten Sie Events. --- # Integration mit Angular {#integration-with-angular} @@ -234,6 +234,10 @@ ngOnDestroy() { } ~~~ +:::info +Die Methode `destructor()` entfernt die mit `spreadsheet.events.on()` hinzugefügten Event-Handler. Wenn eine neue Spreadsheet-Instanz erstellt wird, zum Beispiel wenn die Komponente erneut erstellt wird, fügen Sie die Handler der neuen Instanz hinzu. +::: + ### Schritt 3. Spreadsheet zur App hinzufügen {#step-3-adding-spreadsheet-into-the-app} Um die `SpreadsheetComponent`-Komponente zur App hinzuzufügen, öffnen Sie die Datei *src/app/app.component.ts* und ersetzen Sie den Standardcode durch den folgenden: diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/api_overview.md b/i18n/de/docusaurus-plugin-content-docs/current/api/api_overview.md index 359ca435..0bdf0398 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/api_overview.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/api_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: API-Übersicht title: API-Übersicht -description: Sie können eine API-Übersicht der DHTMLX JavaScript Spreadsheet-Bibliothek in der Dokumentation einsehen. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: "Übersicht über die API von DHTMLX Spreadsheet: Konstruktor, Methoden, Events, Eigenschaften sowie die Module Sheet Manager, Selection, Event Bus und Export." --- # API-Übersicht {#api-overview} @@ -27,6 +27,7 @@ Parameter: | [](api/spreadsheet_addcolumn_method.md) | @getshort(api/spreadsheet_addcolumn_method.md) | | [](api/spreadsheet_addformula_method.md) | @getshort(api/spreadsheet_addformula_method.md) | | [](api/spreadsheet_addrow_method.md) | @getshort(api/spreadsheet_addrow_method.md) | +| [](api/spreadsheet_announce_method.md) | @getshort(api/spreadsheet_announce_method.md) | | [](api/spreadsheet_clear_method.md) | @getshort(api/spreadsheet_clear_method.md) | | [](api/spreadsheet_deletecolumn_method.md) | @getshort(api/spreadsheet_deletecolumn_method.md) | | [](api/spreadsheet_deleterow_method.md) | @getshort(api/spreadsheet_deleterow_method.md) | @@ -99,6 +100,7 @@ Parameter: | [](api/spreadsheet_multisheets_config.md) | @getshort(api/spreadsheet_multisheets_config.md) | | [](api/spreadsheet_readonly_config.md) | @getshort(api/spreadsheet_readonly_config.md) | | [](api/spreadsheet_rowscount_config.md) | @getshort(api/spreadsheet_rowscount_config.md) | +| [](api/spreadsheet_selection_config.md) | @getshort(api/spreadsheet_selection_config.md) | | [](api/spreadsheet_toolbarblocks_config.md) | @getshort(api/spreadsheet_toolbarblocks_config.md) | @@ -118,8 +120,11 @@ Parameter: | Name | Beschreibung | | :--------------------------------------------- | :---------------------------------------------------- | +| [](api/selection_disable_method.md) | @getshort(api/selection_disable_method.md) | +| [](api/selection_enable_method.md) | @getshort(api/selection_enable_method.md) | | [](api/selection_getfocusedcell_method.md) | @getshort(api/selection_getfocusedcell_method.md) | | [](api/selection_getselectedcell_method.md) | @getshort(api/selection_getselectedcell_method.md) | +| [](api/selection_isdisabled_method.md) | @getshort(api/selection_isdisabled_method.md) | | [](api/selection_removeselectedcell_method.md) | @getshort(api/selection_removeselectedcell_method.md) | | [](api/selection_setfocusedcell_method.md) | @getshort(api/selection_setfocusedcell_method.md) | | [](api/selection_setselectedcell_method.md) | @getshort(api/selection_setselectedcell_method.md) | diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md index 5de189ba..fe3e615b 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md @@ -67,8 +67,8 @@ spreadsheet.events.on("beforeColumnAdd", function(cell){ | **merge** | Die Aktion wird beim Verbinden eines Zellbereichs ausgeführt | | **removeCellStyles** | Die Aktion wird beim Löschen der Stile einer Zelle ausgeführt | | **renameSheet** | Die Aktion wird beim Umbenennen eines Blatts ausgeführt | -| **resizeCol** | Die Aktion wird beim Ändern der Spaltenbreite ausgeführt | -| **resizeRow** | Die Aktion wird beim Ändern der Zeilenhöhe ausgeführt | +| **resizeCol** | Die Aktion wird beim Ändern der Spaltenbreite durch Ziehen des Spaltenrands oder mit dem Befehl *Spaltenbreite* ausgeführt | +| **resizeRow** | Die Aktion wird beim Ändern der Zeilenhöhe durch Ziehen des Zeilenrands oder mit dem Befehl *Zeilenhöhe* ausgeführt | | **setCellFormat** | Die Aktion wird beim Ändern des Formats einer Zelle ausgeführt | | **setCellValue** | Die Aktion wird beim Ändern oder Entfernen des Werts einer Zelle ausgeführt | | **setValidation** | Die Aktion wird beim Festlegen der Datenvalidierung für eine Zelle ausgeführt | @@ -78,6 +78,13 @@ spreadsheet.events.on("beforeColumnAdd", function(cell){ | **toggleFreeze** | Die Aktion wird beim Einfrieren/Aufheben des Einfrierens von Spalten/Zeilen ausgeführt | | **unmerge** | Die Aktion wird beim Aufheben der Verbindung von Zellen ausgeführt | +:::note +Im `config`-Objekt der Events [`beforeAction`](api/spreadsheet_beforeaction_event.md) und [`afterAction`](api/spreadsheet_afteraction_event.md) übergeben die Aktionen **resizeCol** und **resizeRow** Folgendes: + +- `cell` - die Zelle oder der Zellbereich, dessen Spalten oder Zeilen in der Größe geändert werden +- `val` - die neue Breite oder Höhe in Pixeln. Der Wert wird nur für die Befehle *Spaltenbreite* und *Zeilenhöhe* gesetzt, nicht beim Ändern der Größe durch Ziehen +::: + **Changelog:** - Die Aktionen **toggleFreeze** und **toggleVisibility** wurden in v5.2 hinzugefügt diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/methods_overview.md b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/methods_overview.md index 06234b93..2f5e9d4c 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/methods_overview.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/methods_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Methoden-Übersicht title: Methoden-Übersicht -description: Sie können die Methoden-Übersicht der DHTMLX JavaScript Spreadsheet-Bibliothek in der Dokumentation einsehen. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Liste der DHTMLX Spreadsheet-Methoden zum Laden und Speichern von Daten, Bearbeiten von Zellen, Formatieren, Verbinden, Sortieren, Filtern und Verwalten von Tabellenblättern. --- # Methoden-Übersicht {#methods-overview} @@ -11,6 +11,7 @@ description: Sie können die Methoden-Übersicht der DHTMLX JavaScript Spreadshe | [](api/spreadsheet_addcolumn_method.md) | @getshort(../spreadsheet_addcolumn_method.md) | | [](api/spreadsheet_addformula_method.md) | @getshort(../spreadsheet_addformula_method.md) | | [](api/spreadsheet_addrow_method.md) | @getshort(../spreadsheet_addrow_method.md) | +| [](api/spreadsheet_announce_method.md) | @getshort(../spreadsheet_announce_method.md) | | [](api/spreadsheet_clear_method.md) | @getshort(../spreadsheet_clear_method.md) | | [](api/spreadsheet_deletecolumn_method.md) | @getshort(../spreadsheet_deletecolumn_method.md) | | [](api/spreadsheet_deleterow_method.md) | @getshort(../spreadsheet_deleterow_method.md) | diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/properties_overview.md b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/properties_overview.md index 72ee682e..b702786c 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/properties_overview.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/properties_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Eigenschaften-Übersicht title: Eigenschaften-Übersicht -description: Sie können die Eigenschaften-Übersicht der DHTMLX JavaScript Spreadsheet-Bibliothek in der Dokumentation einsehen. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Liste der DHTMLX Spreadsheet-Konfigurationseigenschaften für Symbolleiste, Menü, schreibgeschützten Modus, Auswahl, Rastergröße und mehr. --- # Eigenschaften-Übersicht {#properties-overview} @@ -18,4 +18,5 @@ description: Sie können die Eigenschaften-Übersicht der DHTMLX JavaScript Spre | [](api/spreadsheet_multisheets_config.md) | @getshort(../spreadsheet_multisheets_config.md) | | [](api/spreadsheet_readonly_config.md) | @getshort(../spreadsheet_readonly_config.md) | | [](api/spreadsheet_rowscount_config.md) | @getshort(../spreadsheet_rowscount_config.md) | +| [](api/spreadsheet_selection_config.md) | @getshort(../spreadsheet_selection_config.md) | | [](api/spreadsheet_toolbarblocks_config.md) | @getshort(../spreadsheet_toolbarblocks_config.md) | diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/selection_overview.md b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/selection_overview.md index 9440023f..4269b623 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/selection_overview.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/selection_overview.md @@ -1,15 +1,18 @@ --- sidebar_label: Übersicht der Selection-Methoden title: Übersicht der Selection-Methoden -description: Sie können die Übersicht der Selection-Methoden der DHTMLX JavaScript Spreadsheet-Bibliothek in der Dokumentation einsehen. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Liste der Methoden des Selection-Moduls von DHTMLX Spreadsheet zum Auswählen von Zellen, Setzen des Fokus sowie Aus- und Einschalten der Zellauswahl. --- # Übersicht der Selection-Methoden {#selection-methods-overview} | Name | Beschreibung | | :--------------------------------------------- | :---------------------------------------------------- | +| [](api/selection_disable_method.md) | @getshort(../selection_disable_method.md) | +| [](api/selection_enable_method.md) | @getshort(../selection_enable_method.md) | | [](api/selection_getfocusedcell_method.md) | @getshort(../selection_getfocusedcell_method.md) | | [](api/selection_getselectedcell_method.md) | @getshort(../selection_getselectedcell_method.md) | +| [](api/selection_isdisabled_method.md) | @getshort(../selection_isdisabled_method.md) | | [](api/selection_removeselectedcell_method.md) | @getshort(../selection_removeselectedcell_method.md) | | [](api/selection_setfocusedcell_method.md) | @getshort(../selection_setfocusedcell_method.md) | | [](api/selection_setselectedcell_method.md) | @getshort(../selection_setselectedcell_method.md) | diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_disable_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_disable_method.md new file mode 100644 index 00000000..b31fd52d --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_disable_method.md @@ -0,0 +1,47 @@ +--- +sidebar_label: disable() +title: disable Selection-Methode +description: Schalten Sie die Zellauswahl in DHTMLX Spreadsheet zur Laufzeit mit der Methode selection.disable() aus. Die Methode entfernt die aktive Zelle und ignoriert die Auswahl per Maus, Tastatur und API. +--- + +# disable() + +### Beschreibung {#description} + +@short: Schaltet die Zellauswahl aus + +### Verwendung {#usage} + +~~~jsx +disable(): void; +~~~ + +### Beispiel {#example} + +~~~jsx {6} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + // config parameters +}); +spreadsheet.parse(data); + +spreadsheet.selection.disable(); +~~~ + +### Details {#details} + +Die Methode: + +- beendet die Bearbeitung einer Zelle und speichert den eingegebenen Wert +- entfernt die ausgewählten und die aktiven Zellen auf jedem Blatt +- ignoriert die Auswahl per Maus, Tastatur und API, bis die Methode [`enable()`](api/selection_enable_method.md) aufgerufen wird + +Solange die Auswahl ausgeschaltet ist, geben die Methoden [`getSelectedCell()`](api/selection_getselectedcell_method.md) und [`getFocusedCell()`](api/selection_getfocusedcell_method.md) `undefined` zurück. Die übrigen Auswirkungen entsprechen denen der Konfigurationsoption [`selection: false`](api/spreadsheet_selection_config.md#details). + +Ist die Auswahl bereits ausgeschaltet, tut die Methode nichts. + +**Changelog:** Hinzugefügt in v6.0.4 + +**Verwandte Artikel:** +- [`selection`](api/spreadsheet_selection_config.md) +- [`enable()`](api/selection_enable_method.md) +- [Barrierefreiheit: Einrichtung für den schreibgeschützten Modus](accessibility.md#read-only-setup) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_enable_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_enable_method.md new file mode 100644 index 00000000..ec1d4692 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_enable_method.md @@ -0,0 +1,42 @@ +--- +sidebar_label: enable() +title: enable Selection-Methode +description: Schalten Sie die Zellauswahl in DHTMLX Spreadsheet mit der Methode selection.enable() wieder ein. Die Methode macht die Zelle A1 aktiv und löst die Auswahl-Events aus. +--- + +# enable() + +### Beschreibung {#description} + +@short: Schaltet die Zellauswahl ein + +### Verwendung {#usage} + +~~~jsx +enable(): void; +~~~ + +### Beispiel {#example} + +~~~jsx {7} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, + // other config parameters +}); +spreadsheet.parse(data); + +spreadsheet.selection.enable(); +~~~ + +### Details {#details} + +Die Methode macht die Zelle A1 des aktiven Blatts aktiv. Für die Zelle A1 werden die Events [`beforeSelectionSet`](api/spreadsheet_beforeselectionset_event.md), [`beforeFocusSet`](api/spreadsheet_beforefocusset_event.md), [`afterFocusSet`](api/spreadsheet_afterfocusset_event.md) und [`afterSelectionSet`](api/spreadsheet_afterselectionset_event.md) ausgelöst. + +Ist die Auswahl bereits eingeschaltet, tut die Methode nichts. + +**Changelog:** Hinzugefügt in v6.0.4 + +**Verwandte Artikel:** +- [`selection`](api/spreadsheet_selection_config.md) +- [`disable()`](api/selection_disable_method.md) +- [Barrierefreiheit: Einrichtung für den schreibgeschützten Modus](accessibility.md#read-only-setup) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md new file mode 100644 index 00000000..dbf27134 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md @@ -0,0 +1,41 @@ +--- +sidebar_label: isDisabled() +title: isDisabled Selection-Methode +description: Prüfen Sie mit der Methode selection.isDisabled(), ob die Zellauswahl in DHTMLX Spreadsheet ausgeschaltet ist. +--- + +# isDisabled() + +### Beschreibung {#description} + +@short: Prüft, ob die Zellauswahl ausgeschaltet ist + +### Verwendung {#usage} + +~~~jsx +isDisabled(): boolean; +~~~ + +### Rückgabewert {#returns} + +Die Methode gibt `true` zurück, wenn die Auswahl ausgeschaltet ist, andernfalls `false` + +### Beispiel {#example} + +~~~jsx {7} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, + // other config parameters +}); +spreadsheet.parse(data); + +const disabled = spreadsheet.selection.isDisabled(); // -> true +~~~ + +**Changelog:** Hinzugefügt in v6.0.4 + +**Verwandte Artikel:** +- [`selection`](api/spreadsheet_selection_config.md) +- [`enable()`](api/selection_enable_method.md) +- [`disable()`](api/selection_disable_method.md) +- [Barrierefreiheit: Einrichtung für den schreibgeschützten Modus](accessibility.md#read-only-setup) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md index 86d0b9b7..9d8370fa 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setFocusedCell() title: setFocusedCell Selection-Methode -description: Sie können die setFocusedCell Selection-Methode in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek kennenlernen. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Machen Sie eine Zelle aktiv und verschieben Sie den Tastaturfokus mit der Methode selection.setFocusedCell() in DHTMLX Spreadsheet auf diese Zelle. --- # setFocusedCell() @@ -13,12 +13,13 @@ description: Sie können die setFocusedCell Selection-Methode in der Dokumentati ### Verwendung {#usage} ~~~jsx -setFocusedCell(cell: string): void; +setFocusedCell(cell: string, scroll?: boolean): void; ~~~ ### Parameter {#parameters} - `cell` - (erforderlich) die ID der Zelle, auf die der Fokus gesetzt werden soll +- `scroll` - (optional) legt fest, ob die Tabellenkalkulation zur Zelle gescrollt wird, standardmäßig `true` ### Beispiel {#example} @@ -31,4 +32,24 @@ spreadsheet.parse(data); spreadsheet.selection.setFocusedCell("D4"); ~~~ -**Verwandter Artikel:** [Mit der Tabellenkalkulation arbeiten](working_with_ssheet.md) +### Details {#details} + +Die Methode macht die angegebene Zelle aktiv und verschiebt nach dem Neuzeichnen den Tastaturfokus auf diese Zelle. Der Tastaturfokus wird nicht verschoben, wenn er sich befindet: + +- in einem Element außerhalb der Tabellenkalkulation +- in der Symbolleiste, im Menü oder in den Tabellenblatt-Tabs, die per Tastatur erreicht wurden +- in einem geöffneten Zelleneditor + +Befindet sich der Tastaturfokus auf dem Seitenkörper (body), zum Beispiel direkt nach dem Laden der Seite, verschiebt die Methode ihn auf die Zelle. + +Dieselben Regeln gelten für jede andere Änderung der aktiven Zelle, zum Beispiel durch eine andere API-Methode. + +Wenn der Handler des Events [`beforeFocusSet`](api/spreadsheet_beforefocusset_event.md) `false` zurückgibt, wird die aktive Zelle nicht geändert und der Tastaturfokus nicht verschoben. + +Die Methode tut nichts, solange die Auswahl mit der Konfigurationsoption [`selection: false`](api/spreadsheet_selection_config.md) oder mit der Methode [`selection.disable()`](api/selection_disable_method.md) deaktiviert ist. + +**Changelog:** Das Verschieben des Tastaturfokus auf die Zelle wurde in v6.0.4 hinzugefügt + +**Verwandte Artikel:** +- [Mit der Tabellenkalkulation arbeiten](working_with_ssheet.md) +- [Barrierefreiheit: Tastaturnavigation](accessibility.md#keyboard-navigation) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md index fd73da4b..92f9d52e 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md @@ -13,12 +13,13 @@ description: Sie können die setSelectedCell Selection-Methode in der Dokumentat ### Verwendung {#usage} ~~~jsx -setSelectedCell(cell: string): void; +setSelectedCell(cell: string, scroll?: boolean): void; ~~~ ### Parameter {#parameters} - `cell` - (erforderlich) die ID(s) oder ein Bereich der auszuwählenden Zelle(n) +- `scroll` - (optional) legt fest, ob die Tabellenkalkulation zur Zelle gescrollt wird, standardmäßig `true` ### Beispiel {#example} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md index ebfb6fd1..95d6785e 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md @@ -13,7 +13,21 @@ description: Sie können mehr über das afterAction-Event in der Dokumentation d ### Verwendung {#usage} ~~~jsx -afterAction: (action: string, config: object) => void; +afterAction: ( + action: string, + config: { + action?: string, + cell?: string, + row?: number, + col?: number, + val?: any, + prev?: any, + groupAction?: string, + pageId?: string | number, + pageName?: string, + // other properties of the action + } | object[] +) => void; ~~~ ### Parameter {#parameters} @@ -21,7 +35,18 @@ afterAction: (action: string, config: object) => void; Der Callback des Events akzeptiert folgende Parameter: - `action` - (erforderlich) der Name der Aktion. Die vollständige Liste der verfügbaren Aktionen finden Sie [hier](api/overview/actions_overview.md#list-of-actions) -- `config` - (erforderlich) ein Objekt mit den Parametern der Aktion +- `config` - (erforderlich) ein Objekt mit den Parametern der Aktion. Die Menge der Eigenschaften hängt von der Aktion ab. Das Objekt kann Folgendes enthalten: + - `action` - (optional) der Name der Aktion + - `cell` - (optional) die ID der Zelle oder des Zellbereichs, auf den die Aktion angewendet wird, zum Beispiel `"A1"` oder `"B2:D5"` + - `row` - (optional) der nullbasierte Index der Zeile der Zelle + - `col` - (optional) der nullbasierte Index der Spalte der Zelle + - `val` - (optional) der neue Wert, den die Aktion anwendet, zum Beispiel ein Zellwert, ein Stil oder eine Größe + - `prev` - (optional) der vorherige Wert + - `groupAction` - (optional) der Name der Aktion, die anstelle von `action` ausgeführt wird, wenn `cell` ein Zellbereich ist, zum Beispiel `"groupAction"`, `"groupRowAction"` oder `"resizeCol"` + - `pageId` - (optional) die ID des Tabellenblatts + - `pageName` - (optional) der Name des Tabellenblatts + + Werden mehrere Aktionen gemeinsam ausgeführt, zum Beispiel beim Einfügen, lautet der Parameter `action` `"groupAction"`, und `config` ist ein Array solcher Objekte. ### Beispiel {#example} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md new file mode 100644 index 00000000..5cbcf9b3 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md @@ -0,0 +1,67 @@ +--- +sidebar_label: announce() +title: announce Methode +description: Senden Sie mit der Methode announce() eine Statusmeldung an Screenreader-Nutzer von DHTMLX Spreadsheet, zum Beispiel um das Ergebnis eines benutzerdefinierten Toolbar- oder Menübefehls zu melden. +--- + +# announce() + +### Beschreibung {#description} + +@short: Gibt eine Meldung an Screenreader-Nutzer aus + +### Verwendung {#usage} + +~~~jsx +announce(message: string): void; +~~~ + +### Parameter {#parameters} + +- `message` - (erforderlich) der Text, der angekündigt werden soll. Ein leerer String löscht die Meldung + +### Beispiel {#example} + +Im folgenden Beispiel zählt ein benutzerdefinierter Menübefehl die leeren Zellen im ausgewählten Bereich und gibt das Ergebnis aus: + +~~~jsx {18} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + menu: true, + // other config parameters +}); +spreadsheet.parse(data); + +spreadsheet.menu.data.add({ + id: "count-empty", + value: "Count empty cells" +}); + +spreadsheet.menu.events.on("click", function (id) { + if (id === "count-empty") { + let count = 0; + spreadsheet.eachCell(function (cell, value) { + if (value === "" || value === undefined || value === null) count++; + }, spreadsheet.selection.getSelectedCell()); + spreadsheet.announce(count + " empty cells in the selection"); + } +}); +~~~ + +### Details {#details} + +Verwenden Sie die Methode, um Screenreader-Nutzer über das Ergebnis einer Aktion zu informieren, die kein eigenes sichtbares Element hat, etwa ein benutzerdefinierter Toolbar- oder Menübefehl. + +Die Meldung geht an eine visuell verborgene Live-Region, die direkt nach dem Grid-Element platziert ist (`role="status"`, `aria-live="polite"`, `aria-atomic="true"`). Der Screenreader liest sie vor, nachdem er die aktuelle Ausgabe beendet hat, und der Tastaturfokus wird nicht verschoben. + +Das Spreadsheet gibt seine eigenen Meldungen über dieselbe Region aus: den ausgewählten Bereich, neue Formelfehler und ungültige Werte, abgelehnte Änderungen, Suchergebnisse, Beginn und Ende von Import und Export sowie neue Spaltenbreiten und Zeilenhöhen (siehe die [Liste der Statusmeldungen](accessibility.md#status-announcements)). Die Region enthält jeweils nur eine Meldung, sodass eine neuere Meldung, ob eigene oder integrierte, die vorherige ersetzt. + +Wenn Sie den Text übergeben, der sich gerade in der Region befindet, liest der Screenreader ihn erneut vor. + +Die Methode funktioniert auch im [schreibgeschützten Modus](api/spreadsheet_readonly_config.md) und bei ausgeschalteter [Auswahl](api/spreadsheet_selection_config.md). Sie tut nichts, bevor das Spreadsheet in die Seite eingebunden wurde, und nachdem die Methode `destructor()` aufgerufen wurde. + +**Changelog:** Hinzugefügt in v6.0.4 + +**Verwandte Artikel:** +- [Statusmeldungen](accessibility.md#status-announcements) +- [Einen benutzerdefinierten Befehl ankündigen](accessibility.md#announcing-a-custom-command) +- [Anpassen des Menüs](customization.md#menu) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md index 036be70b..c766c509 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md @@ -13,7 +13,21 @@ description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek e ### Verwendung {#usage} ~~~jsx -beforeAction: (action: string, config: object) => void | boolean; +beforeAction: ( + action: string, + config: { + action?: string, + cell?: string, + row?: number, + col?: number, + val?: any, + prev?: any, + groupAction?: string, + pageId?: string | number, + pageName?: string, + // other properties of the action + } | object[] +) => void | boolean; ~~~ ### Parameter {#parameters} @@ -21,7 +35,18 @@ beforeAction: (action: string, config: object) => void | boolean; Der Callback des Events nimmt folgende Parameter entgegen: - `action` - (erforderlich) der Name der Aktion. Die vollständige Liste der verfügbaren Aktionen finden Sie [hier](api/overview/actions_overview.md#list-of-actions) -- `config` - (erforderlich) ein Objekt mit den Parametern der Aktion +- `config` - (erforderlich) ein Objekt mit den Parametern der Aktion. Die Menge der Eigenschaften hängt von der Aktion ab. Das Objekt kann Folgendes enthalten: + - `action` - (optional) der Name der Aktion + - `cell` - (optional) die ID der Zelle oder des Zellbereichs, auf den die Aktion angewendet wird, zum Beispiel `"A1"` oder `"B2:D5"` + - `row` - (optional) der nullbasierte Index der Zeile der Zelle + - `col` - (optional) der nullbasierte Index der Spalte der Zelle + - `val` - (optional) der neue Wert, den die Aktion anwendet, zum Beispiel ein Zellwert, ein Stil oder eine Größe + - `prev` - (optional) der vorherige Wert + - `groupAction` - (optional) der Name der Aktion, die anstelle von `action` ausgeführt wird, wenn `cell` ein Zellbereich ist, zum Beispiel `"groupAction"`, `"groupRowAction"` oder `"resizeCol"` + - `pageId` - (optional) die ID des Tabellenblatts + - `pageName` - (optional) der Name des Tabellenblatts + + Werden mehrere Aktionen gemeinsam ausgeführt, zum Beispiel beim Einfügen, lautet der Parameter `action` `"groupAction"`, und `config` ist ein Array solcher Objekte. ### Rückgabewert {#returns} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md index bbd09dd7..c6ac0f16 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md @@ -1,7 +1,7 @@ --- sidebar_label: deleteColumn() title: deleteColumn method -description: Sie können im Dokumentationsbereich der DHTMLX JavaScript Spreadsheet-Bibliothek mehr über die deleteColumn-Methode erfahren. Lesen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Entfernen Sie mit der Methode deleteColumn() eine Spalte oder einen Spaltenbereich aus DHTMLX Spreadsheet, einschließlich aller Spalten einer verbundenen Zelle. --- # deleteColumn() @@ -11,7 +11,9 @@ description: Sie können im Dokumentationsbereich der DHTMLX JavaScript Spreadsh @short: Entfernt eine Spalte aus der Tabellenkalkulation :::info -Die Methode sucht die angegebene Zelle, markiert sie, entfernt die Spalte, in der sich die Zelle befindet, und verschiebt die Spalte links davon an deren Position. +Die Methode entfernt die Spalte, in der sich die angegebene Zelle befindet, und verschiebt die Spalten rechts davon nach links. + +Befindet sich die Zelle innerhalb einer verbundenen Zelle, entfernt die Methode jede Spalte, über die sich die verbundene Zelle erstreckt. ::: ### Verwendung {#usage} @@ -35,7 +37,27 @@ spreadsheet.deleteColumn("G2"); ~~~ :::note -Sie können mehrere Spalten löschen, indem Sie einen Zellenbereich als Parameter der Methode angeben, zum Beispiel: "A1:C3". +Sie können mehrere Spalten löschen, indem Sie einen Zellenbereich als Parameter der Methode angeben, zum Beispiel: "A1:C3". Wenn der Bereich eine verbundene Zelle berührt, werden die Spalten der gesamten verbundenen Zelle gelöscht. Ein Bereich, der ganze Spalten abdeckt, zum Beispiel "B1:C100" in einem Tabellenblatt mit 100 Zeilen, wird unverändert gelöscht. ::: -**Verwandter Artikel:** [Arbeiten mit der Tabellenkalkulation](working_with_ssheet.md#addingremoving-rows-and-columns) +### Details {#details} + +Wird eine Spalte innerhalb einer verbundenen Zelle gelöscht, wird die gesamte verbundene Zelle mit allen ihren Spalten gelöscht: + +~~~jsx +spreadsheet.mergeCells("B2:D2"); + +// removes columns B, C and D +spreadsheet.deleteColumn("C2"); +~~~ + +Werden ganze Spalten gelöscht, wird eine verbundene Zelle, die sich über diese erstreckt, kleiner. Verbundene Zellen rechts von den gelöschten Spalten werden zusammen mit ihren Spalten nach links verschoben. Sind die gelöschten Spalten fixiert, verkleinert sich der fixierte Bereich um die Anzahl der gelöschten fixierten Spalten. + +Die Events [`beforeAction`](api/spreadsheet_beforeaction_event.md) und [`afterAction`](api/spreadsheet_afteraction_event.md) der Aktion `"deleteColumn"` erhalten die Zelle, die an die Methode übergeben wird, und nicht den Bereich der gelöschten Spalten. + +**Changelog:** Das Löschen aller Spalten einer verbundenen Zelle wurde in v6.0.4 hinzugefügt + +**Verwandte Artikel:** +- [Arbeiten mit Zeilen und Spalten](work_with_rows_cols.md#removing-columns) +- [Zellen verbinden](merge_cells.md#removing-rows-and-columns-of-merged-cells) +- [Arbeiten mit der Tabellenkalkulation](working_with_ssheet.md#addingremoving-rows-and-columns) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md index 397ca7ac..ca14c5cd 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md @@ -1,7 +1,7 @@ --- sidebar_label: deleteRow() title: deleteRow method -description: Sie können im Dokumentationsbereich der DHTMLX JavaScript Spreadsheet-Bibliothek mehr über die deleteRow-Methode erfahren. Lesen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Entfernen Sie mit der Methode deleteRow() eine Zeile oder einen Zeilenbereich aus DHTMLX Spreadsheet, einschließlich aller Zeilen einer verbundenen Zelle. --- # deleteRow() @@ -11,7 +11,9 @@ description: Sie können im Dokumentationsbereich der DHTMLX JavaScript Spreadsh @short: Entfernt eine Zeile aus der Tabellenkalkulation :::info -Die Methode sucht die angegebene Zelle, markiert sie, entfernt die Zeile, in der sich die Zelle befindet, und verschiebt die darunter liegende Zeile an deren Position. +Die Methode entfernt die Zeile, in der sich die angegebene Zelle befindet, und verschiebt die darunter liegenden Zeilen nach oben. + +Befindet sich die Zelle innerhalb einer verbundenen Zelle, entfernt die Methode jede Zeile, über die sich die verbundene Zelle erstreckt. ::: ### Verwendung {#usage} @@ -35,7 +37,27 @@ spreadsheet.deleteRow("G2"); ~~~ :::note -Sie können mehrere Zeilen löschen, indem Sie einen Zellenbereich als Parameter der Methode angeben, zum Beispiel: "A1:C3". +Sie können mehrere Zeilen löschen, indem Sie einen Zellenbereich als Parameter der Methode angeben, zum Beispiel: "A1:C3". Wenn der Bereich eine verbundene Zelle berührt, werden die Zeilen der gesamten verbundenen Zelle gelöscht. Ein Bereich, der ganze Zeilen abdeckt, zum Beispiel "A2:Z3" in einem Tabellenblatt mit den Spalten A bis Z, wird unverändert gelöscht. ::: -**Verwandter Artikel:** [Arbeiten mit der Tabellenkalkulation](working_with_ssheet.md#addingremoving-rows-and-columns) +### Details {#details} + +Wird eine Zeile innerhalb einer verbundenen Zelle gelöscht, wird die gesamte verbundene Zelle mit allen ihren Zeilen gelöscht: + +~~~jsx +spreadsheet.mergeCells("B2:B4"); + +// removes rows 2, 3 and 4 +spreadsheet.deleteRow("B3"); +~~~ + +Werden ganze Zeilen gelöscht, wird eine verbundene Zelle, die sich über diese erstreckt, kleiner. Verbundene Zellen unterhalb der gelöschten Zeilen werden zusammen mit ihren Zeilen nach oben verschoben. Sind die gelöschten Zeilen fixiert, verkleinert sich der fixierte Bereich um die Anzahl der gelöschten fixierten Zeilen. + +Die Events [`beforeAction`](api/spreadsheet_beforeaction_event.md) und [`afterAction`](api/spreadsheet_afteraction_event.md) der Aktion `"deleteRow"` erhalten die Zelle, die an die Methode übergeben wird, und nicht den Bereich der gelöschten Zeilen. + +**Changelog:** Das Löschen aller Zeilen einer verbundenen Zelle wurde in v6.0.4 hinzugefügt + +**Verwandte Artikel:** +- [Arbeiten mit Zeilen und Spalten](work_with_rows_cols.md#removing-rows) +- [Zellen verbinden](merge_cells.md#removing-rows-and-columns-of-merged-cells) +- [Arbeiten mit der Tabellenkalkulation](working_with_ssheet.md#addingremoving-rows-and-columns) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md index 24c7aa68..4394ab56 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md @@ -1,7 +1,7 @@ --- sidebar_label: readonly title: readonly-Konfiguration -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die readonly-Konfiguration. Lesen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Aktivieren Sie den Nur-Lesen-Modus in DHTMLX Spreadsheet mit der Eigenschaft readonly. Er blockiert Datenänderungen, behält aber Tastaturnavigation, Auswahl, Kopieren und Suche bei. --- # readonly @@ -31,9 +31,41 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { }); ~~~ +### Details {#details} + +Im Nur-Lesen-Modus sind die Symbolleiste, das Menü und die Formelleiste ausgeblendet, und das Kontextmenü sowie das Symbol des Spaltenmenüs sind nicht verfügbar. Die Tabellenblatt-Tabs bleiben erhalten, jedoch ohne die Schaltfläche zum Hinzufügen eines Tabellenblatts, das Kontextmenü der Tabellenblätter und das Umbenennen per Doppelklick. + +Benutzer können die Daten weiterhin lesen und kopieren: + +- die Zelle A1 ist nach dem Laden der Daten aktiv +- die Zellen können per Tastatur navigiert und per Maus ausgewählt werden, und die Auswahl-Events werden bei diesen Aktionen ausgelöst +- die Zellen können mit `Ctrl (Cmd) + C` kopiert und mit `Ctrl (Cmd) + F` durchsucht werden +- die Tabellenblätter können in den Tabellenblatt-Tabs und per Tastatur gewechselt werden +- die Links in Zellen können geöffnet werden, aber die Schaltflächen zum Bearbeiten und Entfernen eines Links sind im Link-Popup deaktiviert + +Änderungen der Daten werden abgelehnt: + +- Eingaben, Bearbeitungstasten, Ausschneiden und Einfügen, Rückgängig und Wiederholen sowie die Tastenkombinationen zum Formatieren von Zellen, Einfügen eines Links, Hinzufügen eines Tabellenblatts oder Einblenden ausgeblendeter Zeilen und Spalten werden ignoriert, und Screenreader kündigen "The sheet is read-only" an +- die Methoden, die Daten bearbeiten, zum Beispiel [`setValue()`](api/spreadsheet_setvalue_method.md), [`setStyle()`](api/spreadsheet_setstyle_method.md) und [`deleteRow()`](api/spreadsheet_deleterow_method.md), sowie die Methode [`startEdit()`](api/spreadsheet_startedit_method.md) werden ignoriert. Die Methoden [`parse()`](api/spreadsheet_parse_method.md) und [`load()`](api/spreadsheet_load_method.md) laden weiterhin Daten +- der Fill-Handle ist ausgeblendet +- die Spalten und Zeilen können nicht durch Ziehen ihrer Ränder in der Größe geändert werden, und ein Doppelklick auf einen Spaltenrand passt die Spaltenbreite nicht an die Daten an + +Um auch die Tastaturnavigation und die Auswahl zu deaktivieren, setzen Sie die Option [`selection`](api/spreadsheet_selection_config.md) auf `false`. In diesem Fall hat die Tabellenkalkulation keine aktive Zelle, und die Zellen können weder per Maus, Tastatur noch API ausgewählt werden: + +~~~jsx {3} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, + selection: false, + // other config parameters +}); +~~~ + +**Changelog:** Die Tastaturnavigation, die Auswahl, das Kopieren und die Suche im Nur-Lesen-Modus wurden in v6.0.4 hinzugefügt + **Verwandte Artikel:** - [Konfiguration](configuration.md#read-only-mode) - [Anpassung](customization.md#custom-read-only-mode) +- [Barrierefreiheit: Einrichtung für den Nur-Lesen-Modus](accessibility.md#read-only-setup) **Verwandtes Beispiel:** [Spreadsheet. Nur-Lesen](https://snippet.dhtmlx.com/2w959gx2) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md new file mode 100644 index 00000000..09d0b008 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md @@ -0,0 +1,63 @@ +--- +sidebar_label: selection +title: selection Konfiguration +description: Schalten Sie die Zellauswahl in DHTMLX Spreadsheet mit der Eigenschaft selection aus, allein oder zusammen mit dem schreibgeschützten Modus, um die Daten ohne aktive Zelle anzuzeigen. +--- + +# selection + +### Beschreibung {#description} + +@short: Optional. Aktiviert/deaktiviert die Zellauswahl + +### Verwendung {#usage} + +~~~jsx +selection?: boolean; +~~~ + +### Standardkonfiguration {#default-config} + +~~~jsx +selection: true +~~~ + +### Beispiel {#example} + +~~~jsx {2} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, + // other config parameters +}); +~~~ + +### Details {#details} + +Wenn die Eigenschaft auf `false` gesetzt ist: + +- hat das Spreadsheet keine aktive Zelle +- können Zellen weder mit der Maus, der Tastatur noch der API ausgewählt werden: Die Methoden [`setSelectedCell()`](api/selection_setselectedcell_method.md) und [`setFocusedCell()`](api/selection_setfocusedcell_method.md) werden ignoriert, und die Methoden [`getSelectedCell()`](api/selection_getselectedcell_method.md) und [`getFocusedCell()`](api/selection_getfocusedcell_method.md) geben `undefined` zurück +- können Zellen nicht über die Oberfläche bearbeitet werden: Die Formelleiste ist gesperrt, der Ausfüllgriff ist ausgeblendet, und die Methode [`startEdit()`](api/spreadsheet_startedit_method.md) wird ignoriert +- sind das Kontextmenü und das Spaltenmenü-Symbol nicht verfügbar +- hält `Tab` einmal auf dem Grid an und verschiebt den Fokus weiter, und `Ctrl + F6` überspringt das Grid + +Die Spalten und Zeilen lassen sich weiterhin durch Ziehen ihrer Ränder in der Größe ändern, und die Daten können weiterhin über die API geändert werden, zum Beispiel mit der Methode [`setValue()`](api/spreadsheet_setvalue_method.md). + +In Kombination mit der Eigenschaft [`readonly`](api/spreadsheet_readonly_config.md) schaltet die Option die Tastaturnavigation und die Auswahl aus, die im schreibgeschützten Modus verfügbar sind: + +~~~jsx {3} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, + selection: false, + // other config parameters +}); +~~~ + +Um die Auswahl zur Laufzeit aus- und einzuschalten, verwenden Sie die Methoden [`selection.disable()`](api/selection_disable_method.md) und [`selection.enable()`](api/selection_enable_method.md). + +**Changelog:** Hinzugefügt in v6.0.4 + +**Verwandte Artikel:** +- [Auswahl von Zellen](configuration.md#selection-of-cells) +- [Schreibgeschützter Modus](configuration.md#read-only-mode) +- [Barrierefreiheit: Einrichtung für den schreibgeschützten Modus](accessibility.md#read-only-setup) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md index 2de68aaa..dae19d2b 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md @@ -35,4 +35,10 @@ spreadsheet.parse(data); spreadsheet.startEdit(); ~~~ +### Details {#details} + +Die Eingabe in der aktiven Zelle startet die Bearbeitung über diese Methode. Text, der mit einem Input Method Editor (IME) verfasst wird, wird nach Abschluss der Komposition als `initialValue` übergeben. Somit erhalten die Events [`beforeEditStart`](api/spreadsheet_beforeeditstart_event.md) und [`afterEditStart`](api/spreadsheet_aftereditstart_event.md) den eingegebenen bzw. verfassten Text, und `beforeEditStart` kann die Bearbeitung abbrechen. + +**Changelog:** Das Starten der Bearbeitung mit dem per IME verfassten Text wurde in v6.0.4 hinzugefügt + **Verwandter Artikel:** [Mit dem Spreadsheet arbeiten](working_with_cells.md#editing-a-cell) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/configuration.md b/i18n/de/docusaurus-plugin-content-docs/current/configuration.md index 6e6faf6d..3cc98a99 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/configuration.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/configuration.md @@ -1,7 +1,7 @@ --- sidebar_label: Konfiguration title: Konfiguration -description: In der Dokumentation erfahren Sie alles über die Konfiguration der DHTMLX JavaScript Spreadsheet-Bibliothek. Lesen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: DHTMLX Spreadsheet konfigurieren. Symbolleiste, Bearbeitungsleiste, Menü, Anzahl der Zeilen und Spalten, schreibgeschützter Modus, Zellauswahl und Zahlenformate einrichten. --- # Konfiguration {#configuration} @@ -48,10 +48,43 @@ Das Menü des Spreadsheets ist standardmäßig ausgeblendet. Sie können es übe Sie können auch den schreibgeschützten Modus aktivieren, um die Bearbeitung von Spreadsheet-Zellen über die Konfigurationsoption [`readonly`](api/spreadsheet_readonly_config.md) zu verhindern. +~~~jsx {2} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, +}); +~~~ + +Im schreibgeschützten Modus sind die Symbolleiste, das Menü und die Formelleiste ausgeblendet. Nutzer können mit der Tastatur zwischen den Zellen navigieren, Zellen mit der Maus auswählen, kopieren und durchsuchen. Änderungen werden abgelehnt und Screenreadern mit der Meldung "The sheet is read-only" angekündigt. Das Ausfüllkästchen (Fill Handle) ist ausgeblendet. Details finden Sie im Artikel zu [`readonly`](api/spreadsheet_readonly_config.md#details). Wie Tastatur- und Screenreader-Nutzer mit einem schreibgeschützten Spreadsheet arbeiten, erfahren Sie im Abschnitt [Read-only setup](accessibility.md#read-only-setup) des Accessibility-Leitfadens. + +Um die Tastaturnavigation und die Auswahl im schreibgeschützten Modus auszuschalten, setzen Sie die Option [`selection`](api/spreadsheet_selection_config.md) auf `false`: + +~~~jsx {3} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, + selection: false, +}); +~~~ + Sie können auch das [schreibgeschützte Verhalten des Spreadsheets anpassen](customization.md#custom-read-only-mode). +## Zellauswahl {#selection-of-cells} + +Standardmäßig können Nutzer Zellen mit der Maus und der Tastatur auswählen, und das Spreadsheet hat eine aktive Zelle. Um die Auswahl auszuschalten, setzen Sie die Konfigurationsoption [`selection`](api/spreadsheet_selection_config.md) auf `false`: + +~~~jsx {2} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, +}); +~~~ + +In diesem Fall hat das Spreadsheet keine aktive Zelle, die Zellen können über die Oberfläche weder ausgewählt noch bearbeitet werden, und das Kontextmenü ist nicht verfügbar. + +Um die Auswahl zur Laufzeit aus- und einzuschalten, verwenden Sie die Methoden [`selection.disable()`](api/selection_disable_method.md) und [`selection.enable()`](api/selection_enable_method.md). Mit der Methode [`selection.isDisabled()`](api/selection_isdisabled_method.md) prüfen Sie, ob die Auswahl ausgeschaltet ist. + +Ohne Auswahl wird das Raster zu einem einzigen Tabstopp, den die Tastatur durchläuft. Siehe den Abschnitt [Read-only setup](accessibility.md#read-only-setup) des Accessibility-Leitfadens. + ## Benutzerdefinierte Zahlenformate für Zellen {#custom-number-formats-for-cells} Sie können 7 Standardformate auf Zellwerte anwenden: "Common", "Number", "Percent", "Currency", "Date", "Time", "Text". diff --git a/i18n/de/docusaurus-plugin-content-docs/current/customization.md b/i18n/de/docusaurus-plugin-content-docs/current/customization.md index 40d8a5f1..38cbfe1b 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/customization.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/customization.md @@ -1,7 +1,7 @@ --- sidebar_label: Anpassung title: Anpassung -description: Sie erfahren in der Dokumentation, wie Sie die DHTMLX JavaScript Spreadsheet-Bibliothek anpassen. Durchsuchen Sie Entwicklerleitfaden und API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus, und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: DHTMLX Spreadsheet anpassen. Icons ändern sowie Controls der Symbolleiste, des Menüs und des Kontextmenüs hinzufügen, aktualisieren und löschen oder einen benutzerdefinierten schreibgeschützten Modus erstellen. --- # Anpassung {#customization} @@ -31,6 +31,8 @@ Anschließend können Sie den Namen des Icons als Wert der Eigenschaft `icon` im Sie können die folgenden Control-Typen hinzufügen: `button`, `menuItem`, `separator` und `spacer`. +Wie die anderen Controls der [Standard-Toolbar](#default-controls) sind auch die Controls *Textfarbe* und *Hintergrundfarbe* sowie das Control *Rahmenfarbe* im Popup *Rahmen* vom Typ [`navItem`](https://docs.dhtmlx.com/suite/toolbar/navitem/). Sie zeichnen die aktuelle Farbe über die Eigenschaft [`html`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/), beziehen ihren zugänglichen Namen aus der Eigenschaft [`value`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/), zum Beispiel "Text color: dark gray", und öffnen ein Farb-Popup. Spreadsheet aktualisiert beide Eigenschaften der Controls *Textfarbe* und *Hintergrundfarbe*, wenn sich die aktive Zelle ändert, und des Controls *Rahmenfarbe*, wenn eine Rahmenfarbe gewählt wird. + Das `button`-Objekt hat folgende Eigenschaften: - `type` - der Typ eines Buttons, setzen Sie diesen auf "button" @@ -51,7 +53,7 @@ Das `menuItem`-Objekt hat folgende Eigenschaften: - `value` - der Wert eines Menüeintrags - `childs` - ein Array von untergeordneten Controls (beachten Sie, dass alle untergeordneten Elemente den Typ `menuItem` haben müssen) -Die Datensammlungs-API der **Toolbar**, des **Menüs** und des **Kontextmenüs** ermöglicht Ihnen die Verwaltung von Controls: Sie können benutzerdefinierte Controls hinzufügen, nicht benötigte entfernen oder vorhandene aktualisieren - beispielsweise deren Icons ändern. +Die Datensammlungs-API der **Toolbar**, des **Menüs** und des **Kontextmenüs** ermöglicht Ihnen die Verwaltung von Controls: Sie können benutzerdefinierte Controls hinzufügen, nicht benötigte entfernen oder vorhandene aktualisieren, beispielsweise deren Icons ändern. ### Controls hinzufügen {#adding-controls} @@ -379,7 +381,8 @@ Das [Standard-Kontextmenü](/#context-menu) hat folgende Struktur: - das **Spalten**-menuItem (id: "columns") - das *Spalte hinzufügen*-menuItem (id: "add-col") - das *Spalte entfernen*-menuItem (id: "remove-col") - - das *An Daten anpassen*-menuItem (id: "fit-col") + - das *An Daten anpassen*-menuItem (id: "fit-col"), angezeigt im Spaltenmenü und bei Auswahl ganzer Spalten + - das *Spaltenbreite*-menuItem (id: "col-width") - der Trenner - das *Spalten einblenden*-menuItem (id: "unfreeze-cols") - das *Bis Spalte [id] fixieren*-menuItem (id: "freeze-cols") @@ -388,6 +391,7 @@ Das [Standard-Kontextmenü](/#context-menu) hat folgende Struktur: - das **Zeilen**-menuItem (id: "rows") - das *Zeile hinzufügen*-menuItem (id: "add-row") - das *Zeile entfernen*-menuItem (id: "remove-row") + - das *Zeilenhöhe*-menuItem (id: "row-height") - der Trenner - das *Zeilen einblenden*-menuItem (id: "unfreeze-rows") - das *Bis Zeile [id] fixieren*-menuItem (id: "freeze-rows") @@ -397,6 +401,7 @@ Das [Standard-Kontextmenü](/#context-menu) hat folgende Struktur: - das *A bis Z sortieren*-menuItem (id: "asc-sort") - das *Z bis A sortieren*-menuItem (id: "desc-sort") - das **Link einfügen**-menuItem (id: "link") +- das **Filter öffnen**-menuItem (id: "open-filter"), angezeigt, wenn die aktive Zelle das Filtersymbol enthält ### Controls hinzufügen {#adding-controls-3} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/data_search.md b/i18n/de/docusaurus-plugin-content-docs/current/data_search.md index acd44e24..a8a093a4 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/data_search.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/data_search.md @@ -1,7 +1,7 @@ --- sidebar_label: Daten suchen title: Daten suchen -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie alles über die Datensuche. Lesen Sie Entwicklerleitfäden und die API-Referenz, probieren Sie Codebeispiele und Live-Demos aus, und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Daten in DHTMLX Spreadsheet mit der Suchleiste durchsuchen. Öffnen Sie sie mit Ctrl (Cmd) + F oder über das Menü Daten, wechseln Sie zwischen den Treffern und schließen Sie sie mit Esc. --- # Daten suchen {#searching-for-data} @@ -12,3 +12,11 @@ Um die Suchleiste zu öffnen, haben Sie zwei Möglichkeiten: - Oder navigieren Sie zu: *Daten* -> *Suchen* ![DHTMLX Spreadsheet-Suchleiste mit einem Texteingabefeld zum Suchen von Daten](/img/search_data.png) + +Geben Sie den zu suchenden Text in die Suchleiste ein. Die erste Zelle, die den Text enthält, wird hervorgehoben und in den sichtbaren Bereich gescrollt, und der Zähler zeigt die Anzahl der Treffer an. Um zwischen den Treffern zu wechseln, klicken Sie auf die Pfeiltasten in der Suchleiste. + +Die Suchergebnisse werden nach dem Bearbeiten von Zellen und nach dem Öffnen eines anderen Tabellenblatts aktualisiert. Screenreader kündigen die Anzahl der Treffer und die Adresse des ersten Treffers an, nachdem Sie die Eingabe beendet haben, zum Beispiel "Results: 5. 1 of 5, B2" oder "No results". Wenn Sie zu einem anderen Treffer wechseln, kündigen sie dessen Position und Adresse an, zum Beispiel "2 of 5, B7". + +Um die Suchleiste zu schließen, drücken Sie **Esc** oder klicken Sie auf die Schaltfläche zum Schließen. Der Fokus kehrt zur aktiven Zelle zurück. + +Um Daten über die API zu suchen, verwenden Sie die Methode [`search()`](api/spreadsheet_search_method.md). diff --git a/i18n/de/docusaurus-plugin-content-docs/current/excel_import_export.md b/i18n/de/docusaurus-plugin-content-docs/current/excel_import_export.md index 6722d501..f8263a77 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/excel_import_export.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/excel_import_export.md @@ -1,7 +1,7 @@ --- sidebar_label: Excel-Import/Export title: Excel-Import und -Export -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über den Excel-Import und -Export. Durchsuchen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Daten aus Excel-Dateien in DHTMLX Spreadsheet importieren und über die Symbolleiste oder das Menü Datei nach .xlsx exportieren. --- # Excel-Import/Export {#excel-importexport} @@ -37,3 +37,9 @@ Gehen Sie zu: *Datei -> Herunterladen als... -> Microsoft Excel (.xlsx)* im Men ![DHTMLX Spreadsheet File menu with the Download As option for Microsoft Excel XLSX export](/img/file_export.png) 2\. Überprüfen Sie Ihr Download-Verzeichnis, um die Excel-Datei mit den Daten aus Spreadsheet zu finden. + +Screenreader kündigen den Beginn und das Ende von Import und Export an. + +:::note +Import und Export von Excel-Dateien verwenden WebAssembly. Wenn der Browser WebAssembly nicht unterstützt, zeigen die Befehle Import und Export eine Meldung mit dem Text des Schlüssels `wasmNotSupported` der [Locale](localization.md#default-locale) an. Die Methode [`load()`](api/spreadsheet_load_method.md) mit dem Typ `"xlsx"` und die Methode [`export.xlsx()`](api/export_xlsx_method.md) werfen einen `Error` mit demselben Text, den Sie in Ihrem Code abfangen können. +::: diff --git a/i18n/de/docusaurus-plugin-content-docs/current/filtering_data.md b/i18n/de/docusaurus-plugin-content-docs/current/filtering_data.md index b297a39d..8b1e8085 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/filtering_data.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/filtering_data.md @@ -1,7 +1,7 @@ --- sidebar_label: Daten filtern title: Daten filtern -description: Sie können mehr über das Filtern von Daten in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren. Lesen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Daten in DHTMLX Spreadsheet nach Bedingung oder nach Werten filtern, einen Filter mit der Tastatur öffnen sowie Filter löschen oder entfernen. --- # Daten filtern {#filtering-data} @@ -36,6 +36,20 @@ Um einen Filter zu löschen, klicken Sie auf das **Filter**-Symbol in der Spalte ![DHTMLX Spreadsheet-Filterdialog mit der Option "Nach Bedingung: Keine" zum Löschen von Filtern](/img/clear_filter_bycondition.png) +## Einen Filter mit der Tastatur öffnen {#opening-a-filter-with-the-keyboard} + +So öffnen Sie den Filter einer Spalte ohne Maus: + +- Bewegen Sie die aktive Zelle zur Kopfzelle der Spalte mit dem **Filter**-Symbol + +- Drücken Sie `Shift + F10` oder die Menütaste, um das Kontextmenü aufzurufen, und wählen Sie *Open filter* + +![DHTMLX Spreadsheet context menu of a header cell with the filter icon and the Open filter command focused](/img/open_filter_context_menu.png) + +Der Befehl *Open filter* erscheint im Kontextmenü nur für Zellen mit dem **Filter**-Symbol. Sie können ihn auch nach einem Rechtsklick auf eine solche Zelle wählen. Im [schreibgeschützten Modus](api/spreadsheet_readonly_config.md) sind das Kontextmenü und der Befehl *Open filter* nicht verfügbar. + +Das Filter-Popup erhält den Fokus, und `Tab` wechselt zwischen seinen Controls. `Esc` schließt das Popup und gibt den Fokus an die Zelle zurück. Ist im Popup eine Dropdown-Liste oder ein Datepicker geöffnet, schließt `Esc` zuerst diese. + ## Filtern nach Werten {#filtering-by-values} - Klicken Sie auf das **Filter**-Symbol der gewünschten Spalte diff --git a/i18n/de/docusaurus-plugin-content-docs/current/guides.md b/i18n/de/docusaurus-plugin-content-docs/current/guides.md index cc6c8c53..e75d8cea 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/guides.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/guides.md @@ -1,12 +1,12 @@ --- sidebar_label: Leitfaden-Übersicht title: Entwickler- und Benutzerhandbücher -description: Entwickler- und Benutzerhandbücher finden Sie in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek. Durchsuchen Sie die API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: "Entwickler- und Benutzerhandbücher von DHTMLX Spreadsheet: von Initialisierung, Konfiguration und Datenladen bis zum Bearbeiten von Zellen, Formatieren und Arbeiten mit Tabellenblättern." --- # Leitfäden {#guides} -DHTMLX Spreadsheet bietet ein breites Spektrum an Funktionen: Import und Export von Daten in verschiedenen Formaten, komfortables Arbeiten mit Zellinhalten und -stilen, eine flexible Tabellenstruktur, einen Nur-Lesen-Modus, umfangreiche Anpassungsmöglichkeiten für das Erscheinungsbild und Integration mit gängigen Frameworks. +DHTMLX Spreadsheet bietet ein breites Spektrum an Funktionen: Import und Export von Daten in verschiedenen Formaten, komfortables Arbeiten mit Zellinhalten und -stilen, eine flexible Tabellenstruktur, einen Nur-Lesen-Modus, umfangreiche Anpassungsmöglichkeiten für das Erscheinungsbild, Barrierefreiheit für Tastatur- und Screenreader-Nutzer und Integration mit gängigen Frameworks. ## Entwicklerhandbücher {#developer-guides} @@ -42,6 +42,12 @@ Zeigt, wie Sie Daten in Spreadsheet laden, Events verarbeiten und die wichtigste - [DHTMLX MCP-Server](mcp-server.md) - verbindet KI-Coding-Assistenten mit der Live-Dokumentation von Spreadsheet +### Barrierefreiheit {#accessibility} + +- [Barrierefreiheit](accessibility.md) - WAI-ARIA-Unterstützung, Tastaturnavigation, Screenreader-Ankündigungen und High-Contrast-Themes +- [Einen barrierefreien Spreadsheet einrichten](accessibility.md#configuration-recipes) - Konfigurationen für Tastatur- und Screenreader-Nutzer, einschließlich des schreibgeschützten Modus +- [Konformitätsbericht (VPAT)](accessibility_conformance_report.md) - Konformität mit WCAG 2.2 AA, Section 508 und EN 301 549 + ## Benutzerhandbücher {#user-guides} Die Benutzerhandbücher erleichtern Ihren Nutzern die Arbeit mit Spreadsheet. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/hotkeys.md b/i18n/de/docusaurus-plugin-content-docs/current/hotkeys.md index 69174ee9..c4507f5e 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/hotkeys.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/hotkeys.md @@ -1,13 +1,21 @@ --- sidebar_label: Liste der Tastenkombinationen title: Tastenkombinationen -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie alles uber die Tastenkombinationen. Lesen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Tastenkombinationen von DHTMLX Spreadsheet zum Bearbeiten, Formatieren, für die Navigation, Auswahl, Suche, die Arbeit mit Tabellenblättern, Zeilen und Spalten sowie für Popups und Dialoge. --- # Liste der Tastenkombinationen {#hot-keys-list} Hier finden Sie eine Übersicht der Tastenkombinationen, die Sie bei der Arbeit mit DHTMLX Spreadsheet verwenden können. +:::note +Die Tastenkombinationen für Zellen funktionieren, solange sich der Fokus in den Zellen oder in der Formelleiste befindet. Die Tastenkombinationen für Formatierung, Rückgängig, Suche, Link und das Hinzufügen von Tabellenblättern funktionieren auch, wenn sich der Fokus in der Symbolleiste befindet. Wenn sich der Fokus in der Symbolleiste, in der Menüleiste oder in den Tabellenblatt-Registern befindet, funktionieren die Pfeiltasten sowie **Home**, **End**, **Enter** und **Leertaste** innerhalb dieser Leiste (siehe [Fokus verschieben](#moving-the-focus)). + +Im [schreibgeschützten Modus](api/spreadsheet_readonly_config.md) funktionieren die Tastenkombinationen für Navigation, Auswahl, Kopieren und Suche. Tastenkombinationen, die das Tabellenblatt ändern, darunter **Ctrl (Cmd) + Shift + 9**, **Ctrl (Cmd) + Shift + 0** und **Shift + F11**, werden abgelehnt, und Screenreader melden "The sheet is read-only". Das Kontextmenü ist nicht verfügbar, daher funktionieren **Shift + F10** und die Menütaste nicht. + +Informationen zur Tastaturnavigation mit Screenreadern finden Sie im Handbuch [Barrierefreiheit](accessibility.md#keyboard-navigation). +::: + ## Bearbeitung {#editing} @@ -28,6 +36,10 @@ Hier finden Sie eine Übersicht der Tastenkombinationen, die Sie bei der Arbeit + + + +
Esc schließt den Editor in einer Zelle ohne die Änderungen zu speichern
Alt (Option) + Enteröffnet den Link der aktiven Zelle in einem neuen Tab
@@ -114,43 +126,43 @@ Hier finden Sie eine Übersicht der Tastenkombinationen, die Sie bei der Arbeit Shift + Enter - verschiebt die Auswahl um eine Zelle nach oben (in einer Spalte). Wenn ein Zellbereich ausgewählt ist, wird die Auswahl innerhalb des Bereichs um eine Zelle nach oben verschoben. Deaktiviert, wenn die erste Zelle einer Spalte erreicht wird. + verschiebt die Auswahl um eine Zelle nach oben (in einer Spalte). Wenn ein Zellbereich ausgewählt ist, wird die Auswahl innerhalb des Bereichs um eine Zelle nach oben verschoben. Tab - verschiebt die Auswahl um eine Zelle nach rechts (in einer Zeile). Wenn ein Zellbereich ausgewählt ist, wird die Auswahl innerhalb des Bereichs um eine Zelle nach rechts verschoben. Deaktiviert, wenn die äußerste rechte Zelle einer Zeile erreicht wird. + verschiebt die Auswahl um eine Zelle nach rechts (in einer Zeile). Von der äußersten rechten Zelle aus wird die Auswahl zur ersten Zelle derselben Zeile verschoben. Wenn ein Zellbereich ausgewählt ist, wird die Auswahl innerhalb des Bereichs um eine Zelle nach rechts verschoben. Von der letzten Zelle des Tabellenblatts aus wird der bearbeitete Wert gespeichert und der Fokus aus den Zellen zum nächsten Teil der Seite verschoben, zum Beispiel zu den Tabellenblatt-Registern. Tab + Shift - verschiebt die Auswahl um eine Zelle nach links (in einer Zeile). Wenn ein Zellbereich ausgewählt ist, wird die Auswahl innerhalb des Bereichs um eine Zelle nach links verschoben. Deaktiviert, wenn die äußerste linke Zelle einer Zeile erreicht wird. + verschiebt die Auswahl um eine Zelle nach links (in einer Zeile). Von der äußersten linken Zelle aus wird die Auswahl zur letzten Zelle derselben Zeile verschoben. Wenn ein Zellbereich ausgewählt ist, wird die Auswahl innerhalb des Bereichs um eine Zelle nach links verschoben. Von der ersten Zelle des Tabellenblatts aus wird der bearbeitete Wert gespeichert und der Fokus aus den Zellen zum vorherigen Teil der Seite verschoben, zum Beispiel zur Formelleiste. Pfeiltasten - ermöglichen die Navigation zwischen den Zellen in einem Tabellenblatt + ermöglichen die Navigation zwischen den Zellen in einem Tabellenblatt. Stoppen an der ersten und letzten sichtbaren Zeile und Spalte. Wenn ein Zellbereich ausgewählt ist, reduziert eine Pfeiltaste am Rand des Tabellenblatts den Bereich auf die aktive Zelle Home - verschiebt die Auswahl zur ersten Zelle in der Zeile + verschiebt die Auswahl zur ersten sichtbaren Zelle in der Zeile End - verschiebt die Auswahl zur letzten Zelle in der Zeile + verschiebt die Auswahl zur letzten sichtbaren Zelle in der Zeile Ctrl (Cmd) + Linke Pfeiltaste - verschiebt die Auswahl zur ersten Zelle in einer Zeile + verschiebt die Auswahl zur ersten sichtbaren Zelle in einer Zeile Ctrl (Cmd) + Rechte Pfeiltaste - verschiebt die Auswahl zur letzten Zelle in einer Zeile + verschiebt die Auswahl zur letzten sichtbaren Zelle in einer Zeile Ctrl (Cmd) + Obere Pfeiltaste - verschiebt die Auswahl zur ersten Zelle in einer Spalte + verschiebt die Auswahl zur ersten sichtbaren Zelle in einer Spalte Ctrl (Cmd) + Untere Pfeiltaste - verschiebt die Auswahl zur letzten Zelle in einer Spalte + verschiebt die Auswahl zur letzten sichtbaren Zelle in einer Spalte Ctrl (Cmd) + Home @@ -175,6 +187,59 @@ Hier finden Sie eine Übersicht der Tastenkombinationen, die Sie bei der Arbeit +## Fokus verschieben {#moving-the-focus} + +Die Symbolleiste, die Menüleiste und die Tabellenblatt-Register sind jeweils ein einzelner Tab-Stopp: Tab verschiebt den Fokus in eine Leiste hinein und wieder heraus, und der Fokus landet auf dem zuletzt verwendeten Steuerelement. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ctrl + F6verschiebt den Fokus zum nächsten Teil von Spreadsheet in der Reihenfolge: Menü, Symbolleiste, Tabellenblatt (die aktive Zelle), Tabellenblatt-Register und dann zurück zum Menü. Die Formelleiste und ausgeblendete Teile werden übersprungen. Speichert zuvor den Wert der bearbeiteten Zelle
Ctrl + Shift + F6verschiebt den Fokus zum vorherigen Teil von Spreadsheet
Linke Pfeiltaste/Rechte Pfeiltasteverschiebt den Fokus zum vorherigen/nächsten Steuerelement der Symbolleiste, der Menüleiste oder der Tabellenblatt-Register
Home/Endverschiebt den Fokus zum ersten/letzten Steuerelement der Leiste
Enter/Leertastebetätigt das fokussierte Steuerelement: führt den Befehl aus, öffnet das Dropdown oder wechselt zum Tabellenblatt des fokussierten Registers
Untere Pfeiltasteöffnet das Dropdown des fokussierten Steuerelements und verschiebt den Fokus zu dessen erstem Element
Obere Pfeiltaste/Untere Pfeiltasteverschiebt den Fokus zwischen den Elementen eines geöffneten Dropdowns oder Menüs
Rechte Pfeiltasteöffnet das Untermenü des fokussierten Menüelements
Linke Pfeiltasteschließt das Untermenü. In der ersten Ebene eines Dropdowns schließt sie das Dropdown und gibt den Fokus an dessen Steuerelement zurück
Escschließt das Dropdown oder das Menü und gibt den Fokus an das Steuerelement zurück, das es geöffnet hat. Schließt den Tooltip eines Symbolleisten-Steuerelements. Ohne Esc bleibt der Tooltip geöffnet, solange sich der Mauszeiger darauf befindet
Shift + F10 oder Menütasteöffnet das Kontextmenü der aktiven Zelle oder des fokussierten Tabellenblatt-Registers und verschiebt den Fokus hinein. Nach Ctrl (Cmd) + Space zeigt das Kontextmenü einer Zelle die Befehle für die Spalte. Esc schließt das Kontextmenü und gibt den Fokus an die Zelle zurück
+ ## Suche {#search} @@ -185,11 +250,15 @@ Hier finden Sie eine Übersicht der Tastenkombinationen, die Sie bei der Arbeit - + - + + + + +
Ctrl (Cmd) + Gverschiebt die Auswahl zum nächsten gefundenen Trefferhebt den nächsten gefundenen Treffer hervor
Ctrl (Cmd) + Shift + Gverschiebt die Auswahl zum vorherigen gefundenen Trefferhebt den vorherigen gefundenen Treffer hervor
Escschließt das Suchfeld und gibt den Fokus an die aktive Zelle zurück
@@ -234,8 +303,110 @@ Hier finden Sie eine Übersicht der Tastenkombinationen, die Sie bei der Arbeit fügt ein neues Tabellenblatt in die Tabelle ein - Alt + Pfeiltaste oben/unten - wechselt zum nächsten/vorherigen Tabellenblatt + Alt (Option) + Pfeiltaste oben + wechselt zum nächsten Tabellenblatt. Vom letzten Tabellenblatt aus wird zum ersten gewechselt + + + Alt (Option) + Pfeiltaste unten + wechselt zum vorherigen Tabellenblatt. Vom ersten Tabellenblatt aus wird zum letzten gewechselt + + + Ctrl (Cmd) + Alt (Option) + Page Down + wechselt zum nächsten Tabellenblatt + + + Ctrl (Cmd) + Alt (Option) + Page Up + wechselt zum vorherigen Tabellenblatt + + + + +## Arbeit mit Zeilen und Spalten {#work-with-rows-and-columns} + + + + + + + + + + + + +
Ctrl (Cmd) + Shift + 9blendet die ausgeblendeten Zeilen innerhalb des ausgewählten Bereichs ein
Ctrl (Cmd) + Shift + 0blendet die ausgeblendeten Spalten innerhalb des ausgewählten Bereichs ein
+ +## Symbolleisten-Popups {#toolbar-popups} + +Die folgenden Tasten funktionieren in den Popups der Steuerelemente *Text color*, *Background color* und *Border* der Symbolleiste. Das Popup erhält beim Öffnen den Fokus. + + + + + + + + + + + + + + + + + + + + + + + + +
Pfeiltastenverschieben den Fokus zwischen den Farben der Palette oder zwischen den Steuerelementen des Border-Popups
Home/Endverschiebt den Fokus zur ersten/letzten Farbe der Palette
Enterwendet die fokussierte Farbe oder den fokussierten Rahmen an. Nachdem eine Text- oder Hintergrundfarbe angewendet wurde, kehrt der Fokus zur aktiven Zelle zurück
Esckehrt vom benutzerdefinierten Farbmodus zur Palette zurück. In einem über dem Border-Popup geöffneten Farb- oder Stil-Popup schließt sie dieses und gibt den Fokus an dessen Schaltfläche im Border-Popup zurück. Andernfalls schließt sie das Popup und gibt den Fokus an dessen Symbolleisten-Steuerelement zurück
Tab/Tab + Shiftschließt das Popup und gibt den Fokus an dessen Symbolleisten-Steuerelement zurück. Im Border-Popup und in den darüber geöffneten Popups werden alle geschlossen und der Fokus kehrt zum Border-Steuerelement zurück. Im benutzerdefinierten Farbmodus verschiebt sie den Fokus zwischen den Steuerelementen des Farbwählers
+ +## Listen-Editor {#list-editor} + +Die folgenden Tasten funktionieren im Editor einer Zelle mit einer [Werteliste](api/spreadsheet_setvalidation_method.md). + + + + + + + + + + + + + + + + + + + + +
Obere Pfeiltaste/Untere Pfeiltastenavigiert durch die Werteliste
Enterwählt den Wert aus und schließt den Editor
Escschließt den Editor ohne die Änderungen zu speichern
Tabspeichert den Wert und verschiebt die Auswahl um eine Zelle nach rechts
+ +## Filter und Dialoge {#filter-and-dialogs} + +Die folgenden Tasten funktionieren im Popup eines [Filters](filtering_data.md#opening-a-filter-with-the-keyboard) und in den Dialogen [Spaltenbreite und Zeilenhöhe](work_with_rows_cols.md#setting-column-width-and-row-height). + + + + + + + + + + + + + +
Escschließt das Filter-Popup und gibt den Fokus an die Zelle zurück
Enterwendet die Größe in den Dialogen Column width und Row height an
Escschließt die Dialoge Column width und Row height ohne Änderungen
diff --git a/i18n/de/docusaurus-plugin-content-docs/current/localization.md b/i18n/de/docusaurus-plugin-content-docs/current/localization.md index 980ddb54..ffdc4edb 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/localization.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/localization.md @@ -1,7 +1,7 @@ --- sidebar_label: Lokalisierung title: Lokalisierung -description: Sie können sich in der Dokumentation über die Lokalisierung der DHTMLX JavaScript Spreadsheet-Bibliothek informieren. Durchsuchen Sie Entwicklerleitfäden und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Lokalisieren Sie DHTMLX Spreadsheet. Lernen Sie das Standard-Gebietsschema kennen, erstellen Sie ein benutzerdefiniertes, übersetzen Sie die integrierten Widgets und das Formel-Popup und wenden Sie ein Gebietsschema an. --- # Lokalisierung {#localization} @@ -23,6 +23,8 @@ const en = { textColor: "Text color", backgroundColor: "Background color", + fontSize: "Font size", + bold: "Bold", italic: "Italic", underline: "Underline", @@ -60,6 +62,10 @@ const en = { addRow: "Add row above", removeRow: "Remove row {row}", removeRows: "Remove rows {row}", + columnWidth: "Column width", + rowHeight: "Row height", + widthInPixels: "Width in pixels", + heightInPixels: "Height in pixels", row: "row", col: "col", freeze: "Freeze", @@ -82,8 +88,10 @@ const en = { text: "Text", date: "Date", time: "Time", + scientific: "Scientific", filter: "Filter", + openFilter: "Open filter", help: "Help", @@ -104,6 +112,9 @@ const en = { border_style: "Border style", // Tabbar + // the name of a new sheet is this prefix followed by a number: sheet1, sheet2 + defaultSheetName: "sheet", + addSheet: "Add sheet", deleteSheet: "Delete", renameSheet: "Rename", renameSheetAlert: "A sheet with the name $name already exists. Please enter another name. ", @@ -114,10 +125,14 @@ const en = { export: "Export", downloadAs: "Download as...", importAs: "Import as...", + xlsxFormat: "Microsoft Excel(.xlsx)", data: "Data", validation: "Data validation", search: "Search", + previousMatch: "Previous match", + nextMatch: "Next match", + closeSearch: "Close search", sort: "Sort", ascSort: "Sort A to Z", descSort: "Sort Z to A", @@ -177,17 +192,105 @@ const en = { spanUnmergeLockedError: "You can't unmerge locked cells!", spanOverFilteredRow: "You can't merge cells over a filtered row.", removeAlert: "You can't remove last $name!", + wasmNotSupported: "WebAssembly is not supported by your browser", + invalidValue: "Invalid value", + + // Accessible names, read by screen readers + // accessible name of a color button; {label} is the name of the control, {color} is a name from the colorpicker locale + aria_colorButton: "{label}: {color}", + // accessible names of the toolbars; the screen reader adds the word "toolbar" itself + aria_toolbarFormatting: "Formatting", + aria_toolbarBorders: "Borders", + aria_toolbarSheets: "Sheets", + aria_toolbarSearch: "Search", + aria_toolbarLink: "Link", + // accessible names of the line styles in the border style list + aria_borderStyleThin: "Thin line", + aria_borderStyleMedium: "Medium line", + aria_borderStyleThick: "Thick line", + aria_borderStyleDashed: "Dashed line", + aria_borderStyleDotted: "Dotted line", + aria_borderStyleDouble: "Double line", + // accessible names of the context menus; the screen reader adds the word "menu" itself + aria_cellMenu: "Cell", + aria_sheetMenu: "Sheet", + // accessible name of the menu bar; the screen reader adds the words "menu bar" itself + aria_menuBar: "Main", + // accessible name of the cell grid; the screen reader adds the word "grid" itself + aria_grid: "Spreadsheet", + // accessible name of the select-all corner, the first column header + aria_selectAll: "Select all", + // accessible name of the formula bar; {cell} is the address of the cell it shows, for example "B7" + aria_formulaBar: "Formula bar, {cell}", + // accessible name of the input that edits a cell; {cell} is the address of the cell, for example "B7" + aria_cellEditor: "Cell editor, {cell}", + // accessible name of the close icon of the formula help panel + aria_closeFormulaHelp: "Close formula help", + + // Cell descriptions, read with the content of the active cell + // read with the content of a cell that has a filter icon; the icon itself is hidden from assistive technology + aria_filter: "Filter", + aria_filterApplied: "Filter applied", + // read after the content of a selected cell that holds a link; Alt+Enter opens the link + aria_cellLink: "link", + // read after the content of a selected locked cell; the lock icon itself is hidden from assistive technology + aria_lockedState: "locked", + // read after the value of a cell with a formula error; the formula engine writes the error as #ERROR, #REF! or #SPILL! + aria_errorSyntax: "Syntax error. Check the formula", + aria_errorCalc: "Calculation error. Check the values and functions", + aria_errorRef: "Reference error. Check the cell references", + aria_errorSpill: "Spill error. Clear the cells the result needs", + // read after the value of a cell that breaks its list validation + aria_invalidValue: "Invalid value. Choose a value from the list", + + // Screen reader announcements + // announced when an editing key is pressed in the read-only mode + aria_readonlySheet: "The sheet is read-only", + // announced when Ctrl+Shift+9 or Ctrl+Shift+0 finds nothing to reveal + aria_noHiddenRows: "No hidden rows in the selection", + aria_noHiddenCols: "No hidden columns in the selection", + // announced when a selection of several cells changes; {range} is built from aria_rangeExtent + aria_selectedRange: "{range}, {count} cells", + aria_rangeExtent: "{start} to {end}", + // joins the ranges of a selection made with Ctrl + aria_rangeSeparator: ", ", + // announced after an action; {message} is one of the texts above + aria_cellMessage: "{cell}: {message}", + // announced when an action makes several errors appear; {first} is aria_cellMessage for the first of them + aria_newErrors: "{count} new errors. {first}", + // announced when an action puts several invalid values; {first} is aria_cellMessage for the first of them + aria_invalidValues: "{count} invalid values. {first}", + // announced once when an edit of a locked cell is refused; the second one when a range holds locked cells + aria_lockedCell: "The cell is locked", + aria_lockedCells: "Locked cells were not changed", + // announced when the search text changes; followed by aria_searchMatch for the first match + aria_searchResults: "Results: {count}.", + // announced for the current match; {cell} is its address, for example "B7" + aria_searchMatch: "{index} of {count}, {cell}", + aria_searchNoResults: "No results", + // announced when an export or an import of a file starts and ends + aria_exportStarted: "Exporting the file", + aria_exportDone: "The file is exported", + aria_importStarted: "Importing the file", + aria_importDone: "The file is imported", + // announced when the column width or the row height command is applied; {size} is the applied size + aria_columnWidthSet: "Column width set to {size} pixels", + aria_rowHeightSet: "Row height set to {size} pixels", }; ~~~ +Die Schlüssel, die mit `aria_` beginnen, werden in der Oberfläche nicht angezeigt. Screenreader lesen sie als Namen der Steuerelemente, als Beschreibungen der aktiven Zelle und als Meldungen des Live-Bereichs, den auch die Methode [`announce()`](api/spreadsheet_announce_method.md) verwendet. Die Teile in geschweiften Klammern, wie `{cell}` oder `{count}`, werden beim Vorlesen der Zeichenfolge durch die Werte ersetzt. Behalten Sie sie in den übersetzten Zeichenfolgen bei. Ein Beispiel für übersetzte Barrierefreiheits-Zeichenfolgen finden Sie im Handbuch [Barrierefreiheit](accessibility.md#translated-accessibility-strings). + +Der Schlüssel `defaultSheetName` legt das Präfix der Standardnamen von Tabellenblättern fest. Spreadsheet hängt eine Nummer an, sodass der Standardwert `"sheet"` die Namen "sheet1", "sheet2" usw. ergibt. Mit `"Tabelle"`, dem Präfix, das Microsoft Excel im Deutschen verwendet, heißen die Tabellenblätter beispielsweise "Tabelle1", "Tabelle2" usw. + ## Benutzerdefiniertes Gebietsschema {#custom-locale} Um ein anderes Gebietsschema anzuwenden, müssen Sie: -- Übersetzungen für alle Textbeschriftungen in Spreadsheet bereitstellen, beispielsweise für das russische Gebietsschema: +- Übersetzungen für alle Textbeschriftungen in Spreadsheet bereitstellen, beispielsweise für das deutsche Gebietsschema: ~~~jsx -const ru = { +const de = { // language settings }; ~~~ @@ -195,10 +298,48 @@ const ru = { - das neue Gebietsschema anwenden, indem Sie die Methode `dhx.i18n.setLocale()` vor der Initialisierung von Spreadsheet aufrufen: ~~~jsx -dhx.i18n.setLocale("spreadsheet", ru); +dhx.i18n.setLocale("spreadsheet", de); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); +~~~ + +## Integrierte Widgets lokalisieren {#localizing-built-in-widgets} + +Spreadsheet verwendet intern die Widgets Calendar, Colorpicker, Grid, Timepicker, Toolbar, Window und Message von DHTMLX Suite. Ihre Zeichenfolgen sind in separaten Gebietsschemas gespeichert, die Sie auf dieselbe Weise übersetzen können wie das Gebietsschema `spreadsheet`: + +| Gebietsschema | In Spreadsheet verwendete Zeichenfolgen | +| ------ | --------------------------- | +| `calendar` | die Monats- und Tagesnamen des Datumseditors und des Datumsfilters | +| `colorpicker` | die Beschriftungen des benutzerdefinierten Farbmodus in den Farb-Popups der Symbolleiste, der Name der Palette und die Farbnamen, die Screenreader für die Farbfelder und die Farbschaltflächen vorlesen, zum Beispiel "Text color: dark gray" | +| `grid` | die Ansage der Anzahl geladener Zeilen | +| `timepicker` | die Beschriftungen des Zeiteditors | +| `toolbar` | der standardmäßige zugängliche Name einer Symbolleiste | +| `window` | der standardmäßige zugängliche Name eines Dialogs | +| `message` | die zugänglichen Namen der Alert- und Confirm-Dialoge und ihrer Schaltflächen | + +Rufen Sie `dhx.i18n.setLocale()` mit dem Namen des Gebietsschemas vor der Initialisierung von Spreadsheet auf, da die Symbolleisten, die Menüs und die Kontextmenüs das Gebietsschema beim Erstellen auslesen: + +~~~jsx +const deColorpicker = { + cancel: "Abbrechen", + select: "Auswählen", + aria_palette: "Farbpalette", + aria_colorRed: "rot", + // other strings +}; + +const deMessage = { + aria_confirm: "Bestätigen" +}; + +dhx.i18n.setLocale("spreadsheet", de); +dhx.i18n.setLocale("colorpicker", deColorpicker); +dhx.i18n.setLocale("message", deMessage); + const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); ~~~ +Die Gebietsschema-Schlüssel sind flach: Übergeben Sie jeden Schlüssel auf der obersten Ebene des Objekts. Weitere Informationen finden Sie im Artikel [Localization of screen-reader strings](https://docs.dhtmlx.com/suite/common_features/accessibility_support/#localization-of-screen-reader-strings) in der Dokumentation von DHTMLX Suite. + ## Standard-Gebietsschema für Formeln {#default-locale-for-formulas} Das Objekt `dhx.i18n.formulas` enthält das i18n-Gebietsschema für das Spreadsheet-Formel-Popup. Das Standard-Gebietsschema für Formeln sieht wie folgt aus: diff --git a/i18n/de/docusaurus-plugin-content-docs/current/merge_cells.md b/i18n/de/docusaurus-plugin-content-docs/current/merge_cells.md index d251c8a0..b0853abd 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/merge_cells.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/merge_cells.md @@ -1,7 +1,7 @@ --- sidebar_label: Zellen zusammenführen title: Zellen zusammenführen -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie, wie Sie Zellen zusammenführen. Lesen Sie Entwicklerhandbücher und API-Referenzen, testen Sie Code-Beispiele und Live-Demos, und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Führen Sie Zellen in DHTMLX Spreadsheet über die Symbolleiste oder das Menü „Format" zusammen und teilen Sie sie wieder auf. Erfahren Sie außerdem, wie sich das Entfernen von Zeilen und Spalten auf zusammengeführte Zellen auswirkt. --- # Zellen zusammenführen {#merging-cells} @@ -45,3 +45,13 @@ oder 2\. Navigieren Sie zu: *Format -> Unmerge* im Menü ![DHTMLX Spreadsheet-Menü „Format" mit der Option „Unmerge" zum Aufteilen zusammengeführter Zellen](/img/unmerge_cells_via_menu.png) + +## Zeilen und Spalten zusammengeführter Zellen entfernen {#removing-rows-and-columns-of-merged-cells} + +Wenn Sie eine Zeile oder eine Spalte über eine zusammengeführte Zelle entfernen, werden alle Zeilen oder Spalten entfernt, die sich über die zusammengeführte Zelle erstrecken. Das gilt, wenn eine Zelle oder ein Zellbereich ausgewählt ist und die Zeile oder Spalte über die Symbolleiste, das Menü, das Kontextmenü oder die Methoden [`deleteRow()`](api/spreadsheet_deleterow_method.md) / [`deleteColumn()`](api/spreadsheet_deletecolumn_method.md) entfernt wird. Das Kontextmenü zeigt den gesamten Bereich im Namen des Befehls an, zum Beispiel *Remove rows 2-4*. + +![DHTMLX Spreadsheet context menu with the Rows submenu showing Remove rows 2-4 for a merged cell](/img/remove_merged_rows_context_menu.png) + +Wenn ganze Zeilen oder Spalten ausgewählt sind, zum Beispiel durch Klicken auf ihre Kopfzellen oder mit `Shift + Space` bzw. `Ctrl (Cmd) + Space`, werden nur die ausgewählten Zeilen oder Spalten entfernt. Eine zusammengeführte Zelle, die sich über sie erstreckt, wird kleiner, und eine zusammengeführte Zelle, von der nur eine einzelne Zelle übrig bleibt, wird zu einer gewöhnlichen Zelle. + +Zusammengeführte Zellen, die unterhalb oder rechts von den entfernten Zeilen oder Spalten liegen, werden mit ihnen verschoben. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/react/overview.md b/i18n/de/docusaurus-plugin-content-docs/current/react/overview.md index 48298d43..b70eae28 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/react/overview.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/react/overview.md @@ -96,8 +96,8 @@ Props werden danach kategorisiert, wie die Komponente mit Änderungen umgeht: | Kategorie | Props | Was passiert bei Änderung | |----------|-------|----------------------| -| **Init-Only** | `menu`, `editLine`, `toolbarBlocks`, `multiSheets`, `formats`, `localization`, `importModulePath`, `exportModulePath`, `spreadsheetLocale` | Das Widget wird zerstört und neu erstellt. Tabellendaten bleiben erhalten, aber Rückgängig/Wiederherstellen-Verlauf und UI-Zustand (Auswahl, Scrollposition) werden zurückgesetzt. | -| **Laufzeit** | `readonly`, `rowsCount`, `colsCount` | Wird sofort ohne Datenverlust oder UI-Zustandsreset angewendet. | +| **Init-Only** | `menu`, `editLine`, `toolbarBlocks`, `multiSheets`, `formats`, `localization`, `importModulePath`, `exportModulePath`, `spreadsheetLocale`, `readonly` | Das Widget wird zerstört und neu erstellt. Tabellendaten bleiben erhalten, aber Rückgängig/Wiederherstellen-Verlauf und UI-Zustand (Auswahl, Scrollposition) werden zurückgesetzt. | +| **Laufzeit** | `selection`, `rowsCount`, `colsCount` | Wird sofort ohne Datenverlust oder UI-Zustandsreset angewendet. | | **Daten** | `sheets`, `activeSheet` | Wird inkrementell angewendet; nur geänderte Zellen, Bereiche oder Einstellungen werden aktualisiert. | | **Neu-Parsen** | `styles` | Stiländerungen erfordern einen vollständigen Datenneulade. Tabellendaten bleiben erhalten, aber Rückgängig/Wiederherstellen-Verlauf und UI-Zustand werden zurückgesetzt. | | **Zustand** | `search`, `theme`, `loadUrl` | Wird über dedizierte Widget-APIs ohne Nebeneffekte angewendet. | @@ -198,6 +198,10 @@ function App() { Die `instance`-Eigenschaft ist `null`, bevor das Widget initialisiert wird und nach dem Unmount. +:::info +Handler, die mit `ref.current.instance.events.on()` hinzugefügt wurden, werden entfernt, wenn das Widget nach der Änderung eines Init-Only-Props neu erstellt wird und wenn die Komponente unmountet wird. Verwenden Sie die [Event-Callback-Props](react/events.md), die die Komponente an jede neue Widget-Instanz anhängt. +::: + ## API-Referenz {#api-reference} | Dokument | Inhalt | diff --git a/i18n/de/docusaurus-plugin-content-docs/current/react/props.md b/i18n/de/docusaurus-plugin-content-docs/current/react/props.md index 52044c97..0d118127 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/react/props.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/react/props.md @@ -25,6 +25,7 @@ Das Ändern einer dieser Props führt dazu, dass das Widget zerstört und neu er | `importModulePath` | `string` | Pfad zum XLSX-Importmodul. Siehe JS-API: [`importModulePath`](api/spreadsheet_importmodulepath_config.md). | | `exportModulePath` | `string` | Pfad zum XLSX-Exportmodul. Siehe JS-API: [`exportModulePath`](api/spreadsheet_exportmodulepath_config.md). | | `spreadsheetLocale` | [`SpreadsheetLocale`](react/types.md#spreadsheetlocale) | UI-Übersetzungen und lokalisierte Formelnamen. Unabhängig von `localization`. | +| `readonly` | `boolean` | Schreibschutz-Modus aktivieren. Benutzer können die Zellen navigieren, auswählen, kopieren und durchsuchen, Bearbeitungen werden abgelehnt. Siehe JS-API: [`readonly`](api/spreadsheet_readonly_config.md). | @@ -40,7 +41,7 @@ Diese Props werden sofort angewendet, ohne das Widget zu zerstören. Kein Datenv |------|------|-------------| | `rowsCount` | `number` | Anzahl der Zeilen im Raster. Siehe JS-API: [`rowsCount`](api/spreadsheet_rowscount_config.md). | | `colsCount` | `number` | Anzahl der Spalten im Raster. Siehe JS-API: [`colsCount`](api/spreadsheet_colscount_config.md). | -| `readonly` | `boolean` | Schreibschutz-Modus aktivieren. Siehe JS-API: [`readonly`](api/spreadsheet_readonly_config.md). | +| `selection` | `boolean` | Auswahl von Zellen ein- und ausschalten. Standard: `true`. Bei `false` hat das Spreadsheet keine aktive Zelle, und die Zellen können nicht über die UI ausgewählt oder bearbeitet werden. Siehe JS-API: [`selection`](api/spreadsheet_selection_config.md). | ## Daten-Props {#data-props} @@ -225,10 +226,18 @@ const [theme, setTheme] = useState("light"); ### Schreibschutz-Modus {#read-only-mode} +Im Schreibschutz-Modus können Benutzer die Zellen mit der Tastatur navigieren, mit der Maus auswählen, kopieren und durchsuchen. Bearbeitungen werden abgelehnt und für Screenreader angekündigt. Da `readonly` ein Init-Only-Prop ist, wird das Widget bei einer Änderung neu erstellt. Die Daten bleiben erhalten, während der Rückgängig/Wiederherstellen-Verlauf und der UI-Zustand (Auswahl, Scrollposition) zurückgesetzt werden. + ~~~tsx ~~~ +Um auch die Tastaturnavigation und die Auswahl zu deaktivieren, fügen Sie `selection={false}` hinzu. Das Prop `selection` wird zur Laufzeit angewendet und kann daher ohne Neuerstellung des Widgets umgeschaltet werden: + +~~~tsx + +~~~ + ### Daten von URL laden {#loading-data-from-url} ~~~tsx diff --git a/i18n/de/docusaurus-plugin-content-docs/current/react/themes.md b/i18n/de/docusaurus-plugin-content-docs/current/react/themes.md index 01851069..042a8d41 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/react/themes.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/react/themes.md @@ -77,6 +77,9 @@ Definieren Sie einen benutzerdefinierten `data-dhx-theme`-Selektor, uberschreibe /* Spreadsheet-Bereichsfarben */ --dhx-spreadsheet-range-background-1: #bee3f8; --dhx-spreadsheet-range-color-1: #2b6cb0; + + /* keyboard focus outline of the formula bar and the toolbar controls */ + --dhx-spreadsheet-focus-color: #2b6cb0; } ~~~ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/react/types.md b/i18n/de/docusaurus-plugin-content-docs/current/react/types.md index bbb3c436..bed59b43 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/react/types.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/react/types.md @@ -188,6 +188,13 @@ ref.current?.instance?.selection.setSelectedCell("A1:C5"); // Ruckgangig/Wiederholen ref.current?.instance?.undo(); ref.current?.instance?.redo(); + +// Turn the selection off and on +ref.current?.instance?.selection.disable(); +ref.current?.instance?.selection.enable(); + +// Send a status message to screen readers +ref.current?.instance?.announce("The report is saved"); ~~~ ## Actions-Enum {#actions-enum} @@ -270,6 +277,7 @@ Diese Typen werden der Einfachheit halber aus `@dhx/ts-spreadsheet` erneut expor | `IStylesList` | Stildefinitions-Map. | | `IDataWithStyles` | Datenstruktur mit eingebetteten Stilen (verwendet von `serialize()`/`parse()`). | | `ICellInfo` | Zellinformationen, die von Widget-Methoden zuruckgegeben werden. | +| `ISelection` | Selection-Modul-Interface (`instance.selection`), einschließlich der Methoden [`enable()`](api/selection_enable_method.md), [`disable()`](api/selection_disable_method.md) und [`isDisabled()`](api/selection_isdisabled_method.md). | | `FileFormat` | Dateiformat fur das Laden von Daten (z. B. `"json"` oder `"xlsx"`). | | `ToolbarBlocks` | Bezeichner fur Toolbar-Blocke (z. B. `"default"`, `"undo"` oder `"font"`). | | `FilterConditions` | Enum der verfugbaren Filterbedingungstypen. | diff --git a/i18n/de/docusaurus-plugin-content-docs/current/themes/themes.md b/i18n/de/docusaurus-plugin-content-docs/current/themes/themes.md index a48861c9..488fb06a 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/themes/themes.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/themes/themes.md @@ -1,7 +1,7 @@ --- sidebar_label: Built-in themes title: Integrierte Themes -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr uber die integrierten Themes. Durchsuchen Sie Entwickleranleitungen und die API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Integrierte Themes von DHTMLX Spreadsheet, hell und dunkel mit ihren Hochkontrast-Varianten. Lernen Sie die Spreadsheet-spezifischen CSS-Variablen kennen und erfahren Sie, wie Sie ein Theme setzen. --- # Integrierte Themes {#built-in-themes} @@ -13,7 +13,7 @@ Die DHTMLX Spreadsheet-Bibliothek bietet 4 vordefinierte Themes: - [Helles Hochkontrast-Theme](#light-high-contrast-theme) ("contrast-light") - [Dunkles Hochkontrast-Theme](#dark-high-contrast-theme) ("contrast-dark") -Die Spreadsheet-Themes wurden in Ubereinstimmung mit internationalen Standards entwickelt. Die Hochkontrast-Themes helfen Benutzern mit Sehbehinderungen. Weitere Details finden Sie im Artikel [Barrierefreiheitsunterstutzung](https://docs.dhtmlx.com/suite/common_features/accessibility_support/). +Die Spreadsheet-Themes wurden in Ubereinstimmung mit internationalen Standards entwickelt. Die Hochkontrast-Themes helfen Benutzern mit Sehbehinderungen. Informationen zum Kontrast der Themes und zum Indikator für den Tastaturfokus in Spreadsheet finden Sie im Abschnitt [High contrast and focus](accessibility.md#high-contrast-and-focus) des Leitfadens zur Barrierefreiheit. Informationen zur Barrierefreiheit der DHTMLX Suite-Widgets finden Sie im Artikel [Barrierefreiheitsunterstutzung](https://docs.dhtmlx.com/suite/common_features/accessibility_support/). Sie konnen alle Themes im folgenden Beispiel ausprobieren: @@ -377,14 +377,15 @@ Die Liste der fur die Spreadsheet-Komponente spezifischen Variablen umfasst folg --dhx-spreadsheet-range-background-8: #ecb6ff; --dhx-spreadsheet-range-color-1: #00815a; - --dhx-spreadsheet-range-color-2: #bfc000; - --dhx-spreadsheet-range-color-3: #c55933; - --dhx-spreadsheet-range-color-4: #0cc1d6; - --dhx-spreadsheet-range-color-5: #0080a3; - --dhx-spreadsheet-range-color-6: #529a0a; + --dhx-spreadsheet-range-color-2: #8b7300; + --dhx-spreadsheet-range-color-3: #a34729; + --dhx-spreadsheet-range-color-4: #007a8c; + --dhx-spreadsheet-range-color-5: #135db1; + --dhx-spreadsheet-range-color-6: #2f6500; --dhx-spreadsheet-range-color-7: #6d767b; - --dhx-spreadsheet-range-color-8: #ba38e7; + --dhx-spreadsheet-range-color-8: #b82fe5; + --dhx-spreadsheet-focus-color: var(--dhx-color-primary); } ~~~ @@ -411,6 +412,17 @@ Die Liste der fur die Spreadsheet-Komponente spezifischen Variablen umfasst folg --dhx-spreadsheet-range-color-7: #e4e4e4; --dhx-spreadsheet-range-color-8: #ecb6ff; + --dhx-spreadsheet-focus-color: hsl(var(--dhx-h-primary), var(--dhx-s-primary), calc(var(--dhx-l-primary) + 12% - var(--dhx-l-contrast-offset))); +} +~~~ + +Die Variablen `--dhx-spreadsheet-range-color-*` und `--dhx-spreadsheet-range-background-*` legen die Farben fest, mit denen die Zellbezüge einer Formel während der Bearbeitung markiert werden. In den hellen Themes haben die Farben `--dhx-spreadsheet-range-color-*` einen Kontrast von mindestens 4,5:1 gegenüber dem Hintergrund der Formelleiste. + +Die Variable `--dhx-spreadsheet-focus-color` legt die Farbe des Tastaturfokus-Rahmens der Formelleiste sowie der Steuerelemente der Symbolleiste, der Menüleiste, der Tabellenblatt-Registerkarten, des Border-Popups, des Link-Popups und der Suchleiste fest. In den dunklen Themes ist die Farbe heller als die Primärfarbe, sodass der Rahmen einen Kontrast von mindestens 3:1 behält. Sie können die Variable in einem [benutzerdefinierten Theme](themes/custom_theme.md) neu definieren: + +~~~css +[data-dhx-theme='custom-theme-dark'] { + --dhx-spreadsheet-focus-color: #7fc8ff; } ~~~ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/vuejs_integration.md b/i18n/de/docusaurus-plugin-content-docs/current/vuejs_integration.md index b477fc26..82c0aabf 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/vuejs_integration.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/vuejs_integration.md @@ -1,7 +1,7 @@ --- sidebar_label: Integration mit Vue title: Vue-Integration -description: In der Dokumentation erfahren Sie mehr über die Vue-Integration der DHTMLX JavaScript Spreadsheet-Bibliothek. Lesen Sie Entwickleranleitungen und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus, und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: DHTMLX Spreadsheet in einer Vue-Anwendung verwenden. Erstellen Sie ein Projekt, fügen Sie Spreadsheet als Vue-Komponente hinzu, laden Sie Daten und verarbeiten Sie Events. --- # Integration mit Vue {#integration-with-vue} @@ -260,6 +260,10 @@ export default { //... ~~~ +:::info +Die Methode `destructor()` entfernt die mit `spreadsheet.events.on()` hinzugefügten Event-Handler. Wenn eine neue Spreadsheet-Instanz erstellt wird, zum Beispiel wenn die Komponente erneut erstellt wird, fügen Sie die Handler der neuen Instanz hinzu. +::: + Danach können Sie die App starten, um Spreadsheet mit Daten auf einer Seite geladen zu sehen. ![DHTMLX Spreadsheet mit Beispieldaten in einer Vue 3-Anwendung initialisiert](/img/integrations/trial_spreadsheet.png) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md index 543c1739..6ad0a3c2 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md @@ -8,6 +8,58 @@ description: Sie erfahren in der Dokumentation, was neu in der DHTMLX JavaScript Wenn Sie Spreadsheet von einer älteren Version aktualisieren, lesen Sie die [Migration auf eine neuere Version](migration.md) für Details. +## Version 6.0.4 {#version-604} + +Veröffentlicht am Oktober , 2026 + +### Neue Funktionen {#new-functionality-604} + +- Unterstützung der Barrierefreiheit nach WCAG 2.2 AA, Section 508 und EN 301 549: Tastaturbedienung aller Teile von Spreadsheet, Screenreader-Unterstützung und ein sichtbarer Fokus in jedem Theme. Weitere Informationen finden Sie im Leitfaden [Accessibility](accessibility.md) und im [Accessibility Conformance Report](accessibility_conformance_report.md) +- Die Möglichkeit, die Auswahl von Zellen aus- und einzuschalten: + - neue Konfigurationseigenschaft: [`selection`](api/spreadsheet_selection_config.md) + - neue Methoden des Selection-Moduls: [`enable()`](api/selection_enable_method.md), [`disable()`](api/selection_disable_method.md), [`isDisabled()`](api/selection_isdisabled_method.md) +- Die Methode [`announce()`](api/spreadsheet_announce_method.md) sendet eine Statusmeldung an Screenreader +- Neue Befehle des [Kontextmenüs](customization.md#context-menu): [*Column width*, *Row height*](work_with_rows_cols.md#setting-column-width-and-row-height) und [*Open filter*](filtering_data.md#opening-a-filter-with-the-keyboard) + +### Aktualisierungen {#updates-604} + +- Tastaturnavigation (siehe die [Liste der Hotkeys](hotkeys.md)): + - der Fokus bleibt auf der aktiven Zelle, `Tab` und `Shift + Tab` verlassen die Zellen von der letzten bzw. der ersten Zelle des Tabellenblatts aus, und `Ctrl + F6` verschiebt den Fokus zwischen Menü, Symbolleiste, Tabellenblatt und Tabellenblatt-Registerkarten + - die Symbolleiste, die Menüleiste und die Tabellenblatt-Registerkarten sind jeweils ein einzelner Tab-Stopp und werden mit den Pfeiltasten navigiert + - neue Tastenkombinationen wurden hinzugefügt, zum Beispiel `Shift + F10` für das Kontextmenü und `Ctrl (Cmd) + Shift + 9` / `Ctrl (Cmd) + Shift + 0` zum Einblenden ausgeblendeter Zeilen und Spalten + - die Farb- und Rahmen-Popups der Symbolleiste übernehmen beim Öffnen den Fokus und werden mit `Esc` und `Tab` geschlossen +- Die Pfeiltasten stoppen an der ersten und letzten sichtbaren Zeile und Spalte, anstatt zum gegenüberliegenden Rand zu springen, und eine Pfeiltaste am Rand reduziert einen ausgewählten Bereich auf die aktive Zelle +- Mit einem Input Method Editor (IME) eingegebener Text wird in der aktiven Zelle angezeigt und startet die Bearbeitung über die Methode [`startEdit()`](api/spreadsheet_startedit_method.md), sodass die Events `beforeEditStart` und `afterEditStart` dafür ausgelöst werden +- Die Methode [`setFocusedCell()`](api/selection_setfocusedcell_method.md) verschiebt den Tastaturfokus auf die Zelle +- Ein [Link in einer Zelle](work_with_cells.md#inserting-a-hyperlink-into-a-cell) wird als echter Link dargestellt, der in einem neuen Tab geöffnet wird, und `Alt (Option) + Enter` öffnet den Link der aktiven Zelle +- Der [Nur-Lese-Modus](api/spreadsheet_readonly_config.md) behält die Tastaturnavigation, die Auswahl, das Kopieren und die Suche bei, und Screenreader kündigen abgelehnte Bearbeitungen an. Um die Auswahl auszuschalten, verwenden Sie die Option `selection: false` +- [Das Entfernen einer Zeile oder Spalte über eine zusammengeführte Zelle](merge_cells.md#removing-rows-and-columns-of-merged-cells) entfernt alle Zeilen bzw. Spalten der zusammengeführten Zelle +- Neue Oberflächen- und Screenreader-Texte im [Gebietsschema `spreadsheet`](localization.md#default-locale) sowie [Übersetzung der integrierten Widgets](localization.md#localizing-built-in-widgets) +- Die Variable [`--dhx-spreadsheet-focus-color`](/themes/#spreadsheet-specific-styles) für den Tastaturfokus sowie die Referenzfarben von Formeln mit höherem Kontrast in den hellen Themes +- React Spreadsheet: die Prop [`selection`](react/props.md#runtime-props), der Typ [`ISelection`](react/types.md#re-exported-upstream-types) und [`readonly`](react/props.md#init-only-props) als Init-only-Prop + +### Fehlerbehebungen {#fixes-604} + +- Eine zusammengeführte Zelle wurde verworfen, anstatt verschoben zu werden, wenn eine Zeile oder Spalte vor ihr gelöscht wurde. Jetzt wird eine zusammengeführte Zelle, von der nur eine einzelne Zelle übrig bleibt, zu einer gewöhnlichen Zelle und behält ihren Wert +- Das Löschen einer Zeile oder Spalte über eine zusammengeführte Zelle entfernte nur eine Zeile bzw. Spalte der Zusammenführung +- Die Beschriftungen des Kontextmenüs zum Entfernen von Zeilen und Spalten zeigten nicht alle Zeilen oder Spalten einer zusammengeführten Zelle an, die entfernt würden +- Zeilen wurden nicht gelöscht, wenn sie den gesamten gefilterten Bereich abdeckten +- Der fixierte Bereich wurde nicht kleiner, wenn fixierte Zeilen oder Spalten gelöscht wurden +- Autofill löste einen Fehler aus, wenn die gezogenen Zellen keine einfache Zahl enthielten +- Die Seite fror bei den Tasten `Home`, `End`, `Ctrl (Cmd) + Home`, `Ctrl (Cmd) + End` und `Ctrl (Cmd) + Pfeiltaste` ein, wenn die erste oder letzte Zeile oder Spalte ausgeblendet war +- Die Schriftgröße ging verloren, wenn Zellen nach Excel kopiert oder aus Excel bzw. innerhalb von Spreadsheet eingefügt wurden +- Der Tooltip für ungültige Werte erschien abseits der ungültigen Zelle oder wurde nicht angezeigt +- `Esc` und `Tab` funktionierten im Listen-Editor nicht mehr, nachdem die Pfeiltasten verwendet wurden +- Die Suche hob zuerst den zweiten Treffer hervor und aktualisierte die Ergebnisse nach einer Bearbeitung oder einem Wechsel des Tabellenblatts nicht +- Beim Import oder Export in einem Browser ohne WebAssembly trat ein Skriptfehler auf +- Nach `destructor()` blieben Dokument-Listener und innere Widgets zurück +- Der Tastaturfokus ging verloren, nachdem die Suchleiste geschlossen wurde +- Ein geschlossenes Kontextmenü wurde erneut geöffnet +- Die aktive Zelle wurde bei der Tastaturnavigation eine Zelle zu kurz an den Rand des Viewports gescrollt +- React Spreadsheet: die Event-Callbacks und `onStateChange` wurden nicht ausgelöst, nachdem Spreadsheet durch eine Änderung einer Init-only-Prop neu erstellt wurde +- React Spreadsheet: die Event-Handler des Wrappers wurden beim Unmount nicht entfernt +- React Spreadsheet: die Daten aus `loadUrl` wurden beim Mount zweimal geladen und nach dem Neuerstellen von Spreadsheet erneut über die beibehaltenen Daten + ## Version 6.0.3 {#version-603} Veröffentlicht am 24. August 2026 diff --git a/i18n/de/docusaurus-plugin-content-docs/current/work_with_cells.md b/i18n/de/docusaurus-plugin-content-docs/current/work_with_cells.md index 635d959d..443817d7 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/work_with_cells.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/work_with_cells.md @@ -1,7 +1,7 @@ --- sidebar_label: Zellen bearbeiten title: Zellen bearbeiten -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie alles über die Arbeit mit Zellen. Lesen Sie Entwicklerhandbücher und die API-Referenz, testen Sie Codebeispiele und Live-Demos, und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Bearbeiten Sie Zellen in DHTMLX Spreadsheet. Geben Sie Inhalte ein, fügen Sie Hyperlinks ein, verwenden Sie Dropdown-Listen, füllen Sie mehrere Zellen aus, kopieren Sie Zellen von und nach Excel und sperren Sie Zellen. --- # Zellen bearbeiten {#editing-cells} @@ -145,14 +145,27 @@ Sie können Zellen automatisch mit Daten füllen. So funktioniert es: - Um die Reihe 1, 3, 5, 7, 9, ... zu erstellen, geben Sie 1 und 3 in die ersten beiden Zellen ein. - Um die Reihe 2, 4, 6, 8, 10, ... zu erstellen, geben Sie 2 und 4 in die ersten beiden Zellen ein. - Neben Zahlen können Sie auch Buchstaben in einem Muster verwenden, zum Beispiel: Um eine Reihe wie 1, a, 2, b, 3, a, 4, b, ... zu erstellen, geben Sie 1, a, 2, b in die ersten vier Zellen ein. + - Um eine Zahl am Ende eines Textes fortzusetzen, geben Sie die ersten Werte ein, zum Beispiel: Um eine Reihe item1, item2, item3, ... zu erstellen, geben Sie item1 und item2 in die ersten beiden Zellen ein. + - Um eine Reihe von Datumsangaben zu erstellen, geben Sie ein Datum in die erste Zelle ein: Jede weitere Zelle erhält den nächsten Tag. +- Wiederholen des Texts + +Beispiel: Um die Reihe North, South, North, South, ... zu erstellen, geben Sie North und South in die ersten beiden Zellen ein. Zahlen in Zellen mit dem Format *Text* werden auf dieselbe Weise wiederholt. 3\. Ziehen Sie den **Ausfüllpunkt** ![DHTMLX Spreadsheet-Autofill: Ausfüllpunkt ziehen, um Zelldaten zu replizieren](/img/autofill.gif) +## Zellen von und nach Excel kopieren {#copying-cells-to-and-from-excel} + +Sie können Zellen mit **Ctrl (Cmd) + C** kopieren und mit **Ctrl (Cmd) + V** einfügen, und zwar innerhalb von Spreadsheet sowie zwischen Spreadsheet und Microsoft Excel: + +- innerhalb von Spreadsheet behalten die Zellen ihre Werte, Formeln, Stile, Zahlenformate und Links. Die Zellbezüge in den Formeln werden an die neue Position verschoben +- in Excel erhalten die eingefügten Zellen die Werte (die Ergebnisse der Formeln, nicht die Formeln), die Stile (einschließlich der Schriftgröße), zusammengeführte Zellen und Links. Zeilen, die durch einen Filter ausgeblendet sind, werden übersprungen +- aus Excel kopierte Zellen behalten beim Einfügen in Spreadsheet ihre Werte, Stile (einschließlich der Schriftgröße), Zahlenformate, zusammengeführte Zellen und Links + ## Zellen sperren {#locking-cells} -Sie können Zellen sperren, um ihre Werte vor Änderungen zu schützen. Wenn Sie eine Zelle sperren, wird in der oberen rechten Ecke ein graues "Schlüssel"-Symbol angezeigt. Gesperrte Zellen reagieren nicht auf Bearbeitungsversuche. +Sie können Zellen sperren, um ihre Werte vor Änderungen zu schützen. Wenn Sie eine Zelle sperren, wird in der oberen rechten Ecke ein graues "Schlüssel"-Symbol angezeigt. Gesperrte Zellen reagieren nicht auf Bearbeitungsversuche. Screenreader kündigen die abgelehnte Bearbeitung an: „Die Zelle ist gesperrt" ("The cell is locked") bei einer einzelnen Zelle oder „Gesperrte Zellen wurden nicht geändert" ("Locked cells were not changed"), wenn der ausgewählte Bereich gesperrte Zellen enthält. ![DHTMLX Spreadsheet: gesperrte Zellen, markiert mit einem grauen Schlüssel-Symbol in der oberen rechten Ecke](/img/lockedcells.png) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/work_with_rows_cols.md b/i18n/de/docusaurus-plugin-content-docs/current/work_with_rows_cols.md index ff40c61f..97ce073d 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/work_with_rows_cols.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/work_with_rows_cols.md @@ -1,7 +1,7 @@ --- sidebar_label: Arbeiten mit Zeilen und Spalten title: Arbeiten mit Zeilen und Spalten -description: Sie erfahren, wie Sie in der DHTMLX JavaScript Spreadsheet-Bibliothek mit Zeilen und Spalten arbeiten. Entdecken Sie Entwicklerhandbücher und API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus, und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Arbeiten Sie in DHTMLX Spreadsheet mit Zeilen und Spalten. Fügen Sie sie hinzu und entfernen Sie sie, passen Sie die Spaltenbreite automatisch an, legen Sie Spaltenbreite und Zeilenhöhe fest, fixieren Sie sie und blenden Sie sie aus und ein. --- # Arbeiten mit Zeilen und Spalten {#work-with-rows-and-columns} @@ -54,6 +54,10 @@ Um eine Zeile zu entfernen, führen Sie die folgenden Schritte aus: Um mehrere Zeilen auf einmal zu entfernen: Wahlen Sie die Zeilen aus, klicken Sie mit der rechten Maustaste, um das Kontextmenü aufzurufen, und wählen Sie *Rows -> Remove rows [ids]*. ::: +:::info +Wenn die ausgewählte Zelle innerhalb einer zusammengeführten Zelle liegt, werden alle Zeilen der zusammengeführten Zelle entfernt. Details finden Sie im Artikel [Zellen zusammenführen](merge_cells.md#removing-rows-and-columns-of-merged-cells). +::: + ### Spalten hinzufügen {#adding-columns} Um eine neue Spalte hinzuzufügen, führen Sie die folgenden Schritte aus: @@ -98,6 +102,10 @@ Um eine Spalte zu entfernen, führen Sie die folgenden Schritte aus: Um mehrere Spalten auf einmal zu entfernen: Wahlen Sie die Spalten aus, klicken Sie mit der rechten Maustaste, um das Kontextmenü aufzurufen, und wählen Sie *Columns -> Remove columns [ids]*. ::: +:::info +Wenn die ausgewählte Zelle innerhalb einer zusammengeführten Zelle liegt, werden alle Spalten der zusammengeführten Zelle entfernt. Details finden Sie im Artikel [Zellen zusammenführen](merge_cells.md#removing-rows-and-columns-of-merged-cells). +::: + ## Spaltenbreite automatisch anpassen {#autofit-column-width} Um die Spaltenbreite so zu ändern, dass sie automatisch dem längsten Inhalt der Spalte entspricht, können Sie: @@ -116,6 +124,50 @@ Um die Spaltenbreite so zu ändern, dass sie automatisch dem längsten Inhalt de ![DHTMLX Spreadsheet Columns submenu with the Fit to data option for autofit column width](/img/column_autofit.png) +## Spaltenbreite und Zeilenhöhe festlegen {#setting-column-width-and-row-height} + +### Spaltenbreite festlegen {#setting-column-width} + +Um eine genaue Breite für Spalten festzulegen, führen Sie die folgenden Schritte aus: + +1\. Wählen Sie eine Spalte oder eine Zelle in der Spalte aus. Um mehrere Spalten zu ändern, wählen Sie einen Zellbereich aus, der sie umfasst. + +2\. Klicken Sie mit der rechten Maustaste auf die Auswahl oder drücken Sie `Shift + F10` bzw. die Menütaste und wählen Sie *Columns -> Column width*. Derselbe Befehl ist im Menü des 3-Punkte-Symbols der Spalte verfügbar. + +![DHTMLX Spreadsheet context menu with the Columns submenu showing Column width](/img/column_width_context_menu.png) + +3\. Geben Sie im Dialog *Column width* die Breite in Pixeln ein und klicken Sie auf **Apply** oder drücken Sie `Enter`. + +![DHTMLX Spreadsheet Column width dialog with the width in pixels and the Cancel and Apply buttons](/img/column_width_dialog.png) + +### Zeilenhöhe festlegen {#setting-row-height} + +Um eine genaue Höhe für Zeilen festzulegen, führen Sie die folgenden Schritte aus: + +1\. Wählen Sie eine Zeile oder eine Zelle in der Zeile aus. Um mehrere Zeilen zu ändern, wählen Sie einen Zellbereich aus, der sie umfasst. + +2\. Klicken Sie mit der rechten Maustaste auf die Auswahl oder drücken Sie `Shift + F10` bzw. die Menütaste und wählen Sie *Rows -> Row height*. + +![DHTMLX Spreadsheet context menu with the Rows submenu showing Row height](/img/row_height_context_menu.png) + +3\. Geben Sie im Dialog *Row height* die Höhe in Pixeln ein und klicken Sie auf **Apply** oder drücken Sie `Enter`. + +![DHTMLX Spreadsheet Row height dialog with the height in pixels and the Cancel and Apply buttons](/img/row_height_dialog.png) + +### Anwendung der neuen Größe {#how-the-new-size-is-applied} + +Der Dialog zeigt die aktuelle Größe der ersten Spalte bzw. Zeile des ausgewählten Bereichs an und wendet die neue Größe auf jede Spalte bzw. Zeile dieses Bereichs an. Wenn mehrere Bereiche ausgewählt sind, wird der zuletzt ausgewählte Bereich verwendet. + +Die Größe wird auf ganze Pixel gerundet. Die Mindestbreite einer Spalte beträgt 20 px und die Mindesthöhe einer Zeile 10 px: Ein kleinerer positiver Wert wird durch das Minimum ersetzt. Solange das Feld leer ist oder der Wert keine positive Zahl ist, ist die Schaltfläche **Apply** deaktiviert. + +Die Schaltfläche **Cancel** oder `Esc` schließt den Dialog ohne Änderungen. Screenreader kündigen die neue Größe an, zum Beispiel „Column width set to 120 pixels". + +### Änderung rückgängig machen {#undoing-the-change} + +Die neue Größe kann mit `Ctrl (Cmd) + Z` rückgängig gemacht werden. + +Um die Änderung im Code zu verarbeiten, verwenden Sie die [Actions](api/overview/actions_overview.md#list-of-actions) `resizeCol` und `resizeRow`. + ## Zeilen und Spalten fixieren/Fixierung aufheben {#freezingunfreezing-rows-and-columns} ### Zeilen fixieren {#freezing-rows} @@ -212,6 +264,10 @@ Um eine Zeile auszublenden, führen Sie die folgenden Schritte aus: ![DHTMLX Spreadsheet context menu with the Rows submenu showing Hide rows](/img/hide_row_context_menu.png) +:::info +Wenn sich die aktive Zelle in einer Zeile befindet, die ausgeblendet wird, wechselt die aktive Zelle zur ersten sichtbaren Zeile darunter, und die Auswahl wird auf diese Zelle reduziert. Wenn darunter keine sichtbaren Zeilen vorhanden sind, wechselt sie zur letzten sichtbaren Zeile darüber. +::: + ### Zeilen einblenden {#showing-rows} Um ausgeblendete Zeilen einzublenden, führen Sie einen der folgenden Schritte aus: @@ -228,6 +284,8 @@ Um ausgeblendete Zeilen einzublenden, führen Sie einen der folgenden Schritte a ![DHTMLX Spreadsheet context menu with the Rows submenu showing Show rows](/img/show_rows_context_menu.png) +- oder wählen Sie Zeilen oder mehrere Zellen aus, sodass die ausgeblendeten Zeilen in die Auswahl eingeschlossen sind, und drücken Sie `Ctrl (Cmd) + Shift + 9`. Wählen Sie zum Beispiel die Zeilen 2-4 aus, um die ausgeblendete Zeile 3 einzublenden. Wenn die Auswahl keine ausgeblendeten Zeilen enthält, kündigen Screenreader „No hidden rows in the selection" an + ### Spalten ausblenden {#hiding-columns} Um eine Spalte auszublenden, führen Sie die folgenden Schritte aus: @@ -244,6 +302,10 @@ Um eine Spalte auszublenden, führen Sie die folgenden Schritte aus: ![DHTMLX Spreadsheet context menu with the Columns submenu showing Hide columns](/img/hide_columns_context_menu.png) +:::info +Wenn sich die aktive Zelle in einer Spalte befindet, die ausgeblendet wird, wechselt die aktive Zelle zur ersten sichtbaren Spalte rechts davon, und die Auswahl wird auf diese Zelle reduziert. Wenn rechts keine sichtbaren Spalten vorhanden sind, wechselt sie zur letzten sichtbaren Spalte links. +::: + ### Spalten einblenden {#showing-columns} Um ausgeblendete Spalten einzublenden, führen Sie einen der folgenden Schritte aus: @@ -259,3 +321,5 @@ Um ausgeblendete Spalten einzublenden, führen Sie einen der folgenden Schritte (*In der folgenden Abbildung ist die Spalte C ausgeblendet*) ![DHTMLX Spreadsheet context menu with the Columns submenu showing Show columns](/img/show_columns_context_menu.png) + +- oder wählen Sie Spalten oder mehrere Zellen aus, sodass die ausgeblendeten Spalten in die Auswahl eingeschlossen sind, und drücken Sie `Ctrl (Cmd) + Shift + 0`. Wenn die Auswahl keine ausgeblendeten Spalten enthält, kündigen Screenreader „No hidden columns in the selection" an diff --git a/i18n/ko/docusaurus-plugin-content-docs/current.json b/i18n/ko/docusaurus-plugin-content-docs/current.json index 1bf9b07c..4648be09 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current.json +++ b/i18n/ko/docusaurus-plugin-content-docs/current.json @@ -83,6 +83,10 @@ "message": "셀 작업", "description": "The generated-index page title for category 'Work with cells' in sidebar 'docs'" }, + "sidebar.docs.category.Accessibility": { + "message": "접근성", + "description": "The label for category 'Accessibility' in sidebar 'docs'" + }, "sidebar.docs.category.Frameworks & integrations": { "message": "프레임워크 및 통합", "description": "The label for category 'Frameworks & integrations' in sidebar 'docs'" diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/.sync b/i18n/ko/docusaurus-plugin-content-docs/current/.sync index 96f6c508..8fee4307 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/.sync +++ b/i18n/ko/docusaurus-plugin-content-docs/current/.sync @@ -1 +1 @@ -2b6d3c2fd433461ffce34526974de3f1ba5161a8 +1853f2853225a3d5774a2d166077a4404f555063 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/accessibility.md b/i18n/ko/docusaurus-plugin-content-docs/current/accessibility.md new file mode 100644 index 00000000..bced66c2 --- /dev/null +++ b/i18n/ko/docusaurus-plugin-content-docs/current/accessibility.md @@ -0,0 +1,449 @@ +--- +sidebar_label: 접근성 +title: 접근성 +description: DHTMLX Spreadsheet를 키보드 및 스크린 리더 사용자가 이용할 수 있도록 만드는 방법을 설명합니다. WCAG 2.2 AA를 목표로 하는 WAI-ARIA 지원, 키보드 탐색, 스크린 리더 안내 및 고대비 테마에 대해 알아보십시오. +--- + +# DHTMLX Spreadsheet의 접근성 + +이 가이드는 접근성 요구 사항을 충족해야 하는 애플리케이션에 DHTMLX Spreadsheet를 포함하는 개발자를 위한 문서입니다. 이 가이드를 사용하여 컴포넌트를 체크리스트와 대조하고, 키보드, 스크린 리더 및 고대비 사용자를 위해 컴포넌트를 구성하십시오. + +Spreadsheet는 마크업의 일부로 WAI-ARIA 역할과 상태를 렌더링합니다. 키보드 포커스는 활성 셀에 유지되며, 툴바, 메뉴 바 및 시트 탭은 각각 하나의 탭 정지점입니다. 거부된 편집이나 검색 결과처럼 별도의 요소가 없는 변경 사항은 스크린 리더가 소리 내어 읽는 라이브 영역(live region)으로 전달됩니다. + +:::info 목표 준수 수준 +DHTMLX Spreadsheet는 **WCAG 2.2 Level AA**, 미국 재활법 **Section 508**, 그리고 **EN 301 549**(유럽 접근성법의 기술 기준)를 충족하도록 설계되었습니다. + +준수 여부는 DHTMLX Spreadsheet 6.0.4에 대해 기준별로 보고됩니다. 상세한 **Accessibility Conformance Report (VPAT® 2.5)** 는 다음에서 확인할 수 있습니다. [Accessibility Conformance Report](accessibility_conformance_report.md). +::: + +## 기능 {#capabilities} + +| 영역 | 지원 내용 | +| ---- | ------- | +| 키보드 조작 | 셀에 대한 모든 명령에 키가 있습니다. 툴바, 메뉴 바 및 시트 탭은 화살표 키로 탐색하는 단일 탭 정지점입니다. 열 너비, 행 높이 및 열 필터에는 컨텍스트 메뉴 명령이 있으므로 드래그하거나 아이콘을 클릭할 필요가 없습니다 | +| WAI-ARIA 시맨틱 | 셀은 `columnheader`, `rowheader` 및 `gridcell` 요소가 포함된 `grid`입니다. 역할은 항상 렌더링됩니다 | +| 포커스 모델 | 키보드 포커스는 활성 셀에 있습니다. Tab은 활성 셀을 통해 시트로 진입하며 마지막 셀과 첫 번째 셀에서 시트를 벗어납니다. Ctrl + F6은 메뉴, 툴바, 시트 및 시트 탭 간에 포커스를 이동합니다 | +| 선택 모델 | 활성 셀, 범위 및 여러 범위는 `aria-selected`를 통해 노출되며, 범위의 크기가 안내됩니다. 선택은 [`selection`](api/spreadsheet_selection_config.md) 옵션으로 끌 수 있습니다 | +| 읽기 전용 모드 | 시트에서 탐색, 선택, 복사 및 검색할 수 있습니다. 편집은 거부되고 안내되며, 컨텍스트 메뉴는 사용할 수 없습니다 | +| 스크린 리더 | NVDA, JAWS 및 VoiceOver로 테스트되었습니다 | +| 시각적 접근성 | `contrast-light` 및 `contrast-dark` 테마, 모든 테마에서 보이는 포커스 표시기, 색상에 의존하지 않는 단서 | +| 텍스트 크기 조정 및 확대 | 200% 및 400% 확대와 텍스트 간격 재정의 상태에서도 레이아웃을 조작할 수 있습니다 | +| 사용자 정의 | 사용자 고유의 메시지를 위한 공개 [`announce()`](api/spreadsheet_announce_method.md) 메서드와 모든 기본 제공 이름 및 안내를 위한 번역 가능한 `aria_*` 로캘 문자열 | +| 표준 | WCAG 2.2 AA, Section 508, EN 301 549 | + +## 적용 범위 {#covered-areas} + +이 가이드는 Spreadsheet 위젯을 다룹니다. + +- 셀, 열 및 행 헤더, 병합된 셀, 고정된 행과 열 +- 선택: 활성 셀, 범위 및 여러 범위 +- 수식 입력줄과 셀 에디터(값 목록이 있는 셀의 에디터 포함) +- 색상 및 테두리 팝업이 있는 툴바, 메뉴 바 및 컨텍스트 메뉴 +- 시트 탭 +- 정렬, 필터링, 검색, 데이터 유효성 검사, 셀의 링크, 가져오기 및 내보내기 +- 테마와 포커스 표시기 + +최종 페이지의 접근성은 호스트 애플리케이션에도 좌우됩니다. [Host-page responsibilities](#host-page-responsibilities)를 참조하십시오. + +## WAI-ARIA 지원 {#wai-aria-support} + +Spreadsheet는 마크업에 WAI-ARIA 역할과 속성을 자동으로 추가하며, 이를 끌 수 없습니다. 위젯의 각 부분에는 고유한 역할과 이름이 있으며, 이름은 [로캘](#localization)에서 가져옵니다. + +### Spreadsheet 컨테이너 {#spreadsheet-container} + +Spreadsheet의 각 부분은 이름이 지정된 별도의 컨트롤입니다. + +| 부분 | 역할 / 속성 | 접근 가능한 이름 | +| ---- | ---------------- | --------------- | +| 메뉴 바 | `role="menubar"` + `aria-label` | "Main" | +| 툴바 | `role="toolbar"` + `aria-label` | "Formatting" | +| 수식 입력줄 | 입력란의 `aria-label` | "Formula bar, B7", 활성 셀의 주소 포함 | +| 셀 | `role="grid"` + `aria-label` | "Spreadsheet" | +| 시트 탭 | `role="toolbar"` + `aria-label` | "Sheets" | +| 라이브 영역 | `role="status"`, `aria-live="polite"`, `aria-atomic="true"` | 시각적으로 숨겨져 있으며, `role="grid"` 바깥의 그리드 옆에 배치됩니다 | + +Spreadsheet의 루트 요소에는 랜드마크 역할이 없으므로 페이지에 맞는 랜드마크 안에 배치할 수 있습니다. + +### 셀 영역 {#cell-surface} + +다음 속성은 셀 전체를 설명합니다. `.dhx_grid-content` 요소가 이 속성들을 가집니다. + +| 선택자 | 역할 / 속성 | 용도 | +| -------- | ---------------- | ------- | +| `.dhx_grid-content` | `role="grid"` | 셀의 대화형 그리드 | +| `.dhx_grid-content` | `aria-label` | "Spreadsheet", `aria_grid` 로캘 키에서 가져옴 | +| `.dhx_grid-content` | `aria-rowcount` | 시트의 행 수에 헤더 행을 더한 값 | +| `.dhx_grid-content` | `aria-colcount` | 표시되는 열 수에 행 번호 열을 더한 값 | +| `.dhx_grid-content` | `aria-readonly` | [읽기 전용 모드](api/spreadsheet_readonly_config.md)이거나 [선택](api/spreadsheet_selection_config.md)이 꺼져 있는 동안 `"true"` | +| `.dhx_grid-content` | `aria-multiselectable` | `"true"`. 선택이 꺼져 있는 동안에는 `"false"` | + +### 행과 셀 {#rows-and-cells} + +다음 표는 행과 셀의 역할, 위치 및 상태 속성을 나열합니다. + +| 선택자 | 역할 / 속성 | 용도 | +| -------- | ---------------- | ------- | +| 행 | `role="row"` + `aria-rowindex` | 시트의 행. 열 헤더가 첫 번째 행이므로 시트의 1행은 `aria-rowindex="2"`를 가집니다 | +| 셀 | `role="gridcell"` + `aria-colindex` | 셀. 행 번호가 첫 번째 열이므로 A열은 `aria-colindex="2"`를 가집니다 | +| 행 번호 | `role="rowheader"` | 행의 헤더 | +| 셀 | `aria-selected` | 활성 셀과 선택된 범위의 모든 셀에서 `"true"` | +| 셀 | `aria-readonly` | 읽기 전용 모드, [선택](api/spreadsheet_selection_config.md)이 꺼져 있는 동안, 그리고 [잠긴 셀](work_with_cells.md#locking-cells)에서 `"true"` | +| 셀 | `tabindex` | 활성 셀에서 `"0"`, 다른 셀에서 `"-1"`이므로 셀은 하나의 탭 정지점입니다 | +| 활성 셀 | DOM 포커스 | 키보드 포커스는 별도의 입력란이 아니라 활성 셀 자체에 있습니다. 셀을 편집하는 동안에는 포커스가 셀 에디터에 있습니다 | +| 병합된 셀 | `aria-colspan` / `aria-rowspan` | 병합된 셀이 걸쳐 있는 열 또는 행의 수. 병합된 셀에 가려진 셀은 `aria-hidden="true"`로 숨겨집니다 | +| 셀의 링크 | `target="_blank"` 및 `rel="noopener noreferrer"`가 있는 `
` | `http`, `https`, `mailto`, `ftp` 또는 `tel` 스킴을 사용하는 링크 | + +셀에는 값과 함께 스크린 리더가 읽는 시각적으로 숨겨진 텍스트도 포함됩니다. + +| 숨겨진 텍스트 | 시점 | +| ----------- | ---- | +| 셀 주소(예: "B7") | 활성 셀과 선택된 범위의 모든 셀. 스크린 리더는 값보다 먼저 주소를 읽습니다 | +| "link" | 링크가 있는 선택된 셀. Alt + Enter로 링크를 엽니다 | +| "locked" | 선택된 잠긴 셀 | +| 수식 오류에 대한 설명(예: "Reference error. Check the cell references") | 수식 오류가 있는 셀 | +| "Invalid value. Choose a value from the list" | 값이 [값 목록](work_with_cells.md#using-drop-down-lists-in-cells)에 없는 셀 | +| "Filter" / "Filter applied" | 필터 아이콘이 있는 셀 | + +### 열 및 행 헤더 {#column-and-row-headers} + +| 선택자 | 역할 / 속성 | 용도 | +| -------- | ---------------- | ------- | +| 열 문자 | `role="columnheader"` + `aria-colindex` | 열의 헤더 | +| 모두 선택 모서리 | `role="columnheader"` | "Select all"로 명명됨 | +| 행 번호 | `role="rowheader"` | 행의 헤더 | +| 열 메뉴 아이콘, 숨겨진 행과 열의 아이콘 | `aria-hidden="true"` | 장식용. 명령은 컨텍스트 메뉴에 있습니다 | + +헤더는 탭 정지점이 아닙니다. 열 문자, 행 번호 또는 모서리를 클릭하면 행이나 열이 선택되고 포커스가 활성 셀로 돌아갑니다. + +### 수식 입력줄과 에디터 {#formula-bar-and-editors} + +| 선택자 | 역할 / 속성 | 용도 | +| -------- | ---------------- | ------- | +| 수식 입력줄 입력란 | `aria-label` | "Formula bar, B7", 활성 셀의 주소 포함. 잠긴 셀에서는 입력란이 `readonly`이므로 값을 읽을 수 있습니다. 선택이 꺼져 있는 동안 수식 입력줄은 비어 있고 잠깁니다 | +| 셀 에디터 입력란 | `aria-label` | "Cell editor, B7" | +| 값 목록이 있는 셀의 에디터 | `role="combobox"`, `aria-controls`, `aria-expanded`, `aria-activedescendant` | 값 목록은 `option` 요소로 구성된 `listbox`이며, 강조 표시된 옵션은 `aria-selected`입니다 | +| 잘못된 값이 있는 에디터 | `aria-invalid="true"` | 셀의 저장된 값이 값 목록에 없습니다. 이 속성은 사용자가 입력하는 동안이 아니라 값이 저장된 후에 업데이트됩니다 | +| 수식 도움말의 닫기 아이콘 | `role="button"` + `aria-label` | "Close formula help" | + +### 툴바와 메뉴 {#toolbar-and-menus} + +| 선택자 | 역할 / 속성 | 용도 | +| -------- | ---------------- | ------- | +| 툴바 | `role="toolbar"` + `aria-label` | "Formatting". 테두리 팝업, 검색 바 및 링크 팝업의 툴바는 "Borders", "Search" 및 "Link"로 명명됩니다 | +| 툴바 버튼 | `aria-label` | 버튼의 값. 아이콘 버튼은 툴팁으로 명명됩니다(예: "Bold (ctrl+b)"). 아이콘은 `aria-hidden="true"`로 숨겨집니다 | +| Bold, Italic, Underline, Strikethrough, Lock, Filter | `aria-pressed` | 서식 또는 필터가 켜져 있는지 여부 | +| 드롭다운을 여는 버튼 | `aria-haspopup="menu"`, `aria-expanded` | 드롭다운은 해당 버튼의 이름을 따른 `menu`입니다 | +| 정렬, 텍스트 줄 바꿈, 숫자 형식 | `role="menuitemradio"` + `aria-checked` | 배타적 집합의 한 옵션 | +| Text color, Background color, Border color | `aria-label` | 컨트롤과 현재 색상의 이름(예: "Text color: dark gray") | +| 색상 팔레트 | `gridcell` 요소로 구성된 `role="grid"` | 그리드는 "Color palette"로 명명됩니다. 각 색상 셀은 해당 색상의 이름을 가지며, 선택된 셀은 `aria-selected="true"`를 가집니다 | +| 테두리 스타일 목록 | `option` 요소로 구성된 `role="listbox"` | 옵션은 "Thin line", "Medium line", "Thick line", "Dashed line", "Dotted line", "Double line"으로 명명됩니다 | +| 메뉴 바 | `role="menubar"` + `aria-label` | "Main". 항목은 `role="menu"`가 있는 팝업을 엽니다. 팝업에서 서식 항목은 `role="menuitemcheckbox"`를, 정렬, 텍스트 줄 바꿈 및 숫자 형식 항목은 `role="menuitemradio"`를 가집니다. 둘 다 `aria-checked`로 상태를 보고합니다 | +| 컨텍스트 메뉴 | `role="menu"` + `aria-label` | 셀용은 "Cell", 시트 탭용은 "Sheet" | + +### 시트 탭 {#sheet-tabs} + +| 선택자 | 역할 / 속성 | 용도 | +| -------- | ---------------- | ------- | +| 시트 탭 바 | `role="toolbar"` + `aria-label` | "Sheets" | +| 시트 탭 | `button` + `aria-pressed` | 탭은 해당 시트의 이름을 따릅니다. 활성 시트의 탭은 `aria-pressed="true"`를 가집니다 | +| 시트 추가 버튼 | `aria-label` | "Add sheet" | + +### 대화 상자 {#dialogs} + +| 선택자 | 역할 / 속성 | 용도 | +| -------- | ---------------- | ------- | +| Column width 및 Row height 대화 상자 | `role="dialog"`, `aria-modal="true"`, `aria-label` | 대화 상자 제목으로 명명됩니다. 입력란의 레이블은 "Width in pixels" / "Height in pixels"입니다 | +| 검색 바 | `role="dialog"` + `aria-label` | "Search"로 명명됩니다. 검색 입력란의 레이블은 "Search"이며, 버튼은 "Previous match", "Next match" 및 "Close search"로 명명됩니다 | +| Insert link, Data validation | `role="dialog"` + `aria-label` | 대화 상자 제목으로 명명됩니다 | +| 알림 | `role="alertdialog"`, `aria-modal="true"`, `aria-labelledby`, `aria-describedby` | 알림 헤더로 명명되고 알림 텍스트로 설명됩니다 | + +### 숨겨진 요소와 장식 요소 {#hidden-and-decorative-elements} + +Spreadsheet는 `aria-hidden="true"`를 사용하여 보조 기술에서 장식 부분을 숨깁니다. 여기에는 잠금, 필터 및 열 메뉴 아이콘, 숨겨진 행과 열의 아이콘, 모두 선택 아이콘이 포함됩니다. 선택 영역, 복사 및 검색 강조 표시, 채우기 핸들을 그리는 레이어도 숨겨집니다. 수식 입력줄에 있는 수식의 색상 복사본과 병합된 셀에 가려진 셀도 마찬가지입니다. 레이아웃 래퍼에는 `role="presentation"`이 있습니다. 그리드 앞뒤의 포커스 센티널은 포커스를 활성 셀로 전달하는 역할만 합니다. + +## 선택 및 편집 모델 {#selection-and-editing-model} + +DOM 포커스는 활성 셀 자체에 있으므로 스크린 리더는 별도의 입력란이 아니라 셀을 읽습니다. 활성 셀이 이동하면 스크린 리더는 새 셀의 주소를 먼저 읽고, 그다음 값과 숨겨진 설명을 읽습니다. 사용자가 키보드나 마우스로 범위를 선택하면 선택 변경이 멈춘 후 스크린 리더가 범위의 크기를 한 번 안내합니다. 여러 범위에 공유된 셀은 한 번만 계산되며, 숨겨진 행과 열의 셀도 계산됩니다. 셀을 편집하는 동안에는 아무것도 안내되지 않습니다. 범위가 활성 셀 하나로 줄어들면 해당 셀의 주소가 안내됩니다. + +| 상황 | 스크린 리더가 받는 내용 | +| --------- | --------------------------- | +| 활성 셀이 이동함 | 주소, 값 및 설명이 포함된 셀(예: "B7, 120, locked") | +| 범위가 선택됨 | "B2 to D7, 18 cells" | +| Ctrl로 여러 범위가 선택됨 | "B2 to B4, D2 to D4, 6 cells" | +| Enter, F2 또는 입력으로 에디터가 열림 | "Cell editor, B7"로 명명된 에디터 입력란 | +| 값 목록이 있는 셀의 에디터가 열림 | 확장된 콤보박스. ↑ 또는 ↓를 누르면 목록에서 강조 표시된 옵션을 읽습니다 | +| 편집이 저장됨 | 편집된 셀과 그 셀에 의존하는 셀의 새 수식 오류, 그리고 편집된 셀의 잘못된 값이 안내됩니다 | +| 잠긴 셀의 편집이 거부됨 | "The cell is locked" | +| 읽기 전용 모드에서 편집 키를 누름 | "The sheet is read-only" | + +Enter, F2 또는 입력으로 에디터가 열립니다. Enter는 값을 저장하고 아래로 이동하며, Tab은 값을 저장하고 오른쪽으로 이동하고, Esc는 편집을 취소합니다. + +## 키보드 탐색 {#keyboard-navigation} + +키보드는 Spreadsheet가 페이지에 표시되는 즉시 작동하며 별도의 구성이 필요하지 않습니다. 아래 표는 키보드 모델을 요약합니다. 전체 단축키는 [Hot keys list](hotkeys.md)를 참조하십시오. + +![툴바의 Horizontal align 드롭다운을 아래쪽 화살표 키로 열었으며 첫 번째 항목에 포커스가 있는 모습](/img/accessibility/toolbar_dropdown_focus.png) + +### 셀 {#cells} + +| 키 | 동작 | +| ---- | ------ | +| 화살표 키 | 활성 셀을 이동합니다. 활성 셀은 표시되는 첫 번째와 마지막 행 및 열에서 멈춥니다 | +| Shift + 화살표 키 | 선택된 범위를 확장합니다 | +| Home / End | 행에서 표시되는 첫 번째 또는 마지막 셀로 이동합니다 | +| Ctrl + 화살표 키, Ctrl + Home / End | 시트의 가장자리로 이동합니다 | +| Tab / Shift + Tab | 행 안에서 오른쪽 또는 왼쪽으로 이동합니다. 시트의 마지막 또는 첫 번째 셀에서는 포커스를 셀 밖의 다음 또는 이전 페이지 부분(예: 시트 탭 또는 수식 입력줄)으로 이동합니다 | +| Enter, F2 | 에디터를 엽니다 | +| Esc | 저장하지 않고 에디터를 닫습니다 | +| Ctrl + Space / Shift + Space | 열 또는 행을 선택합니다 | +| Ctrl + Shift + 9 / 0 | 선택된 범위 안의 숨겨진 행 또는 열을 표시합니다 | +| Alt + Enter | 활성 셀의 링크를 엽니다 | +| Shift + F10 또는 Menu 키 | 셀에 대한 명령이 있는 컨텍스트 메뉴를 엽니다. Ctrl + Space 이후에는 열에 대한 컨텍스트 메뉴를 엽니다 | +| Alt + ↑ / ↓, Ctrl + Alt + Page Down / Page Up | 다음 또는 이전 시트로 전환합니다 | + +### 부분 간 이동 {#moving-between-the-parts} + +| 키 | 동작 | +| ---- | ------ | +| Ctrl + F6 / Ctrl + Shift + F6 | 포커스를 다음 또는 이전 부분(메뉴, 툴바, 시트, 시트 탭)으로 이동합니다. 수식 입력줄과 숨겨진 부분은 건너뜁니다. 열려 있는 편집은 먼저 저장됩니다 | +| Tab / Shift + Tab | 페이지 탭 순서에서 포커스를 다음 또는 이전 부분으로 이동합니다. 각 바는 하나의 탭 정지점이며, 포커스는 마지막으로 사용한 컨트롤에 놓입니다 | + +### 툴바, 메뉴 바 및 시트 탭 {#toolbar-menu-bar-and-sheet-tabs} + +| 키 | 동작 | +| ---- | ------ | +| ← / →, Home / End | 바의 컨트롤 간에 이동합니다 | +| Enter / Space | 컨트롤을 누릅니다. 명령을 실행하거나, 드롭다운을 열거나, 시트로 전환합니다 | +| ↓ | 드롭다운을 열고 포커스를 첫 번째 항목으로 이동합니다 | +| ↑ / ↓ | 열려 있는 드롭다운 또는 메뉴의 항목 간에 이동합니다 | +| → / ← | 하위 메뉴를 열거나 닫습니다 | +| Esc | 드롭다운 또는 메뉴를 닫고 포커스를 해당 컨트롤로 되돌립니다 | + +### 팝업 및 대화 상자 {#popups-and-dialogs} + +| 키 | 동작 | +| ---- | ------ | +| 화살표 키, Home / End | 색상 팔레트의 색상 간에 이동합니다 | +| Enter | 색상, 테두리 또는 Column width 및 Row height 대화 상자의 크기를 적용합니다 | +| Esc | 팝업, 대화 상자 또는 검색 바를 닫고 포커스를 이를 연 컨트롤 또는 셀로 되돌립니다. 사용자 지정 색상 모드에서는 팔레트로 돌아갑니다. 테두리 팝업에서 연 색상 또는 스타일 팝업에서는 팝업을 닫고 포커스를 테두리 팝업의 해당 버튼으로 되돌립니다 | +| Tab / Shift + Tab | 대화 상자 또는 사용자 지정 색상 모드의 컨트롤 간에 이동합니다. 색상 팝업 또는 테두리 팝업에서는 팝업을 닫고 포커스를 해당 툴바 버튼으로 되돌립니다 | +| ↑ / ↓, Enter | 셀의 값 목록을 탐색하고 값을 선택합니다 | + +:::note +포인터 전용 동작에는 키보드 대안이 있습니다. 컨텍스트 메뉴의 *Column width* 및 *Row height* 명령은 드래그하지 않고도 정확한 크기를 설정하며, *Open filter* 명령은 아이콘을 클릭하지 않고도 필터를 엽니다. +::: + +## 보조 기술 {#assistive-technology} + +DHTMLX 팀은 다음 스크린 리더로 Spreadsheet를 테스트합니다. + +| 스크린 리더 | 브라우저 | 플랫폼 | +| ------------- | ------- | -------- | +| NVDA | Firefox | Windows | +| JAWS | Chrome | Windows | +| VoiceOver | Safari | macOS | + +스크린 리더는 각 상태를 해당 상태가 속한 요소에서 가져옵니다. + +| 상태 | 노출 방식 | 읽는 대상 | +| ----- | --------------- | ------- | +| 위치 | `aria-rowindex`, `aria-colindex` 및 셀 텍스트의 셀 주소 | 각 셀. 주소는 활성 셀과 선택된 범위의 셀 텍스트에 있습니다 | +| 선택 | `aria-selected` | 활성 셀과 선택된 범위의 셀 | +| 편집 가능 여부 | `aria-readonly` | 읽기 전용 모드와 선택이 꺼져 있는 동안의 그리드 및 셀, 그리고 잠긴 셀 | +| 병합된 셀 | `aria-colspan`, `aria-rowspan` | 병합된 셀 | +| 행 헤더 | `role="rowheader"` | 행 번호 | +| 토글 상태 | `aria-pressed` | Bold, Italic, Underline, Strikethrough, Lock 및 Filter 버튼과 시트 탭 | +| 선택 상태 | `aria-checked` | 메뉴 바의 서식 항목, 그리고 정렬, 텍스트 줄 바꿈 및 숫자 형식 항목 | +| 오류 및 잘못된 값 | 셀의 숨겨진 텍스트, `aria-invalid` | 셀과 해당 에디터 | +| 링크 | `` 및 숨겨진 텍스트 "link" | 링크가 있는 셀 | + +## 고대비 및 포커스 {#high-contrast-and-focus} + +### 테마 {#themes} + +Spreadsheet에는 `light`(기본값), `dark`, `contrast-light` 및 `contrast-dark`의 네 가지 기본 제공 테마가 있습니다. `contrast-light` 및 `contrast-dark` 테마는 텍스트에 대한 WCAG AA 대비 요구 사항을 충족합니다. `dhx.setTheme()` 메서드 또는 `data-dhx-theme` 속성으로 테마를 전환하십시오. + +~~~jsx +dhx.setTheme("contrast-light"); // or "contrast-dark" +~~~ + +자세한 내용은 [Built-in themes](/themes/) 문서를 참조하십시오. + +밝은 테마에서 수식의 셀 참조를 표시하는 색상은 최소 4.5:1의 대비를 가집니다. + +`contrast-light` 테마는 흰색 배경에 어두운 텍스트와 테두리를 그립니다. 아래 Spreadsheet에서는 필터 아이콘이 있는 셀의 컨텍스트 메뉴를 키보드로 열었습니다. 포커스가 있는 명령인 [*Open filter*](filtering_data.md#opening-a-filter-with-the-keyboard)는 점선 윤곽선으로 표시되고, 활성 셀은 테마의 기본 색상으로 된 실선 테두리로 표시됩니다. + +![contrast-light 테마의 Spreadsheet](/img/accessibility/spreadsheet_contrast_light.png) + +`contrast-dark` 테마는 어두운 배경에 밝은 텍스트와 테두리를 그립니다. 포커스가 툴바 컨트롤에 있으면 해당 컨트롤은 `--dhx-spreadsheet-focus-color` 색상의 포커스 링으로 표시되며, 이 색상은 어두운 테마에서 활성 셀 테두리의 기본 색상보다 밝습니다. + +![contrast-dark 테마의 Spreadsheet](/img/accessibility/spreadsheet_contrast_dark.png) + +### 포커스 표시기 {#focus-indicator} + +키보드 포커스는 모든 테마에서 표시됩니다. + +- 활성 셀에는 테마의 기본 색상으로 된 2px 실선 테두리가 있습니다 +- 키보드 포커스가 있는 셀과 셀 에디터에는 테마의 기본 색상으로 된 2px 윤곽선이 적용됩니다 +- 수식 입력줄과 툴바, 메뉴 바, 시트 탭, 테두리 팝업, 링크 팝업 및 검색 바의 컨트롤에는 `--dhx-spreadsheet-focus-color` 변수 색상으로 된 2px 윤곽선이 적용됩니다 +- 색상 팔레트, 테두리 스타일 목록, 툴바와 메뉴 바의 드롭다운 및 컨텍스트 메뉴에서는 포커스가 있는 항목에 `--dhx-color-focused` 색상으로 된 1px 점선 윤곽선이 적용됩니다 +- 셀의 목록 에디터에서는 포커스가 에디터에 유지되며, 목록의 현재 항목은 배경색으로 강조 표시됩니다 + +`--dhx-spreadsheet-focus-color` 변수는 어두운 테마에서 기본 색상보다 밝으며 [사용자 지정 테마](themes/custom_theme.md)에서 다시 정의할 수 있습니다. 각 테마에서 각 표시기의 대비는 [Accessibility Conformance Report](accessibility_conformance_report.md)에 나와 있습니다. + +### 색상 및 확대 {#color-and-zoom} + +- **색상이 유일한 신호가 아닙니다.** 활성 셀과 선택 영역에는 테두리와 채우기가 있고, 잘못된 값에는 표시기와 숨겨진 설명이 있으며, 서식 버튼은 `aria-pressed`를 통해 상태를 보고합니다. 색상 버튼의 접근 가능한 이름에는 색상 이름이 포함됩니다. +- **확대 및 리플로.** Spreadsheet는 200% 및 400% 확대에서도 조작할 수 있습니다. 셀은 두 방향으로 스크롤되며, 툴바, 메뉴 바 및 시트 탭은 320 CSS px 너비에 맞습니다. +- **텍스트 간격.** WCAG 텍스트 간격 재정의를 적용해도 컨트롤 레이블이 잘리지 않으며, 탭이 늘어나면 시트 탭 바가 스크롤됩니다. +- **보이는 위치로 스크롤.** 활성 셀은 고정된 행과 열 옆에서 보이는 위치로 스크롤됩니다. + +## 상태 안내 {#status-announcements} + +Spreadsheet는 별도의 요소가 없는 변경 사항을 polite 라이브 영역을 통해 안내하므로 스크린 리더는 현재 문장을 먼저 끝까지 읽습니다. + +| 이벤트 | 안내 텍스트 | 로캘 키 | +| ----- | -------------- | ---------- | +| 범위가 선택됨 | "B2 to D7, 18 cells" | `aria_selectedRange`, `aria_rangeExtent`, `aria_rangeSeparator` | +| 편집으로 수식 오류 또는 잘못된 값이 발생함 | "B7: Reference error. Check the cell references" | `aria_cellMessage` | +| 편집으로 여러 오류 / 잘못된 값이 발생함 | "3 new errors. B7: ..." / "3 invalid values. B7: ..." | `aria_newErrors`, `aria_invalidValues` | +| 잠긴 셀 / 범위의 편집이 거부됨 | "The cell is locked" / "Locked cells were not changed" | `aria_lockedCell`, `aria_lockedCells` | +| 읽기 전용 모드에서 편집 키를 누름 | "The sheet is read-only" | `aria_readonlySheet` | +| 검색 텍스트를 입력함 | "Results: 5. 1 of 5, B2" 또는 "No results" | `aria_searchResults`, `aria_searchMatch`, `aria_searchNoResults` | +| 다음 또는 이전 일치 항목이 표시됨 | "2 of 5, B7" | `aria_searchMatch` | +| Excel 파일을 내보냄 | "Exporting the file", "The file is exported" | `aria_exportStarted`, `aria_exportDone` | +| 파일 대화 상자에서 선택한 파일을 가져옴 | "Importing the file", "The file is imported" | `aria_importStarted`, `aria_importDone` | +| Column width / Row height 명령이 적용됨 | "Column width set to 120 pixels" | `aria_columnWidthSet`, `aria_rowHeightSet` | +| Ctrl + Shift + 9 / 0으로 표시할 항목을 찾지 못함 | "No hidden rows in the selection" | `aria_noHiddenRows`, `aria_noHiddenCols` | + +사용자 고유의 명령 결과를 안내하려면 [`announce()`](api/spreadsheet_announce_method.md) 메서드를 호출하십시오. + +~~~jsx +spreadsheet.announce("The report is saved"); +~~~ + +## 현지화 {#localization} + +접근 가능한 이름, 셀 설명 및 안내는 인터페이스 레이블 옆에 `aria_` 접두사가 있는 키로 `spreadsheet` 로캘에 저장됩니다. Spreadsheet를 초기화하기 전에 `dhx.i18n.setLocale()` 메서드로 번역하십시오. + +~~~jsx +dhx.i18n.setLocale("spreadsheet", { + // other keys of the locale + aria_grid: "Tabelle", + aria_cellEditor: "Zelleneditor, {cell}", + aria_readonlySheet: "Das Blatt ist schreibgeschützt", + aria_selectedRange: "{range}, {count} Zellen", + aria_rangeExtent: "{start} bis {end}" +}); + +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); +~~~ + +`{cell}` 또는 `{count}`와 같이 중괄호로 묶인 부분은 값으로 대체되므로 번역된 문자열에서도 유지해야 합니다. 색상 이름과 알림 버튼의 이름은 `colorpicker` 및 `message` 로캘에서 가져옵니다. 전체 키 목록은 [Localization](localization.md#default-locale)을, 다른 로캘은 [Localizing built-in widgets](localization.md#localizing-built-in-widgets)를 참조하십시오. + +## 구성 예시 {#configuration-recipes} + +### 접근성을 고려한 기본 설정 {#accessible-default-setup} + +Spreadsheet는 키보드와 WAI-ARIA 출력을 위해 별도의 구성이 필요하지 않습니다. 텍스트에 대한 WCAG AA 대비 요구 사항을 충족하려면 고대비 테마를 선택하십시오. 테마를 설정하는 다른 방법은 [Built-in themes](/themes/)를 참조하십시오. + +~~~jsx +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { + // the keyboard navigation and the WAI-ARIA output need no configuration +}); +spreadsheet.parse(data); + +dhx.setTheme("contrast-light"); // or "contrast-dark" +~~~ + +### 읽기 전용 설정 {#read-only-setup} + +사용자가 읽고 복사할 수 있지만 변경할 수 없는 데이터를 표시하려면 [`readonly`](api/spreadsheet_readonly_config.md) 옵션을 사용하십시오. 키보드 및 스크린 리더 사용자는 여전히 셀 사이를 이동할 수 있습니다. + +~~~jsx +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { + readonly: true +}); +spreadsheet.parse(data); +~~~ + +활성 셀과 선택 없이 데이터를 표시하려면 [`selection: false`](api/spreadsheet_selection_config.md)를 추가하십시오. 그러면 그리드는 키보드가 통과하는 하나의 탭 정지점이 됩니다. + +### 번역된 접근성 문자열 {#translated-accessibility-strings} + +스크린 리더는 네 개의 로캘에서 접근성 문자열을 읽습니다. `spreadsheet`에는 이름, 셀 설명 및 안내가, `colorpicker`에는 색상 이름이, `message`에는 알림 버튼의 이름이, `grid`에는 로드된 행 수 안내가 포함됩니다. Spreadsheet를 생성하기 전에 네 가지 모두 설정하십시오. 키는 [Localizing built-in widgets](localization.md#localizing-built-in-widgets)를 참조하십시오. + +~~~jsx +const deSpreadsheet = { + // other keys of the locale + aria_grid: "Tabelle", + aria_readonlySheet: "Das Blatt ist schreibgeschützt" +}; +const deColorpicker = { + aria_palette: "Farbpalette", + aria_colorRed: "rot" +}; +const deMessage = { + aria_confirm: "Bestätigen" +}; +const deGrid = { + aria_rowsLoaded: "{count} Zeilen geladen" +}; + +dhx.i18n.setLocale("spreadsheet", deSpreadsheet); +dhx.i18n.setLocale("colorpicker", deColorpicker); +dhx.i18n.setLocale("message", deMessage); +dhx.i18n.setLocale("grid", deGrid); + +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); +~~~ + +### 사용자 지정 명령 안내 {#announcing-a-custom-command} + +사용자 고유의 명령이 데이터를 변경하는 경우 [`announce()`](api/spreadsheet_announce_method.md) 메서드로 스크린 리더 사용자에게 결과를 알려 주십시오. 이 예제는 활성 시트를 지우는 [메뉴](customization.md#menu) 명령을 추가합니다. + +~~~jsx +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); + +spreadsheet.menu.data.add({ id: "clear-sheet", value: "Clear sheet" }); + +spreadsheet.menu.events.on("click", function (id) { + if (id === "clear-sheet") { + spreadsheet.sheets.clear(); + spreadsheet.announce("The sheet is cleared"); + } +}); +~~~ + +## 호스트 페이지의 책임 {#host-page-responsibilities} + +일부 요구 사항은 컴포넌트 내부가 아니라 페이지 수준에 있습니다. 호스트 페이지가 다음을 충족하는지 확인하십시오. + +- 문서 언어(예: ``)와 페이지 제목을 설정합니다 +- Spreadsheet 위에 제목을 두고 랜드마크(예: `
`) 안에 배치합니다 +- Spreadsheet 앞에 긴 탐색 영역이 있는 경우 건너뛰기 링크를 제공합니다 +- 셀 색상으로 표시하는 모든 상태에 텍스트나 아이콘과 같은 두 번째 신호를 제공합니다. 셀 스타일의 색상은 사용자 데이터의 일부이기 때문입니다 +- 셀 스타일과 사용자 지정 테마에서 설정한 색상의 대비를 확인합니다 + +## 테스트 및 방법론 {#testing-and-methodology} + +DHTMLX 팀은 컴포넌트 소스와 브라우저에서 Spreadsheet 6.0.4의 접근성을 검증합니다. + +1. **자동화 테스트**: 검색 바, 목록 에디터, 대화 상자 및 알림이 열린 상태에서 `light`, `dark`, `contrast-light` 및 `contrast-dark` 테마에 대해 [axe-core](https://github.com/dequelabs/axe-core)로 수행합니다. +2. **수동 검토**: 소스를 대상으로 각 부분의 역할, 상태 및 이름, 키보드 핸들러와 포커스 영역, 그리고 대비율이 포함된 테마 토큰을 검토합니다. +3. **수동 테스트**: 셀, 바, 메뉴 및 대화 상자에 대한 키보드 전용 워크스루, NVDA, JAWS 및 VoiceOver를 사용한 스크린 리더 테스트, 200% 및 400% 확대, 320 CSS px에서의 리플로, WCAG 텍스트 간격 재정의를 수행합니다. +4. **준수 보고**: Spreadsheet가 부분적으로 지원하는 기준을 포함하여 결과를 [Accessibility Conformance Report](accessibility_conformance_report.md)에 기준별로 게시합니다. + +## 리소스 {#resources} + +- [Accessibility Conformance Report (VPAT 2.5)](accessibility_conformance_report.md) +- [단축키 목록](hotkeys.md) +- [`readonly`](api/spreadsheet_readonly_config.md) +- [`selection`](api/spreadsheet_selection_config.md) +- [`announce()`](api/spreadsheet_announce_method.md) +- [현지화](localization.md) +- [기본 제공 테마](/themes/) +- [WCAG 2.2](https://www.w3.org/TR/WCAG22/) +- [WAI-ARIA 1.2](https://www.w3.org/TR/wai-aria-1.2/) +- [WAI-ARIA Authoring Practices: Grid pattern](https://www.w3.org/WAI/ARIA/apg/patterns/grid/) +- [WAI-ARIA Authoring Practices: Toolbar pattern](https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/) diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/accessibility_conformance_report.md b/i18n/ko/docusaurus-plugin-content-docs/current/accessibility_conformance_report.md new file mode 100644 index 00000000..7f9337a5 --- /dev/null +++ b/i18n/ko/docusaurus-plugin-content-docs/current/accessibility_conformance_report.md @@ -0,0 +1,218 @@ +--- +sidebar_label: 적합성 보고서 (VPAT) +title: 접근성 적합성 보고서 +description: VPAT 2.5 기반 DHTMLX Spreadsheet 접근성 적합성 보고서 - WCAG 2.2 AA, Section 508 및 EN 301 549 준수 현황. +--- + +# 접근성 적합성 보고서 + +이 보고서는 DHTMLX Spreadsheet가 주요 접근성 표준을 어떻게 준수하는지 설명합니다. 보고서는 **VPAT® 2.5 (International Edition)** 구조를 따릅니다. 접근성 기능과 구성 방법에 대한 작업 중심 개요는 [접근성](accessibility.md) 가이드를 참조하십시오. + +**제품명/버전:** DHTMLX Spreadsheet v6.0.4 + +**보고서 날짜:** 2026년 10월 + +**제품 설명:** DHTMLX Spreadsheet는 웹 애플리케이션용 JavaScript 스프레드시트 컴포넌트입니다. 인터페이스는 메뉴 바, 툴바, 수식 입력줄, 행 및 열 머리글이 있는 셀 그리드, 시트 탭으로 구성됩니다. 수식, 셀 서식, 셀 병합, 행 및 열 고정, 정렬, 필터링, 검색, 데이터 유효성 검사, 셀 링크, Excel 가져오기 및 내보내기 기능을 제공합니다. 이 컴포넌트는 호스트 웹 애플리케이션에 포함되어 사용됩니다. + +**연락처:** [info@dhtmlx.com](mailto:info@dhtmlx.com) + +## 참고 사항 {#notes} + +- 이 보고서는 DHTMLX Spreadsheet를 **권장 접근성 구성**으로 평가합니다. 권장 구성은 WAI-ARIA 출력과 키보드 탐색이 항상 켜져 있는 기본 구성이며, `dhx.setTheme()` 또는 `data-dhx-theme` 속성으로 `contrast-light` 또는 `contrast-dark` 테마를 설정한 상태입니다. 적합성 수준이 이 구성에 의존하는 경우 비고에 명시합니다. 설정 방법은 [접근성](accessibility.md) 가이드를 참조하십시오. +- DHTMLX Spreadsheet는 호스트 애플리케이션이 렌더링하는 **웹 콘텐츠**입니다. 페이지 수준의 책임 사항(페이지 제목, ``, 건너뛰기/우회 메커니즘, 사이트 전체 탐색)은 호스트 애플리케이션에 속하며, 설명과 함께 *해당 없음*으로 보고합니다. +- WCAG 표에서는 **Web** 응답만 작성합니다. *Electronic Docs*, *Software*, *Closed*, *Authoring Tool* 행은 *해당 없음*입니다. 이 제품은 독립 실행형(비웹) 소프트웨어, 폐쇄형 기능, 저작 도구, 전자 문서가 아니기 때문입니다. +- 작성자가 셀 스타일을 통해 셀에 적용하는 색상은 문서 데이터의 일부이며 제품 평가 대상에 포함되지 않습니다. + +**사용한 평가 방법:** + +- 자동 테스트: 검색 바, 목록 편집기, 대화 상자, 알림이 열린 상태에서 `light`, `dark`, `contrast-light`, `contrast-dark` 테마로 axe-core를 실행했습니다. +- 컴포넌트 소스와 스타일시트의 수동 코드 검토: 위젯 각 부분의 role과 ARIA 속성, 키보드 핸들러와 포커스 영역, 접근 가능한 이름과 해당 로캘 키, 테마 색상 토큰을 검토했으며 네 가지 테마에 대해 명암비를 계산했습니다. +- 보조 기술 테스트: Windows에서 **NVDA + Firefox** 및 **JAWS + Chrome**, macOS에서 **VoiceOver + Safari**로 수동 점검을 수행했습니다. +- 브라우저 재정의: 200% / 400% 확대, 320 CSS px에서의 리플로우, WCAG 텍스트 간격 재정의. + +## 적용 표준 / 지침 {#applicable-standards--guidelines} + +| 표준 / 지침 | 보고서 포함 여부 | +|---|---| +| Web Content Accessibility Guidelines 2.0 | Level A (아니요) · Level AA (아니요) · Level AAA (아니요) | +| Web Content Accessibility Guidelines 2.1 | Level A (아니요) · Level AA (아니요) · Level AAA (아니요) | +| Web Content Accessibility Guidelines 2.2 | Level A (**예**) · Level AA (**예**) · Level AAA (아니요) | +| Revised Section 508 standards (2017년 1월 18일 발행, 2018년 1월 22일 정정) | (**예**) | +| EN 301 549 - V3.1.1 (2019-11) 및 V3.2.1 (2021-03) | (**예**) | + +*WCAG 2.0과 2.1은 별도로 보고하지 않습니다. WCAG에서 "2.1 and 2.2"로 표시한 기준은 WCAG 2.2에 포함되고 +EN 301 549에서 참조하므로 답변합니다.* + +## 용어 {#terms} + +- **지원함(Supports):** 제품의 기능에 알려진 결함 없이 기준을 충족하는 방법이 하나 이상 있거나, 동등한 촉진(equivalent facilitation)으로 충족합니다. +- **부분 지원(Partially Supports):** 제품의 일부 기능이 기준을 충족하지 않습니다. +- **지원하지 않음(Does Not Support):** 제품 기능의 대부분이 기준을 충족하지 않습니다. +- **해당 없음(Not Applicable):** 해당 기준이 제품과 관련이 없습니다. + +## WCAG 2.x 보고서 {#wcag-2x-report} + +DHTMLX Spreadsheet는 웹 콘텐츠이므로 아래에는 **Web** 응답만 작성합니다. "AA 적합 테마 필요"는 구성 의존성이며 결함이 +아닙니다. 기준 4.1.1 구문 분석(Parsing)은 WCAG 2.2에서 제거되어 보고하지 않습니다. + +### 표 1: 성공 기준, Level A {#table-1-success-criteria-level-a} + +| 기준 | 적합성 수준 | 비고 및 설명 | +|---|---|---| +| **1.1.1** 텍스트 아닌 콘텐츠 | 지원함 | 아이콘은 글꼴 글리프입니다. 아이콘만 있는 컨트롤은 로캘 또는 툴팁에서 접근 가능한 이름을 가져옵니다(예: "Add sheet", "Close search", "Select all"). 색상 버튼은 색상 이름을 가집니다(예: "Text color: dark gray"). 장식용 아이콘(잠금, 필터, 열 메뉴, 숨겨진 줄 표시), 선택 레이어, 병합된 셀에 가려진 셀은 `aria-hidden="true"`로 숨깁니다. 이들이 나타내는 상태는 셀 안의 텍스트("locked", "Filter applied" 등)로 전달됩니다. | +| **1.2.1** 오디오 전용 및 비디오 전용(녹화) | 해당 없음 | 제품에 오디오 또는 비디오 콘텐츠가 없습니다. | +| **1.2.2** 자막(녹화) | 해당 없음 | 녹화된 멀티미디어가 없습니다. | +| **1.2.3** 오디오 설명 또는 미디어 대체물(녹화) | 해당 없음 | 녹화된 멀티미디어가 없습니다. | +| **1.3.1** 정보와 관계 | 지원함 | 셀은 `row`, `columnheader`, `rowheader`, `gridcell` role을 가진 "Spreadsheet"라는 이름의 `grid`입니다. 위치는 `aria-rowcount`/`aria-colcount`에 대한 `aria-rowindex`/`aria-colindex`로, 병합된 셀의 범위는 `aria-colspan`/`aria-rowspan`으로, 편집 가능 여부는 `aria-readonly`로, 선택은 `aria-selected`와 `aria-multiselectable`로 노출됩니다. 툴바, 메뉴 바, 시트 탭은 이름이 있는 `toolbar` 및 `menubar` 요소입니다. 서식 토글은 툴바에서 `aria-pressed`를 가지며 메뉴 바에서는 `menuitemcheckbox`이고, 상호 배타적인 서식 옵션은 `aria-checked`를 가진 `menuitemradio`입니다. | +| **1.3.2** 의미 있는 순서 | 지원함 | DOM 및 읽기 순서는 시각적 순서(메뉴 바, 툴바, 수식 입력줄, 셀, 시트 탭)를 따릅니다. 셀은 `aria-rowindex`/`aria-colindex`로 시트 내 위치를 전달하므로, 행과 열이 스크롤되어 DOM에서 사라져도 순서가 유지됩니다. | +| **1.3.3** 감각적 특성 | 지원함 | 어떤 지침이나 레이블도 모양, 크기, 공간적 위치에만 의존하지 않으며, 상호작용 요소는 텍스트 또는 ARIA 이름을 가집니다. | +| **1.4.1** 색의 사용 | 지원함 | 색상으로 나타내는 각 상태에는 테두리, 채우기, 표시 또는 텍스트도 함께 제공됩니다. 활성 셀, 선택한 범위, 검색 일치 항목, 복사한 범위, 잘못된 셀이 해당하며, `aria-selected` 또는 셀 안의 텍스트가 함께 제공됩니다. 필터로 숨겨진 행은 행 번호에 간격을 남깁니다. 색상 버튼은 접근 가능한 이름에 색상 이름을 포함합니다. | +| **1.4.2** 오디오 제어 | 해당 없음 | 제품은 자동 재생 오디오를 생성하지 않습니다. | +| **2.1.1** 키보드 | 지원함 | 셀에 대한 모든 명령에 키가 있으며 [단축키 목록](hotkeys.md)에 나열되어 있습니다. `Shift`+`F10` 또는 Menu 키로 컨텍스트 메뉴를 엽니다. `Ctrl`+`F6`은 메뉴, 툴바, 시트, 시트 탭 사이로 포커스를 이동합니다. 바, 바의 드롭다운과 팝업, 목록 편집기는 화살표 키, `Home`, `End`, `Enter`, `Esc`로 작동합니다. 열 너비, 행 높이, 열 필터에는 컨텍스트 메뉴 명령이 있습니다. | +| **2.1.2** 키보드 트랩 없음 | 지원함 | 시트의 마지막 셀에서 `Tab`, 첫 번째 셀에서 `Shift`+`Tab`을 누르면 포커스가 셀에서 페이지의 다음 또는 이전 부분으로 이동하며, `Ctrl`+`F6`은 Spreadsheet의 각 부분 사이로 포커스를 이동합니다. 목록 편집기에서 `Tab`은 편집을 종료하고 `Esc`는 취소하며, 화살표 키를 사용한 후에도 동일합니다. `Esc`와 `Tab`은 툴바 팝업을 닫고 포커스를 해당 버튼으로 되돌립니다. | +| **2.1.4** 문자 키 단축키 | 지원함 | 모든 단축키는 수정자 키(`Ctrl`, `Alt`, `Shift`) 또는 비문자 키(`F2`, `F6`, `F10`, `F11`, `Enter`, `Esc`, `Delete`, 화살표)를 사용합니다. 셀에서 문자를 입력하면 셀에 입력되며, 이는 셀의 본래 목적이고 명령을 실행하지 않습니다. | +| **2.2.1** 시간 조절 가능 | 해당 없음 | 제품은 시간 제한을 설정하지 않습니다. | +| **2.2.2** 일시정지, 정지, 숨기기 | 지원함 | 자동으로 갱신되거나 움직이거나 깜박이거나 스크롤되는 콘텐츠가 없습니다. 5초를 넘는 애니메이션이 없습니다. | +| **2.3.1** 세 번 깜박임 또는 임계값 이하 | 지원함 | 제품에 깜박이는 콘텐츠가 없습니다. | +| **2.4.1** 블록 건너뛰기 | 해당 없음 | 페이지 수준에 적용되며, 우회 메커니즘은 호스트 애플리케이션에 속합니다. | +| **2.4.2** 페이지 제목 | 해당 없음 | 페이지 제목은 호스트 애플리케이션의 책임입니다. | +| **2.4.3** 초점 순서 | 지원함 | 셀은 활성 셀에 하나의 탭 정지 지점을 가지며, 툴바, 메뉴 바, 시트 탭은 각각 하나의 탭 정지 지점을 가지고 시각적 순서를 따릅니다. `Tab`은 마지막 셀과 첫 번째 셀에서 시트를 벗어납니다. 대화 상자는 포커스를 가져가고 `Tab`을 내부에 유지하며, 닫힐 때 포커스를 활성 셀로 되돌립니다. 메뉴, 컨텍스트 메뉴, 팝업은 포커스를 연 컨트롤로 되돌리며, 텍스트 또는 배경 색상을 적용한 후에는 포커스가 활성 셀로 돌아갑니다. 활성 셀은 포커스를 받을 때 보이는 위치로 스크롤됩니다. | +| **2.4.4** 링크 목적(문맥 내) | 지원함 | 셀의 링크는 작성자가 설정한 링크 텍스트 또는 주소를 텍스트로 가진 `` 요소로 렌더링됩니다. 셀이 선택되면 셀 텍스트에 "link"가 추가되며, `Alt`+`Enter`로 링크를 엽니다. | +| **2.5.1** 포인터 제스처 | 지원함 | 다중 포인트 또는 경로 기반 제스처가 필요한 작업이 없으며, 모든 드래그 작업에는 드래그가 아닌 대안이 있습니다(2.5.7 참조). | +| **2.5.2** 포인터 취소 | 지원함 | 열 및 행 크기 조절과 채우기 핸들은 놓을 때 적용되며, 한 번의 실행 취소로 각각을 되돌릴 수 있습니다. 툴바, 메뉴, 시트 탭의 명령은 `click` 시 실행됩니다. | +| **2.5.3** 이름에 레이블 포함 | 지원함 | 보이는 텍스트가 있는 컨트롤은 그 텍스트를 접근 가능한 이름으로 사용합니다. 메뉴 항목, 컨텍스트 메뉴 명령, 시트 탭, 대화 상자 버튼이 해당합니다. 아이콘 버튼은 툴팁으로, 색상 버튼은 툴팁 뒤에 색상 이름을 붙여 이름을 지정합니다. | +| **2.5.4** 동작 작동 | 해당 없음 | 기기 동작이나 사용자 동작으로 작동하는 기능이 없습니다. | +| **3.1.1** 페이지의 언어 | 해당 없음 | 문서 언어(``)는 호스트 애플리케이션이 설정합니다. | +| **3.2.1** 초점 시 | 지원함 | 포커스를 받아도 문맥이 바뀌지 않습니다. 열 문자, 행 번호 또는 모서리를 클릭하면 해당 줄이 선택되고 포커스는 활성 셀에 유지됩니다. | +| **3.2.2** 입력 시 | 지원함 | 값을 변경해도 문맥이 바뀌지 않습니다. 셀 편집, 목록에서 값 선택, 검색 바에 입력하면 시트가 그 자리에서 갱신되며, 이는 해당 컨트롤의 문서화된 목적입니다. | +| **3.2.6** 일관된 도움말 (2.2 전용) | 해당 없음 | 위젯은 도움말 메커니즘을 제공하지 않으며, 이는 페이지 수준의 사항입니다. | +| **3.3.1** 오류 식별 | 지원함 | 수식 오류와 잘못된 목록 값은 셀 내용에 설명됩니다(예: "Reference error. Check the cell references", "Invalid value. Choose a value from the list"). 편집으로 발생한 새 수식 오류와 잘못된 값은 라이브 영역을 통해 안내되며, 잘못된 값의 편집기에는 `aria-invalid="true"`가 설정됩니다. | +| **3.3.2** 레이블 또는 지침 | 지원함 | 셀 편집기는 "Cell editor, B7", 수식 입력줄은 "Formula bar, B7"로 이름이 지정되며, 편집 중인 셀의 주소를 포함합니다. 대화 상자 필드에는 레이블이 있으며(예: "Width in pixels"), 검색 바 버튼은 "Previous match", "Next match", "Close search"로 이름이 지정됩니다. | +| **3.3.7** 중복 입력 (2.2 전용) | 지원함 | 제품에는 이미 입력한 정보를 다시 요구하는 다단계 프로세스가 없습니다. | +| **4.1.2** 이름, 역할, 값 | 지원함 | 각 부분은 role, 상태, 로캘에서 가져온 이름을 노출합니다. 셀(`grid`, `row`, `gridcell`, `columnheader`, `rowheader`, `aria-selected`, `aria-readonly`), 툴바와 메뉴 바(`toolbar`, `menubar`), 서식, Lock, Filter 버튼과 시트 탭(`aria-pressed`), 메뉴 바의 서식 항목(`menuitemcheckbox`, `aria-checked`), 상호 배타적인 서식(`menuitemradio`, `aria-checked`)이 해당합니다. 알림은 `aria-modal="true"`가 설정된 `alertdialog`입니다. 목록 편집기는 `listbox`를 제어하는 `combobox`이며 `aria-expanded`와 `aria-activedescendant`를 가집니다. | + +### 표 2: 성공 기준, Level AA {#table-2-success-criteria-level-aa} + +| 기준 | 적합성 수준 | 비고 및 설명 | +|---|---|---| +| **1.2.4** 자막(라이브) | 해당 없음 | 라이브 멀티미디어가 없습니다. | +| **1.2.5** 오디오 설명(녹화) | 해당 없음 | 녹화된 비디오가 없습니다. | +| **1.3.4** 방향 | 지원함 | 콘텐츠가 단일 디스플레이 방향으로 제한되지 않습니다. | +| **1.3.5** 입력 목적 식별 | 해당 없음 | 제품의 편집기는 문서 데이터를 수집하며, WCAG 입력 목적 목록에서 다루는 사용자 본인의 개인 정보를 수집하지 않습니다. | +| **1.4.3** 명도 대비(최소) | 지원함 | `contrast-light` 및 `contrast-dark` 테마는 AA를 충족합니다. 검색 바, 목록 편집기, 열 너비 대화 상자, 알림이 열린 상태에서 두 테마 모두 제품 텍스트가 4.5:1 미만인 경우가 없습니다. 수식 참조 색상은 light 및 `contrast-light` 테마에서 4.59:1에서 7.04:1, dark 테마에서 7.62:1에서 12.26:1입니다. 기본 light 테마에서는 대화 상자 필드 레이블과 알림 텍스트 같은 보조 텍스트가 약 3.95:1입니다. 이 기준을 충족하려면 대비 테마 중 하나를 선택해야 하며, 지원되는 방법 하나로 충족합니다. | +| **1.4.4** 텍스트 크기 조절 | 지원함 | 콘텐츠나 기능의 손실 없이 텍스트를 200%까지 확대할 수 있으며, 툴바, 수식 입력줄, 시트 탭, 대화 상자를 계속 사용할 수 있습니다. | +| **1.4.5** 텍스트 이미지 | 지원함 | 모든 텍스트는 실제 텍스트로 렌더링됩니다. 아이콘은 글꼴 글리프이며 제품은 래스터 이미지를 사용하지 않습니다. | +| **1.4.10** 리플로우 | 지원함 | 셀은 이 기준에서 리플로우 예외로 인정하는 2차원 콘텐츠이며, 가로와 세로로 스크롤됩니다. 툴바, 메뉴 바, 시트 탭은 320 CSS px 너비에 맞습니다. | +| **1.4.11** 텍스트 아닌 명도 대비 | 지원함 | 셀, 수식 입력줄, 바 컨트롤의 포커스 표시기는 2px 너비이며 테마 색상으로 그려집니다. 아래 비율은 기본 light, `contrast-light`, dark, `contrast-dark` 테마에 대한 값입니다. 활성 셀은 `--dhx-color-primary` 색상의 2px 실선 테두리로 표시되며, 셀 배경 대비 약 3.9:1, 7.7:1, 3.4:1, 5.3:1입니다. 키보드 포커스를 가진 셀과 셀 편집기는 같은 색상의 2px 아웃라인을 가지며 비율도 같고, 선택한 범위 안에서는 약 3.3:1, 6.0:1, 3.1:1, 4.2:1입니다. 수식 입력줄은 `--dhx-spreadsheet-focus-color` 색상의 2px 아웃라인을 가지며, 배경 대비 약 3.9:1, 7.7:1, 5.3:1, 6.5:1입니다. 툴바, 메뉴 바, 시트 탭의 컨트롤은 같은 아웃라인을 가지며, 바 배경 대비 약 3.7:1, 7.2:1, 3.9:1, 4.9:1입니다. 모든 값이 3:1 요구 사항을 넘습니다. | +| **1.4.12** 텍스트 간격 | 지원함 | WCAG 텍스트 간격 재정의를 적용해도 잘리는 컨트롤 레이블이 없으며, 탭이 늘어나면 시트 탭 바가 스크롤됩니다. | +| **1.4.13** 호버 또는 포커스 시 콘텐츠 | 지원함 | 툴바 툴팁은 마우스를 올려 둔 동안 열려 있고, 포인터나 포커스를 옮기지 않고 `Esc`로 닫을 수 있습니다. 잘못된 값 툴팁은 입력 오류를 알리고, 셀이 활성 상태인 동안 유지되며, `Esc`로 제거됩니다. | +| **2.4.5** 여러 가지 방법 | 해당 없음 | 웹 페이지 집합 내에서 페이지를 찾는 데 적용되며, 단일 임베디드 컴포넌트에는 범위 밖입니다(호스트 애플리케이션의 사항). | +| **2.4.6** 제목과 레이블 | 지원함 | 주요 부분은 로캘에서 접근 가능한 이름을 가져옵니다. "Spreadsheet"(그리드), "Formatting"(툴바), "Borders", "Search", "Link"(Border 팝업, 검색 바, 링크 팝업의 툴바), "Main"(메뉴 바), "Cell" 및 "Sheet"(셀과 시트 탭의 컨텍스트 메뉴), "Sheets"(시트 탭 바), "Formula bar, B7"(수식 입력줄), "Cell editor, B7"(셀 편집기)이 해당합니다. 전체 선택 모서리는 "Select all", 검색 바는 "Search", 그 버튼은 "Previous match", "Next match", "Close search", 시트를 추가하는 버튼은 "Add sheet"로 이름이 지정되며, 그 밖의 대화 상자는 제목으로 이름이 지정됩니다. | +| **2.4.7** 초점 표시 | 지원함 | 키보드 포커스 위치가 항상 보입니다. 활성 셀에는 항상 2px 실선 테두리가 있고, 포커스를 가진 셀 또는 셀 편집기에는 2px 아웃라인이 있으며, 둘 다 테마의 기본 색상입니다. 수식 입력줄과 툴바, 메뉴 바, 시트 탭, Border 팝업, 링크 팝업, 검색 바의 컨트롤에는 `--dhx-spreadsheet-focus-color` 색상의 2px 포커스 링이 표시됩니다. 색상 팔레트, 테두리 스타일 목록, 툴바와 메뉴 바의 드롭다운, 컨텍스트 메뉴에서는 포커스된 항목에 1px 점선 아웃라인이 있습니다. 목록 편집기에서는 포커스된 항목이 배경색으로 강조됩니다. 포커스 표시기는 모든 기본 제공 테마에서 표시됩니다. | +| **2.4.11** 초점 가려지지 않음(최소) (2.2 전용) | 지원함 | 활성 셀은 고정된 행과 열 옆의 보이는 위치로 스크롤되므로 고정 영역 뒤에 가려지지 않습니다. | +| **2.5.7** 드래그 동작 (2.2 전용) | 지원함 | 범위 선택에는 `Shift`+화살표와 `Ctrl`+`Space`/`Shift`+`Space`를 사용할 수 있습니다. 열 너비와 행 높이는 컨텍스트 메뉴의 *Column width* 및 *Row height* 명령으로 설정하며 실행 취소를 지원합니다. 숨겨진 행과 열은 `Ctrl`+`Shift`+`9`/`0` 및 *Show rows*/*Show columns* 명령으로 표시합니다. 셀 채우기는 컨텍스트 메뉴 명령에 바인딩할 수 있는 [`groupFill`](api/spreadsheet_groupfill_event.md) 이벤트로 사용할 수 있습니다. | +| **2.5.8** 대상 크기(최소) (2.2 전용) | 부분 지원 | 채우기 핸들은 12 x 12 CSS px입니다. 열 및 행 크기 조절 핸들에는 동등한 컨트롤인 *Column width* 및 *Row height* 명령이 있습니다. 전체 선택 모서리는 40 x 32 CSS px의 모서리 머리글 셀이며, 툴바와 메뉴 컨트롤은 24 x 24 CSS px보다 큽니다. | +| **3.1.2** 부분의 언어 | 해당 없음 | 위젯은 콘텐츠 안에서 여러 언어를 혼용하지 않으며, 언어는 호스트가 관리합니다. | +| **3.2.3** 일관된 탐색 | 해당 없음 | 웹 페이지 집합 전체에 적용되며, 호스트 애플리케이션의 사항입니다. | +| **3.2.4** 일관된 식별 | 지원함 | 기능이 같은 명령은 툴바, 메뉴 바, 컨텍스트 메뉴에서 같은 이름과 아이콘, 같은 키를 가집니다. | +| **3.3.3** 오류 수정 제안 | 지원함 | 오류 설명은 수정 방법을 제안합니다. 참조 오류에는 "Check the cell references", 잘못된 목록 값에는 "Choose a value from the list"가 표시됩니다. | +| **3.3.4** 오류 예방(법률, 금융, 데이터) | 지원함 | 데이터의 모든 변경은 실행 취소(`Ctrl`+`Z`)로 되돌리고 다시 실행으로 반복할 수 있습니다. 호스트 애플리케이션은 추가로 [`beforeAction`](api/spreadsheet_beforeaction_event.md) 이벤트를 통해 모든 동작을 취소할 수 있습니다. | +| **3.3.8** 접근 가능한 인증(최소) (2.2 전용) | 해당 없음 | 제품은 인증을 수행하지 않습니다. | +| **4.1.3** 상태 메시지 | 지원함 | 상태 변경은 그리드 바깥에 있는 시각적으로 숨겨진 라이브 영역(`role="status"`, `aria-live="polite"`, `aria-atomic="true"`)을 통해 포커스를 이동하지 않고 안내됩니다. 이 영역은 선택한 범위, 새 수식 오류와 잘못된 값, 잠긴 셀 또는 읽기 전용 시트에 대한 거부된 편집, 검색 결과, 가져오기와 내보내기의 시작 및 종료, 새 열 너비와 행 높이, 표시할 숨겨진 행이나 열이 없는 선택을 알립니다. 같은 영역은 공개 [`announce()`](api/spreadsheet_announce_method.md) 메서드를 통해 호스트 애플리케이션에서도 사용할 수 있으며, 모든 기본 제공 메시지는 `aria_*` 로캘 키로 현지화할 수 있습니다. | + +## 개정된 Section 508 보고서 {#revised-section-508-report} + +WCAG에 대응하는 조항은 위의 WCAG 2.x 보고서에서 답변했으며 여기서는 이를 참조합니다. 4장(하드웨어)은 +해당 없음입니다. DHTMLX Spreadsheet는 하드웨어나 물리적 컨트롤이 없는 소프트웨어 컴포넌트이기 때문입니다. + +### 3장: 기능 성능 기준 {#chapter-3-functional-performance-criteria} + +| 기준 | 적합성 수준 | 비고 및 설명 | +|---|---|---| +| 302.1 시각 없이 | 지원함 | 열 및 행 머리글이 있는 `grid` 모델, 각 셀과 함께 읽히는 셀 주소와 설명, 이름이 지정된 툴바와 메뉴, 라이브 영역, 키보드 모델을 통해 스크린 리더로 조작할 수 있습니다. WCAG 1.3.1, 2.1.1, 4.1.2, 4.1.3을 참조하십시오. | +| 302.2 제한된 시력 | 지원함 | 확대, 텍스트 크기 조절, 리플로우를 지원하며, 모든 테마에서 포커스가 보이고, `contrast-light` / `contrast-dark` 테마로 AA 대비를 충족합니다. WCAG 1.4.3, 1.4.4, 1.4.10, 1.4.11, 2.4.7을 참조하십시오. | +| 302.3 색 지각 없이 | 지원함 | 색상만으로 전달되는 정보가 없습니다. 활성 셀, 선택, 검색 일치 항목, 잘못된 값은 각각 색상과 함께 셀 안에 테두리, 표시 또는 텍스트를 가지며, 색상 버튼은 색상 이름을 가집니다. WCAG 1.4.1을 참조하십시오. | +| 302.4 청각 없이 | 지원함 | 소리로 전달되는 정보가 없습니다. | +| 302.5 제한된 청력 | 지원함 | 소리로 전달되는 정보가 없습니다. | +| 302.6 음성 없이 | 지원함 | 제품을 조작하는 데 음성 입력이 필요하지 않습니다. | +| 302.7 제한된 조작 | 지원함 | 모든 기능이 키보드로 작동하며, 경로 기반 제스처가 필요하지 않고, 모든 드래그 작업에는 키보드 또는 명령 대안이 있습니다. WCAG 2.1.1, 2.5.1, 2.5.7, 2.5.8을 참조하십시오. | +| 302.8 제한된 도달 범위와 힘 | 지원함 | 키보드로 조작할 수 있으며, 물리적 도달 범위, 힘, 시간 요구 사항이 없습니다. | +| 302.9 제한된 언어, 인지 및 학습 능력 | 지원함 | 명령은 툴바, 메뉴, 컨텍스트 메뉴에서 같은 이름을 가지며, 수식 오류는 수정 방법과 함께 설명되고, 모든 변경은 실행 취소로 되돌릴 수 있습니다. WCAG 3.2.4, 3.3.3, 3.3.4를 참조하십시오. | + +### 5장: 소프트웨어 {#chapter-5-software} + +| 기준 | 적합성 수준 | 비고 및 설명 | +|---|---|---| +| 501.1 범위 - WCAG 2.0 AA 통합 | WCAG 2.x 섹션 참조 | 위의 WCAG 2.x 보고서를 참조하십시오. | +| 502 보조 기술과의 상호 운용성 | 해당 없음 | 비웹(플랫폼) 소프트웨어에 적용됩니다. DHTMLX Spreadsheet는 표준 DOM과 ARIA를 브라우저 접근성 트리에 노출하는 웹 콘텐츠이며, 상호 운용성은 WCAG 결과(Clause 9 / 501.1)로 다룹니다. | +| 503 애플리케이션 | 해당 없음 | 비웹 플랫폼 소프트웨어에 적용되며, 이 제품은 웹 콘텐츠입니다. | +| 504 저작 도구 | 해당 없음 | DHTMLX Spreadsheet는 웹 콘텐츠용 저작 도구가 아닙니다. 접근성과 관련된 웹 콘텐츠가 아니라 스프레드시트 데이터를 편집합니다. | + +### 6장: 지원 문서 및 서비스 {#chapter-6-support-documentation-and-services} + +| 기준 | 적합성 수준 | 비고 및 설명 | +|---|---|---| +| 602.2 접근성 및 호환성 기능 | 지원함 | 문서는 제품의 접근성 기능을 설명합니다. [접근성](accessibility.md) 가이드는 WAI-ARIA 모델, 키보드 모델, 읽기 전용 모드와 선택 옵션, 테마와 포커스 표시기, [`announce()`](api/spreadsheet_announce_method.md) API, [현지화 가능한 `aria_*` 문자열](accessibility.md#localization)을 다루며, [단축키 목록](hotkeys.md)은 모든 단축키를 나열합니다. | +| 602.3 전자 지원 문서 | 지원함 (WCAG 2.x 섹션 참조) | 문서 사이트는 웹 콘텐츠로 제공되며 WCAG 2.2 AA를 충족하도록 유지 관리됩니다. | +| 602.4 비전자 지원 문서의 대체 형식 | 해당 없음 | 문서는 전자 형식으로만 제공되며, 비전자(인쇄) 지원 문서는 없습니다. | +| 603.2 접근성 및 호환성 기능에 대한 정보 | 지원함 | 제품의 접근성 기능은 [접근성](accessibility.md) 가이드에 공개적으로 문서화되어 있으며, 요청 시 지원 채널을 통해 제공할 수 있습니다. | +| 603.3 의사소통 요구 수용 | 지원함 | 지원은 텍스트 기반 이메일 채널로 제공되며, 사용자는 자신의 보조 기술로 상호작용합니다. | + +## EN 301 549 보고서 {#en-301-549-report} + +Clause 9(Web)는 위의 WCAG 2.x 보고서에 직접 대응하며, 이 웹 제품에 대한 핵심 평가입니다. 전화, 비디오, 하드웨어 관련 조항(Clause 6, 7, 8, 13)은 +해당 없음입니다. + +### Clause 4: 기능 성능 설명 {#clause-4-functional-performance-statements} + +이 항목은 Section 508 3장의 결과를 그대로 따릅니다(결론 동일). + +| 기준 | 적합성 수준 | 비고 및 설명 | +|---|---|---| +| 4.2.1 시각 없이 사용 | 지원함 | 508 302.1을 참조하십시오(그리드 모델, 셀 설명, 이름이 지정된 컨트롤, 라이브 영역, 키보드 모델을 통해 스크린 리더로 조작 가능). | +| 4.2.2 제한된 시력으로 사용 | 지원함 | 508 302.2를 참조하십시오(대비 테마를 통한 AA 대비, 모든 테마에서 보이는 포커스, 확대 및 리플로우 지원). | +| 4.2.3 색 지각 없이 사용 | 지원함 | 508 302.3을 참조하십시오(모든 색상 단서에 테두리, 표시 또는 텍스트가 함께 제공됨). | +| 4.2.4 청각 없이 사용 | 지원함 | 소리로 전달되는 정보가 없습니다. | +| 4.2.5 제한된 청력으로 사용 | 지원함 | 소리로 전달되는 정보가 없습니다. | +| 4.2.6 음성 능력이 없거나 제한적인 경우 사용 | 지원함 | 음성 입력이 필요하지 않습니다. | +| 4.2.7 제한된 조작 또는 힘으로 사용 | 지원함 | 508 302.7을 참조하십시오(키보드로 조작 가능, 제스처 없음, 모든 드래그 작업에 대한 대안 제공). | +| 4.2.8 제한된 도달 범위로 사용 | 지원함 | 물리적 도달 범위 요구 사항이 없습니다(소프트웨어 컴포넌트). | +| 4.2.9 광과민성 발작 유발 요인 최소화 | 지원함 | 깜박이는 콘텐츠가 없습니다(WCAG 2.3.1 참조). | +| 4.2.10 제한된 인지, 언어 또는 학습 능력으로 사용 | 지원함 | 508 302.9를 참조하십시오(일관된 명령 이름, 설명이 있는 오류, 되돌릴 수 있는 변경). | +| 4.2.11 개인정보 보호 | 지원함 | 접근성 기능은 다른 사용자와 같은 인터페이스를 사용하며, 별도의 개인정보 보호 수준이 낮은 모드가 없습니다. | + +### Clause 5: 일반 요구 사항 {#clause-5-generic-requirements} + +**대부분 해당 없음.** Clause 5는 폐쇄형 기능과 하드웨어 유형의 요구 사항을 다룹니다. DHTMLX +Spreadsheet는 플랫폼 및 브라우저 보조 기술과 함께 작동하는 개방형 웹 소프트웨어이므로, 폐쇄형 기능 하위 조항, 생체 인식(5.3), 조작 가능한 부분(5.5), +잠금/토글 컨트롤 상태(5.6)는 해당 없음입니다. 일반 요구 사항이 일반적인 보조 기술 지원으로 충족되는 경우에는 +Clause 9(Web)와 WCAG 결과에서 다룹니다. + +### Clause 9: 웹 {#clause-9-web} + +**WCAG 2.x 섹션을 참조하십시오.** Clause 9.1.1.1-9.4.1.3은 위의 표 1과 표 2에 있는 WCAG 2.2 Level A/AA +결과에 대응합니다. + +### Clause 11: 소프트웨어 {#clause-11-software} + +**해당 없음 (Clause 9에서 평가).** DHTMLX Spreadsheet는 Clause 9(Web)에서 평가하는 웹 콘텐츠이며, +비웹 소프트웨어가 아닙니다. WCAG에 대응하는 소프트웨어 조항(11.1.1.1-11.4.1.3)은 WCAG +2.x 결과에서 다룹니다. 11.8(저작 도구)은 제품이 저작 도구가 아니므로 해당 없음입니다. + +### Clause 12: 문서 및 지원 서비스 {#clause-12-documentation-and-support-services} + +| 기준 | 적합성 수준 | 비고 및 설명 | +|---|---|---| +| 12.1.1 접근성 및 호환성 기능 | 지원함 | [접근성](accessibility.md) 가이드는 제품의 접근성 기능을 문서화합니다. WAI-ARIA 모델, 키보드 모델, 읽기 전용 모드와 선택 옵션, 테마, 포커스 표시기, [`announce()`](api/spreadsheet_announce_method.md) API, [현지화 가능한 `aria_*` 문자열](accessibility.md#localization)이 해당합니다. | +| 12.1.2 접근 가능한 문서 | 지원함 (WCAG 2.x 섹션 참조) | 문서 사이트는 웹 콘텐츠로 제공되며 WCAG 2.2 AA를 충족하도록 유지 관리됩니다. | +| 12.2.2 접근성 및 호환성 기능에 대한 정보 | 지원함 | 접근성 기능은 공개적으로 문서화되어 있으며, 요청 시 지원 팀이 안내할 수 있습니다. | +| 12.2.3 효과적인 의사소통 | 지원함 | 지원은 텍스트 기반 이메일 채널로 제공되며, 사용자는 자신의 보조 기술로 상호작용합니다. | +| 12.2.4 접근 가능한 문서 | 지원함 (WCAG 2.x 섹션 참조) | 12.1.2와 같은 근거로, 문서 사이트는 WCAG 2.2 AA를 충족하도록 유지 관리됩니다. | + +## 법적 고지 {#legal-disclaimer} + +이 보고서는 정보 제공 목적으로만 제공되며, 보고서 날짜 기준으로 명시된 +제품 버전의 접근성을 설명합니다. 이 보고서는 어떠한 종류의 보증도 없이 "있는 그대로" 제공되며, +계약상의 약속이나 보장을 구성하지 않습니다. 접근성 지원은 이후 릴리스에서 변경될 수 있으며, +결과는 평가한 구성에 적용됩니다. "VPAT" 및 "Voluntary Product Accessibility Template"는 +Information Technology Industry Council(ITI)의 등록 서비스 마크입니다. diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/angular_integration.md b/i18n/ko/docusaurus-plugin-content-docs/current/angular_integration.md index 09757af4..9ce0a000 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/angular_integration.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/angular_integration.md @@ -1,7 +1,7 @@ --- sidebar_label: Angular 통합 title: Angular 통합 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 Angular 통합에 대해 문서에서 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 직접 실행해 보세요. DHTMLX Spreadsheet의 30일 무료 평가판도 다운로드할 수 있습니다. +description: Angular 애플리케이션에서 DHTMLX Spreadsheet를 사용하는 방법입니다. 프로젝트를 만들고, Spreadsheet를 Angular 컴포넌트로 추가하고, 데이터를 로드하고, 이벤트를 처리합니다. --- # Angular 통합 {#integration-with-angular} @@ -234,6 +234,10 @@ ngOnDestroy() { } ~~~ +:::info +`destructor()` 메서드는 `spreadsheet.events.on()`으로 연결한 이벤트 핸들러를 제거합니다. 새 Spreadsheet 인스턴스를 생성할 때(예: 컴포넌트가 다시 생성될 때) 새 인스턴스에 핸들러를 다시 연결하세요. +::: + ### 3단계. 앱에 Spreadsheet 추가 {#step-3-adding-spreadsheet-into-the-app} `SpreadsheetComponent` 컴포넌트를 앱에 추가하려면 *src/app/app.component.ts* 파일을 열고 기본 코드를 다음으로 교체합니다: diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/api_overview.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/api_overview.md index 9fb698f3..bb0e8211 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/api_overview.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/api_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: API 개요 title: API 개요 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 API 개요를 문서에서 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet API 개요입니다. 생성자, 메서드, 이벤트, 속성과 시트 매니저, 셀 선택, 이벤트 버스, 내보내기 모듈을 다룹니다. --- # API 개요 {#api-overview} @@ -27,6 +27,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { | [](api/spreadsheet_addcolumn_method.md) | @getshort(api/spreadsheet_addcolumn_method.md) | | [](api/spreadsheet_addformula_method.md) | @getshort(api/spreadsheet_addformula_method.md) | | [](api/spreadsheet_addrow_method.md) | @getshort(api/spreadsheet_addrow_method.md) | +| [](api/spreadsheet_announce_method.md) | @getshort(api/spreadsheet_announce_method.md) | | [](api/spreadsheet_clear_method.md) | @getshort(api/spreadsheet_clear_method.md) | | [](api/spreadsheet_deletecolumn_method.md) | @getshort(api/spreadsheet_deletecolumn_method.md) | | [](api/spreadsheet_deleterow_method.md) | @getshort(api/spreadsheet_deleterow_method.md) | @@ -99,6 +100,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { | [](api/spreadsheet_multisheets_config.md) | @getshort(api/spreadsheet_multisheets_config.md) | | [](api/spreadsheet_readonly_config.md) | @getshort(api/spreadsheet_readonly_config.md) | | [](api/spreadsheet_rowscount_config.md) | @getshort(api/spreadsheet_rowscount_config.md) | +| [](api/spreadsheet_selection_config.md) | @getshort(api/spreadsheet_selection_config.md) | | [](api/spreadsheet_toolbarblocks_config.md) | @getshort(api/spreadsheet_toolbarblocks_config.md) | @@ -118,8 +120,11 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { | 이름 | 설명 | | :--------------------------------------------- | :---------------------------------------------------- | +| [](api/selection_disable_method.md) | @getshort(api/selection_disable_method.md) | +| [](api/selection_enable_method.md) | @getshort(api/selection_enable_method.md) | | [](api/selection_getfocusedcell_method.md) | @getshort(api/selection_getfocusedcell_method.md) | | [](api/selection_getselectedcell_method.md) | @getshort(api/selection_getselectedcell_method.md) | +| [](api/selection_isdisabled_method.md) | @getshort(api/selection_isdisabled_method.md) | | [](api/selection_removeselectedcell_method.md) | @getshort(api/selection_removeselectedcell_method.md) | | [](api/selection_setfocusedcell_method.md) | @getshort(api/selection_setfocusedcell_method.md) | | [](api/selection_setselectedcell_method.md) | @getshort(api/selection_setselectedcell_method.md) | diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md index 8039e4d9..6b35b283 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md @@ -67,8 +67,8 @@ spreadsheet.events.on("beforeColumnAdd", function(cell){ | **merge** | 셀 범위를 병합할 때 실행됩니다 | | **removeCellStyles** | 셀 스타일을 지울 때 실행됩니다 | | **renameSheet** | 시트 이름을 바꿀 때 실행됩니다 | -| **resizeCol** | 열 크기를 조정할 때 실행됩니다 | -| **resizeRow** | 행 크기를 조정할 때 실행됩니다 | +| **resizeCol** | 경계를 드래그하거나 *Column width* 명령으로 열 크기를 조정할 때 실행됩니다 | +| **resizeRow** | 경계를 드래그하거나 *Row height* 명령으로 행 크기를 조정할 때 실행됩니다 | | **setCellFormat** | 셀 형식을 변경할 때 실행됩니다 | | **setCellValue** | 셀 값을 변경하거나 제거할 때 실행됩니다 | | **setValidation** | 셀에 데이터 유효성 검사를 설정할 때 실행됩니다 | @@ -78,6 +78,13 @@ spreadsheet.events.on("beforeColumnAdd", function(cell){ | **toggleFreeze** | 열/행을 고정하거나 고정 해제할 때 실행됩니다 | | **unmerge** | 셀을 분할할 때 실행됩니다 | +:::note +[`beforeAction`](api/spreadsheet_beforeaction_event.md) 및 [`afterAction`](api/spreadsheet_afteraction_event.md) 이벤트의 `config` 객체에서 **resizeCol** 및 **resizeRow** 액션은 다음 값을 전달합니다: + +- `cell` - 열 또는 행의 크기가 조정되는 셀 또는 셀 범위 +- `val` - 픽셀 단위의 새 너비 또는 높이. *Column width* 및 *Row height* 명령에서만 설정되며, 드래그로 크기를 조정할 때는 설정되지 않습니다 +::: + **변경 로그:** - **toggleFreeze** 및 **toggleVisibility** 액션이 v5.2에서 추가되었습니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/methods_overview.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/methods_overview.md index 3ec5c888..b8d957e7 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/methods_overview.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/methods_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: 메서드 개요 title: 메서드 개요 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 메서드 개요를 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드할 수 있습니다. +description: 데이터 로드 및 저장, 셀 편집, 스타일 지정, 병합, 정렬, 필터링, 시트 관리를 위한 DHTMLX Spreadsheet 메서드 목록입니다. --- # 메서드 개요 {#methods-overview} @@ -11,6 +11,7 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 메서 | [](api/spreadsheet_addcolumn_method.md) | @getshort(../spreadsheet_addcolumn_method.md) | | [](api/spreadsheet_addformula_method.md) | @getshort(../spreadsheet_addformula_method.md) | | [](api/spreadsheet_addrow_method.md) | @getshort(../spreadsheet_addrow_method.md) | +| [](api/spreadsheet_announce_method.md) | @getshort(../spreadsheet_announce_method.md) | | [](api/spreadsheet_clear_method.md) | @getshort(../spreadsheet_clear_method.md) | | [](api/spreadsheet_deletecolumn_method.md) | @getshort(../spreadsheet_deletecolumn_method.md) | | [](api/spreadsheet_deleterow_method.md) | @getshort(../spreadsheet_deleterow_method.md) | diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/properties_overview.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/properties_overview.md index 14ea5ad2..77a2b100 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/properties_overview.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/properties_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: 속성 개요 title: 속성 개요 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 속성 개요를 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드할 수 있습니다. +description: 툴바, 메뉴, 읽기 전용 모드, 셀 선택, 그리드 크기 등을 설정하는 DHTMLX Spreadsheet 구성 속성 목록입니다. --- # 속성 개요 {#properties-overview} @@ -18,4 +18,5 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 속성 | [](api/spreadsheet_multisheets_config.md) | @getshort(../spreadsheet_multisheets_config.md) | | [](api/spreadsheet_readonly_config.md) | @getshort(../spreadsheet_readonly_config.md) | | [](api/spreadsheet_rowscount_config.md) | @getshort(../spreadsheet_rowscount_config.md) | +| [](api/spreadsheet_selection_config.md) | @getshort(../spreadsheet_selection_config.md) | | [](api/spreadsheet_toolbarblocks_config.md) | @getshort(../spreadsheet_toolbarblocks_config.md) | diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/selection_overview.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/selection_overview.md index 886c69c6..d35042aa 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/selection_overview.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/selection_overview.md @@ -1,15 +1,18 @@ --- sidebar_label: Selection 메서드 개요 title: Selection 메서드 개요 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 Selection 메서드 개요를 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드할 수 있습니다. +description: 셀 선택, 포커스 설정, 셀 선택 해제 및 활성화를 위한 DHTMLX Spreadsheet selection 모듈 메서드 목록입니다. --- # Selection 메서드 개요 {#selection-methods-overview} | 이름 | 설명 | | :--------------------------------------------- | :---------------------------------------------------- | +| [](api/selection_disable_method.md) | @getshort(../selection_disable_method.md) | +| [](api/selection_enable_method.md) | @getshort(../selection_enable_method.md) | | [](api/selection_getfocusedcell_method.md) | @getshort(../selection_getfocusedcell_method.md) | | [](api/selection_getselectedcell_method.md) | @getshort(../selection_getselectedcell_method.md) | +| [](api/selection_isdisabled_method.md) | @getshort(../selection_isdisabled_method.md) | | [](api/selection_removeselectedcell_method.md) | @getshort(../selection_removeselectedcell_method.md) | | [](api/selection_setfocusedcell_method.md) | @getshort(../selection_setfocusedcell_method.md) | | [](api/selection_setselectedcell_method.md) | @getshort(../selection_setselectedcell_method.md) | diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_disable_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_disable_method.md new file mode 100644 index 00000000..0fb88a50 --- /dev/null +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_disable_method.md @@ -0,0 +1,47 @@ +--- +sidebar_label: disable() +title: disable selection 메서드 +description: DHTMLX Spreadsheet에서 selection.disable() 메서드로 런타임에 셀 선택 기능을 끌 수 있습니다. 이 메서드는 활성 셀을 제거하고 마우스, 키보드, API를 통한 선택을 무시합니다. +--- + +# disable() + +### 설명 {#description} + +@short: 셀 선택 기능을 끕니다 + +### 사용법 {#usage} + +~~~jsx +disable(): void; +~~~ + +### 예제 {#example} + +~~~jsx {6} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + // config parameters +}); +spreadsheet.parse(data); + +spreadsheet.selection.disable(); +~~~ + +### 상세 설명 {#details} + +이 메서드는 다음과 같이 동작합니다. + +- 셀 편집을 종료하고 입력된 값을 저장합니다 +- 모든 시트에서 선택된 셀과 활성 셀을 제거합니다 +- [`enable()`](api/selection_enable_method.md) 메서드가 호출될 때까지 마우스, 키보드, API를 통한 선택을 무시합니다 + +선택 기능이 꺼져 있는 동안 [`getSelectedCell()`](api/selection_getselectedcell_method.md) 및 [`getFocusedCell()`](api/selection_getfocusedcell_method.md) 메서드는 `undefined`를 반환합니다. 그 밖의 동작은 [`selection: false`](api/spreadsheet_selection_config.md#details) 구성 옵션을 사용할 때와 동일합니다. + +선택 기능이 이미 꺼져 있으면 이 메서드는 아무 동작도 하지 않습니다. + +**변경 로그:** v6.0.4에서 추가됨 + +**관련 문서:** +- [`selection`](api/spreadsheet_selection_config.md) +- [`enable()`](api/selection_enable_method.md) +- [접근성: 읽기 전용 설정](accessibility.md#read-only-setup) diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_enable_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_enable_method.md new file mode 100644 index 00000000..df76be54 --- /dev/null +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_enable_method.md @@ -0,0 +1,42 @@ +--- +sidebar_label: enable() +title: enable selection 메서드 +description: DHTMLX Spreadsheet에서 selection.enable() 메서드로 셀 선택 기능을 다시 켤 수 있습니다. 이 메서드는 A1 셀을 활성화하고 선택 관련 이벤트를 발생시킵니다. +--- + +# enable() + +### 설명 {#description} + +@short: 셀 선택 기능을 켭니다 + +### 사용법 {#usage} + +~~~jsx +enable(): void; +~~~ + +### 예제 {#example} + +~~~jsx {7} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, + // other config parameters +}); +spreadsheet.parse(data); + +spreadsheet.selection.enable(); +~~~ + +### 상세 설명 {#details} + +이 메서드는 활성 시트의 A1 셀을 활성 셀로 만듭니다. A1 셀에 대해 [`beforeSelectionSet`](api/spreadsheet_beforeselectionset_event.md), [`beforeFocusSet`](api/spreadsheet_beforefocusset_event.md), [`afterFocusSet`](api/spreadsheet_afterfocusset_event.md), [`afterSelectionSet`](api/spreadsheet_afterselectionset_event.md) 이벤트가 발생합니다. + +선택 기능이 이미 켜져 있으면 이 메서드는 아무 동작도 하지 않습니다. + +**변경 로그:** v6.0.4에서 추가됨 + +**관련 문서:** +- [`selection`](api/spreadsheet_selection_config.md) +- [`disable()`](api/selection_disable_method.md) +- [접근성: 읽기 전용 설정](accessibility.md#read-only-setup) diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md new file mode 100644 index 00000000..23fc8482 --- /dev/null +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md @@ -0,0 +1,41 @@ +--- +sidebar_label: isDisabled() +title: isDisabled selection 메서드 +description: DHTMLX Spreadsheet에서 selection.isDisabled() 메서드로 셀 선택 기능이 꺼져 있는지 확인할 수 있습니다. +--- + +# isDisabled() + +### 설명 {#description} + +@short: 셀 선택 기능이 꺼져 있는지 확인합니다 + +### 사용법 {#usage} + +~~~jsx +isDisabled(): boolean; +~~~ + +### 반환값 {#returns} + +선택 기능이 꺼져 있으면 `true`를, 그렇지 않으면 `false`를 반환합니다 + +### 예제 {#example} + +~~~jsx {7} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, + // other config parameters +}); +spreadsheet.parse(data); + +const disabled = spreadsheet.selection.isDisabled(); // -> true +~~~ + +**변경 로그:** v6.0.4에서 추가됨 + +**관련 문서:** +- [`selection`](api/spreadsheet_selection_config.md) +- [`enable()`](api/selection_enable_method.md) +- [`disable()`](api/selection_disable_method.md) +- [접근성: 읽기 전용 설정](accessibility.md#read-only-setup) diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md index 3a162a2d..a6880adc 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setFocusedCell() title: setFocusedCell selection 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 setFocusedCell selection 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 selection.setFocusedCell() 메서드로 셀을 활성화하고 키보드 포커스를 해당 셀로 이동합니다. --- # setFocusedCell() @@ -13,12 +13,13 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 setFocus ### 사용법 {#usage} ~~~jsx -setFocusedCell(cell: string): void; +setFocusedCell(cell: string, scroll?: boolean): void; ~~~ ### 매개변수 {#parameters} - `cell` - (필수) 포커스를 설정할 셀의 id +- `scroll` - (선택 사항) Spreadsheet를 해당 셀로 스크롤할지 여부이며, 기본값은 `true`입니다 ### 예제 {#example} @@ -31,4 +32,24 @@ spreadsheet.parse(data); spreadsheet.selection.setFocusedCell("D4"); ~~~ -**관련 문서:** [Spreadsheet 작업하기](working_with_ssheet.md) +### 상세 정보 {#details} + +이 메서드는 지정된 셀을 활성 셀로 만들고, 다시 그려진 후 키보드 포커스를 해당 셀로 이동합니다. 키보드 포커스가 다음 위치에 있는 경우에는 이동하지 않습니다: + +- Spreadsheet 외부의 요소 +- 키보드로 이동한 툴바, 메뉴 또는 시트 탭 +- 열려 있는 셀 에디터 + +키보드 포커스가 페이지 body에 있는 경우(예: 페이지를 로드한 직후) 이 메서드는 포커스를 셀로 이동합니다. + +다른 API 메서드 등으로 활성 셀을 변경하는 경우에도 동일한 규칙이 적용됩니다. + +[`beforeFocusSet`](api/spreadsheet_beforefocusset_event.md) 이벤트 핸들러가 `false`를 반환하면 활성 셀이 변경되지 않으며 키보드 포커스도 이동하지 않습니다. + +[`selection: false`](api/spreadsheet_selection_config.md) 구성 옵션 또는 [`selection.disable()`](api/selection_disable_method.md) 메서드로 선택이 비활성화된 동안에는 이 메서드가 아무 작업도 하지 않습니다. + +**변경 로그:** 셀로 키보드 포커스를 이동하는 기능이 v6.0.4에서 추가됨 + +**관련 문서:** +- [Spreadsheet 작업하기](working_with_ssheet.md) +- [접근성: 키보드 탐색](accessibility.md#keyboard-navigation) diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md index b853979c..e53e22a2 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md @@ -13,12 +13,13 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 setSelec ### 사용법 {#usage} ~~~jsx -setSelectedCell(cell: string): void; +setSelectedCell(cell: string, scroll?: boolean): void; ~~~ ### 매개변수 {#parameters} - `cell` - (필수) 선택할 셀의 id 또는 범위 +- `scroll` - (선택 사항) Spreadsheet를 해당 셀로 스크롤할지 여부이며, 기본값은 `true`입니다 ### 예제 {#example} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md index 5de85602..ebf8190b 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md @@ -13,7 +13,21 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 afterAct ### 사용법 {#usage} ~~~jsx -afterAction: (action: string, config: object) => void; +afterAction: ( + action: string, + config: { + action?: string, + cell?: string, + row?: number, + col?: number, + val?: any, + prev?: any, + groupAction?: string, + pageId?: string | number, + pageName?: string, + // other properties of the action + } | object[] +) => void; ~~~ ### 매개변수 {#parameters} @@ -21,7 +35,18 @@ afterAction: (action: string, config: object) => void; 이벤트의 callback은 다음 매개변수를 받습니다: - `action` - (필수) 액션의 이름. 사용 가능한 액션의 전체 목록은 [여기](api/overview/actions_overview.md#list-of-actions)를 참조하세요. -- `config` - (필수) 액션의 매개변수를 포함한 객체 +- `config` - (필수) 액션의 매개변수를 포함한 객체. 속성 집합은 액션에 따라 다릅니다. 객체에는 다음이 포함될 수 있습니다: + - `action` - (선택 사항) 액션의 이름 + - `cell` - (선택 사항) 액션이 적용되는 셀 또는 셀 범위의 id (예: `"A1"` 또는 `"B2:D5"`) + - `row` - (선택 사항) 셀이 위치한 행의 0부터 시작하는 인덱스 + - `col` - (선택 사항) 셀이 위치한 열의 0부터 시작하는 인덱스 + - `val` - (선택 사항) 액션이 적용하는 새 값 (예: 셀 값, 스타일 또는 크기) + - `prev` - (선택 사항) 이전 값 + - `groupAction` - (선택 사항) `cell`이 셀 범위일 때 `action` 대신 실행되는 액션의 이름 (예: `"groupAction"`, `"groupRowAction"` 또는 `"resizeCol"`) + - `pageId` - (선택 사항) 시트의 id + - `pageName` - (선택 사항) 시트의 이름 + + 붙여넣기처럼 여러 액션이 함께 실행되는 경우 `action` 매개변수는 `"groupAction"`이며, `config`는 이러한 객체의 배열입니다. ### 예제 {#example} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md new file mode 100644 index 00000000..9d56a324 --- /dev/null +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md @@ -0,0 +1,67 @@ +--- +sidebar_label: announce() +title: announce 메서드 +description: DHTMLX Spreadsheet에서 announce() 메서드로 스크린 리더 사용자에게 상태 메시지를 전달할 수 있습니다. 예를 들어 사용자 정의 툴바 또는 메뉴 명령의 실행 결과를 알릴 때 사용합니다. +--- + +# announce() + +### 설명 {#description} + +@short: 스크린 리더 사용자에게 메시지를 알립니다 + +### 사용법 {#usage} + +~~~jsx +announce(message: string): void; +~~~ + +### 매개변수 {#parameters} + +- `message` - (필수) 알릴 텍스트. 빈 문자열을 전달하면 메시지가 지워집니다 + +### 예제 {#example} + +아래 예제에서는 사용자 정의 메뉴 명령이 선택한 범위의 빈 셀 개수를 세고 그 결과를 알립니다. + +~~~jsx {18} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + menu: true, + // other config parameters +}); +spreadsheet.parse(data); + +spreadsheet.menu.data.add({ + id: "count-empty", + value: "Count empty cells" +}); + +spreadsheet.menu.events.on("click", function (id) { + if (id === "count-empty") { + let count = 0; + spreadsheet.eachCell(function (cell, value) { + if (value === "" || value === undefined || value === null) count++; + }, spreadsheet.selection.getSelectedCell()); + spreadsheet.announce(count + " empty cells in the selection"); + } +}); +~~~ + +### 상세 설명 {#details} + +사용자 정의 툴바 또는 메뉴 명령처럼 화면에 표시되는 요소가 따로 없는 동작의 결과를 스크린 리더 사용자에게 알려야 할 때 이 메서드를 사용합니다. + +메시지는 그리드 요소 바로 뒤에 있는 시각적으로 숨겨진 라이브 영역(`role="status"`, `aria-live="polite"`, `aria-atomic="true"`)으로 전달됩니다. 스크린 리더는 현재 읽고 있는 음성이 끝난 뒤에 이 메시지를 읽으며, 키보드 포커스는 이동하지 않습니다. + +Spreadsheet도 같은 영역을 통해 자체 메시지를 알립니다. 선택한 범위, 새로 발생한 수식 오류와 잘못된 값, 거부된 편집, 검색 결과, 가져오기와 내보내기의 시작 및 종료, 새 열 너비와 행 높이가 이에 해당합니다([상태 알림 목록](accessibility.md#status-announcements) 참조). 이 영역은 한 번에 하나의 메시지만 유지하므로, 나중에 전달된 메시지는 직접 보낸 메시지이든 기본 제공 메시지이든 이전 메시지를 대체합니다. + +영역에 현재 들어 있는 텍스트와 같은 텍스트를 전달하면 스크린 리더가 해당 텍스트를 다시 읽습니다. + +이 메서드는 [읽기 전용 모드](api/spreadsheet_readonly_config.md)에서도, [선택](api/spreadsheet_selection_config.md) 기능이 꺼져 있는 동안에도 동작합니다. Spreadsheet가 페이지에 연결되기 전이나 `destructor()` 메서드가 호출된 후에는 아무 동작도 하지 않습니다. + +**변경 로그:** v6.0.4에서 추가됨 + +**관련 문서:** +- [상태 알림](accessibility.md#status-announcements) +- [사용자 정의 명령 알리기](accessibility.md#announcing-a-custom-command) +- [메뉴 커스터마이징](customization.md#menu) diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md index e9dc2c31..e09f1311 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md @@ -13,7 +13,21 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 beforeAc ### 사용법 {#usage} ~~~jsx -beforeAction: (action: string, config: object) => void | boolean; +beforeAction: ( + action: string, + config: { + action?: string, + cell?: string, + row?: number, + col?: number, + val?: any, + prev?: any, + groupAction?: string, + pageId?: string | number, + pageName?: string, + // other properties of the action + } | object[] +) => void | boolean; ~~~ ### 매개변수 {#parameters} @@ -21,7 +35,18 @@ beforeAction: (action: string, config: object) => void | boolean; 이벤트의 callback은 다음 매개변수를 받습니다: - `action` - (필수) 액션의 이름. 사용 가능한 액션의 전체 목록은 [여기](api/overview/actions_overview.md#list-of-actions)에서 확인하세요 -- `config` - (필수) 액션의 매개변수를 포함하는 객체 +- `config` - (필수) 액션의 매개변수를 포함한 객체. 속성 집합은 액션에 따라 다릅니다. 객체에는 다음이 포함될 수 있습니다: + - `action` - (선택 사항) 액션의 이름 + - `cell` - (선택 사항) 액션이 적용되는 셀 또는 셀 범위의 id (예: `"A1"` 또는 `"B2:D5"`) + - `row` - (선택 사항) 셀이 위치한 행의 0부터 시작하는 인덱스 + - `col` - (선택 사항) 셀이 위치한 열의 0부터 시작하는 인덱스 + - `val` - (선택 사항) 액션이 적용하는 새 값 (예: 셀 값, 스타일 또는 크기) + - `prev` - (선택 사항) 이전 값 + - `groupAction` - (선택 사항) `cell`이 셀 범위일 때 `action` 대신 실행되는 액션의 이름 (예: `"groupAction"`, `"groupRowAction"` 또는 `"resizeCol"`) + - `pageId` - (선택 사항) 시트의 id + - `pageName` - (선택 사항) 시트의 이름 + + 붙여넣기처럼 여러 액션이 함께 실행되는 경우 `action` 매개변수는 `"groupAction"`이며, `config`는 이러한 객체의 배열입니다. ### 반환값 {#returns} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md index aa626c11..447d67c1 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md @@ -1,7 +1,7 @@ --- sidebar_label: deleteColumn() title: deleteColumn 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 문서에서 deleteColumn 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 체험하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 deleteColumn() 메서드로 열 또는 열 범위를 제거합니다. 병합된 셀의 모든 열도 함께 제거됩니다. --- # deleteColumn() @@ -11,7 +11,9 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리의 문서에서 delet @short: 스프레드시트에서 열을 제거합니다 :::info -이 메서드는 지정된 셀을 찾아 선택한 다음, 해당 셀이 위치한 열을 제거하고 왼쪽 열을 해당 위치로 이동합니다. +이 메서드는 지정된 셀이 위치한 열을 제거하고, 그 오른쪽에 있는 열을 왼쪽으로 이동합니다. + +셀이 병합된 셀 안에 있으면 병합된 셀이 걸쳐 있는 모든 열을 제거합니다. ::: ### 사용법 {#usage} @@ -35,7 +37,27 @@ spreadsheet.deleteColumn("G2"); ~~~ :::note -"A1:C3"과 같이 셀 id의 범위를 메서드의 매개변수로 제공하여 여러 열을 삭제할 수 있습니다. +"A1:C3"과 같이 셀 id의 범위를 메서드의 매개변수로 제공하여 여러 열을 삭제할 수 있습니다. 범위가 병합된 셀에 닿아 있으면 병합된 셀 전체의 열이 삭제됩니다. 예를 들어 행이 100개인 시트에서 "B1:C100"처럼 전체 열을 포함하는 범위는 그대로 삭제됩니다. ::: -**관련 문서:** [스프레드시트 작업](working_with_ssheet.md#addingremoving-rows-and-columns) +### 상세 정보 {#details} + +병합된 셀 안의 열을 삭제하면 병합된 셀 전체가 모든 열과 함께 삭제됩니다: + +~~~jsx +spreadsheet.mergeCells("B2:D2"); + +// removes columns B, C and D +spreadsheet.deleteColumn("C2"); +~~~ + +전체 열을 삭제하면 해당 열에 걸쳐 있던 병합된 셀의 크기가 작아집니다. 삭제된 열의 오른쪽에 있는 병합된 셀은 해당 열과 함께 왼쪽으로 이동합니다. 삭제된 열이 고정된 열이면 고정 영역이 삭제된 고정 열의 개수만큼 줄어듭니다. + +`"deleteColumn"` 액션의 [`beforeAction`](api/spreadsheet_beforeaction_event.md) 및 [`afterAction`](api/spreadsheet_afteraction_event.md) 이벤트는 삭제된 열의 범위가 아니라 메서드에 전달된 셀을 받습니다. + +**변경 로그:** 병합된 셀의 모든 열을 삭제하는 기능이 v6.0.4에서 추가됨 + +**관련 문서:** +- [행과 열 작업](work_with_rows_cols.md#removing-columns) +- [셀 병합](merge_cells.md#removing-rows-and-columns-of-merged-cells) +- [스프레드시트 작업](working_with_ssheet.md#addingremoving-rows-and-columns) diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md index 4d060c00..c083b33b 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md @@ -1,7 +1,7 @@ --- sidebar_label: deleteRow() title: deleteRow 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 문서에서 deleteRow 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 체험하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 deleteRow() 메서드로 행 또는 행 범위를 제거합니다. 병합된 셀의 모든 행도 함께 제거됩니다. --- # deleteRow() @@ -11,7 +11,9 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리의 문서에서 delet @short: 스프레드시트에서 행을 제거합니다 :::info -이 메서드는 지정된 셀을 찾아 선택한 다음, 해당 셀이 위치한 행을 제거하고 아래 행을 해당 위치로 이동합니다. +이 메서드는 지정된 셀이 위치한 행을 제거하고, 그 아래에 있는 행을 위로 이동합니다. + +셀이 병합된 셀 안에 있으면 병합된 셀이 걸쳐 있는 모든 행을 제거합니다. ::: ### 사용법 {#usage} @@ -35,7 +37,27 @@ spreadsheet.deleteRow("G2"); ~~~ :::note -"A1:C3"과 같이 셀 id의 범위를 메서드의 매개변수로 제공하여 여러 행을 삭제할 수 있습니다. +"A1:C3"과 같이 셀 id의 범위를 메서드의 매개변수로 제공하여 여러 행을 삭제할 수 있습니다. 범위가 병합된 셀에 닿아 있으면 병합된 셀 전체의 행이 삭제됩니다. 예를 들어 A부터 Z까지 열이 있는 시트에서 "A2:Z3"처럼 전체 행을 포함하는 범위는 그대로 삭제됩니다. ::: -**관련 문서:** [스프레드시트 작업](working_with_ssheet.md#addingremoving-rows-and-columns) +### 상세 정보 {#details} + +병합된 셀 안의 행을 삭제하면 병합된 셀 전체가 모든 행과 함께 삭제됩니다: + +~~~jsx +spreadsheet.mergeCells("B2:B4"); + +// removes rows 2, 3 and 4 +spreadsheet.deleteRow("B3"); +~~~ + +전체 행을 삭제하면 해당 행에 걸쳐 있던 병합된 셀의 크기가 작아집니다. 삭제된 행의 아래에 있는 병합된 셀은 해당 행과 함께 위로 이동합니다. 삭제된 행이 고정된 행이면 고정 영역이 삭제된 고정 행의 개수만큼 줄어듭니다. + +`"deleteRow"` 액션의 [`beforeAction`](api/spreadsheet_beforeaction_event.md) 및 [`afterAction`](api/spreadsheet_afteraction_event.md) 이벤트는 삭제된 행의 범위가 아니라 메서드에 전달된 셀을 받습니다. + +**변경 로그:** 병합된 셀의 모든 행을 삭제하는 기능이 v6.0.4에서 추가됨 + +**관련 문서:** +- [행과 열 작업](work_with_rows_cols.md#removing-rows) +- [셀 병합](merge_cells.md#removing-rows-and-columns-of-merged-cells) +- [스프레드시트 작업](working_with_ssheet.md#addingremoving-rows-and-columns) diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md index d1468f7b..a40c9fc2 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md @@ -1,7 +1,7 @@ --- sidebar_label: readonly title: readonly 설정 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 readonly 설정에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet 30일 무료 평가판을 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 readonly 속성으로 읽기 전용 모드를 켭니다. 데이터 변경은 차단하지만 키보드 탐색, 선택, 복사 및 검색은 유지됩니다. --- # readonly @@ -31,7 +31,39 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { }); ~~~ +### 상세 정보 {#details} + +읽기 전용 모드에서는 툴바, 메뉴, 수식 입력줄이 숨겨지고 컨텍스트 메뉴와 열 메뉴 아이콘을 사용할 수 없습니다. 시트 탭은 유지되지만 시트 추가 버튼, 시트 컨텍스트 메뉴, 더블 클릭으로 이름 바꾸기는 제공되지 않습니다. + +사용자는 여전히 데이터를 읽고 복사할 수 있습니다: + +- 데이터가 로드된 후 A1 셀이 활성 상태가 됩니다 +- 키보드로 셀을 탐색하고 마우스로 선택할 수 있으며, 이러한 동작 시 선택 이벤트가 발생합니다 +- `Ctrl (Cmd) + C`로 셀을 복사하고 `Ctrl (Cmd) + F`로 검색할 수 있습니다 +- 시트 탭과 키보드로 시트를 전환할 수 있습니다 +- 셀의 링크를 열 수 있지만, 링크 팝업에서 링크를 편집하고 제거하는 버튼은 비활성화됩니다 + +데이터 변경은 거부됩니다: + +- 입력, 편집 키, 잘라내기와 붙여넣기, 실행 취소와 다시 실행, 셀 서식 지정·링크 삽입·시트 추가·숨겨진 행과 열 표시 단축키는 무시되며, 스크린 리더는 "The sheet is read-only"라고 안내합니다 +- [`setValue()`](api/spreadsheet_setvalue_method.md), [`setStyle()`](api/spreadsheet_setstyle_method.md), [`deleteRow()`](api/spreadsheet_deleterow_method.md) 등 데이터를 편집하는 메서드와 [`startEdit()`](api/spreadsheet_startedit_method.md) 메서드는 무시됩니다. [`parse()`](api/spreadsheet_parse_method.md) 및 [`load()`](api/spreadsheet_load_method.md) 메서드는 계속 데이터를 로드합니다 +- 채우기 핸들이 숨겨집니다 +- 열과 행의 경계를 드래그하여 크기를 조정할 수 없으며, 열 경계를 더블 클릭해도 열 너비가 데이터에 맞춰지지 않습니다 + +키보드 탐색과 선택도 끄려면 [`selection`](api/spreadsheet_selection_config.md) 옵션을 `false`로 설정하세요. 이 경우 Spreadsheet에는 활성 셀이 없으며, 마우스, 키보드 또는 API로 셀을 선택할 수 없습니다: + +~~~jsx {3} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, + selection: false, + // other config parameters +}); +~~~ + +**변경 로그:** 읽기 전용 모드에서의 키보드 탐색, 선택, 복사 및 검색이 v6.0.4에서 추가됨 + **관련 문서:** +- [접근성: 읽기 전용 설정](accessibility.md#read-only-setup) - [구성](configuration.md#read-only-mode) - [커스터마이징](customization.md#custom-read-only-mode) diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md new file mode 100644 index 00000000..5f00bc4f --- /dev/null +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md @@ -0,0 +1,63 @@ +--- +sidebar_label: selection +title: selection 구성 옵션 +description: DHTMLX Spreadsheet에서 selection 속성으로 셀 선택 기능을 끌 수 있습니다. 단독으로 사용하거나 읽기 전용 모드와 함께 사용하여 활성 셀 없이 데이터를 표시할 수 있습니다. +--- + +# selection + +### 설명 {#description} + +@short: 선택 사항. 셀 선택 기능을 활성화하거나 비활성화합니다 + +### 사용법 {#usage} + +~~~jsx +selection?: boolean; +~~~ + +### 기본 구성 {#default-config} + +~~~jsx +selection: true +~~~ + +### 예제 {#example} + +~~~jsx {2} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, + // other config parameters +}); +~~~ + +### 상세 설명 {#details} + +속성을 `false`로 설정하면 다음과 같이 동작합니다. + +- Spreadsheet에 활성 셀이 없습니다 +- 마우스, 키보드, API로 셀을 선택할 수 없습니다. [`setSelectedCell()`](api/selection_setselectedcell_method.md) 및 [`setFocusedCell()`](api/selection_setfocusedcell_method.md) 메서드는 무시되고, [`getSelectedCell()`](api/selection_getselectedcell_method.md) 및 [`getFocusedCell()`](api/selection_getfocusedcell_method.md) 메서드는 `undefined`를 반환합니다 +- 인터페이스에서 셀을 편집할 수 없습니다. 수식 입력줄이 잠기고, 채우기 핸들이 숨겨지며, [`startEdit()`](api/spreadsheet_startedit_method.md) 메서드는 무시됩니다 +- 컨텍스트 메뉴와 열 메뉴 아이콘을 사용할 수 없습니다 +- `Tab` 키는 그리드에서 한 번만 멈춘 뒤 포커스를 다음으로 이동하며, `Ctrl + F6`은 그리드를 건너뜁니다 + +열과 행은 테두리를 드래그하여 크기를 조절할 수 있으며, 데이터는 [`setValue()`](api/spreadsheet_setvalue_method.md) 메서드 같은 API로 여전히 변경할 수 있습니다. + +[`readonly`](api/spreadsheet_readonly_config.md) 속성과 함께 사용하면, 읽기 전용 모드에서 제공되는 키보드 탐색과 선택 기능까지 끌 수 있습니다. + +~~~jsx {3} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, + selection: false, + // other config parameters +}); +~~~ + +런타임에 선택 기능을 끄고 켜려면 [`selection.disable()`](api/selection_disable_method.md) 및 [`selection.enable()`](api/selection_enable_method.md) 메서드를 사용하세요. + +**변경 로그:** v6.0.4에서 추가됨 + +**관련 문서:** +- [셀 선택](configuration.md#selection-of-cells) +- [읽기 전용 모드](configuration.md#read-only-mode) +- [접근성: 읽기 전용 설정](accessibility.md#read-only-setup) diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md index 4f4a4f42..fcfc119f 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md @@ -35,4 +35,10 @@ spreadsheet.parse(data); spreadsheet.startEdit(); ~~~ +### 상세 정보 {#details} + +활성 셀에 입력하면 이 메서드를 통해 편집이 시작됩니다. 입력기(IME)로 조합한 텍스트는 조합이 끝날 때 `initialValue`로 전달됩니다. 따라서 [`beforeEditStart`](api/spreadsheet_beforeeditstart_event.md) 및 [`afterEditStart`](api/spreadsheet_aftereditstart_event.md) 이벤트는 입력한 텍스트 또는 조합한 텍스트를 받으며, `beforeEditStart`는 편집을 취소할 수 있습니다. + +**변경 로그:** IME로 조합한 텍스트로 편집을 시작하는 기능이 v6.0.4에서 추가됨 + **관련 문서:** [Spreadsheet 사용](working_with_cells.md#editing-a-cell) diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md b/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md index ff5bb1c4..6607d84f 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md @@ -1,7 +1,7 @@ --- sidebar_label: 구성 title: 구성 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 구성에 대해 문서에서 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 직접 실행해 보세요. DHTMLX Spreadsheet의 30일 무료 평가판도 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet를 구성합니다. 툴바, 편집 바, 메뉴, 행과 열의 수, 읽기 전용 모드, 셀 선택, 숫자 형식을 설정합니다. --- # 구성 {#configuration} @@ -48,10 +48,43 @@ Spreadsheet의 메뉴는 기본적으로 숨겨져 있습니다. 해당 구성 [`readonly`](api/spreadsheet_readonly_config.md) 구성 옵션을 통해 Spreadsheet 셀 편집을 방지하는 읽기 전용 모드를 활성화할 수도 있습니다. +~~~jsx {2} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, +}); +~~~ + +읽기 전용 모드에서는 툴바, 메뉴, 수식 바가 숨겨집니다. 사용자는 키보드로 셀을 탐색하고, 마우스로 선택하고, 복사하고, 검색할 수 있습니다. 편집은 거부되며 스크린 리더에 "The sheet is read-only"로 안내됩니다. 채우기 핸들은 숨겨집니다. 자세한 내용은 [`readonly`](api/spreadsheet_readonly_config.md#details) 문서를 확인하십시오. 키보드 및 스크린 리더 사용자가 읽기 전용 Spreadsheet를 사용하는 방법은 접근성 가이드의 [Read-only setup](accessibility.md#read-only-setup) 섹션을 참고하십시오. + +읽기 전용 모드에서 키보드 탐색과 선택을 끄려면 [`selection`](api/spreadsheet_selection_config.md) 옵션을 `false`로 설정합니다: + +~~~jsx {3} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, + selection: false, +}); +~~~ + [Spreadsheet의 읽기 전용 동작을 커스터마이징](customization.md#custom-read-only-mode)할 수도 있습니다. +## 셀 선택 {#selection-of-cells} + +기본적으로 사용자는 마우스와 키보드로 셀을 선택할 수 있으며, Spreadsheet에는 활성 셀이 있습니다. 선택을 끄려면 [`selection`](api/spreadsheet_selection_config.md) 구성 옵션을 `false`로 설정합니다: + +~~~jsx {2} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, +}); +~~~ + +이 경우 Spreadsheet에는 활성 셀이 없으며, 인터페이스에서 셀을 선택하거나 편집할 수 없고 컨텍스트 메뉴도 사용할 수 없습니다. + +런타임에 선택을 끄고 켜려면 [`selection.disable()`](api/selection_disable_method.md) 및 [`selection.enable()`](api/selection_enable_method.md) 메서드를 사용합니다. [`selection.isDisabled()`](api/selection_isdisabled_method.md) 메서드는 선택이 꺼져 있는지 확인합니다. + +선택이 없으면 그리드는 키보드가 그냥 지나가는 하나의 탭 정지 지점이 됩니다. 접근성 가이드의 [Read-only setup](accessibility.md#read-only-setup) 섹션을 확인하십시오. + ## 셀에 대한 사용자 정의 숫자 형식 {#custom-number-formats-for-cells} 셀 값에 7가지 기본 형식을 적용할 수 있습니다: "Common", "Number", "Percent", "Currency", "Date", "Time", "Text". diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/customization.md b/i18n/ko/docusaurus-plugin-content-docs/current/customization.md index 161b055a..492197e6 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/customization.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/customization.md @@ -1,7 +1,7 @@ --- sidebar_label: 커스터마이징 title: 커스터마이징 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 커스터마이징에 대해 문서에서 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 직접 실행해 보세요. DHTMLX Spreadsheet의 30일 무료 평가판도 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet를 커스터마이징합니다. 아이콘을 변경하고, 툴바, 메뉴, 컨텍스트 메뉴의 컨트롤을 추가, 업데이트, 삭제하거나 사용자 정의 읽기 전용 모드를 구현합니다. --- # 커스터마이징 {#customization} @@ -31,6 +31,8 @@ DHTMLX Spreadsheet는 기본적으로 [Material Design](https://pictogrammers.co `button`, `menuItem`, `separator`, `spacer` 유형의 컨트롤을 추가할 수 있습니다. +[기본 툴바](#default-controls)의 다른 컨트롤과 마찬가지로 *텍스트 색상* 및 *배경색* 컨트롤과 *테두리* 팝업의 *테두리 색상* 컨트롤은 [`navItem`](https://docs.dhtmlx.com/suite/toolbar/navitem/) 유형입니다. 이 컨트롤은 [`html`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/) 속성으로 현재 색상을 표시하고, [`value`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/) 속성에서 접근 가능한 이름(예: "Text color: dark gray")을 가져오며, 색상 팝업을 엽니다. Spreadsheet는 활성 셀이 변경되면 *텍스트 색상* 및 *배경색* 컨트롤의 두 속성을 업데이트하고, 테두리 색상을 선택하면 *테두리 색상* 컨트롤의 두 속성을 업데이트합니다. + `button` 객체에는 다음 속성이 있습니다: - `type` - 버튼 유형, "button"으로 설정 @@ -379,7 +381,8 @@ spreadsheet.menu.data.remove("undo"); - **열** menuItem (id: "columns") - *열 추가* menuItem (id: "add-col") - *열 제거* menuItem (id: "remove-col") - - *데이터에 맞추기* menuItem (id: "fit-col") + - *데이터에 맞추기* menuItem (id: "fit-col"), 열 메뉴와 전체 열이 선택된 경우에 표시됨 + - *열 너비* menuItem (id: "col-width") - 구분선 - *열 고정 해제* menuItem (id: "unfreeze-cols") - *[id]열까지 고정* menuItem (id: "freeze-cols") @@ -388,6 +391,7 @@ spreadsheet.menu.data.remove("undo"); - **행** menuItem (id: "rows") - *행 추가* menuItem (id: "add-row") - *행 제거* menuItem (id: "remove-row") + - *행 높이* menuItem (id: "row-height") - 구분선 - *행 고정 해제* menuItem (id: "unfreeze-rows") - *[id]행까지 고정* menuItem (id: "freeze-rows") @@ -396,6 +400,7 @@ spreadsheet.menu.data.remove("undo"); - **정렬** menuItem (id: "sort") - *A에서 Z로 정렬* menuItem (id: "asc-sort") - *Z에서 A로 정렬* menuItem (id: "desc-sort") +- **필터 열기** menuItem (id: "open-filter"), 활성 셀에 필터 아이콘이 있을 때 표시됨 - **링크 삽입** menuItem (id: "link") ### 컨트롤 추가 {#adding-controls-3} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/data_search.md b/i18n/ko/docusaurus-plugin-content-docs/current/data_search.md index 97049f87..08192012 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/data_search.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/data_search.md @@ -1,7 +1,7 @@ --- sidebar_label: 데이터 검색 title: 데이터 검색 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 데이터 검색에 대해 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 직접 실행해 보세요. DHTMLX Spreadsheet의 30일 무료 평가판도 다운로드할 수 있습니다. +description: 검색 바로 DHTMLX Spreadsheet에서 데이터를 검색합니다. Ctrl (Cmd) + F 또는 데이터 메뉴로 열고, 일치 항목 사이를 이동하며, Esc로 닫습니다. --- # 데이터 검색 {#searching-for-data} @@ -12,3 +12,11 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 데이 - 또는 *데이터* -> *검색*으로 이동합니다 ![데이터 검색을 위한 텍스트 입력이 있는 DHTMLX Spreadsheet 검색 바](/img/search_data.png) + +검색 바에 찾을 텍스트를 입력합니다. 텍스트가 포함된 첫 번째 셀이 강조 표시되고 화면에 스크롤되며, 카운터에 일치 항목 수가 표시됩니다. 일치 항목 사이를 이동하려면 검색 바의 화살표 버튼을 클릭합니다. + +검색 결과는 셀을 편집한 후와 다른 시트를 연 후에 업데이트됩니다. 스크린 리더는 입력을 멈춘 뒤 일치 항목 수와 첫 번째 일치 항목의 주소를 안내합니다(예: "Results: 5. 1 of 5, B2" 또는 "No results"). 다른 일치 항목으로 이동하면 해당 항목의 위치와 주소를 안내합니다(예: "2 of 5, B7"). + +검색 바를 닫으려면 **Esc**를 누르거나 닫기 버튼을 클릭합니다. 포커스는 활성 셀로 돌아갑니다. + +API로 데이터를 검색하려면 [`search()`](api/spreadsheet_search_method.md) 메서드를 사용합니다. diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/excel_import_export.md b/i18n/ko/docusaurus-plugin-content-docs/current/excel_import_export.md index 154a9c52..ae8b62b2 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/excel_import_export.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/excel_import_export.md @@ -1,7 +1,7 @@ --- sidebar_label: Excel 가져오기/내보내기 title: Excel 가져오기 및 내보내기 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 Excel 가져오기 및 내보내기에 대해 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 직접 실행해 보세요. DHTMLX Spreadsheet의 30일 무료 평가판도 다운로드할 수 있습니다. +description: Excel 파일의 데이터를 DHTMLX Spreadsheet로 가져오고 툴바 또는 파일 메뉴에서 .xlsx로 내보냅니다. --- # Excel 가져오기/내보내기 {#excel-importexport} @@ -37,3 +37,9 @@ Spreadsheet에 입력한 데이터를 Excel 파일로 내보낼 수 있습니다 ![Microsoft Excel XLSX 내보내기를 위한 다음으로 다운로드 옵션이 있는 DHTMLX Spreadsheet 파일 메뉴](/img/file_export.png) 2\. 다운로드 디렉터리에서 Spreadsheet의 데이터가 포함된 Excel 파일을 확인합니다. + +스크린 리더는 가져오기와 내보내기의 시작과 끝을 안내합니다. + +:::note +Excel 파일의 가져오기와 내보내기는 WebAssembly를 사용합니다. 브라우저가 WebAssembly를 지원하지 않으면 Import 및 Export 명령이 `wasmNotSupported` [로케일](localization.md#default-locale) 키의 텍스트로 메시지를 표시합니다. `"xlsx"` 유형의 [`load()`](api/spreadsheet_load_method.md) 메서드와 [`export.xlsx()`](api/export_xlsx_method.md) 메서드는 같은 텍스트의 `Error`를 발생시키며, 코드에서 이를 잡아 처리할 수 있습니다. +::: diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/filtering_data.md b/i18n/ko/docusaurus-plugin-content-docs/current/filtering_data.md index 2653216a..2972ebbc 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/filtering_data.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/filtering_data.md @@ -1,7 +1,7 @@ --- sidebar_label: 데이터 필터링 title: 데이터 필터링 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 데이터 필터링에 대해 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 직접 실행해 보세요. DHTMLX Spreadsheet의 30일 무료 평가판도 다운로드할 수 있습니다. +description: 조건 또는 값으로 DHTMLX Spreadsheet의 데이터를 필터링하고, 키보드로 필터를 열고, 필터를 지우거나 제거합니다. --- # 데이터 필터링 {#filtering-data} @@ -36,6 +36,20 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 데이 ![필터를 지우기 위한 조건으로 없음 옵션이 있는 DHTMLX Spreadsheet 필터 대화상자](/img/clear_filter_bycondition.png) +## 키보드로 필터 열기 {#opening-a-filter-with-the-keyboard} + +마우스 없이 열의 필터를 열려면 다음과 같이 합니다: + +- 활성 셀을 **필터** 아이콘이 있는 열 헤더 셀로 이동합니다 + +- `Shift + F10` 또는 Menu 키를 눌러 컨텍스트 메뉴를 호출하고 *필터 열기*를 선택합니다 + +![필터 아이콘이 있는 헤더 셀의 DHTMLX Spreadsheet 컨텍스트 메뉴에서 필터 열기 명령에 포커스가 있는 모습](/img/open_filter_context_menu.png) + +*필터 열기* 명령은 **필터** 아이콘이 있는 셀의 컨텍스트 메뉴에만 나타납니다. 해당 셀을 마우스 오른쪽 버튼으로 클릭한 후에도 선택할 수 있습니다. [읽기 전용 모드](api/spreadsheet_readonly_config.md)에서는 컨텍스트 메뉴와 *필터 열기* 명령을 사용할 수 없습니다. + +필터 팝업이 포커스를 받으며, `Tab`으로 팝업의 컨트롤 사이를 이동합니다. `Esc`는 팝업을 닫고 포커스를 셀로 돌려줍니다. 팝업에 드롭다운 목록이나 날짜 선택기가 열려 있으면 `Esc`가 먼저 그것을 닫습니다. + ## 값으로 필터링 {#filtering-by-values} - 해당 열의 **필터** 아이콘을 클릭합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/guides.md b/i18n/ko/docusaurus-plugin-content-docs/current/guides.md index d3314553..8919df19 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/guides.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/guides.md @@ -1,12 +1,12 @@ --- sidebar_label: 가이드 개요 title: 개발자 및 사용자 가이드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 개발자 및 사용자 가이드를 학습할 수 있습니다. API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보고, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하십시오. +description: DHTMLX Spreadsheet의 개발자 및 사용자 가이드로, 초기화, 구성, 데이터 로드부터 셀 편집, 서식 지정, 시트 작업까지 다룹니다. --- # 가이드 {#guides} -DHTMLX Spreadsheet는 다양한 형식의 데이터 가져오기 및 내보내기, 셀 내용 및 스타일 작업의 편의성, 유연한 스프레드시트 구조, 읽기 전용 모드, 광범위한 외관 커스터마이징, 인기 프레임워크와의 통합 등 폭넓은 기능을 제공합니다. +DHTMLX Spreadsheet는 다양한 형식의 데이터 가져오기 및 내보내기, 셀 내용 및 스타일 작업의 편의성, 유연한 스프레드시트 구조, 읽기 전용 모드, 광범위한 외관 커스터마이징, 키보드 및 스크린 리더 접근성, 인기 프레임워크와의 통합 등 폭넓은 기능을 제공합니다. ## 개발자 가이드 {#developer-guides} @@ -38,6 +38,12 @@ Spreadsheet에 데이터를 로드하고, 이벤트를 처리하며, 주요 기 - [Svelte와의 통합](svelte_integration.md) - Svelte 앱에서 Spreadsheet를 사용하는 GitHub 데모 - [Vue.js와의 통합](vuejs_integration.md) - Vue 앱에서 Spreadsheet를 사용하는 GitHub 데모 +### 접근성 {#accessibility} + +- [접근성](accessibility.md) - WAI-ARIA 지원, 키보드 탐색, 스크린 리더 안내, 고대비 테마 +- [접근 가능한 Spreadsheet 설정하기](accessibility.md#configuration-recipes) - 읽기 전용 모드를 포함한 키보드 및 스크린 리더 사용자를 위한 구성 +- [준수 보고서 (VPAT)](accessibility_conformance_report.md) - WCAG 2.2 AA, Section 508, EN 301 549 준수 여부 + ### AI 지원 개발 {#ai-assisted-development} - [DHTMLX MCP 서버](mcp-server.md) - AI 코딩 어시스턴트를 실시간 Spreadsheet 문서에 연결 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/hotkeys.md b/i18n/ko/docusaurus-plugin-content-docs/current/hotkeys.md index 3b6bcd03..9b13f493 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/hotkeys.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/hotkeys.md @@ -1,13 +1,21 @@ --- sidebar_label: 단축키 목록 title: 단축키 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 단축키에 대해 학습할 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보고, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하십시오. +description: 편집, 서식 지정, 탐색, 선택, 검색, 시트·행·열 작업, 팝업과 대화 상자에 사용하는 DHTMLX Spreadsheet 단축키입니다. --- # 단축키 목록 {#hot-keys-list} 다음은 DHTMLX Spreadsheet 사용 시 활용할 수 있는 단축키 목록입니다. +:::note +셀 단축키는 포커스가 셀 또는 수식 입력줄에 있을 때 작동합니다. 서식 지정, 실행 취소, 검색, 링크, 시트 추가 단축키는 포커스가 툴바에 있을 때도 작동합니다. 포커스가 툴바, 메뉴 바 또는 시트 탭에 있을 때는 화살표 키, **Home**, **End**, **Enter**, **Space**가 해당 바 내에서 작동합니다([포커스 이동](#moving-the-focus) 참조). + +[읽기 전용 모드](api/spreadsheet_readonly_config.md)에서는 탐색, 선택, 복사, 검색 단축키가 작동합니다. **Ctrl (Cmd) + Shift + 9**, **Ctrl (Cmd) + Shift + 0**, **Shift + F11**을 포함하여 시트를 변경하는 단축키는 거부되며, 스크린 리더는 "The sheet is read-only"를 안내합니다. 컨텍스트 메뉴는 사용할 수 없으므로 **Shift + F10**과 Menu 키는 작동하지 않습니다. + +키보드 탐색이 스크린 리더와 함께 작동하는 방식은 [접근성](accessibility.md#keyboard-navigation) 가이드를 참조하십시오. +::: + ## 편집 {#editing} @@ -28,6 +36,10 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 단축 + + + +
Esc 변경 사항을 저장하지 않고 셀 편집기를 닫습니다
Alt (Option) + Enter활성 셀의 링크를 새 탭에서 엽니다
@@ -114,43 +126,43 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 단축 Shift + Enter - 선택을 한 셀 위로 이동합니다(열 방향). 셀 범위가 선택된 경우 범위 내에서 한 셀 위로 이동합니다. 열의 첫 번째 셀에 도달하면 비활성화됩니다. + 선택을 한 셀 위로 이동합니다(열 방향). 셀 범위가 선택된 경우 범위 내에서 한 셀 위로 이동합니다. Tab - 선택을 한 셀 오른쪽으로 이동합니다(행 방향). 셀 범위가 선택된 경우 범위 내에서 한 셀 오른쪽으로 이동합니다. 행의 가장 오른쪽 셀에 도달하면 비활성화됩니다. + 선택을 한 셀 오른쪽으로 이동합니다(행 방향). 가장 오른쪽 셀에서는 같은 행의 첫 번째 셀로 이동합니다. 셀 범위가 선택된 경우 범위 내에서 한 셀 오른쪽으로 이동합니다. 시트의 마지막 셀에서는 편집한 값을 저장하고 포커스를 셀 밖의 페이지 다음 부분(예: 시트 탭)으로 이동합니다. Tab + Shift - 선택을 한 셀 왼쪽으로 이동합니다(행 방향). 셀 범위가 선택된 경우 범위 내에서 한 셀 왼쪽으로 이동합니다. 행의 가장 왼쪽 셀에 도달하면 비활성화됩니다. + 선택을 한 셀 왼쪽으로 이동합니다(행 방향). 가장 왼쪽 셀에서는 같은 행의 마지막 셀로 이동합니다. 셀 범위가 선택된 경우 범위 내에서 한 셀 왼쪽으로 이동합니다. 시트의 첫 번째 셀에서는 편집한 값을 저장하고 포커스를 셀 밖의 페이지 이전 부분(예: 수식 입력줄)으로 이동합니다. 화살표 키 - 시트의 셀 간 탐색을 제공합니다 + 시트의 셀 간 탐색을 제공합니다. 첫 번째와 마지막 표시 행 및 열에서 멈춥니다. 셀 범위가 선택된 경우 시트의 가장자리에서 화살표 키를 누르면 범위가 활성 셀로 축소됩니다 Home - 선택을 행의 첫 번째 셀로 이동합니다 + 선택을 행의 첫 번째 표시 셀로 이동합니다 End - 선택을 행의 마지막 셀로 이동합니다 + 선택을 행의 마지막 표시 셀로 이동합니다 Ctrl (Cmd) + 왼쪽 화살표 키 - 선택을 행의 첫 번째 셀로 이동합니다 + 선택을 행의 첫 번째 표시 셀로 이동합니다 Ctrl (Cmd) + 오른쪽 화살표 키 - 선택을 행의 마지막 셀로 이동합니다 + 선택을 행의 마지막 표시 셀로 이동합니다 Ctrl (Cmd) + 위쪽 화살표 키 - 선택을 열의 첫 번째 셀로 이동합니다 + 선택을 열의 첫 번째 표시 셀로 이동합니다 Ctrl (Cmd) + 아래쪽 화살표 키 - 선택을 열의 마지막 셀로 이동합니다 + 선택을 열의 마지막 표시 셀로 이동합니다 Ctrl (Cmd) + Home @@ -175,6 +187,59 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 단축 +## 포커스 이동 {#moving-the-focus} + +툴바, 메뉴 바, 시트 탭은 각각 하나의 탭 정지점입니다. Tab은 포커스를 바 안으로 이동하거나 바 밖으로 이동하며, 포커스는 마지막으로 사용한 컨트롤에 놓입니다. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ctrl + F6포커스를 Spreadsheet의 다음 부분으로 이동합니다. 순서는 메뉴, 툴바, 시트(활성 셀), 시트 탭이며, 이후 다시 메뉴로 돌아갑니다. 수식 입력줄과 숨겨진 부분은 건너뜁니다. 먼저 편집 중인 셀의 값을 저장합니다
Ctrl + Shift + F6포커스를 Spreadsheet의 이전 부분으로 이동합니다
Left Arrow/Right Arrow Key포커스를 툴바, 메뉴 바 또는 시트 탭의 이전/다음 컨트롤로 이동합니다
Home/End포커스를 바의 첫 번째/마지막 컨트롤로 이동합니다
Enter/Space포커스된 컨트롤을 누릅니다. 명령을 실행하거나, 드롭다운을 열거나, 포커스된 탭의 시트로 전환합니다
Down Arrow Key포커스된 컨트롤의 드롭다운을 열고 포커스를 첫 번째 항목으로 이동합니다
Up Arrow/Down Arrow Key열린 드롭다운 또는 메뉴의 항목 간에 포커스를 이동합니다
Right Arrow Key포커스된 메뉴 항목의 하위 메뉴를 엽니다
Left Arrow Key하위 메뉴를 닫습니다. 드롭다운의 첫 번째 수준에서는 드롭다운을 닫고 포커스를 해당 컨트롤로 되돌립니다
Esc드롭다운 또는 메뉴를 닫고 포커스를 이를 연 컨트롤로 되돌립니다. 툴바 컨트롤의 툴팁을 닫습니다. Esc를 누르지 않으면 포인터가 툴팁 위에 있는 동안 툴팁이 열린 상태로 유지됩니다
Shift + F10 or Menu key활성 셀 또는 포커스된 시트 탭의 컨텍스트 메뉴를 열고 포커스를 메뉴로 이동합니다. Ctrl (Cmd) + Space를 누른 후에는 셀의 컨텍스트 메뉴에 열에 대한 명령이 표시됩니다. Esc는 컨텍스트 메뉴를 닫고 포커스를 셀로 되돌립니다
+ ## 검색 {#search} @@ -185,11 +250,15 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 단축 - + - + + + + +
Ctrl (Cmd) + G선택을 다음 검색 결과로 이동합니다다음 검색 결과를 강조 표시합니다
Ctrl (Cmd) + Shift + G선택을 이전 검색 결과로 이동합니다이전 검색 결과를 강조 표시합니다
Esc검색 상자를 닫고 포커스를 활성 셀로 되돌립니다
@@ -234,8 +303,110 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 단축 스프레드시트에 새 시트를 추가합니다 - Alt + 위쪽 화살표 / 아래쪽 화살표 - 다음/이전 시트로 전환합니다 + Alt (Option) + Arrow Up + 다음 시트로 전환합니다. 마지막 시트에서는 첫 번째 시트로 전환합니다 + + + Alt (Option) + Arrow Down + 이전 시트로 전환합니다. 첫 번째 시트에서는 마지막 시트로 전환합니다 + + + Ctrl (Cmd) + Alt (Option) + Page Down + 다음 시트로 전환합니다 + + + Ctrl (Cmd) + Alt (Option) + Page Up + 이전 시트로 전환합니다 + + + + +## 행 및 열 작업 {#work-with-rows-and-columns} + + + + + + + + + + + + +
Ctrl (Cmd) + Shift + 9선택한 범위 내의 숨겨진 행을 표시합니다
Ctrl (Cmd) + Shift + 0선택한 범위 내의 숨겨진 열을 표시합니다
+ +## 툴바 팝업 {#toolbar-popups} + +아래 키는 툴바의 *Text color*, *Background color*, *Border* 컨트롤 팝업에서 작동합니다. 팝업은 열릴 때 포커스를 받습니다. + + + + + + + + + + + + + + + + + + + + + + + + +
Arrow keys팔레트의 색상 간 또는 Border 팝업의 컨트롤 간에 포커스를 이동합니다
Home/End포커스를 팔레트의 첫 번째/마지막 색상으로 이동합니다
Enter포커스된 색상 또는 테두리를 적용합니다. 텍스트 색상 또는 배경색을 적용한 후 포커스는 활성 셀로 돌아갑니다
Esc사용자 지정 색상 모드에서 팔레트로 돌아갑니다. Border 팝업 위에 열린 색상 또는 스타일 팝업에서는 해당 팝업을 닫고 포커스를 Border 팝업의 버튼으로 되돌립니다. 그 외에는 팝업을 닫고 포커스를 해당 툴바 컨트롤로 되돌립니다
Tab/Tab + Shift팝업을 닫고 포커스를 해당 툴바 컨트롤로 되돌립니다. Border 팝업과 그 위에 열린 팝업에서는 모두 닫고 포커스를 Border 컨트롤로 되돌립니다. 사용자 지정 색상 모드에서는 색상 선택기의 컨트롤 간에 포커스를 이동합니다
+ +## 목록 편집기 {#list-editor} + +아래 키는 [값 목록](api/spreadsheet_setvalidation_method.md)이 있는 셀의 편집기에서 작동합니다. + + + + + + + + + + + + + + + + + + + + +
Up Arrow/Down Arrow Key값 목록을 따라 이동합니다
Enter값을 선택하고 편집기를 닫습니다
Esc변경 사항을 저장하지 않고 편집기를 닫습니다
Tab값을 저장하고 선택을 한 셀 오른쪽으로 이동합니다
+ +## 필터 및 대화 상자 {#filter-and-dialogs} + +아래 키는 [필터](filtering_data.md#opening-a-filter-with-the-keyboard) 팝업과 [열 너비 및 행 높이](work_with_rows_cols.md#setting-column-width-and-row-height) 대화 상자에서 작동합니다. + + + + + + + + + + + + + +
Esc필터 팝업을 닫고 포커스를 셀로 되돌립니다
Enter열 너비 및 행 높이 대화 상자에서 크기를 적용합니다
Esc변경 없이 열 너비 및 행 높이 대화 상자를 닫습니다
diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/localization.md b/i18n/ko/docusaurus-plugin-content-docs/current/localization.md index 5e600ab2..75d210b5 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/localization.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/localization.md @@ -1,7 +1,7 @@ --- sidebar_label: 로컬라이제이션 title: 로컬라이제이션 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 로컬라이제이션에 대한 문서를 확인하세요. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해보며, DHTMLX Spreadsheet의 30일 무료 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet를 현지화합니다. 기본 로케일을 확인하고, 사용자 정의 로케일을 만들고, 내장 위젯과 수식 팝업을 번역하고, 로케일을 적용하는 방법을 설명합니다. --- # 로컬라이제이션 {#localization} @@ -23,6 +23,8 @@ const en = { textColor: "Text color", backgroundColor: "Background color", + fontSize: "Font size", + bold: "Bold", italic: "Italic", underline: "Underline", @@ -60,6 +62,10 @@ const en = { addRow: "Add row above", removeRow: "Remove row {row}", removeRows: "Remove rows {row}", + columnWidth: "Column width", + rowHeight: "Row height", + widthInPixels: "Width in pixels", + heightInPixels: "Height in pixels", row: "row", col: "col", freeze: "Freeze", @@ -82,8 +88,10 @@ const en = { text: "Text", date: "Date", time: "Time", + scientific: "Scientific", filter: "Filter", + openFilter: "Open filter", help: "Help", @@ -104,6 +112,9 @@ const en = { border_style: "Border style", // Tabbar + // the name of a new sheet is this prefix followed by a number: sheet1, sheet2 + defaultSheetName: "sheet", + addSheet: "Add sheet", deleteSheet: "Delete", renameSheet: "Rename", renameSheetAlert: "A sheet with the name $name already exists. Please enter another name. ", @@ -114,10 +125,14 @@ const en = { export: "Export", downloadAs: "Download as...", importAs: "Import as...", + xlsxFormat: "Microsoft Excel(.xlsx)", data: "Data", validation: "Data validation", search: "Search", + previousMatch: "Previous match", + nextMatch: "Next match", + closeSearch: "Close search", sort: "Sort", ascSort: "Sort A to Z", descSort: "Sort Z to A", @@ -177,17 +192,105 @@ const en = { spanUnmergeLockedError: "You can't unmerge locked cells!", spanOverFilteredRow: "You can't merge cells over a filtered row.", removeAlert: "You can't remove last $name!", + wasmNotSupported: "WebAssembly is not supported by your browser", + invalidValue: "Invalid value", + + // Accessible names, read by screen readers + // accessible name of a color button; {label} is the name of the control, {color} is a name from the colorpicker locale + aria_colorButton: "{label}: {color}", + // accessible names of the toolbars; the screen reader adds the word "toolbar" itself + aria_toolbarFormatting: "Formatting", + aria_toolbarBorders: "Borders", + aria_toolbarSheets: "Sheets", + aria_toolbarSearch: "Search", + aria_toolbarLink: "Link", + // accessible names of the line styles in the border style list + aria_borderStyleThin: "Thin line", + aria_borderStyleMedium: "Medium line", + aria_borderStyleThick: "Thick line", + aria_borderStyleDashed: "Dashed line", + aria_borderStyleDotted: "Dotted line", + aria_borderStyleDouble: "Double line", + // accessible names of the context menus; the screen reader adds the word "menu" itself + aria_cellMenu: "Cell", + aria_sheetMenu: "Sheet", + // accessible name of the menu bar; the screen reader adds the words "menu bar" itself + aria_menuBar: "Main", + // accessible name of the cell grid; the screen reader adds the word "grid" itself + aria_grid: "Spreadsheet", + // accessible name of the select-all corner, the first column header + aria_selectAll: "Select all", + // accessible name of the formula bar; {cell} is the address of the cell it shows, for example "B7" + aria_formulaBar: "Formula bar, {cell}", + // accessible name of the input that edits a cell; {cell} is the address of the cell, for example "B7" + aria_cellEditor: "Cell editor, {cell}", + // accessible name of the close icon of the formula help panel + aria_closeFormulaHelp: "Close formula help", + + // Cell descriptions, read with the content of the active cell + // read with the content of a cell that has a filter icon; the icon itself is hidden from assistive technology + aria_filter: "Filter", + aria_filterApplied: "Filter applied", + // read after the content of a selected cell that holds a link; Alt+Enter opens the link + aria_cellLink: "link", + // read after the content of a selected locked cell; the lock icon itself is hidden from assistive technology + aria_lockedState: "locked", + // read after the value of a cell with a formula error; the formula engine writes the error as #ERROR, #REF! or #SPILL! + aria_errorSyntax: "Syntax error. Check the formula", + aria_errorCalc: "Calculation error. Check the values and functions", + aria_errorRef: "Reference error. Check the cell references", + aria_errorSpill: "Spill error. Clear the cells the result needs", + // read after the value of a cell that breaks its list validation + aria_invalidValue: "Invalid value. Choose a value from the list", + + // Screen reader announcements + // announced when an editing key is pressed in the read-only mode + aria_readonlySheet: "The sheet is read-only", + // announced when Ctrl+Shift+9 or Ctrl+Shift+0 finds nothing to reveal + aria_noHiddenRows: "No hidden rows in the selection", + aria_noHiddenCols: "No hidden columns in the selection", + // announced when a selection of several cells changes; {range} is built from aria_rangeExtent + aria_selectedRange: "{range}, {count} cells", + aria_rangeExtent: "{start} to {end}", + // joins the ranges of a selection made with Ctrl + aria_rangeSeparator: ", ", + // announced after an action; {message} is one of the texts above + aria_cellMessage: "{cell}: {message}", + // announced when an action makes several errors appear; {first} is aria_cellMessage for the first of them + aria_newErrors: "{count} new errors. {first}", + // announced when an action puts several invalid values; {first} is aria_cellMessage for the first of them + aria_invalidValues: "{count} invalid values. {first}", + // announced once when an edit of a locked cell is refused; the second one when a range holds locked cells + aria_lockedCell: "The cell is locked", + aria_lockedCells: "Locked cells were not changed", + // announced when the search text changes; followed by aria_searchMatch for the first match + aria_searchResults: "Results: {count}.", + // announced for the current match; {cell} is its address, for example "B7" + aria_searchMatch: "{index} of {count}, {cell}", + aria_searchNoResults: "No results", + // announced when an export or an import of a file starts and ends + aria_exportStarted: "Exporting the file", + aria_exportDone: "The file is exported", + aria_importStarted: "Importing the file", + aria_importDone: "The file is imported", + // announced when the column width or the row height command is applied; {size} is the applied size + aria_columnWidthSet: "Column width set to {size} pixels", + aria_rowHeightSet: "Row height set to {size} pixels", }; ~~~ +`aria_`로 시작하는 키는 인터페이스에 표시되지 않습니다. 스크린 리더는 이 키를 컨트롤의 이름, 활성 셀의 설명, 그리고 [`announce()`](api/spreadsheet_announce_method.md) 메서드도 사용하는 라이브 영역의 메시지로 읽습니다. `{cell}`, `{count}`와 같이 중괄호로 둘러싸인 부분은 문자열을 읽을 때 값으로 대체됩니다. 번역한 문자열에도 이 부분을 그대로 유지하십시오. 번역된 접근성 문자열의 예는 [접근성](accessibility.md#translated-accessibility-strings) 가이드를 참조하십시오. + +`defaultSheetName` 키는 기본 시트 이름의 접두사를 설정합니다. Spreadsheet는 여기에 숫자를 붙이므로 기본값 `"sheet"`는 "sheet1", "sheet2" 등의 이름을 만듭니다. 예를 들어 Microsoft Excel이 독일어에서 사용하는 접두사인 `"Tabelle"`을 사용하면 시트 이름은 "Tabelle1", "Tabelle2" 등이 됩니다. + ## 사용자 정의 로케일 {#custom-locale} 다른 로케일을 적용하려면 다음을 수행해야 합니다: -- Spreadsheet의 모든 텍스트 레이블에 대한 번역을 제공합니다. 예를 들어 러시아어 로케일의 경우: +- Spreadsheet의 모든 텍스트 레이블에 대한 번역을 제공합니다. 예를 들어 독일어 로케일의 경우: ~~~jsx -const ru = { +const de = { // 언어 설정 }; ~~~ @@ -195,10 +298,48 @@ const ru = { - Spreadsheet를 초기화하기 전에 `dhx.i18n.setLocale()` 메서드를 호출하여 새 로케일을 적용합니다: ~~~jsx -dhx.i18n.setLocale("spreadsheet", ru); +dhx.i18n.setLocale("spreadsheet", de); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); +~~~ + +## 내장 위젯 현지화 {#localizing-built-in-widgets} + +Spreadsheet는 내부적으로 DHTMLX Suite의 Calendar, Colorpicker, Grid, Timepicker, Toolbar, Window, Message 위젯을 사용합니다. 이 위젯들의 문자열은 별도의 로케일에 저장되어 있으며, `spreadsheet` 로케일과 같은 방식으로 번역할 수 있습니다: + +| 로케일 | Spreadsheet에서 사용하는 문자열 | +| ------ | --------------------------- | +| `calendar` | 날짜 편집기와 날짜 필터의 월 및 요일 이름 | +| `colorpicker` | 툴바의 색상 팝업에 있는 사용자 지정 색상 모드의 레이블, 팔레트 이름, 그리고 스크린 리더가 색상 견본과 색상 버튼에 대해 읽는 색상 이름(예: "Text color: dark gray") | +| `grid` | 로드된 행 수 안내 | +| `timepicker` | 시간 편집기의 레이블 | +| `toolbar` | 툴바의 기본 접근 가능한 이름 | +| `window` | 대화 상자의 기본 접근 가능한 이름 | +| `message` | alert 및 confirm 대화 상자와 해당 버튼의 접근 가능한 이름 | + +툴바, 메뉴, 컨텍스트 메뉴는 생성될 때 로케일을 읽으므로, Spreadsheet를 초기화하기 전에 로케일 이름과 함께 `dhx.i18n.setLocale()`을 호출하십시오: + +~~~jsx +const deColorpicker = { + cancel: "Abbrechen", + select: "Auswählen", + aria_palette: "Farbpalette", + aria_colorRed: "rot", + // other strings +}; + +const deMessage = { + aria_confirm: "Bestätigen" +}; + +dhx.i18n.setLocale("spreadsheet", de); +dhx.i18n.setLocale("colorpicker", deColorpicker); +dhx.i18n.setLocale("message", deMessage); + const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); ~~~ +로케일 키는 평면 구조입니다. 각 키를 객체의 최상위 수준에 전달하십시오. 자세한 내용은 DHTMLX Suite 문서의 [스크린 리더 문자열 현지화](https://docs.dhtmlx.com/suite/common_features/accessibility_support/#localization-of-screen-reader-strings) 문서를 참조하십시오. + ## 수식의 기본 로케일 {#default-locale-for-formulas} `dhx.i18n.formulas` 객체에는 Spreadsheet 수식 팝업의 i18n 로케일이 포함되어 있습니다. 수식의 기본 로케일은 다음과 같습니다: diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/merge_cells.md b/i18n/ko/docusaurus-plugin-content-docs/current/merge_cells.md index 92e57cb7..0bee001e 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/merge_cells.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/merge_cells.md @@ -1,7 +1,7 @@ --- sidebar_label: 셀 병합 title: 셀 병합 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 셀 병합에 대해 알아보세요. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해보며, DHTMLX Spreadsheet의 30일 무료 평가판을 다운로드하세요. +description: 툴바 또는 서식 메뉴를 통해 DHTMLX Spreadsheet에서 셀을 병합하고 분할하는 방법과, 행과 열을 제거할 때 병합된 셀에 미치는 영향을 알아봅니다. --- # 셀 병합 {#merging-cells} @@ -45,3 +45,13 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 셀 병 2\. 메뉴에서 *Format -> Unmerge*로 이동합니다 ![병합된 셀을 분리하는 Unmerge 옵션이 있는 DHTMLX Spreadsheet Format 메뉴](/img/unmerge_cells_via_menu.png) + +## 병합된 셀의 행과 열 제거 {#removing-rows-and-columns-of-merged-cells} + +병합된 셀을 통해 행 또는 열을 제거하면 병합된 셀이 걸쳐 있는 모든 행 또는 열이 제거됩니다. 셀 또는 셀 범위를 선택한 상태에서 툴바, 메뉴, 컨텍스트 메뉴 또는 [`deleteRow()`](api/spreadsheet_deleterow_method.md) / [`deleteColumn()`](api/spreadsheet_deletecolumn_method.md) 메서드로 행 또는 열을 제거할 때 이렇게 동작합니다. 컨텍스트 메뉴는 명령 이름에 전체 범위를 표시합니다. 예: *행 2-4 제거*. + +![병합된 셀에 대해 행 2-4 제거가 표시된 행 하위 메뉴가 있는 DHTMLX Spreadsheet 컨텍스트 메뉴](/img/remove_merged_rows_context_menu.png) + +행 또는 열 전체를 선택한 경우(예: 헤더를 클릭하거나 `Shift + Space` 또는 `Ctrl (Cmd) + Space`를 사용) 선택한 행 또는 열만 제거됩니다. 해당 행 또는 열에 걸쳐 있던 병합된 셀은 더 작아지고, 셀이 하나만 남은 병합된 셀은 일반 셀이 됩니다. + +제거된 행 또는 열의 아래쪽이나 오른쪽에 있는 병합된 셀은 함께 이동합니다. diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/react/overview.md b/i18n/ko/docusaurus-plugin-content-docs/current/react/overview.md index 5b85ed99..0352699c 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/react/overview.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/react/overview.md @@ -96,8 +96,8 @@ Props는 컴포넌트가 변경 사항을 처리하는 방식에 따라 분류 | 카테고리 | Props | 변경 시 동작 | |----------|-------|----------------------| -| **초기화 전용** | `menu`, `editLine`, `toolbarBlocks`, `multiSheets`, `formats`, `localization`, `importModulePath`, `exportModulePath`, `spreadsheetLocale` | 위젯이 소멸되고 재생성됩니다. 스프레드시트 데이터는 보존되지만 실행 취소/다시 실행 기록과 UI 상태(선택 영역, 스크롤 위치)는 초기화됩니다. | -| **런타임** | `readonly`, `rowsCount`, `colsCount` | 데이터 손실이나 UI 상태 초기화 없이 즉시 적용됩니다. | +| **초기화 전용** | `menu`, `editLine`, `toolbarBlocks`, `multiSheets`, `formats`, `localization`, `importModulePath`, `exportModulePath`, `spreadsheetLocale`, `readonly` | 위젯이 소멸되고 재생성됩니다. 스프레드시트 데이터는 보존되지만 실행 취소/다시 실행 기록과 UI 상태(선택 영역, 스크롤 위치)는 초기화됩니다. | +| **런타임** | `selection`, `rowsCount`, `colsCount` | 데이터 손실이나 UI 상태 초기화 없이 즉시 적용됩니다. | | **데이터** | `sheets`, `activeSheet` | 증분 방식으로 적용됩니다. 변경된 셀, 범위 또는 설정만 업데이트됩니다. | | **재파싱** | `styles` | 스타일 변경 시 전체 데이터 재로드가 필요합니다. 스프레드시트 데이터는 보존되지만 실행 취소/다시 실행 기록과 UI 상태는 초기화됩니다. | | **상태** | `search`, `theme`, `loadUrl` | 전용 위젯 API를 통해 부작용 없이 적용됩니다. | @@ -198,6 +198,10 @@ function App() { `instance` 속성은 위젯이 초기화되기 전과 언마운트 후에는 `null`입니다. +:::info +`ref.current.instance.events.on()`으로 연결한 핸들러는 초기화 전용 prop 변경 후 위젯이 재생성될 때와 컴포넌트가 언마운트될 때 제거됩니다. 컴포넌트가 모든 새 위젯 인스턴스에 연결하는 [이벤트 콜백 props](react/events.md)를 사용하세요. +::: + ## API 참조 {#api-reference} | 문서 | 내용 | diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/react/props.md b/i18n/ko/docusaurus-plugin-content-docs/current/react/props.md index 38d055cc..29431d79 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/react/props.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/react/props.md @@ -25,6 +25,7 @@ description: "타입과 예시가 포함된 ReactSpreadsheet 컴포넌트의 모 | `importModulePath` | `string` | XLSX 가져오기 모듈의 경로입니다. JS API: [`importModulePath`](api/spreadsheet_importmodulepath_config.md) 참조. | | `exportModulePath` | `string` | XLSX 내보내기 모듈의 경로입니다. JS API: [`exportModulePath`](api/spreadsheet_exportmodulepath_config.md) 참조. | | `spreadsheetLocale` | [`SpreadsheetLocale`](react/types.md#spreadsheetlocale) | UI 번역 및 로컬라이즈된 수식 이름입니다. `localization`과는 별개입니다. | +| `readonly` | `boolean` | 읽기 전용 모드를 활성화합니다. 사용자는 셀을 탐색, 선택, 복사 및 검색할 수 있으며 편집은 거부됩니다. JS API: [`readonly`](api/spreadsheet_readonly_config.md) 참조. | @@ -40,7 +41,7 @@ description: "타입과 예시가 포함된 ReactSpreadsheet 컴포넌트의 모 |------|------|-------------| | `rowsCount` | `number` | 그리드의 행 수입니다. JS API: [`rowsCount`](api/spreadsheet_rowscount_config.md) 참조. | | `colsCount` | `number` | 그리드의 열 수입니다. JS API: [`colsCount`](api/spreadsheet_colscount_config.md) 참조. | -| `readonly` | `boolean` | 읽기 전용 모드를 활성화합니다. JS API: [`readonly`](api/spreadsheet_readonly_config.md) 참조. | +| `selection` | `boolean` | 셀 선택을 켜거나 끕니다. 기본값: `true`. `false`로 설정하면 스프레드시트에 활성 셀이 없으며 UI에서 셀을 선택하거나 편집할 수 없습니다. JS API: [`selection`](api/spreadsheet_selection_config.md) 참조. | ## 데이터 props {#data-props} @@ -225,10 +226,18 @@ const [theme, setTheme] = useState("light"); ### 읽기 전용 모드 {#read-only-mode} +읽기 전용 모드에서 사용자는 키보드로 셀을 탐색하고, 마우스로 선택하고, 복사 및 검색할 수 있습니다. 편집은 거부되며 스크린 리더에 알림이 전달됩니다. `readonly`는 초기화 전용 prop이므로 변경하면 위젯이 재생성됩니다. 데이터는 유지되지만 실행 취소/다시 실행 기록과 UI 상태(선택 영역, 스크롤 위치)는 초기화됩니다. + ~~~tsx ~~~ +키보드 탐색과 선택도 끄려면 `selection={false}`를 추가하세요. `selection` prop은 런타임에 적용되므로 위젯을 재생성하지 않고 전환할 수 있습니다: + +~~~tsx + +~~~ + ### URL에서 데이터 로드 {#loading-data-from-url} ~~~tsx diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/react/themes.md b/i18n/ko/docusaurus-plugin-content-docs/current/react/themes.md index ab21cae1..21ffa7a2 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/react/themes.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/react/themes.md @@ -77,6 +77,9 @@ DHTMLX Spreadsheet는 레이어드 CSS 변수 시스템을 사용합니다. 이 /* 스프레드시트 범위 색상 */ --dhx-spreadsheet-range-background-1: #bee3f8; --dhx-spreadsheet-range-color-1: #2b6cb0; + + /* 수식 입력줄과 툴바 컨트롤의 키보드 포커스 윤곽선 */ + --dhx-spreadsheet-focus-color: #2b6cb0; } ~~~ diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/react/types.md b/i18n/ko/docusaurus-plugin-content-docs/current/react/types.md index 204812a6..710fd25a 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/react/types.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/react/types.md @@ -188,6 +188,13 @@ ref.current?.instance?.selection.setSelectedCell("A1:C5"); // 실행 취소/다시 실행 ref.current?.instance?.undo(); ref.current?.instance?.redo(); + +// 선택 끄기 및 켜기 +ref.current?.instance?.selection.disable(); +ref.current?.instance?.selection.enable(); + +// 스크린 리더에 상태 메시지 전송 +ref.current?.instance?.announce("The report is saved"); ~~~ ## Actions 열거형 {#actions-enum} @@ -264,6 +271,7 @@ type SpreadsheetConfigProps = Omit< | `ISpreadsheet` | 메인 스프레드시트 위젯 인스턴스 인터페이스. | | `ISpreadsheetConfig` | 생성자 구성 인터페이스. | | `ISheet` | 시트 인스턴스 인터페이스(시트 이벤트 콜백에서 사용). | +| `ISelection` | 선택 모듈 인터페이스(`instance.selection`). [`enable()`](api/selection_enable_method.md), [`disable()`](api/selection_disable_method.md), [`isDisabled()`](api/selection_isdisabled_method.md) 메서드를 포함합니다. | | `IFormats` | 커스텀 숫자 형식 정의. | | `IFilterRules` | 필터 규칙 구성. | | `IFilter` | 필터 인스턴스 인터페이스. | diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/themes/themes.md b/i18n/ko/docusaurus-plugin-content-docs/current/themes/themes.md index 57111f0b..fb1e33be 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/themes/themes.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/themes/themes.md @@ -1,7 +1,7 @@ --- sidebar_label: 내장 테마 title: 내장 테마 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 내장 테마에 대해 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 직접 사용해 보거나, DHTMLX Spreadsheet 30일 무료 평가판을 다운로드하십시오. +description: DHTMLX Spreadsheet의 기본 제공 테마(라이트, 다크 및 각각의 고대비 변형)입니다. Spreadsheet 전용 CSS 변수와 테마를 설정하는 방법을 알아봅니다. --- # 내장 테마 {#built-in-themes} @@ -13,7 +13,7 @@ DHTMLX Spreadsheet 라이브러리는 4가지 사전 정의된 테마를 제공 - [라이트 고대비 테마](#light-high-contrast-theme) ("contrast-light") - [다크 고대비 테마](#dark-high-contrast-theme) ("contrast-dark") -Spreadsheet 테마는 국제 표준에 따라 개발되었습니다. 고대비 테마는 시각 장애가 있는 사용자를 돕습니다. 자세한 내용은 [접근성 지원](https://docs.dhtmlx.com/suite/common_features/accessibility_support/) 문서를 참조하십시오. +Spreadsheet 테마는 국제 표준에 따라 개발되었습니다. 고대비 테마는 시각 장애가 있는 사용자를 돕습니다. Spreadsheet에서 테마의 대비와 키보드 포커스 표시기에 대한 내용은 접근성 가이드의 [고대비 및 포커스](accessibility.md#high-contrast-and-focus) 섹션을 확인하십시오. DHTMLX Suite 위젯의 접근성에 대해서는 [접근성 지원](https://docs.dhtmlx.com/suite/common_features/accessibility_support/) 문서를 참조하십시오. 아래 예제에서 모든 테마를 직접 사용해 볼 수 있습니다. @@ -377,14 +377,15 @@ Spreadsheet 컴포넌트에 특화된 변수 목록은 다음과 같습니다. --dhx-spreadsheet-range-background-8: #ecb6ff; --dhx-spreadsheet-range-color-1: #00815a; - --dhx-spreadsheet-range-color-2: #bfc000; - --dhx-spreadsheet-range-color-3: #c55933; - --dhx-spreadsheet-range-color-4: #0cc1d6; - --dhx-spreadsheet-range-color-5: #0080a3; - --dhx-spreadsheet-range-color-6: #529a0a; + --dhx-spreadsheet-range-color-2: #8b7300; + --dhx-spreadsheet-range-color-3: #a34729; + --dhx-spreadsheet-range-color-4: #007a8c; + --dhx-spreadsheet-range-color-5: #135db1; + --dhx-spreadsheet-range-color-6: #2f6500; --dhx-spreadsheet-range-color-7: #6d767b; - --dhx-spreadsheet-range-color-8: #ba38e7; + --dhx-spreadsheet-range-color-8: #b82fe5; + --dhx-spreadsheet-focus-color: var(--dhx-color-primary); } ~~~ @@ -411,6 +412,17 @@ Spreadsheet 컴포넌트에 특화된 변수 목록은 다음과 같습니다. --dhx-spreadsheet-range-color-7: #e4e4e4; --dhx-spreadsheet-range-color-8: #ecb6ff; + --dhx-spreadsheet-focus-color: hsl(var(--dhx-h-primary), var(--dhx-s-primary), calc(var(--dhx-l-primary) + 12% - var(--dhx-l-contrast-offset))); +} +~~~ + +`--dhx-spreadsheet-range-color-*` 및 `--dhx-spreadsheet-range-background-*` 변수는 수식을 편집하는 동안 수식의 셀 참조를 표시하는 색상을 설정합니다. 라이트 테마에서 `--dhx-spreadsheet-range-color-*` 색상은 수식 입력줄 배경에 대해 최소 4.5:1의 대비를 가집니다. + +`--dhx-spreadsheet-focus-color` 변수는 수식 입력줄과 툴바, 메뉴 바, 시트 탭, 테두리 팝업, 링크 팝업, 검색 바의 컨트롤에 표시되는 키보드 포커스 윤곽선의 색상을 설정합니다. 다크 테마에서는 윤곽선이 최소 3:1의 대비를 유지하도록 기본 색상보다 밝은 색상이 사용됩니다. [사용자 지정 테마](themes/custom_theme.md)에서 이 변수를 재정의할 수 있습니다: + +~~~css +[data-dhx-theme='custom-theme-dark'] { + --dhx-spreadsheet-focus-color: #7fc8ff; } ~~~ diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/vuejs_integration.md b/i18n/ko/docusaurus-plugin-content-docs/current/vuejs_integration.md index 72ec8868..baa9e2e7 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/vuejs_integration.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/vuejs_integration.md @@ -1,7 +1,7 @@ --- sidebar_label: Vue 통합 title: Vue 통합 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 Vue 통합에 대한 내용을 문서에서 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수 있습니다. +description: Vue 애플리케이션에서 DHTMLX Spreadsheet를 사용하는 방법입니다. 프로젝트를 만들고, Spreadsheet를 Vue 컴포넌트로 추가하고, 데이터를 로드하고, 이벤트를 처리합니다. --- # Vue 통합 {#integration-with-vue} @@ -260,6 +260,10 @@ export default { //... ~~~ +:::info +`destructor()` 메서드는 `spreadsheet.events.on()`으로 연결한 이벤트 핸들러를 제거합니다. 새 Spreadsheet 인스턴스를 생성할 때(예: 컴포넌트가 다시 생성될 때) 새 인스턴스에 핸들러를 다시 연결하세요. +::: + 그런 다음 앱을 시작하면 페이지에 데이터가 로드된 Spreadsheet를 볼 수 있습니다. ![샘플 데이터와 함께 Vue 3 애플리케이션에서 초기화된 DHTMLX Spreadsheet](/img/integrations/trial_spreadsheet.png) diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md index a67ce1a2..a772177d 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md @@ -8,6 +8,58 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리의 새로운 기능 이전 버전에서 Spreadsheet를 업그레이드하는 경우 [최신 버전으로 마이그레이션](migration.md)에서 자세한 내용을 확인하세요. +## 버전 6.0.4 {#version-604} + +2026년 10월 일 출시 + +### 새로운 기능 {#new-functionality-604} + +- WCAG 2.2 AA, Section 508 및 EN 301 549를 목표로 하는 접근성 지원: Spreadsheet 모든 부분의 키보드 조작, 스크린 리더 지원, 모든 테마에서 눈에 보이는 포커스. [접근성](accessibility.md) 가이드와 [접근성 적합성 보고서](accessibility_conformance_report.md)를 확인하세요 +- 셀 선택을 끄고 켜는 기능: + - 새로운 구성 속성: [`selection`](api/spreadsheet_selection_config.md) + - selection 모듈의 새로운 메서드: [`enable()`](api/selection_enable_method.md), [`disable()`](api/selection_disable_method.md), [`isDisabled()`](api/selection_isdisabled_method.md) +- [`announce()`](api/spreadsheet_announce_method.md) 메서드는 스크린 리더에 상태 메시지를 전달합니다 +- [컨텍스트 메뉴](customization.md#context-menu)의 새로운 명령: [*열 너비*, *행 높이*](work_with_rows_cols.md#setting-column-width-and-row-height) 및 [*필터 열기*](filtering_data.md#opening-a-filter-with-the-keyboard) + +### 업데이트 {#updates-604} + +- 키보드 탐색 ([단축키 목록](hotkeys.md) 확인): + - 포커스가 활성 셀에 유지되며, `Tab` 및 `Shift + Tab`은 시트의 마지막 셀과 첫 번째 셀에서 셀 영역을 벗어나고, `Ctrl + F6`은 메뉴, 툴바, 시트, 시트 탭 간에 포커스를 이동합니다 + - 툴바, 메뉴 바, 시트 탭은 방향키로 탐색하는 단일 탭 정지점입니다 + - 새로운 단축키가 추가되었습니다. 예를 들어 컨텍스트 메뉴용 `Shift + F10`, 숨겨진 행과 열을 표시하는 `Ctrl (Cmd) + Shift + 9` / `Ctrl (Cmd) + Shift + 0`이 있습니다 + - 툴바의 색상 및 테두리 팝업은 열릴 때 포커스를 받고 `Esc` 및 `Tab`으로 닫힙니다 +- 방향키는 반대편 가장자리로 이동하지 않고 첫 번째 및 마지막 표시된 행과 열에서 멈추며, 가장자리에서 방향키를 누르면 선택한 범위가 활성 셀로 줄어듭니다 +- 입력기(IME)로 작성한 텍스트가 활성 셀에 표시되고 [`startEdit()`](api/spreadsheet_startedit_method.md) 메서드를 통해 편집이 시작되므로 이 경우 `beforeEditStart` 및 `afterEditStart` 이벤트가 발생합니다 +- [`setFocusedCell()`](api/selection_setfocusedcell_method.md) 메서드는 키보드 포커스를 셀로 이동합니다 +- [셀의 링크](work_with_cells.md#inserting-a-hyperlink-into-a-cell)는 새 탭에서 열리는 실제 링크로 렌더링되며, `Alt (Option) + Enter`는 활성 셀의 링크를 엽니다 +- [읽기 전용 모드](api/spreadsheet_readonly_config.md)는 키보드 탐색, 선택, 복사, 검색을 유지하며, 스크린 리더는 거부된 편집을 안내합니다. 선택을 끄려면 `selection: false` 옵션을 사용하세요 +- [병합된 셀을 통한 행 또는 열 제거](merge_cells.md#removing-rows-and-columns-of-merged-cells)는 병합된 셀의 모든 행 또는 열을 제거합니다 +- [`spreadsheet` 로케일](localization.md#default-locale)의 새로운 인터페이스 및 스크린 리더 문자열과 [기본 제공 위젯의 번역](localization.md#localizing-built-in-widgets) +- 키보드 포커스용 [`--dhx-spreadsheet-focus-color`](/themes/#spreadsheet-specific-styles) 변수와, 라이트 테마에서 더 높은 대비를 가지는 수식 참조 색상 +- React Spreadsheet: [`selection`](react/props.md#runtime-props) prop, [`ISelection`](react/types.md#re-exported-upstream-types) 타입, 초기화 전용 prop인 [`readonly`](react/props.md#init-only-props) + +### 수정 사항 {#fixes-604} + +- 병합된 셀 앞의 행 또는 열이 삭제될 때 병합된 셀이 이동하지 않고 삭제되는 문제. 이제 셀이 하나만 남은 병합된 셀은 일반 셀이 되며 값을 유지합니다 +- 병합된 셀을 통해 행 또는 열을 삭제하면 병합의 한 줄만 제거되는 문제 +- 행과 열 제거용 컨텍스트 메뉴 레이블이 제거될 병합된 셀의 모든 행 또는 열을 표시하지 않는 문제 +- 행이 필터링된 전체 범위를 포함할 때 삭제되지 않는 문제 +- 고정된 행 또는 열이 삭제될 때 고정 영역이 줄어들지 않는 문제 +- 드래그한 셀에 일반 숫자가 없을 때 자동 채우기에서 오류가 발생하는 문제 +- 첫 번째 또는 마지막 행이나 열이 숨겨진 상태에서 `Home`, `End`, `Ctrl (Cmd) + Home`, `Ctrl (Cmd) + End` 및 `Ctrl (Cmd) + Arrow` 키를 누르면 페이지가 멈추는 문제 +- 셀을 Excel로 복사하거나 Excel 또는 Spreadsheet 내에서 붙여넣을 때 글꼴 크기가 사라지는 문제 +- 잘못된 값 툴팁이 잘못된 셀에서 떨어진 위치에 나타나거나 표시되지 않는 문제 +- 방향키를 사용한 후 목록 편집기에서 `Esc` 및 `Tab`이 작동하지 않는 문제 +- 검색이 두 번째 일치 항목을 먼저 강조 표시하고 편집이나 시트 전환 후 결과를 새로 고치지 않는 문제 +- WebAssembly가 없는 브라우저에서 가져오기 또는 내보내기 시 스크립트 오류가 발생하는 문제 +- `destructor()` 후에 document 리스너와 내부 위젯이 남아 있는 문제 +- 검색 바가 닫힌 후 키보드 포커스가 사라지는 문제 +- 닫힌 컨텍스트 메뉴가 다시 열리는 문제 +- 키보드 탐색 중 활성 셀이 뷰포트 가장자리보다 한 셀 모자라게 스크롤되는 문제 +- React Spreadsheet: init-only prop 변경으로 Spreadsheet가 다시 생성된 후 이벤트 콜백과 `onStateChange`가 발생하지 않는 문제 +- React Spreadsheet: 언마운트 시 래퍼의 이벤트 핸들러가 제거되지 않는 문제 +- React Spreadsheet: `loadUrl`의 데이터가 마운트 시 두 번 로드되고, Spreadsheet가 다시 생성된 후 유지된 데이터 위에 다시 로드되는 문제 + ## 버전 6.0.3 {#version-603} 2026년 8월 24일 출시 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/work_with_cells.md b/i18n/ko/docusaurus-plugin-content-docs/current/work_with_cells.md index d2d112c4..efdf8163 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/work_with_cells.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/work_with_cells.md @@ -1,7 +1,7 @@ --- sidebar_label: 셀 편집 title: 셀 편집 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 셀 작업에 대한 내용을 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 셀을 편집합니다. 내용 입력, 하이퍼링크 삽입, 드롭다운 목록 사용, 여러 셀 채우기, Excel과 셀 복사 및 셀 잠금을 다룹니다. --- # 셀 편집 {#editing-cells} @@ -145,14 +145,27 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 셀 작 - 1, 3, 5, 7, 9, ... 시리즈를 만들려면 처음 두 셀에 1과 3을 입력하세요. - 2, 4, 6, 8, 10, ... 시리즈를 만들려면 처음 두 셀에 2와 4를 입력하세요. - 숫자 외에도 패턴에 문자를 사용할 수 있습니다. 예를 들어 1, a, 2, b, 3, a, 4, b, ... 같은 시리즈를 만들려면 처음 네 셀에 1, a, 2, b를 입력하세요. + - 텍스트 끝의 숫자를 이어가려면 처음 값을 입력하세요. 예를 들어 item1, item2, item3, ... 시리즈를 만들려면 처음 두 셀에 item1과 item2를 입력하세요. + - 날짜 시리즈를 만들려면 첫 번째 셀에 날짜를 입력하세요. 이후 각 셀은 다음 날짜로 채워집니다. +- 텍스트 반복 + +예를 들어 North, South, North, South, ... 시리즈를 만들려면 처음 두 셀에 North와 South를 입력하세요. *텍스트* 형식의 셀에 있는 숫자도 같은 방식으로 반복됩니다. 3\. **채우기 핸들**을 드래그하세요. ![셀 데이터를 복제하기 위해 채우기 핸들을 드래그하는 DHTMLX Spreadsheet 자동 채우기](/img/autofill.gif) +## Excel과 셀 복사 {#copying-cells-to-and-from-excel} + +**Ctrl (Cmd) + C**로 셀을 복사하고 **Ctrl (Cmd) + V**로 붙여넣을 수 있습니다. Spreadsheet 내에서, 그리고 Spreadsheet와 Microsoft Excel 간에 사용할 수 있습니다: + +- Spreadsheet 내에서는 셀이 값, 수식, 스타일, 숫자 형식, 링크를 유지합니다. 수식의 셀 참조는 새 위치에 맞게 이동합니다 +- Excel에서는 붙여넣은 셀이 값(수식이 아닌 수식의 결과), 스타일(글꼴 크기 포함), 병합된 셀, 링크를 가집니다. 필터로 숨겨진 행은 건너뜁니다 +- Excel에서 복사한 셀을 Spreadsheet에 붙여넣으면 값, 스타일(글꼴 크기 포함), 숫자 형식, 병합된 셀, 링크가 유지됩니다 + ## 셀 잠금 {#locking-cells} -셀을 잠가 값이 변경되지 않도록 보호할 수 있습니다. 셀을 잠그면 오른쪽 상단 모서리에 회색 "열쇠" 아이콘이 표시됩니다. 잠긴 셀은 편집 시도에 응답하지 않습니다. +셀을 잠가 값이 변경되지 않도록 보호할 수 있습니다. 셀을 잠그면 오른쪽 상단 모서리에 회색 "열쇠" 아이콘이 표시됩니다. 잠긴 셀은 편집 시도에 응답하지 않습니다. 스크린 리더는 거부된 편집을 안내합니다. 단일 셀에는 "The cell is locked", 선택한 범위에 잠긴 셀이 포함된 경우에는 "Locked cells were not changed"라고 안내합니다. ![오른쪽 상단 모서리에 회색 열쇠 아이콘으로 표시된 DHTMLX Spreadsheet 잠긴 셀](/img/lockedcells.png) diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/work_with_rows_cols.md b/i18n/ko/docusaurus-plugin-content-docs/current/work_with_rows_cols.md index 2539f976..ec0f2010 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/work_with_rows_cols.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/work_with_rows_cols.md @@ -1,7 +1,7 @@ --- sidebar_label: 행과 열 작업 title: 행과 열 작업 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 행과 열 작업에 대한 내용을 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 행과 열 작업을 수행합니다. 추가 및 제거, 열 너비 자동 맞춤, 열 너비와 행 높이 설정, 고정, 숨기기와 표시를 다룹니다. --- # 행과 열 작업 {#work-with-rows-and-columns} @@ -54,6 +54,10 @@ DHTMLX Spreadsheet를 사용하면 툴바 버튼, 메뉴 옵션, 셀 컨텍스 여러 행을 한 번에 제거하려면 행들을 선택하고, 마우스 오른쪽 버튼을 클릭하여 컨텍스트 메뉴를 열고 *행 -> 행 제거 [ids]*를 선택하세요. ::: +:::info +선택한 셀이 병합된 셀 안에 있으면 병합된 셀의 모든 행이 제거됩니다. 자세한 내용은 [셀 병합](merge_cells.md#removing-rows-and-columns-of-merged-cells) 문서를 확인하세요. +::: + ### 열 추가 {#adding-columns} 새 열을 추가하려면 다음 단계를 따르세요: @@ -98,6 +102,10 @@ DHTMLX Spreadsheet를 사용하면 툴바 버튼, 메뉴 옵션, 셀 컨텍스 여러 열을 한 번에 제거하려면 열들을 선택하고, 마우스 오른쪽 버튼을 클릭하여 컨텍스트 메뉴를 열고 *열 -> 열 제거 [ids]*를 선택하세요. ::: +:::info +선택한 셀이 병합된 셀 안에 있으면 병합된 셀의 모든 열이 제거됩니다. 자세한 내용은 [셀 병합](merge_cells.md#removing-rows-and-columns-of-merged-cells) 문서를 확인하세요. +::: + ## 열 너비 자동 맞춤 {#autofit-column-width} 열 너비를 열의 가장 긴 내용에 자동으로 맞추려면 다음 방법 중 하나를 사용할 수 있습니다: @@ -116,6 +124,50 @@ DHTMLX Spreadsheet를 사용하면 툴바 버튼, 메뉴 옵션, 셀 컨텍스 ![열 너비 자동 맞춤을 위한 데이터에 맞춤 옵션이 있는 DHTMLX Spreadsheet 열 하위 메뉴](/img/column_autofit.png) +## 열 너비와 행 높이 설정 {#setting-column-width-and-row-height} + +### 열 너비 설정 {#setting-column-width} + +열의 정확한 너비를 설정하려면 다음 단계를 따르세요: + +1\. 열 또는 해당 열의 셀을 선택하세요. 여러 열을 변경하려면 해당 열에 걸친 셀 범위를 선택하세요. + +2\. 선택 영역을 마우스 오른쪽 버튼으로 클릭하거나 `Shift + F10` 또는 Menu 키를 누른 다음 *열 -> 열 너비*를 선택하세요. 같은 명령을 열의 점 3개 아이콘 메뉴에서도 사용할 수 있습니다. + +![열 너비가 표시된 열 하위 메뉴가 있는 DHTMLX Spreadsheet 컨텍스트 메뉴](/img/column_width_context_menu.png) + +3\. *열 너비* 대화상자에서 너비를 픽셀 단위로 입력하고 **적용**을 클릭하거나 `Enter`를 누르세요. + +![픽셀 단위 너비와 취소 및 적용 버튼이 있는 DHTMLX Spreadsheet 열 너비 대화상자](/img/column_width_dialog.png) + +### 행 높이 설정 {#setting-row-height} + +행의 정확한 높이를 설정하려면 다음 단계를 따르세요: + +1\. 행 또는 해당 행의 셀을 선택하세요. 여러 행을 변경하려면 해당 행에 걸친 셀 범위를 선택하세요. + +2\. 선택 영역을 마우스 오른쪽 버튼으로 클릭하거나 `Shift + F10` 또는 Menu 키를 누른 다음 *행 -> 행 높이*를 선택하세요. + +![행 높이가 표시된 행 하위 메뉴가 있는 DHTMLX Spreadsheet 컨텍스트 메뉴](/img/row_height_context_menu.png) + +3\. *행 높이* 대화상자에서 높이를 픽셀 단위로 입력하고 **적용**을 클릭하거나 `Enter`를 누르세요. + +![픽셀 단위 높이와 취소 및 적용 버튼이 있는 DHTMLX Spreadsheet 행 높이 대화상자](/img/row_height_dialog.png) + +### 새 크기 적용 방식 {#how-the-new-size-is-applied} + +대화상자에는 선택한 범위의 첫 번째 열 또는 행의 현재 크기가 표시되며, 새 크기는 해당 범위의 모든 열 또는 행에 적용됩니다. 여러 범위를 선택한 경우 마지막으로 선택한 범위가 사용됩니다. + +크기는 정수 픽셀로 반올림됩니다. 열의 최소 너비는 20px, 행의 최소 높이는 10px이며, 이보다 작은 양수 값은 최솟값으로 대체됩니다. 필드가 비어 있거나 값이 양수가 아닌 동안에는 **적용** 버튼이 비활성화됩니다. + +**취소** 버튼 또는 `Esc`는 변경 없이 대화상자를 닫습니다. 스크린 리더는 새 크기를 안내합니다. 예: "Column width set to 120 pixels". + +### 변경 취소 {#undoing-the-change} + +새 크기는 `Ctrl (Cmd) + Z`로 취소할 수 있습니다. + +코드에서 변경을 처리하려면 `resizeCol` 및 `resizeRow` [액션](api/overview/actions_overview.md#list-of-actions)을 사용하세요. + ## 행과 열 고정/해제 {#freezingunfreezing-rows-and-columns} ### 행 고정 {#freezing-rows} @@ -212,6 +264,10 @@ DHTMLX Spreadsheet를 사용하면 툴바 버튼, 메뉴 옵션, 셀 컨텍스 ![행 숨기기 옵션이 있는 행 하위 메뉴가 표시된 DHTMLX Spreadsheet 컨텍스트 메뉴](/img/hide_row_context_menu.png) +:::info +활성 셀이 숨겨지는 행에 있으면 활성 셀은 그 아래의 첫 번째 표시된 행으로 이동하고, 선택 영역은 이 셀로 줄어듭니다. 아래에 표시된 행이 없으면 위쪽의 마지막 표시된 행으로 이동합니다. +::: + ### 행 표시 {#showing-rows} 숨겨진 행을 표시하려면 다음 단계 중 하나를 따르세요: @@ -228,6 +284,8 @@ DHTMLX Spreadsheet를 사용하면 툴바 버튼, 메뉴 옵션, 셀 컨텍스 ![행 표시 옵션이 있는 행 하위 메뉴가 표시된 DHTMLX Spreadsheet 컨텍스트 메뉴](/img/show_rows_context_menu.png) +- 또는 행이나 여러 셀을 선택하여 숨겨진 행이 선택 범위에 포함되도록 한 후 `Ctrl (Cmd) + Shift + 9`를 누르세요. 예를 들어 숨겨진 3행을 표시하려면 2-4행을 선택하세요. 선택 범위에 숨겨진 행이 없으면 스크린 리더가 "No hidden rows in the selection"이라고 안내합니다 + ### 열 숨기기 {#hiding-columns} 열을 숨기려면 다음 단계를 따르세요: @@ -244,6 +302,10 @@ DHTMLX Spreadsheet를 사용하면 툴바 버튼, 메뉴 옵션, 셀 컨텍스 ![열 숨기기 옵션이 있는 열 하위 메뉴가 표시된 DHTMLX Spreadsheet 컨텍스트 메뉴](/img/hide_columns_context_menu.png) +:::info +활성 셀이 숨겨지는 열에 있으면 활성 셀은 그 오른쪽의 첫 번째 표시된 열로 이동하고, 선택 영역은 이 셀로 줄어듭니다. 오른쪽에 표시된 열이 없으면 왼쪽의 마지막 표시된 열로 이동합니다. +::: + ### 열 표시 {#showing-columns} 숨겨진 열을 표시하려면 다음 단계 중 하나를 따르세요: @@ -259,3 +321,5 @@ DHTMLX Spreadsheet를 사용하면 툴바 버튼, 메뉴 옵션, 셀 컨텍스 (*아래 이미지에서 C열이 숨겨져 있습니다*) ![열 표시 옵션이 있는 열 하위 메뉴가 표시된 DHTMLX Spreadsheet 컨텍스트 메뉴](/img/show_columns_context_menu.png) + +- 또는 열이나 여러 셀을 선택하여 숨겨진 열이 선택 범위에 포함되도록 한 후 `Ctrl (Cmd) + Shift + 0`을 누르세요. 선택 범위에 숨겨진 열이 없으면 스크린 리더가 "No hidden columns in the selection"이라고 안내합니다 diff --git a/i18n/ru/docusaurus-plugin-content-docs/current.json b/i18n/ru/docusaurus-plugin-content-docs/current.json index cf6ba12a..a3027ba0 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current.json +++ b/i18n/ru/docusaurus-plugin-content-docs/current.json @@ -83,6 +83,10 @@ "message": "Работа с ячейками", "description": "The generated-index page title for category 'Work with cells' in sidebar 'docs'" }, + "sidebar.docs.category.Accessibility": { + "message": "Доступность", + "description": "The label for category 'Accessibility' in sidebar 'docs'" + }, "sidebar.docs.category.Frameworks & integrations": { "message": "Фреймворки и интеграции", "description": "The label for category 'Frameworks & integrations' in sidebar 'docs'" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/.sync b/i18n/ru/docusaurus-plugin-content-docs/current/.sync index 96f6c508..8fee4307 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/.sync +++ b/i18n/ru/docusaurus-plugin-content-docs/current/.sync @@ -1 +1 @@ -2b6d3c2fd433461ffce34526974de3f1ba5161a8 +1853f2853225a3d5774a2d166077a4404f555063 diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/accessibility.md b/i18n/ru/docusaurus-plugin-content-docs/current/accessibility.md new file mode 100644 index 00000000..1c1ed55e --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/accessibility.md @@ -0,0 +1,449 @@ +--- +sidebar_label: Доступность +title: Доступность +description: Сделайте DHTMLX Spreadsheet доступным для пользователей клавиатуры и скринридеров. Узнайте о поддержке WAI-ARIA, навигации с клавиатуры, голосовых уведомлениях скринридеров и высококонтрастных темах, соответствующих WCAG 2.2 AA. +--- + +# Доступность в DHTMLX Spreadsheet + +Это руководство предназначено для разработчиков, которые встраивают DHTMLX Spreadsheet в приложение с требованиями к доступности. Используйте его, чтобы сверить компонент со своим чек-листом и настроить его для пользователей клавиатуры, скринридеров и высококонтрастных тем. + +Spreadsheet выводит в разметке роли и состояния WAI-ARIA. Фокус клавиатуры остается на активной ячейке, а панель инструментов, строка меню и вкладки листов представляют собой по одной точке табуляции. Изменения, у которых нет собственного элемента, например отклоненное редактирование или результат поиска, попадают в live-область, которую скринридеры зачитывают вслух. + +:::info Целевое соответствие +DHTMLX Spreadsheet разработан в соответствии с **WCAG 2.2 Level AA**, **Section 508** закона США Rehabilitation Act и **EN 301 549** (техническая основа European Accessibility Act). + +Соответствие отражено по каждому критерию для DHTMLX Spreadsheet 6.0.4. Доступен подробный **Отчет о соответствии требованиям доступности (VPAT® 2.5)**: [Accessibility Conformance Report](accessibility_conformance_report.md). +::: + +## Возможности {#capabilities} + +| Область | Поддержка | +| ---- | ------- | +| Работа с клавиатуры | У каждой команды для ячеек есть клавиша. Панель инструментов, строка меню и вкладки листов представляют собой единые точки табуляции, навигация по ним выполняется стрелками. Для ширины столбца, высоты строки и фильтра столбца есть команды контекстного меню, поэтому перетаскивание или щелчок по иконке не требуются | +| Семантика WAI-ARIA | Ячейки образуют `grid` с элементами `columnheader`, `rowheader` и `gridcell`. Роли выводятся всегда | +| Модель фокуса | Фокус клавиатуры находится на активной ячейке. Tab входит в лист на активную ячейку и покидает его с последней и первой ячейки. Ctrl + F6 перемещает фокус между меню, панелью инструментов, листом и вкладками листов | +| Модель выделения | Активная ячейка, диапазон и несколько диапазонов передаются через `aria-selected`, а размер диапазона озвучивается. Выделение можно отключить с помощью опции [`selection`](api/spreadsheet_selection_config.md) | +| Режим только для чтения | По листу можно перемещаться, выделять, копировать и искать; редактирование отклоняется и озвучивается, контекстное меню недоступно | +| Скринридеры | Протестировано с NVDA, JAWS и VoiceOver | +| Визуальная доступность | Темы `contrast-light` и `contrast-dark`, видимый индикатор фокуса в каждой теме и признаки, не зависящие от цвета | +| Масштабирование текста и страницы | Интерфейс остается работоспособным при масштабе 200% и 400% и при переопределении межстрочных и межбуквенных интервалов | +| Настройка | Публичный метод [`announce()`](api/spreadsheet_announce_method.md) для собственных сообщений и переводимые строки локали `aria_*` для каждого встроенного имени и уведомления | +| Стандарты | WCAG 2.2 AA, Section 508, EN 301 549 | + +## Охватываемые области {#covered-areas} + +Это руководство охватывает виджет Spreadsheet: + +- ячейки, заголовки столбцов и строк, объединенные ячейки и закрепленные строки и столбцы +- выделение: активная ячейка, диапазоны и несколько диапазонов +- строка формул и редакторы ячеек, включая редактор ячейки со списком значений +- панель инструментов с popup-окнами выбора цвета и границ, строка меню и контекстные меню +- вкладки листов +- сортировка, фильтрация, поиск, валидация данных, ссылки в ячейках, импорт и экспорт +- темы и индикатор фокуса + +Доступность итоговой страницы также зависит от приложения-хоста. См. [Ответственность страницы-хоста](#host-page-responsibilities). + +## Поддержка WAI-ARIA {#wai-aria-support} + +Spreadsheet автоматически добавляет в разметку роли и атрибуты WAI-ARIA, отключить их нельзя. У каждой части виджета есть своя роль и имя, а имена берутся из [локали](#localization). + +### Контейнер Spreadsheet {#spreadsheet-container} + +Части Spreadsheet представляют собой отдельные именованные элементы управления: + +| Часть | Роль / атрибут | Доступное имя | +| ---- | ---------------- | --------------- | +| Строка меню | `role="menubar"` + `aria-label` | "Main" | +| Панель инструментов | `role="toolbar"` + `aria-label` | "Formatting" | +| Строка формул | `aria-label` на поле ввода | "Formula bar, B7", с адресом активной ячейки | +| Ячейки | `role="grid"` + `aria-label` | "Spreadsheet" | +| Вкладки листов | `role="toolbar"` + `aria-label` | "Sheets" | +| Live-область | `role="status"`, `aria-live="polite"`, `aria-atomic="true"` | визуально скрыта, расположена рядом с гридом вне `role="grid"` | + +У корневого элемента Spreadsheet нет роли ориентира (landmark), поэтому вы можете поместить его в подходящий для вашей страницы ориентир. + +### Поверхность ячеек {#cell-surface} + +Следующие атрибуты описывают ячейки в целом. Их содержит элемент `.dhx_grid-content`: + +| Селектор | Роль / атрибут | Назначение | +| -------- | ---------------- | ------- | +| `.dhx_grid-content` | `role="grid"` | Интерактивный грид ячеек | +| `.dhx_grid-content` | `aria-label` | "Spreadsheet", из ключа локали `aria_grid` | +| `.dhx_grid-content` | `aria-rowcount` | Количество строк листа плюс строка заголовка | +| `.dhx_grid-content` | `aria-colcount` | Количество видимых столбцов плюс столбец с номерами строк | +| `.dhx_grid-content` | `aria-readonly` | `"true"` в [режиме только для чтения](api/spreadsheet_readonly_config.md) и пока [выделение](api/spreadsheet_selection_config.md) отключено | +| `.dhx_grid-content` | `aria-multiselectable` | `"true"`; `"false"`, пока выделение отключено | + +### Строки и ячейки {#rows-and-cells} + +В следующей таблице перечислены роли, а также атрибуты позиции и состояния строк и ячеек: + +| Селектор | Роль / атрибут | Назначение | +| -------- | ---------------- | ------- | +| Строка | `role="row"` + `aria-rowindex` | Строка листа. У строки 1 листа `aria-rowindex="2"`, так как заголовок столбцов является первой строкой | +| Ячейка | `role="gridcell"` + `aria-colindex` | Ячейка. У столбца A `aria-colindex="2"`, так как номера строк являются первым столбцом | +| Номер строки | `role="rowheader"` | Заголовок строки | +| Ячейка | `aria-selected` | `"true"` на активной ячейке и на каждой ячейке выделенных диапазонов | +| Ячейка | `aria-readonly` | `"true"` в режиме только для чтения, пока [выделение](api/spreadsheet_selection_config.md) отключено, и на [заблокированных ячейках](work_with_cells.md#locking-cells) | +| Ячейка | `tabindex` | `"0"` на активной ячейке и `"-1"` на остальных, поэтому ячейки представляют собой одну точку табуляции | +| Активная ячейка | DOM-фокус | Фокус клавиатуры находится на самой активной ячейке, а не на отдельном поле ввода. Пока ячейка редактируется, фокус находится на редакторе ячейки | +| Объединенная ячейка | `aria-colspan` / `aria-rowspan` | Количество столбцов или строк, которые занимает объединенная ячейка. Покрытые ею ячейки скрыты с помощью `aria-hidden="true"` | +| Ссылка в ячейке | `
` с `target="_blank"` и `rel="noopener noreferrer"` | Ссылка со схемой `http`, `https`, `mailto`, `ftp` или `tel` | + +Ячейка также содержит визуально скрытый текст, который скринридеры зачитывают вместе со значением: + +| Скрытый текст | Когда | +| ----------- | ---- | +| Адрес ячейки, например "B7" | На активной ячейке и на каждой ячейке выделенного диапазона. Скринридеры зачитывают адрес перед значением | +| "link" | На выделенной ячейке со ссылкой. Alt + Enter открывает ссылку | +| "locked" | На выделенной заблокированной ячейке | +| Описание ошибки формулы, например "Reference error. Check the cell references" | На ячейке с ошибкой формулы | +| "Invalid value. Choose a value from the list" | На ячейке, значения которой нет в ее [списке значений](work_with_cells.md#using-drop-down-lists-in-cells) | +| "Filter" / "Filter applied" | На ячейке с иконкой фильтра | + +### Заголовки столбцов и строк {#column-and-row-headers} + +| Селектор | Роль / атрибут | Назначение | +| -------- | ---------------- | ------- | +| Буква столбца | `role="columnheader"` + `aria-colindex` | Заголовок столбца | +| Угол выделения всего листа | `role="columnheader"` | Имя "Select all" | +| Номер строки | `role="rowheader"` | Заголовок строки | +| Иконка меню столбца, иконки скрытых строк и столбцов | `aria-hidden="true"` | Декоративные. Команды находятся в контекстном меню | + +Заголовки не являются точками табуляции. Щелчок по букве столбца, номеру строки или углу выделяет строки или столбцы и возвращает фокус на активную ячейку. + +### Строка формул и редакторы {#formula-bar-and-editors} + +| Селектор | Роль / атрибут | Назначение | +| -------- | ---------------- | ------- | +| Поле ввода строки формул | `aria-label` | "Formula bar, B7", с адресом активной ячейки. На заблокированной ячейке поле ввода имеет атрибут `readonly`, поэтому его значение по-прежнему можно прочитать. Пока выделение отключено, строка формул пуста и заблокирована | +| Поле ввода редактора ячейки | `aria-label` | "Cell editor, B7" | +| Редактор ячейки со списком значений | `role="combobox"`, `aria-controls`, `aria-expanded`, `aria-activedescendant` | Список значений представляет собой `listbox` из элементов `option`, а у выделенной опции есть `aria-selected` | +| Редактор с недопустимым значением | `aria-invalid="true"` | Сохраненного значения ячейки нет в ее списке значений. Атрибут обновляется после сохранения значения, а не во время ввода | +| Иконка закрытия справки по формуле | `role="button"` + `aria-label` | "Close formula help" | + +### Панель инструментов и меню {#toolbar-and-menus} + +| Селектор | Роль / атрибут | Назначение | +| -------- | ---------------- | ------- | +| Панель инструментов | `role="toolbar"` + `aria-label` | "Formatting"; панели инструментов popup-окна границ, строки поиска и popup-окна ссылки называются "Borders", "Search" и "Link" | +| Кнопка панели инструментов | `aria-label` | Значение кнопки. Кнопка с иконкой получает имя из подсказки, например "Bold (ctrl+b)". Иконки скрыты с помощью `aria-hidden="true"` | +| Bold, Italic, Underline, Strikethrough, Lock, Filter | `aria-pressed` | Включено ли форматирование или фильтр | +| Кнопка, открывающая выпадающий список | `aria-haspopup="menu"`, `aria-expanded` | Выпадающий список представляет собой `menu`, названное по своей кнопке | +| Выравнивание, перенос текста, числовые форматы | `role="menuitemradio"` + `aria-checked` | Один вариант из взаимоисключающего набора | +| Text color, Background color, Border color | `aria-label` | Название элемента управления и текущего цвета, например "Text color: dark gray" | +| Цветовая палитра | `role="grid"` из элементов `gridcell` | Грид называется "Color palette". Каждая цветовая ячейка названа по своему цвету, а у выбранной есть `aria-selected="true"` | +| Список стилей границ | `role="listbox"` из элементов `option` | Опции называются "Thin line", "Medium line", "Thick line", "Dashed line", "Dotted line", "Double line" | +| Строка меню | `role="menubar"` + `aria-label` | "Main". Ее пункты открывают popup-окна с `role="menu"`. В popup-окнах у пунктов форматирования `role="menuitemcheckbox"`, а у пунктов выравнивания, переноса текста и числовых форматов `role="menuitemradio"`. Оба вида сообщают свое состояние через `aria-checked` | +| Контекстные меню | `role="menu"` + `aria-label` | "Cell" для ячеек и "Sheet" для вкладок листов | + +### Вкладки листов {#sheet-tabs} + +| Селектор | Роль / атрибут | Назначение | +| -------- | ---------------- | ------- | +| Панель вкладок листов | `role="toolbar"` + `aria-label` | "Sheets" | +| Вкладка листа | `button` + `aria-pressed` | Вкладка названа по своему листу. У вкладки активного листа `aria-pressed="true"` | +| Кнопка добавления листа | `aria-label` | "Add sheet" | + +### Диалоги {#dialogs} + +| Селектор | Роль / атрибут | Назначение | +| -------- | ---------------- | ------- | +| Диалоги Column width и Row height | `role="dialog"`, `aria-modal="true"`, `aria-label` | Названы по заголовку диалога. Поле ввода имеет метку "Width in pixels" / "Height in pixels" | +| Строка поиска | `role="dialog"` + `aria-label` | Называется "Search". Поле поиска имеет метку "Search", а кнопки называются "Previous match", "Next match" и "Close search" | +| Insert link, Data validation | `role="dialog"` + `aria-label` | Названы по заголовку диалога | +| Предупреждения | `role="alertdialog"`, `aria-modal="true"`, `aria-labelledby`, `aria-describedby` | Названы по заголовку предупреждения и описаны его текстом | + +### Скрытые и декоративные элементы {#hidden-and-decorative-elements} + +Spreadsheet скрывает декоративные части от вспомогательных технологий с помощью `aria-hidden="true"`. Это иконки блокировки, фильтра и меню столбца, иконки скрытых строк и столбцов и иконка выделения всего листа. Слой, который рисует выделение, подсветку копирования и поиска и маркер заполнения, также скрыт. Скрыты и цветная копия формулы в строке формул, и ячейки, покрытые объединенной ячейкой. У оберток разметки есть `role="presentation"`. Фокусные ограничители до и после грида лишь передают фокус активной ячейке. + +## Модель выделения и редактирования {#selection-and-editing-model} + +DOM-фокус находится на самой активной ячейке, поэтому скринридер зачитывает ячейку, а не отдельное поле ввода. Когда активная ячейка перемещается, скринридер сначала зачитывает адрес новой ячейки, затем ее значение и скрытые описания. Когда пользователь выделяет диапазон с клавиатуры или мышью, скринридер озвучивает размер диапазона, после того как выделение перестает меняться. Ячейка, принадлежащая нескольким диапазонам, считается один раз, ячейки скрытых строк и столбцов учитываются. Пока ячейка редактируется, ничего не озвучивается. Когда диапазон сокращается до активной ячейки, озвучивается адрес ячейки. + +| Ситуация | Что получает скринридер | +| --------- | --------------------------- | +| Активная ячейка перемещается | Ячейка с ее адресом, значением и описаниями, например "B7, 120, locked" | +| Выделяется диапазон | "B2 to D7, 18 cells" | +| С помощью Ctrl выделяется несколько диапазонов | "B2 to B4, D2 to D4, 6 cells" | +| Редактор открывается клавишей Enter, F2 или вводом текста | Поле ввода редактора с именем "Cell editor, B7" | +| Открывается редактор ячейки со списком значений | Развернутый combobox. После ↑ или ↓ зачитывается выделенная опция списка | +| Редактирование сохраняется | Озвучиваются новые ошибки формул в отредактированных ячейках и в зависящих от них ячейках, а также недопустимые значения в отредактированных ячейках | +| Редактирование заблокированной ячейки отклонено | "The cell is locked" | +| В режиме только для чтения нажата клавиша редактирования | "The sheet is read-only" | + +Enter, F2 или ввод текста открывает редактор. Enter сохраняет значение и переходит вниз, Tab сохраняет его и переходит вправо, а Esc отменяет редактирование. + +## Навигация с клавиатуры {#keyboard-navigation} + +Клавиатура работает сразу после появления Spreadsheet на странице, настройка не требуется. В таблицах ниже кратко описана модель работы с клавиатурой. Полный набор сочетаний клавиш см. в [списке горячих клавиш](hotkeys.md). + +![Выпадающий список Horizontal align на панели инструментов, открытый клавишей Down, с фокусом на первом пункте](/img/accessibility/toolbar_dropdown_focus.png) + +### Ячейки {#cells} + +| Клавиши | Действие | +| ---- | ------ | +| Стрелки | Перемещают активную ячейку. Активная ячейка останавливается на первой и последней видимой строке и столбце | +| Shift + стрелки | Расширяют выделенный диапазон | +| Home / End | Переход к первой или последней видимой ячейке строки | +| Ctrl + стрелки, Ctrl + Home / End | Переход к краю листа | +| Tab / Shift + Tab | Переход вправо или влево внутри строки. С последней или первой ячейки листа фокус выходит из ячеек к следующей или предыдущей части страницы, например к вкладкам листов или строке формул | +| Enter, F2 | Открыть редактор | +| Esc | Закрыть редактор без сохранения | +| Ctrl + Space / Shift + Space | Выделить столбец или строку | +| Ctrl + Shift + 9 / 0 | Показать скрытые строки или столбцы внутри выделенного диапазона | +| Alt + Enter | Открыть ссылку активной ячейки | +| Shift + F10 или клавиша Menu | Открыть контекстное меню с командами для ячейки или для столбца после Ctrl + Space | +| Alt + ↑ / ↓, Ctrl + Alt + Page Down / Page Up | Переключиться на следующий или предыдущий лист | + +### Переход между частями {#moving-between-the-parts} + +| Клавиши | Действие | +| ---- | ------ | +| Ctrl + F6 / Ctrl + Shift + F6 | Переместить фокус на следующую или предыдущую часть: меню, панель инструментов, лист, вкладки листов. Строка формул и скрытые части пропускаются. Открытое редактирование предварительно сохраняется | +| Tab / Shift + Tab | Переместить фокус на следующую или предыдущую часть в порядке табуляции страницы. Каждая панель представляет собой одну точку табуляции, а фокус попадает на элемент управления, использованный последним | + +### Панель инструментов, строка меню и вкладки листов {#toolbar-menu-bar-and-sheet-tabs} + +| Клавиши | Действие | +| ---- | ------ | +| ← / →, Home / End | Переход между элементами управления панели | +| Enter / Space | Нажать элемент управления: выполнить команду, открыть выпадающий список или переключиться на лист | +| ↓ | Открыть выпадающий список и переместить фокус на его первый пункт | +| ↑ / ↓ | Переход между пунктами открытого выпадающего списка или меню | +| → / ← | Открыть или закрыть подменю | +| Esc | Закрыть выпадающий список или меню и вернуть фокус на его элемент управления | + +### Popup-окна и диалоги {#popups-and-dialogs} + +| Клавиши | Действие | +| ---- | ------ | +| Стрелки, Home / End | Переход между цветами цветовой палитры | +| Enter | Применить цвет, границу или размер в диалогах Column width и Row height | +| Esc | Закрыть popup-окно, диалог или строку поиска и вернуть фокус на элемент управления или ячейку, которые их открыли. В режиме пользовательского цвета вернуться к палитре. В popup-окне цвета или стиля, открытом из popup-окна границ, закрыть его и вернуть фокус на его кнопку в popup-окне границ | +| Tab / Shift + Tab | Переход между элементами управления диалога или режима пользовательского цвета. В popup-окне цвета или popup-окне границ закрыть его и вернуть фокус на его кнопку панели инструментов | +| ↑ / ↓, Enter | Перемещение по списку значений ячейки и выбор значения | + +:::note +У действий, рассчитанных только на указатель, есть клавиатурные альтернативы. Команды *Column width* и *Row height* контекстного меню задают точный размер без перетаскивания, а команда *Open filter* открывает фильтр без щелчка по его иконке. +::: + +## Вспомогательные технологии {#assistive-technology} + +Команда DHTMLX тестирует Spreadsheet со следующими скринридерами: + +| Скринридер | Браузер | Платформа | +| ------------- | ------- | -------- | +| NVDA | Firefox | Windows | +| JAWS | Chrome | Windows | +| VoiceOver | Safari | macOS | + +Скринридеры получают каждое состояние от элемента, к которому оно относится: + +| Состояние | Передается через | Зачитывается на | +| ----- | --------------- | ------- | +| Позиция | `aria-rowindex`, `aria-colindex` и адрес ячейки в тексте ячейки | Каждой ячейке. Адрес находится в тексте активной ячейки и ячеек выделенных диапазонов | +| Выделение | `aria-selected` | Активной ячейке и ячейках выделенных диапазонов | +| Возможность редактирования | `aria-readonly` | Гриде и ячейках в режиме только для чтения и пока выделение отключено, а также заблокированных ячейках | +| Объединенные ячейки | `aria-colspan`, `aria-rowspan` | Объединенной ячейке | +| Заголовки строк | `role="rowheader"` | Номерах строк | +| Состояние переключателя | `aria-pressed` | Кнопках Bold, Italic, Underline, Strikethrough, Lock и Filter и вкладках листов | +| Состояние отметки | `aria-checked` | Пунктах форматирования строки меню, а также пунктах выравнивания, переноса текста и числовых форматов | +| Ошибки и недопустимые значения | Скрытый текст в ячейке, `aria-invalid` | Ячейке и ее редакторе | +| Ссылки | `` и скрытый текст "link" | Ячейке со ссылкой | + +## Высокий контраст и фокус {#high-contrast-and-focus} + +### Темы {#themes} + +В Spreadsheet есть четыре встроенные темы: `light` (по умолчанию), `dark`, `contrast-light` и `contrast-dark`. Темы `contrast-light` и `contrast-dark` соответствуют требованиям WCAG AA к контрасту текста. Переключайте тему методом `dhx.setTheme()` или атрибутом `data-dhx-theme`: + +~~~jsx +dhx.setTheme("contrast-light"); // or "contrast-dark" +~~~ + +Подробности см. в статье [Встроенные темы](/themes/). + +В светлых темах цвета, которыми выделяются ссылки на ячейки в формуле, имеют контраст не менее 4.5:1. + +Тема `contrast-light` рисует темный текст и границы на белом фоне. В показанном ниже Spreadsheet с клавиатуры открыто контекстное меню ячейки с иконкой фильтра. Его команда в фокусе, [*Open filter*](filtering_data.md#opening-a-filter-with-the-keyboard), отмечена штриховой рамкой, а активная ячейка отмечена сплошной границей основного цвета темы: + +![Spreadsheet в теме contrast-light](/img/accessibility/spreadsheet_contrast_light.png) + +Тема `contrast-dark` рисует светлый текст и границы на темном фоне. Когда фокус находится на элементе управления панели инструментов, он отмечается кольцом фокуса цвета `--dhx-spreadsheet-focus-color`, который в темных темах светлее основного цвета границы активной ячейки: + +![Spreadsheet в теме contrast-dark](/img/accessibility/spreadsheet_contrast_dark.png) + +### Индикатор фокуса {#focus-indicator} + +Фокус клавиатуры отображается в каждой теме: + +- у активной ячейки сплошная граница 2px основного цвета темы +- ячейка и редактор ячейки, находящиеся в фокусе клавиатуры, получают рамку 2px основного цвета темы +- строка формул и элементы управления панели инструментов, строки меню, вкладок листов, popup-окна границ, popup-окна ссылки и строки поиска получают рамку 2px цвета переменной `--dhx-spreadsheet-focus-color` +- в цветовой палитре, списке стилей границ, выпадающих списках панели инструментов и строки меню и контекстных меню пункт в фокусе получает штриховую рамку 1px цвета `--dhx-color-focused` +- в редакторе ячейки со списком фокус остается в редакторе, а текущий пункт списка подсвечивается цветом фона + +Переменная `--dhx-spreadsheet-focus-color` в темных темах светлее основного цвета и может быть переопределена в [пользовательской теме](themes/custom_theme.md). Контраст каждого индикатора в каждой теме приведен в [Accessibility Conformance Report](accessibility_conformance_report.md). + +### Цвет и масштаб {#color-and-zoom} + +- **Цвет не является единственным сигналом.** У активной ячейки и выделения есть граница и заливка, у недопустимого значения есть маркер и скрытое описание, а кнопки форматирования сообщают свое состояние через `aria-pressed`. В доступное имя цветовых кнопок входит название цвета. +- **Масштаб и перестроение.** Spreadsheet остается работоспособным при масштабе 200% и 400%. Ячейки прокручиваются в двух направлениях, а панель инструментов, строка меню и вкладки листов умещаются в ширину 320 CSS px. +- **Интервалы текста.** При переопределении интервалов текста по WCAG подписи элементов управления не обрезаются, а панель вкладок листов прокручивается, когда вкладки разрастаются. +- **Прокрутка в область видимости.** Активная ячейка прокручивается в область видимости рядом с закрепленными строками и столбцами. + +## Уведомления о состоянии {#status-announcements} + +Spreadsheet озвучивает изменения, у которых нет собственного элемента, через вежливую (polite) live-область, поэтому скринридер сначала дочитывает текущее предложение: + +| Событие | Озвучиваемый текст | Ключ локали | +| ----- | -------------- | ---------- | +| Выделен диапазон | "B2 to D7, 18 cells" | `aria_selectedRange`, `aria_rangeExtent`, `aria_rangeSeparator` | +| Редактирование вызывает ошибку формулы или недопустимое значение | "B7: Reference error. Check the cell references" | `aria_cellMessage` | +| Редактирование вызывает несколько ошибок / недопустимых значений | "3 new errors. B7: ..." / "3 invalid values. B7: ..." | `aria_newErrors`, `aria_invalidValues` | +| Редактирование заблокированной ячейки / диапазона отклонено | "The cell is locked" / "Locked cells were not changed" | `aria_lockedCell`, `aria_lockedCells` | +| В режиме только для чтения нажата клавиша редактирования | "The sheet is read-only" | `aria_readonlySheet` | +| Введен текст поиска | "Results: 5. 1 of 5, B2" или "No results" | `aria_searchResults`, `aria_searchMatch`, `aria_searchNoResults` | +| Показано следующее или предыдущее совпадение | "2 of 5, B7" | `aria_searchMatch` | +| Выполнен экспорт Excel-файла | "Exporting the file", "The file is exported" | `aria_exportStarted`, `aria_exportDone` | +| Импортирован файл, выбранный в диалоге выбора файла | "Importing the file", "The file is imported" | `aria_importStarted`, `aria_importDone` | +| Применена команда Column width / Row height | "Column width set to 120 pixels" | `aria_columnWidthSet`, `aria_rowHeightSet` | +| Ctrl + Shift + 9 / 0 не находит, что показать | "No hidden rows in the selection" | `aria_noHiddenRows`, `aria_noHiddenCols` | + +Чтобы озвучить результат собственной команды, вызовите метод [`announce()`](api/spreadsheet_announce_method.md): + +~~~jsx +spreadsheet.announce("The report is saved"); +~~~ + +## Локализация {#localization} + +Доступные имена, описания ячеек и уведомления хранятся в локали `spreadsheet` в виде ключей с префиксом `aria_`, рядом с подписями интерфейса. Переведите их методом `dhx.i18n.setLocale()` до инициализации Spreadsheet: + +~~~jsx +dhx.i18n.setLocale("spreadsheet", { + // other keys of the locale + aria_grid: "Tabelle", + aria_cellEditor: "Zelleneditor, {cell}", + aria_readonlySheet: "Das Blatt ist schreibgeschützt", + aria_selectedRange: "{range}, {count} Zellen", + aria_rangeExtent: "{start} bis {end}" +}); + +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); +~~~ + +Части в фигурных скобках, например `{cell}` или `{count}`, заменяются значениями и должны сохраняться в переведенных строках. Названия цветов и кнопок предупреждений берутся из локалей `colorpicker` и `message`. Полный список ключей см. в статье [Локализация](localization.md#default-locale), а остальные локали описаны в разделе [Локализация встроенных виджетов](localization.md#localizing-built-in-widgets). + +## Примеры конфигурации {#configuration-recipes} + +### Доступная настройка по умолчанию {#accessible-default-setup} + +Для работы с клавиатуры и вывода WAI-ARIA Spreadsheet не требует настройки. Чтобы соответствовать требованиям WCAG AA к контрасту текста, выберите контрастную тему. Другие способы задать тему см. в статье [Встроенные темы](/themes/): + +~~~jsx +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { + // the keyboard navigation and the WAI-ARIA output need no configuration +}); +spreadsheet.parse(data); + +dhx.setTheme("contrast-light"); // or "contrast-dark" +~~~ + +### Настройка режима только для чтения {#read-only-setup} + +Используйте опцию [`readonly`](api/spreadsheet_readonly_config.md), чтобы показать данные, которые пользователи могут читать и копировать, но не изменять. Пользователи клавиатуры и скринридеров по-прежнему могут перемещаться по ячейкам: + +~~~jsx +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { + readonly: true +}); +spreadsheet.parse(data); +~~~ + +Чтобы показать данные без активной ячейки и без выделения, добавьте [`selection: false`](api/spreadsheet_selection_config.md). Тогда грид станет одной точкой табуляции, которую клавиатура проходит насквозь. + +### Переведенные строки доступности {#translated-accessibility-strings} + +Скринридеры читают строки доступности из четырех локалей: `spreadsheet` содержит имена, описания ячеек и уведомления, `colorpicker` содержит названия цветов, `message` содержит названия кнопок предупреждений, а `grid` содержит уведомление о количестве загруженных строк. Задайте все четыре до создания Spreadsheet. Ключи см. в разделе [Локализация встроенных виджетов](localization.md#localizing-built-in-widgets): + +~~~jsx +const deSpreadsheet = { + // other keys of the locale + aria_grid: "Tabelle", + aria_readonlySheet: "Das Blatt ist schreibgeschützt" +}; +const deColorpicker = { + aria_palette: "Farbpalette", + aria_colorRed: "rot" +}; +const deMessage = { + aria_confirm: "Bestätigen" +}; +const deGrid = { + aria_rowsLoaded: "{count} Zeilen geladen" +}; + +dhx.i18n.setLocale("spreadsheet", deSpreadsheet); +dhx.i18n.setLocale("colorpicker", deColorpicker); +dhx.i18n.setLocale("message", deMessage); +dhx.i18n.setLocale("grid", deGrid); + +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); +~~~ + +### Озвучивание пользовательской команды {#announcing-a-custom-command} + +Когда ваша собственная команда меняет данные, сообщите пользователям скринридеров о результате с помощью метода [`announce()`](api/spreadsheet_announce_method.md). В примере в [меню](customization.md#menu) добавляется команда, очищающая активный лист: + +~~~jsx +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); + +spreadsheet.menu.data.add({ id: "clear-sheet", value: "Clear sheet" }); + +spreadsheet.menu.events.on("click", function (id) { + if (id === "clear-sheet") { + spreadsheet.sheets.clear(); + spreadsheet.announce("The sheet is cleared"); + } +}); +~~~ + +## Ответственность страницы-хоста {#host-page-responsibilities} + +Ряд требований относится к уровню страницы, а не компонента. Убедитесь, что страница-хост: + +- задает язык документа, например ``, и заголовок страницы +- помещает заголовок над Spreadsheet и размещает его внутри ориентира, например `
` +- предоставляет ссылку для пропуска навигации (skip link), если перед Spreadsheet стоит длинная навигация +- дает второй сигнал, например текст или иконку, любому состоянию, которое вы помечаете цветом ячейки, так как цвета стилей ячеек являются частью ваших данных +- проверяет контраст цветов, которые вы задаете в стилях ячеек и в пользовательской теме + +## Тестирование и методология {#testing-and-methodology} + +Команда DHTMLX проверяет доступность Spreadsheet 6.0.4 по исходному коду компонента и в браузере: + +1. **Автоматизированное тестирование** с помощью [axe-core](https://github.com/dequelabs/axe-core) в темах `light`, `dark`, `contrast-light` и `contrast-dark` с открытыми строкой поиска, редактором списка, диалогами и предупреждением. +2. **Ручной анализ** исходного кода: роли, состояния и имена каждой части, обработчики клавиатуры и области фокуса, а также токены тем с их коэффициентами контраста. +3. **Ручное тестирование**: прохождение сценариев только с клавиатуры по ячейкам, панелям, меню и диалогам, проверки скринридерами NVDA, JAWS и VoiceOver, масштаб 200% и 400%, перестроение при 320 CSS px и переопределение интервалов текста по WCAG. +4. **Отчет о соответствии**: результаты публикуются по каждому критерию в [Accessibility Conformance Report](accessibility_conformance_report.md), включая критерии, которые Spreadsheet поддерживает частично. + +## Ресурсы {#resources} + +- [Accessibility Conformance Report (VPAT 2.5)](accessibility_conformance_report.md) +- [Список горячих клавиш](hotkeys.md) +- [`readonly`](api/spreadsheet_readonly_config.md) +- [`selection`](api/spreadsheet_selection_config.md) +- [`announce()`](api/spreadsheet_announce_method.md) +- [Локализация](localization.md) +- [Встроенные темы](/themes/) +- [WCAG 2.2](https://www.w3.org/TR/WCAG22/) +- [WAI-ARIA 1.2](https://www.w3.org/TR/wai-aria-1.2/) +- [WAI-ARIA Authoring Practices: Grid pattern](https://www.w3.org/WAI/ARIA/apg/patterns/grid/) +- [WAI-ARIA Authoring Practices: Toolbar pattern](https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/accessibility_conformance_report.md b/i18n/ru/docusaurus-plugin-content-docs/current/accessibility_conformance_report.md new file mode 100644 index 00000000..c7fd7cd6 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/accessibility_conformance_report.md @@ -0,0 +1,220 @@ +--- +sidebar_label: Отчет о соответствии (VPAT) +title: Отчет о соответствии требованиям доступности +description: Отчет о соответствии требованиям доступности для DHTMLX Spreadsheet на основе VPAT 2.5 - соответствие WCAG 2.2 AA, Section 508 и EN 301 549. +--- + +# Отчет о соответствии требованиям доступности + +Этот отчет описывает, как DHTMLX Spreadsheet соответствует основным стандартам доступности. Он построен по структуре **VPAT® 2.5 (International Edition)**. Обзор возможностей доступности и способов их настройки приведен в руководстве [Доступность](accessibility.md). + +**Название продукта/версия:** DHTMLX Spreadsheet v6.0.4 + +**Дата отчета:** октябрь 2026 + +**Описание продукта:** DHTMLX Spreadsheet - это JavaScript-компонент электронных таблиц для веб-приложений. Его интерфейс состоит из строки меню, панели инструментов, строки формул, сетки ячеек с заголовками строк и столбцов и вкладок листов. Среди его возможностей: формулы, форматирование ячеек, объединенные ячейки, закрепленные строки и столбцы, сортировка, фильтрация, поиск, проверка данных, ссылки в ячейках, а также импорт и экспорт Excel. Компонент встраивается в хост-приложение. + +**Контактная информация:** [info@dhtmlx.com](mailto:info@dhtmlx.com) + +## Примечания {#notes} + +- В этом отчете DHTMLX Spreadsheet оценивается в **рекомендуемой конфигурации доступности**: это конфигурация по умолчанию, в которой вывод WAI-ARIA и навигация с клавиатуры всегда включены, а тема `contrast-light` или `contrast-dark` задана через `dhx.setTheme()` или атрибут `data-dhx-theme`. В примечаниях указано, где уровень соответствия зависит от этой конфигурации. Настройка описана в руководстве [Доступность](accessibility.md). +- DHTMLX Spreadsheet - это **веб-контент**, который отображается хост-приложением. Ответственность на уровне страницы (заголовок страницы, ``, механизмы пропуска блоков и навигация по сайту) лежит на хост-приложении, поэтому такие критерии отмечены как *Не применимо* с пояснением. +- В таблицах WCAG заполнен только ответ для **Web**. Строки *Electronic Docs*, *Software*, *Closed* и *Authoring Tool* отмечены как *Не применимо*: продукт не является автономным (не веб) программным обеспечением, закрытой функциональностью, инструментом разработки контента или электронной документацией. +- Цвета, которые автор применяет к ячейкам через стили ячеек, являются частью данных документа и не оцениваются как часть продукта. + +**Использованные методы оценки:** + +- Автоматизированное тестирование: axe-core в темах `light`, `dark`, `contrast-light` и `contrast-dark` с открытыми панелью поиска, редактором списка, диалоговыми окнами и предупреждением. +- Ручной анализ исходного кода компонента и таблиц стилей: роли и атрибуты ARIA каждой части виджета, обработчики клавиатуры и области фокуса, доступные имена и их ключи локали, цветовые токены тем, а также коэффициенты контрастности, рассчитанные для четырех тем. +- Тестирование со вспомогательными технологиями: ручные проверки с **NVDA + Firefox** и **JAWS + Chrome** в Windows и **VoiceOver + Safari** в macOS. +- Переопределения браузера: масштаб 200% / 400%, перестроение (reflow) при ширине 320 CSS px и переопределения межбуквенных и межстрочных интервалов по WCAG. + +## Применимые стандарты / руководства {#applicable-standards--guidelines} + +| Стандарт / руководство | Включено в отчет | +|---|---| +| Web Content Accessibility Guidelines 2.0 | Уровень A (Нет) · Уровень AA (Нет) · Уровень AAA (Нет) | +| Web Content Accessibility Guidelines 2.1 | Уровень A (Нет) · Уровень AA (Нет) · Уровень AAA (Нет) | +| Web Content Accessibility Guidelines 2.2 | Уровень A (**Да**) · Уровень AA (**Да**) · Уровень AAA (Нет) | +| Revised Section 508 standards (опубликован 18 января 2017 г.; исправлен 22 января 2018 г.) | (**Да**) | +| EN 301 549 - V3.1.1 (2019-11) и V3.2.1 (2021-03) | (**Да**) | + +*WCAG 2.0 и 2.1 отдельно не рассматриваются. На критерии, которые в WCAG помечены как "2.1 и 2.2", даны ответы, поскольку +они входят в WCAG 2.2 и упоминаются в EN 301 549.* + +## Термины {#terms} + +- **Supports (Поддерживается):** Функциональность продукта имеет как минимум один способ, который удовлетворяет критерию + без известных дефектов, либо удовлетворяет ему через эквивалентное обеспечение доступности. +- **Partially Supports (Поддерживается частично):** Часть функциональности продукта не удовлетворяет критерию. +- **Does Not Support (Не поддерживается):** Большая часть функциональности продукта не удовлетворяет критерию. +- **Not Applicable (Не применимо):** Критерий не относится к продукту. + +## Отчет по WCAG 2.x {#wcag-2x-report} + +DHTMLX Spreadsheet - это веб-контент, поэтому ниже заполнен только ответ для **Web**. Формулировка "Требуется тема, соответствующая AA" +означает зависимость от конфигурации, а не дефект. Критерий 4.1.1 Parsing удален в WCAG 2.2 и в отчете не рассматривается. + +### Таблица 1: Критерии успеха, уровень A {#table-1-success-criteria-level-a} + +| Критерий | Уровень соответствия | Примечания и пояснения | +|---|---|---| +| **1.1.1** Нетекстовое содержимое (Non-text Content) | Поддерживается | Значки являются шрифтовыми глифами. Элементы управления, содержащие только значок, получают доступное имя из локали или из своей подсказки, например "Add sheet", "Close search" и "Select all". Кнопки цвета содержат название цвета, например "Text color: dark gray". Декоративные значки (замок, фильтр, меню столбца, маркеры скрытых строк), слой выделения и ячейки, перекрытые объединенной ячейкой, скрыты с помощью `aria-hidden="true"`; состояние, которое они показывают, передается текстом в ячейке, например "locked" и "Filter applied". | +| **1.2.1** Только аудио и только видео (запись) (Audio-only and Video-only (Prerecorded)) | Не применимо | Продукт не содержит аудио- или видеоконтента. | +| **1.2.2** Субтитры (запись) (Captions (Prerecorded)) | Не применимо | Нет записанного мультимедиа. | +| **1.2.3** Аудиоописание или альтернатива мультимедиа (запись) (Audio Description or Media Alternative (Prerecorded)) | Не применимо | Нет записанного мультимедиа. | +| **1.3.1** Информация и взаимосвязи (Info and Relationships) | Поддерживается | Ячейки образуют `grid` с именем "Spreadsheet" и ролями `row`, `columnheader`, `rowheader` и `gridcell`. Позиция передается с помощью `aria-rowindex`/`aria-colindex` относительно `aria-rowcount`/`aria-colcount`; размер объединенной ячейки - с помощью `aria-colspan`/`aria-rowspan`; возможность редактирования - с помощью `aria-readonly`; выделение - с помощью `aria-selected` и `aria-multiselectable`. Панель инструментов, строка меню и вкладки листов являются элементами `toolbar` и `menubar` с именами; переключатели форматирования имеют `aria-pressed` на панели инструментов и являются `menuitemcheckbox` в строке меню, а взаимоисключающие параметры форматирования являются `menuitemradio` с `aria-checked`. | +| **1.3.2** Осмысленная последовательность (Meaningful Sequence) | Поддерживается | Порядок в DOM и порядок чтения соответствуют визуальному порядку: строка меню, панель инструментов, строка формул, ячейки и вкладки листов. Ячейки передают свою позицию на листе через `aria-rowindex`/`aria-colindex`, поэтому последовательность сохраняется, когда строки и столбцы прокручиваются за пределы DOM. | +| **1.3.3** Сенсорные характеристики (Sensory Characteristics) | Поддерживается | Ни одна инструкция или метка не опирается только на форму, размер или расположение; интерактивные элементы имеют текст или имя ARIA. | +| **1.4.1** Использование цвета (Use of Color) | Поддерживается | Каждое состояние, показанное цветом, дополнительно обозначено рамкой, заливкой, маркером или текстом: активная ячейка, выделенный диапазон, совпадения поиска, скопированный диапазон и недопустимые ячейки, вместе с `aria-selected` или текстом в ячейке. Строки, скрытые фильтром, оставляют пропуск в нумерации строк. Кнопки цвета содержат название цвета в своем доступном имени. | +| **1.4.2** Управление звуком (Audio Control) | Не применимо | Продукт не воспроизводит звук автоматически. | +| **2.1.1** Клавиатура (Keyboard) | Поддерживается | Для каждой команды на ячейках есть клавиша, они перечислены в [списке горячих клавиш](hotkeys.md); `Shift`+`F10` или клавиша Menu открывает контекстное меню. `Ctrl`+`F6` перемещает фокус между меню, панелью инструментов, листом и вкладками листов. Панели, их выпадающие списки и всплывающие окна, а также редактор списка работают с клавишами со стрелками, `Home`, `End`, `Enter` и `Esc`. Для ширины столбца, высоты строки и фильтра столбца есть команды контекстного меню. | +| **2.1.2** Отсутствие ловушки для клавиатурного фокуса (No Keyboard Trap) | Поддерживается | `Tab` на последней ячейке и `Shift`+`Tab` на первой ячейке листа выводят фокус из ячеек на следующую или предыдущую часть страницы, а `Ctrl`+`F6` перемещает его между частями Spreadsheet. В редакторе списка `Tab` завершает редактирование, а `Esc` отменяет его, в том числе после использования стрелок. `Esc` и `Tab` закрывают всплывающие окна панели инструментов и возвращают фокус на их кнопки. | +| **2.1.4** Горячие клавиши из одного символа (Character Key Shortcuts) | Поддерживается | Каждое сочетание клавиш использует клавишу-модификатор (`Ctrl`, `Alt`, `Shift`) или нечисловую (не символьную) клавишу (`F2`, `F6`, `F10`, `F11`, `Enter`, `Esc`, `Delete`, стрелки). Ввод символа в ячейке записывает его в ячейку, в чем и состоит назначение ячейки, и не запускает команду. | +| **2.2.1** Настраиваемое время (Timing Adjustable) | Не применимо | Продукт не устанавливает ограничений по времени. | +| **2.2.2** Пауза, остановка, скрытие (Pause, Stop, Hide) | Поддерживается | Нет автоматически обновляемого, движущегося, мигающего или прокручиваемого содержимого. Ни одна анимация не длится дольше 5 секунд. | +| **2.3.1** Не более трех вспышек или ниже порогового значения (Three Flashes or Below Threshold) | Поддерживается | Продукт не содержит мигающего содержимого. | +| **2.4.1** Обход блоков (Bypass Blocks) | Не применимо | Относится к уровню страницы; механизмы обхода блоков находятся в ведении хост-приложения. | +| **2.4.2** Заголовок страницы (Page Titled) | Не применимо | За заголовки страниц отвечает хост-приложение. | +| **2.4.3** Порядок фокуса (Focus Order) | Поддерживается | Ячейки образуют одну точку табуляции на активной ячейке, а панель инструментов, строка меню и вкладки листов - по одной точке табуляции каждая, в визуальном порядке. `Tab` покидает лист на последней и первой ячейке. Диалоговые окна забирают фокус, удерживают `Tab` внутри и возвращают фокус на активную ячейку при закрытии; меню, контекстные меню и всплывающие окна возвращают фокус на элемент, который их открыл, а после применения цвета текста или фона фокус возвращается на активную ячейку. Когда активная ячейка получает фокус, она прокручивается в область видимости. | +| **2.4.4** Назначение ссылки (в контексте) (Link Purpose (In Context)) | Поддерживается | Ссылка в ячейке отображается как элемент ``, текстом которого служит текст ссылки, заданный автором, или адрес. Текст ячейки дополняется словом "link", когда ячейка выделена, а `Alt`+`Enter` открывает ссылку. | +| **2.5.1** Жесты указателя (Pointer Gestures) | Поддерживается | Ни одна операция не требует жеста с несколькими точками касания или жеста по траектории; у каждой операции перетаскивания есть альтернатива без перетаскивания (см. 2.5.7). | +| **2.5.2** Отмена указателя (Pointer Cancellation) | Поддерживается | Изменение размера столбцов и строк и маркер заполнения применяются при отпускании, и одна отмена (undo) возвращает каждое из этих действий. Команды панели инструментов, меню и вкладок листов выполняются по `click`. | +| **2.5.3** Метка в имени (Label in Name) | Поддерживается | Элементы управления с видимым текстом используют этот текст в качестве доступного имени: пункты меню, команды контекстного меню, вкладки листов и кнопки диалоговых окон. Кнопки со значками получают имя из подсказки, а кнопки цвета - из подсказки с добавлением названия цвета. | +| **2.5.4** Активация движением (Motion Actuation) | Не применимо | Никакая функциональность не управляется движением устройства или движением пользователя. | +| **3.1.1** Язык страницы (Language of Page) | Не применимо | Язык документа (``) задается хост-приложением. | +| **3.2.1** При получении фокуса (On Focus) | Поддерживается | Получение фокуса никогда не меняет контекст. Щелчок по букве столбца, номеру строки или угловой ячейке выделяет линии и оставляет фокус на активной ячейке. | +| **3.2.2** При вводе (On Input) | Поддерживается | Изменение значения не меняет контекст. Редактирование ячейки, выбор значения из списка или ввод в панели поиска обновляют лист на месте, в чем и состоит документированное назначение этих элементов управления. | +| **3.2.6** Единообразная помощь (Consistent Help) (только 2.2) | Не применимо | Виджет не предоставляет механизма помощи; это вопрос уровня страницы. | +| **3.3.1** Определение ошибки (Error Identification) | Поддерживается | Ошибки формул и недопустимые значения списка описываются в содержимом ячейки, например "Reference error. Check the cell references" и "Invalid value. Choose a value from the list". Новые ошибки формул и недопустимые значения, возникшие при редактировании, озвучиваются через live-регион, а редактор с недопустимым значением имеет `aria-invalid="true"`. | +| **3.3.2** Метки или инструкции (Labels or Instructions) | Поддерживается | Редактор ячейки называется "Cell editor, B7", а строка формул - "Formula bar, B7", с адресом редактируемой ячейки. Поля диалоговых окон имеют метки, например "Width in pixels", а кнопки панели поиска называются "Previous match", "Next match" и "Close search". | +| **3.3.7** Повторный ввод (Redundant Entry) (только 2.2) | Поддерживается | Продукт не содержит многошагового процесса, запрашивающего уже введенную информацию. | +| **4.1.2** Имя, роль, значение (Name, Role, Value) | Поддерживается | Каждая часть предоставляет роль, свои состояния и имя из локали: ячейки (`grid`, `row`, `gridcell`, `columnheader`, `rowheader`, `aria-selected`, `aria-readonly`), панели инструментов и строка меню (`toolbar`, `menubar`), кнопки форматирования, Lock и Filter и вкладки листов (`aria-pressed`), пункты форматирования строки меню (`menuitemcheckbox`, `aria-checked`) и взаимоисключающие форматы (`menuitemradio`, `aria-checked`). Предупреждения имеют роль `alertdialog` с `aria-modal="true"`. Редактор списка является `combobox`, управляющим `listbox`, с `aria-expanded` и `aria-activedescendant`. | + +### Таблица 2: Критерии успеха, уровень AA {#table-2-success-criteria-level-aa} + +| Критерий | Уровень соответствия | Примечания и пояснения | +|---|---|---| +| **1.2.4** Субтитры (прямая трансляция) (Captions (Live)) | Не применимо | Нет мультимедиа в прямом эфире. | +| **1.2.5** Аудиоописание (запись) (Audio Description (Prerecorded)) | Не применимо | Нет записанного видео. | +| **1.3.4** Ориентация (Orientation) | Поддерживается | Содержимое не ограничено одной ориентацией экрана. | +| **1.3.5** Определение назначения полей ввода (Identify Input Purpose) | Не применимо | Редакторы продукта собирают данные документа, а не личную информацию самого пользователя, на которую распространяется список назначений полей ввода WCAG. | +| **1.4.3** Контрастность (минимальная) (Contrast (Minimum)) | Поддерживается | Темы `contrast-light` и `contrast-dark` соответствуют AA: ни один текст продукта не имеет контрастность ниже 4.5:1 ни в одной из тем, при открытых панели поиска, редакторе списка, диалоговом окне ширины столбца и предупреждении. Цвета ссылок на ячейки в формулах имеют контрастность от 4.59:1 до 7.04:1 в светлой теме и теме `contrast-light`, и от 7.62:1 до 12.26:1 в темных темах. В светлой теме по умолчанию вторичный текст, например метки полей диалоговых окон и текст предупреждений, имеет контрастность около 3.95:1. Для соответствия критерию необходимо выбрать одну из контрастных тем, и одного поддерживаемого способа достаточно. | +| **1.4.4** Изменение размера текста (Resize Text) | Поддерживается | Размер текста можно увеличить до 200% без потери содержимого или функциональности; панель инструментов, строка формул, вкладки листов и диалоговые окна остаются пригодными для использования. | +| **1.4.5** Изображение текста (Images of Text) | Поддерживается | Весь текст отображается как настоящий текст. Значки являются шрифтовыми глифами; продукт не использует растровых изображений. | +| **1.4.10** Перестроение (Reflow) | Поддерживается | Ячейки представляют собой двумерное содержимое, на которое требование перестроения не распространяется, и прокручиваются как по горизонтали, так и по вертикали. Панель инструментов, строка меню и вкладки листов умещаются в ширину 320 CSS px. | +| **1.4.11** Контрастность нетекстового содержимого (Non-text Contrast) | Поддерживается | Индикаторы фокуса ячеек, строки формул и элементов управления панелей имеют ширину 2 px и отрисовываются цветами темы; приведенные ниже коэффициенты даны для тем по умолчанию (светлой), `contrast-light`, темной и `contrast-dark`. Активная ячейка обозначена сплошной рамкой 2 px цвета `--dhx-color-primary`: около 3.9:1, 7.7:1, 3.4:1 и 5.3:1 относительно фона ячейки. Ячейка и редактор ячейки, находящиеся в фокусе клавиатуры, получают контур 2 px того же цвета с теми же коэффициентами, а внутри выделенного диапазона - около 3.3:1, 6.0:1, 3.1:1 и 4.2:1. Строка формул получает контур 2 px цвета `--dhx-spreadsheet-focus-color`: около 3.9:1, 7.7:1, 5.3:1 и 6.5:1 относительно ее фона. Элементы управления панели инструментов, строки меню и вкладок листов получают такой же контур: около 3.7:1, 7.2:1, 3.9:1 и 4.9:1 относительно фона панели. Все значения превышают требование 3:1. | +| **1.4.12** Межстрочные и межбуквенные интервалы (Text Spacing) | Поддерживается | При применении переопределений интервалов текста по WCAG ни одна метка элемента управления не обрезается; панель вкладок листов прокручивается, когда вкладки увеличиваются. | +| **1.4.13** Содержимое при наведении или фокусе (Content on Hover or Focus) | Поддерживается | Подсказки панели инструментов остаются открытыми при наведении и закрываются клавишей `Esc` без перемещения указателя или фокуса. Подсказка о недопустимом значении сообщает об ошибке ввода, остается, пока ячейка активна, и убирается клавишей `Esc`. | +| **2.4.5** Несколько способов (Multiple Ways) | Не применимо | Относится к поиску страниц в наборе веб-страниц; выходит за рамки одного встроенного компонента (вопрос хост-приложения). | +| **2.4.6** Заголовки и метки (Headings and Labels) | Поддерживается | Основные части получают доступные имена из локали: "Spreadsheet" (сетка), "Formatting" (панель инструментов), "Borders", "Search" и "Link" (панели инструментов всплывающего окна Border, панели поиска и всплывающего окна ссылки), "Main" (строка меню), "Cell" и "Sheet" (контекстные меню ячеек и вкладок листов), "Sheets" (панель вкладок листов), "Formula bar, B7" (строка формул) и "Cell editor, B7" (редактор ячейки). Угловая ячейка выделения всех ячеек называется "Select all", панель поиска называется "Search", а ее кнопки - "Previous match", "Next match" и "Close search", кнопка добавления листа называется "Add sheet", а остальные диалоговые окна названы по своим заголовкам. | +| **2.4.7** Видимость фокуса (Focus Visible) | Поддерживается | Расположение фокуса клавиатуры видно всегда. Активная ячейка всегда имеет сплошную рамку 2 px, а ячейка или редактор ячейки в фокусе имеет контур 2 px, оба основного цвета темы. Строка формул и элементы управления панели инструментов, строки меню, вкладок листов, всплывающего окна Border, всплывающего окна ссылки и панели поиска показывают кольцо фокуса 2 px цвета `--dhx-spreadsheet-focus-color`. В палитре цветов, списке стилей границ, выпадающих списках панели инструментов и строки меню и в контекстных меню элемент в фокусе имеет пунктирный контур 1 px. В редакторе списка элемент в фокусе выделяется цветом фона. Индикатор фокуса отображается в каждой встроенной теме. | +| **2.4.11** Фокус не скрыт (минимум) (Focus Not Obscured (Minimum)) (только 2.2) | Поддерживается | Активная ячейка прокручивается в область видимости рядом с закрепленными строками и столбцами, поэтому она никогда не оказывается за закрепленной областью. | +| **2.5.7** Перетаскивание (Dragging Movements) (только 2.2) | Поддерживается | Для выделения диапазона есть `Shift`+стрелки и `Ctrl`+`Space`/`Shift`+`Space`. Ширина столбца и высота строки задаются командами *Column width* и *Row height* контекстного меню с возможностью отмены. Скрытые строки и столбцы показываются с помощью `Ctrl`+`Shift`+`9`/`0` и команд *Show rows*/*Show columns*. Заполнение ячеек доступно через событие [`groupFill`](api/spreadsheet_groupfill_event.md), которое можно привязать к команде контекстного меню. | +| **2.5.8** Размер цели (минимум) (Target Size (Minimum)) (только 2.2) | Поддерживается частично | Маркер заполнения имеет размер 12 x 12 CSS px. У маркеров изменения размера столбцов и строк есть эквивалентные элементы управления - команды *Column width* и *Row height*. Угловая ячейка выделения всех ячеек - это угловая ячейка заголовка размером 40 x 32 CSS px, а элементы управления панели инструментов и меню больше 24 x 24 CSS px. | +| **3.1.2** Язык частей (Language of Parts) | Не применимо | Виджет не смешивает языки в своем содержимом; язык определяется хост-приложением. | +| **3.2.3** Единообразная навигация (Consistent Navigation) | Не применимо | Относится к набору веб-страниц; вопрос хост-приложения. | +| **3.2.4** Единообразное определение (Consistent Identification) | Поддерживается | Команды с одинаковой функцией имеют одинаковые имена и значки в панели инструментов, строке меню и контекстном меню, а также одинаковые клавиши. | +| **3.3.3** Рекомендации по исправлению ошибок (Error Suggestion) | Поддерживается | Описания ошибок предлагают исправление: "Check the cell references" для ошибки ссылки и "Choose a value from the list" для недопустимого значения списка. | +| **3.3.4** Предотвращение ошибок (юридические, финансовые, данные) (Error Prevention (Legal, Financial, Data)) | Поддерживается | Любое изменение данных можно отменить (`Ctrl`+`Z`) и повторить. Хост-приложение дополнительно может отменить любое действие через событие [`beforeAction`](api/spreadsheet_beforeaction_event.md). | +| **3.3.8** Доступная аутентификация (минимум) (Accessible Authentication (Minimum)) (только 2.2) | Не применимо | Продукт не выполняет аутентификацию. | +| **4.1.3** Сообщения о статусе (Status Messages) | Поддерживается | Изменения статуса озвучиваются без перемещения фокуса через визуально скрытый live-регион за пределами сетки (`role="status"`, `aria-live="polite"`, `aria-atomic="true"`). Он сообщает о выделенном диапазоне, новых ошибках формул и недопустимых значениях, отклоненных правках заблокированных ячеек или листа только для чтения, результатах поиска, начале и завершении импорта и экспорта, новой ширине столбцов и высоте строк, а также о выделении, в котором нет скрытых строк или столбцов для показа. Этот же регион доступен хост-приложению через публичный метод [`announce()`](api/spreadsheet_announce_method.md), а каждое встроенное сообщение локализуется через ключи локали `aria_*`. | + +## Отчет по Revised Section 508 {#revised-section-508-report} + +Положения, соответствующие WCAG, рассматриваются в отчете по WCAG 2.x выше, и здесь даются ссылки на него. Глава 4 (Hardware) +не применима, поскольку DHTMLX Spreadsheet является программным компонентом без аппаратных или физических элементов управления. + +### Глава 3: Критерии функциональной эффективности {#chapter-3-functional-performance-criteria} + +| Критерий | Уровень соответствия | Примечания и пояснения | +|---|---|---| +| 302.1 Без зрения (Without Vision) | Поддерживается | Работа со средством чтения с экрана возможна благодаря модели `grid` с заголовками столбцов и строк, адресу ячейки и описаниям, зачитываемым вместе с каждой ячейкой, именованным панелям инструментов и меню, live-региону и модели работы с клавиатуры. См. WCAG 1.3.1, 2.1.1, 4.1.2, 4.1.3. | +| 302.2 С ограниченным зрением (With Limited Vision) | Поддерживается | Поддерживаются масштабирование, изменение размера текста и перестроение, фокус виден в каждой теме, а контрастность AA обеспечивается темами `contrast-light` / `contrast-dark`. См. WCAG 1.4.3, 1.4.4, 1.4.10, 1.4.11, 2.4.7. | +| 302.3 Без восприятия цвета (Without Perception of Color) | Поддерживается | Никакая информация не передается только цветом: активная ячейка, выделение, совпадения поиска и недопустимые значения дополнительно к цвету обозначаются рамкой, маркером или текстом в ячейке, а кнопки цвета содержат название цвета. См. WCAG 1.4.1. | +| 302.4 Без слуха (Without Hearing) | Поддерживается | Никакая информация не передается звуком. | +| 302.5 С ограниченным слухом (With Limited Hearing) | Поддерживается | Никакая информация не передается звуком. | +| 302.6 Без речи (Without Speech) | Поддерживается | Для работы с продуктом не требуется голосовой ввод. | +| 302.7 С ограниченной подвижностью (With Limited Manipulation) | Поддерживается | Все функции работают с клавиатуры; жесты по траектории не требуются, а у каждой операции перетаскивания есть альтернатива с клавиатуры или командой. См. WCAG 2.1.1, 2.5.1, 2.5.7, 2.5.8. | +| 302.8 С ограниченной досягаемостью и силой (With Limited Reach and Strength) | Поддерживается | Управление с клавиатуры; нет требований к физической досягаемости, усилию или времени. | +| 302.9 С ограниченными языковыми, когнитивными и учебными способностями (With Limited Language, Cognitive, and Learning Abilities) | Поддерживается | Команды имеют одинаковые названия в панели инструментов, меню и контекстном меню, ошибки формул описываются с указанием способа исправления, а каждое изменение можно отменить. См. WCAG 3.2.4, 3.3.3, 3.3.4. | + +### Глава 5: Программное обеспечение {#chapter-5-software} + +| Критерий | Уровень соответствия | Примечания и пояснения | +|---|---|---| +| 501.1 Область применения - включение WCAG 2.0 AA (Scope - Incorporation of WCAG 2.0 AA) | См. раздел WCAG 2.x | См. отчет по WCAG 2.x выше. | +| 502 Совместимость со вспомогательными технологиями (Interoperability with Assistive Technology) | Не применимо | Относится к не веб (платформенному) программному обеспечению. DHTMLX Spreadsheet - это веб-контент, который предоставляет браузеру стандартные DOM и ARIA в дереве доступности; совместимость охватывается результатами WCAG (Clause 9 / 501.1). | +| 503 Приложения (Applications) | Не применимо | Относится к не веб-платформенному программному обеспечению; продукт является веб-контентом. | +| 504 Инструменты разработки контента (Authoring Tools) | Не применимо | DHTMLX Spreadsheet не является инструментом создания веб-контента: он редактирует данные электронных таблиц, а не веб-контент, значимый для доступности. | + +### Глава 6: Сопроводительная документация и услуги {#chapter-6-support-documentation-and-services} + +| Критерий | Уровень соответствия | Примечания и пояснения | +|---|---|---| +| 602.2 Функции доступности и совместимости (Accessibility and Compatibility Features) | Поддерживается | Документация описывает функции доступности продукта: руководство [Доступность](accessibility.md) охватывает модель WAI-ARIA, модель работы с клавиатуры, режим только для чтения и параметр выделения, темы и индикатор фокуса, API [`announce()`](api/spreadsheet_announce_method.md) и [локализуемые строки `aria_*`](accessibility.md#localization); [список горячих клавиш](hotkeys.md) перечисляет все сочетания клавиш. | +| 602.3 Электронная сопроводительная документация (Electronic Support Documentation) | Поддерживается (см. раздел WCAG 2.x) | Сайт документации предоставляется как веб-контент и поддерживается в соответствии с WCAG 2.2 AA. | +| 602.4 Альтернативные форматы для неэлектронной сопроводительной документации (Alternate Formats for Non-Electronic Support Documentation) | Не применимо | Документация предоставляется только в электронном виде; неэлектронных (печатных) сопроводительных документов нет. | +| 603.2 Информация о функциях доступности и совместимости (Information on Accessibility and Compatibility Features) | Поддерживается | Функции доступности продукта публично описаны в руководстве [Доступность](accessibility.md) и могут быть предоставлены службой поддержки по запросу. | +| 603.3 Учет коммуникационных потребностей (Accommodation of Communication Needs) | Поддерживается | Поддержка предоставляется по текстовому каналу электронной почты; пользователи работают со своими собственными вспомогательными технологиями. | + +## Отчет по EN 301 549 {#en-301-549-report} + +Раздел 9 (Web) напрямую соответствует отчету по WCAG 2.x выше и является основной оценкой для этого веб-продукта. +Разделы, касающиеся телефонии, видео и оборудования (разделы 6, 7, 8, 13), не применимы. + +### Раздел 4: Описание функциональной эффективности {#clause-4-functional-performance-statements} + +Эти пункты повторяют результаты главы 3 Section 508 (те же выводы). + +| Критерий | Уровень соответствия | Примечания и пояснения | +|---|---|---| +| 4.2.1 Использование без зрения (Usage without vision) | Поддерживается | См. 508 302.1 (работа со средством чтения с экрана через модель grid, описания ячеек, именованные элементы управления, live-регион и модель работы с клавиатуры). | +| 4.2.2 Использование с ограниченным зрением (Usage with limited vision) | Поддерживается | См. 508 302.2 (контрастность AA через контрастные темы, видимый фокус в каждой теме; поддерживаются масштабирование и перестроение). | +| 4.2.3 Использование без восприятия цвета (Usage without perception of colour) | Поддерживается | См. 508 302.3 (каждый цветовой признак сопровождается рамкой, маркером или текстом). | +| 4.2.4 Использование без слуха (Usage without hearing) | Поддерживается | Никакая информация не передается звуком. | +| 4.2.5 Использование с ограниченным слухом (Usage with limited hearing) | Поддерживается | Никакая информация не передается звуком. | +| 4.2.6 Использование при отсутствии или ограниченных голосовых возможностях (Usage with no or limited vocal capability) | Поддерживается | Голосовой ввод не требуется. | +| 4.2.7 Использование с ограниченной подвижностью или силой (Usage with limited manipulation or strength) | Поддерживается | См. 508 302.7 (управление с клавиатуры, без жестов, альтернативы для каждой операции перетаскивания). | +| 4.2.8 Использование с ограниченной досягаемостью (Usage with limited reach) | Поддерживается | Нет требований к физической досягаемости (программный компонент). | +| 4.2.9 Минимизация триггеров фотосенситивных приступов (Minimize photosensitive seizure triggers) | Поддерживается | Нет мигающего содержимого (см. WCAG 2.3.1). | +| 4.2.10 Использование с ограниченными когнитивными, языковыми или учебными способностями (Usage with limited cognition, language or learning) | Поддерживается | См. 508 302.9 (единообразные названия команд, описанные ошибки, обратимые изменения). | +| 4.2.11 Конфиденциальность (Privacy) | Поддерживается | Функции доступности используют тот же интерфейс, что и для всех остальных; отдельного, менее конфиденциального режима нет. | + +### Раздел 5: Общие требования {#clause-5-generic-requirements} + +**В основном не применимо.** Раздел 5 посвящен закрытой функциональности и требованиям аппаратного типа. DHTMLX +Spreadsheet - это открытое веб-программное обеспечение, которое работает с вспомогательными технологиями платформы и браузера, поэтому +подразделы о закрытой функциональности, биометрии (5.3), управляемых частях (5.5) и состоянии блокировки/переключателей +(5.6) не применимы. Если общее требование выполняется за счет обычной поддержки вспомогательных технологий, оно +охватывается разделом 9 (Web) и результатами WCAG. + +### Раздел 9: Web {#clause-9-web} + +**См. раздел WCAG 2.x.** Пункты 9.1.1.1-9.4.1.3 соответствуют результатам WCAG 2.2 уровней A/AA в таблицах 1 +и 2 выше. + +### Раздел 11: Программное обеспечение {#clause-11-software} + +**Не применимо (оценивается по разделу 9).** DHTMLX Spreadsheet - это веб-контент, оцениваемый по разделу 9 (Web); +он не является не веб программным обеспечением. Положения о программном обеспечении, соответствующие WCAG (11.1.1.1-11.4.1.3), охватываются результатами +WCAG 2.x. Пункт 11.8 (Инструменты разработки контента) не применим, поскольку продукт не является инструментом разработки контента. + +### Раздел 12: Документация и службы поддержки {#clause-12-documentation-and-support-services} + +| Критерий | Уровень соответствия | Примечания и пояснения | +|---|---|---| +| 12.1.1 Функции доступности и совместимости (Accessibility and compatibility features) | Поддерживается | Руководство [Доступность](accessibility.md) описывает функции доступности продукта: модель WAI-ARIA, модель работы с клавиатуры, режим только для чтения и параметр выделения, темы, индикатор фокуса, API [`announce()`](api/spreadsheet_announce_method.md) и [локализуемые строки `aria_*`](accessibility.md#localization). | +| 12.1.2 Доступная документация (Accessible documentation) | Поддерживается (см. раздел WCAG 2.x) | Сайт документации предоставляется как веб-контент и поддерживается в соответствии с WCAG 2.2 AA. | +| 12.2.2 Информация о функциях доступности и совместимости (Information on accessibility and compatibility features) | Поддерживается | Функции доступности публично описаны, и служба поддержки может предоставить информацию о них по запросу. | +| 12.2.3 Эффективная коммуникация (Effective communication) | Поддерживается | Поддержка предоставляется по текстовому каналу электронной почты; пользователи работают со своими собственными вспомогательными технологиями. | +| 12.2.4 Доступная документация (Accessible documentation) | Поддерживается (см. раздел WCAG 2.x) | Та же основа, что и для 12.1.2: сайт документации поддерживается в соответствии с WCAG 2.2 AA. | + +## Правовая оговорка {#legal-disclaimer} + +Этот отчет предоставляется исключительно в информационных целях и описывает доступность указанной +версии продукта на дату отчета. Он предоставляется "как есть", без каких-либо гарантий и не +является договорным обязательством или гарантией. Поддержка доступности может измениться в последующих выпусках, +а результаты относятся к оцененной конфигурации. "VPAT" и "Voluntary Product Accessibility Template" являются +зарегистрированными знаками обслуживания Information Technology Industry Council (ITI). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/angular_integration.md b/i18n/ru/docusaurus-plugin-content-docs/current/angular_integration.md index 0844d46a..5ef8c060 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/angular_integration.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/angular_integration.md @@ -1,7 +1,7 @@ --- sidebar_label: Интеграция с Angular title: Интеграция с Angular -description: Вы можете узнать об интеграции DHTMLX JavaScript Spreadsheet с Angular в документации. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Используйте DHTMLX Spreadsheet в приложении Angular. Создайте проект, добавьте Spreadsheet как компонент Angular, загрузите данные и обработайте события. --- # Интеграция с Angular {#integration-with-angular} @@ -234,6 +234,10 @@ ngOnDestroy() { } ~~~ +:::info +Метод `destructor()` удаляет обработчики событий, добавленные через `spreadsheet.events.on()`. При создании нового экземпляра Spreadsheet, например при повторном создании компонента, подключите обработчики к новому экземпляру. +::: + ### Шаг 3. Добавление Spreadsheet в приложение {#step-3-adding-spreadsheet-into-the-app} Чтобы добавить компонент `SpreadsheetComponent` в приложение, откройте файл *src/app/app.component.ts* и замените код по умолчанию следующим: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/api_overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/api_overview.md index 02a18015..76277816 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/api_overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/api_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Обзор API title: Обзор API -description: Вы можете ознакомиться с обзором API библиотеки DHTMLX JavaScript Spreadsheet в документации. Изучайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: "Обзор API DHTMLX Spreadsheet: конструктор, методы, события, свойства, а также модули Sheet Manager, Selection, Event Bus и экспорта." --- # Обзор API {#api-overview} @@ -27,6 +27,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { | [](api/spreadsheet_addcolumn_method.md) | @getshort(api/spreadsheet_addcolumn_method.md) | | [](api/spreadsheet_addformula_method.md) | @getshort(api/spreadsheet_addformula_method.md) | | [](api/spreadsheet_addrow_method.md) | @getshort(api/spreadsheet_addrow_method.md) | +| [](api/spreadsheet_announce_method.md) | @getshort(api/spreadsheet_announce_method.md) | | [](api/spreadsheet_clear_method.md) | @getshort(api/spreadsheet_clear_method.md) | | [](api/spreadsheet_deletecolumn_method.md) | @getshort(api/spreadsheet_deletecolumn_method.md) | | [](api/spreadsheet_deleterow_method.md) | @getshort(api/spreadsheet_deleterow_method.md) | @@ -99,6 +100,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { | [](api/spreadsheet_multisheets_config.md) | @getshort(api/spreadsheet_multisheets_config.md) | | [](api/spreadsheet_readonly_config.md) | @getshort(api/spreadsheet_readonly_config.md) | | [](api/spreadsheet_rowscount_config.md) | @getshort(api/spreadsheet_rowscount_config.md) | +| [](api/spreadsheet_selection_config.md) | @getshort(api/spreadsheet_selection_config.md) | | [](api/spreadsheet_toolbarblocks_config.md) | @getshort(api/spreadsheet_toolbarblocks_config.md) | @@ -118,8 +120,11 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { | Название | Описание | | :--------------------------------------------- | :---------------------------------------------------- | +| [](api/selection_disable_method.md) | @getshort(api/selection_disable_method.md) | +| [](api/selection_enable_method.md) | @getshort(api/selection_enable_method.md) | | [](api/selection_getfocusedcell_method.md) | @getshort(api/selection_getfocusedcell_method.md) | | [](api/selection_getselectedcell_method.md) | @getshort(api/selection_getselectedcell_method.md) | +| [](api/selection_isdisabled_method.md) | @getshort(api/selection_isdisabled_method.md) | | [](api/selection_removeselectedcell_method.md) | @getshort(api/selection_removeselectedcell_method.md) | | [](api/selection_setfocusedcell_method.md) | @getshort(api/selection_setfocusedcell_method.md) | | [](api/selection_setselectedcell_method.md) | @getshort(api/selection_setselectedcell_method.md) | diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md index ecb41206..98ead903 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md @@ -67,8 +67,8 @@ spreadsheet.events.on("beforeColumnAdd", function(cell){ | **merge** | Действие выполняется при объединении диапазона ячеек | | **removeCellStyles** | Действие выполняется при очистке стилей ячейки | | **renameSheet** | Действие выполняется при переименовании листа | -| **resizeCol** | Действие выполняется при изменении ширины столбца | -| **resizeRow** | Действие выполняется при изменении высоты строки | +| **resizeCol** | Действие выполняется при изменении ширины столбца перетаскиванием его границы или командой *Column width* | +| **resizeRow** | Действие выполняется при изменении высоты строки перетаскиванием её границы или командой *Row height* | | **setCellFormat** | Действие выполняется при изменении формата ячейки | | **setCellValue** | Действие выполняется при изменении или удалении значения ячейки | | **setValidation** | Действие выполняется при установке правил проверки данных для ячейки | @@ -78,6 +78,13 @@ spreadsheet.events.on("beforeColumnAdd", function(cell){ | **toggleFreeze** | Действие выполняется при закреплении/откреплении столбцов/строк | | **unmerge** | Действие выполняется при разъединении ячеек | +:::note +В объекте `config` событий [`beforeAction`](api/spreadsheet_beforeaction_event.md) и [`afterAction`](api/spreadsheet_afteraction_event.md) действия **resizeCol** и **resizeRow** передают: + +- `cell` - ячейка или диапазон ячеек, ширина столбцов или высота строк которых изменяется +- `val` - новая ширина или высота в пикселях. Задаётся только для команд *Column width* и *Row height*, но не при изменении размера перетаскиванием +::: + **Журнал изменений:** - Действия **toggleFreeze** и **toggleVisibility** добавлены в v5.2 diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/methods_overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/methods_overview.md index f5af75e0..737d8131 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/methods_overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/methods_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Обзор методов title: Обзор методов -description: Вы можете ознакомиться с обзором методов библиотеки DHTMLX JavaScript Spreadsheet в документации. Изучите руководства разработчика и справочник по API, ознакомьтесь с примерами кода и живыми демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Список методов DHTMLX Spreadsheet для загрузки и сохранения данных, редактирования ячеек, стилизации, объединения, сортировки, фильтрации и управления листами. --- # Обзор методов {#methods-overview} @@ -11,6 +11,7 @@ description: Вы можете ознакомиться с обзором мет | [](api/spreadsheet_addcolumn_method.md) | @getshort(../spreadsheet_addcolumn_method.md) | | [](api/spreadsheet_addformula_method.md) | @getshort(../spreadsheet_addformula_method.md) | | [](api/spreadsheet_addrow_method.md) | @getshort(../spreadsheet_addrow_method.md) | +| [](api/spreadsheet_announce_method.md) | @getshort(../spreadsheet_announce_method.md) | | [](api/spreadsheet_clear_method.md) | @getshort(../spreadsheet_clear_method.md) | | [](api/spreadsheet_deletecolumn_method.md) | @getshort(../spreadsheet_deletecolumn_method.md) | | [](api/spreadsheet_deleterow_method.md) | @getshort(../spreadsheet_deleterow_method.md) | diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/properties_overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/properties_overview.md index f56976eb..ae330e5a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/properties_overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/properties_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Обзор свойств title: Обзор свойств -description: Вы можете ознакомиться с обзором свойств библиотеки DHTMLX JavaScript Spreadsheet в документации. Изучите руководства разработчика и справочник по API, ознакомьтесь с примерами кода и живыми демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Список параметров конфигурации DHTMLX Spreadsheet, которые настраивают панель инструментов, меню, режим только для чтения, выделение, размер сетки и другое. --- # Обзор свойств {#properties-overview} @@ -18,4 +18,5 @@ description: Вы можете ознакомиться с обзором сво | [](api/spreadsheet_multisheets_config.md) | @getshort(../spreadsheet_multisheets_config.md) | | [](api/spreadsheet_readonly_config.md) | @getshort(../spreadsheet_readonly_config.md) | | [](api/spreadsheet_rowscount_config.md) | @getshort(../spreadsheet_rowscount_config.md) | +| [](api/spreadsheet_selection_config.md) | @getshort(../spreadsheet_selection_config.md) | | [](api/spreadsheet_toolbarblocks_config.md) | @getshort(../spreadsheet_toolbarblocks_config.md) | diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/selection_overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/selection_overview.md index 71c85b16..7db7e87c 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/selection_overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/selection_overview.md @@ -1,15 +1,18 @@ --- sidebar_label: Обзор методов Selection title: Обзор методов Selection -description: Вы можете ознакомиться с обзором методов Selection библиотеки DHTMLX JavaScript Spreadsheet в документации. Изучите руководства разработчика и справочник по API, ознакомьтесь с примерами кода и живыми демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Список методов модуля выделения DHTMLX Spreadsheet, которые выделяют ячейки, устанавливают фокус, а также отключают и включают выделение ячеек. --- # Обзор методов Selection {#selection-methods-overview} | Название | Описание | | :--------------------------------------------- | :---------------------------------------------------- | +| [](api/selection_disable_method.md) | @getshort(../selection_disable_method.md) | +| [](api/selection_enable_method.md) | @getshort(../selection_enable_method.md) | | [](api/selection_getfocusedcell_method.md) | @getshort(../selection_getfocusedcell_method.md) | | [](api/selection_getselectedcell_method.md) | @getshort(../selection_getselectedcell_method.md) | +| [](api/selection_isdisabled_method.md) | @getshort(../selection_isdisabled_method.md) | | [](api/selection_removeselectedcell_method.md) | @getshort(../selection_removeselectedcell_method.md) | | [](api/selection_setfocusedcell_method.md) | @getshort(../selection_setfocusedcell_method.md) | | [](api/selection_setselectedcell_method.md) | @getshort(../selection_setselectedcell_method.md) | diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_disable_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_disable_method.md new file mode 100644 index 00000000..54321209 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_disable_method.md @@ -0,0 +1,47 @@ +--- +sidebar_label: disable() +title: Метод disable объекта selection +description: "Отключите выделение ячеек в DHTMLX Spreadsheet во время выполнения с помощью метода selection.disable(): он убирает активную ячейку и игнорирует выделение мышью, клавиатурой и через API." +--- + +# disable() + +### Описание {#description} + +@short: Отключает выделение ячеек + +### Использование {#usage} + +~~~jsx +disable(): void; +~~~ + +### Пример {#example} + +~~~jsx {6} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + // config parameters +}); +spreadsheet.parse(data); + +spreadsheet.selection.disable(); +~~~ + +### Подробности {#details} + +Метод: + +- завершает редактирование ячейки и сохраняет введённое значение +- снимает выделение и убирает активную ячейку на каждом листе +- игнорирует выделение мышью, клавиатурой и через API, пока не будет вызван метод [`enable()`](api/selection_enable_method.md) + +Пока выделение отключено, методы [`getSelectedCell()`](api/selection_getselectedcell_method.md) и [`getFocusedCell()`](api/selection_getfocusedcell_method.md) возвращают `undefined`. Остальные эффекты такие же, как у параметра конфигурации [`selection: false`](api/spreadsheet_selection_config.md#details). + +Если выделение уже отключено, метод ничего не делает. + +**Журнал изменений:** Добавлено в v6.0.4 + +**Связанные статьи:** +- [`selection`](api/spreadsheet_selection_config.md) +- [`enable()`](api/selection_enable_method.md) +- [Доступность: настройка режима только для чтения](accessibility.md#read-only-setup) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_enable_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_enable_method.md new file mode 100644 index 00000000..9bb349d1 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_enable_method.md @@ -0,0 +1,42 @@ +--- +sidebar_label: enable() +title: Метод enable объекта selection +description: "Снова включите выделение ячеек в DHTMLX Spreadsheet с помощью метода selection.enable(): он делает активной ячейку A1 и вызывает события выделения." +--- + +# enable() + +### Описание {#description} + +@short: Включает выделение ячеек + +### Использование {#usage} + +~~~jsx +enable(): void; +~~~ + +### Пример {#example} + +~~~jsx {7} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, + // other config parameters +}); +spreadsheet.parse(data); + +spreadsheet.selection.enable(); +~~~ + +### Подробности {#details} + +Метод делает активной ячейку A1 активного листа. Для ячейки A1 вызываются события [`beforeSelectionSet`](api/spreadsheet_beforeselectionset_event.md), [`beforeFocusSet`](api/spreadsheet_beforefocusset_event.md), [`afterFocusSet`](api/spreadsheet_afterfocusset_event.md) и [`afterSelectionSet`](api/spreadsheet_afterselectionset_event.md). + +Если выделение уже включено, метод ничего не делает. + +**Журнал изменений:** Добавлено в v6.0.4 + +**Связанные статьи:** +- [`selection`](api/spreadsheet_selection_config.md) +- [`disable()`](api/selection_disable_method.md) +- [Доступность: настройка режима только для чтения](accessibility.md#read-only-setup) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md new file mode 100644 index 00000000..1afb8274 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md @@ -0,0 +1,41 @@ +--- +sidebar_label: isDisabled() +title: Метод isDisabled объекта selection +description: Проверьте, отключено ли выделение ячеек в DHTMLX Spreadsheet, с помощью метода selection.isDisabled(). +--- + +# isDisabled() + +### Описание {#description} + +@short: Проверяет, отключено ли выделение ячеек + +### Использование {#usage} + +~~~jsx +isDisabled(): boolean; +~~~ + +### Возвращаемое значение {#returns} + +Метод возвращает `true`, если выделение отключено, и `false` в противном случае + +### Пример {#example} + +~~~jsx {7} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, + // other config parameters +}); +spreadsheet.parse(data); + +const disabled = spreadsheet.selection.isDisabled(); // -> true +~~~ + +**Журнал изменений:** Добавлено в v6.0.4 + +**Связанные статьи:** +- [`selection`](api/spreadsheet_selection_config.md) +- [`enable()`](api/selection_enable_method.md) +- [`disable()`](api/selection_disable_method.md) +- [Доступность: настройка режима только для чтения](accessibility.md#read-only-setup) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md index 39525013..df82332f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setFocusedCell() title: Метод setFocusedCell объекта selection -description: Вы можете узнать о методе setFocusedCell объекта selection в документации библиотеки DHTMLX JavaScript Spreadsheet. Изучите руководства разработчика и справочник по API, ознакомьтесь с примерами кода и живыми демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Сделайте ячейку активной и переместите на неё фокус клавиатуры в DHTMLX Spreadsheet с помощью метода selection.setFocusedCell(). --- # setFocusedCell() @@ -13,12 +13,13 @@ description: Вы можете узнать о методе setFocusedCell об ### Использование {#usage} ~~~jsx -setFocusedCell(cell: string): void; +setFocusedCell(cell: string, scroll?: boolean): void; ~~~ ### Параметры {#parameters} - `cell` - (обязательный) идентификатор ячейки, на которую нужно установить фокус +- `scroll` - (необязательный) определяет, нужно ли прокручивать Spreadsheet к ячейке, по умолчанию `true` ### Пример {#example} @@ -31,4 +32,24 @@ spreadsheet.parse(data); spreadsheet.selection.setFocusedCell("D4"); ~~~ -**Полезная статья:** [Работа со Spreadsheet](working_with_ssheet.md) +### Подробности {#details} + +Метод делает указанную ячейку активной и после перерисовки перемещает на неё фокус клавиатуры. Фокус клавиатуры не перемещается, если он находится: + +- в элементе за пределами Spreadsheet +- на панели инструментов, в меню или на вкладках листов, на которые он перешёл с помощью клавиатуры +- в открытом редакторе ячейки + +Если фокус клавиатуры находится на теле страницы, например, сразу после загрузки страницы, метод перемещает его на ячейку. + +Те же правила действуют при любом другом изменении активной ячейки, например, с помощью другого метода API. + +Если обработчик события [`beforeFocusSet`](api/spreadsheet_beforefocusset_event.md) возвращает `false`, активная ячейка не меняется, а фокус клавиатуры не перемещается. + +Метод ничего не делает, пока выделение отключено с помощью параметра конфигурации [`selection: false`](api/spreadsheet_selection_config.md) или метода [`selection.disable()`](api/selection_disable_method.md). + +**Журнал изменений:** Перемещение фокуса клавиатуры на ячейку добавлено в v6.0.4 + +**Полезные статьи:** +- [Работа со Spreadsheet](working_with_ssheet.md) +- [Специальные возможности: навигация с помощью клавиатуры](accessibility.md#keyboard-navigation) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md index c0a8832f..f7b608a8 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md @@ -13,12 +13,13 @@ description: Вы можете узнать о методе setSelectedCell об ### Использование {#usage} ~~~jsx -setSelectedCell(cell: string): void; +setSelectedCell(cell: string, scroll?: boolean): void; ~~~ ### Параметры {#parameters} - `cell` - (обязательный) идентификатор(ы) или диапазон выбранной(ых) ячейки(ек) +- `scroll` - (необязательный) определяет, нужно ли прокручивать Spreadsheet к ячейке, по умолчанию `true` ### Пример {#example} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md index a341d3d7..14267f80 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md @@ -13,7 +13,21 @@ description: В документации DHTMLX JavaScript Spreadsheet вы мо ### Использование {#usage} ~~~jsx -afterAction: (action: string, config: object) => void; +afterAction: ( + action: string, + config: { + action?: string, + cell?: string, + row?: number, + col?: number, + val?: any, + prev?: any, + groupAction?: string, + pageId?: string | number, + pageName?: string, + // other properties of the action + } | object[] +) => void; ~~~ ### Параметры {#parameters} @@ -21,7 +35,18 @@ afterAction: (action: string, config: object) => void; Колбэк события принимает следующие параметры: - `action` - (обязательный) имя действия. Полный список доступных действий смотрите [здесь](api/overview/actions_overview.md#list-of-actions) -- `config` - (обязательный) объект с параметрами действия +- `config` - (обязательный) объект с параметрами действия. Набор свойств зависит от действия. Объект может содержать: + - `action` - (необязательный) имя действия + - `cell` - (необязательный) идентификатор ячейки или диапазона ячеек, к которым применяется действие, например, `"A1"` или `"B2:D5"` + - `row` - (необязательный) индекс строки ячейки, начиная с нуля + - `col` - (необязательный) индекс столбца ячейки, начиная с нуля + - `val` - (необязательный) новое значение, которое применяет действие, например, значение ячейки, стиль или размер + - `prev` - (необязательный) предыдущее значение + - `groupAction` - (необязательный) имя действия, которое выполняется вместо `action`, когда `cell` является диапазоном ячеек, например, `"groupAction"`, `"groupRowAction"` или `"resizeCol"` + - `pageId` - (необязательный) идентификатор листа + - `pageName` - (необязательный) имя листа + + Когда несколько действий выполняются вместе, например, при вставке, параметр `action` равен `"groupAction"`, а `config` - массив таких объектов. ### Пример {#example} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md new file mode 100644 index 00000000..f9138814 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md @@ -0,0 +1,67 @@ +--- +sidebar_label: announce() +title: Метод announce +description: Отправьте статусное сообщение пользователям программ чтения с экрана в DHTMLX Spreadsheet с помощью метода announce(), например, чтобы сообщить результат пользовательской команды панели инструментов или меню. +--- + +# announce() + +### Описание {#description} + +@short: Озвучивает сообщение для пользователей программ чтения с экрана + +### Использование {#usage} + +~~~jsx +announce(message: string): void; +~~~ + +### Параметры {#parameters} + +- `message` - (обязательный) текст для озвучивания. Пустая строка очищает сообщение + +### Пример {#example} + +В примере ниже пользовательская команда меню подсчитывает пустые ячейки в выделенном диапазоне и озвучивает результат: + +~~~jsx {18} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + menu: true, + // other config parameters +}); +spreadsheet.parse(data); + +spreadsheet.menu.data.add({ + id: "count-empty", + value: "Count empty cells" +}); + +spreadsheet.menu.events.on("click", function (id) { + if (id === "count-empty") { + let count = 0; + spreadsheet.eachCell(function (cell, value) { + if (value === "" || value === undefined || value === null) count++; + }, spreadsheet.selection.getSelectedCell()); + spreadsheet.announce(count + " empty cells in the selection"); + } +}); +~~~ + +### Подробности {#details} + +Используйте метод, чтобы сообщить пользователям программ чтения с экрана о результате действия, у которого нет собственного видимого элемента, например, пользовательской команды панели инструментов или меню. + +Сообщение попадает в визуально скрытую live-область, расположенную сразу после элемента сетки (`role="status"`, `aria-live="polite"`, `aria-atomic="true"`). Программа чтения с экрана зачитывает его после завершения текущей речи, при этом фокус клавиатуры не перемещается. + +Spreadsheet озвучивает собственные сообщения через ту же область: выделенный диапазон, новые ошибки формул и недопустимые значения, отклонённые правки, результаты поиска, начало и конец импорта и экспорта, а также новую ширину столбцов и высоту строк (см. [список статусных оповещений](accessibility.md#status-announcements)). Область хранит одно сообщение за раз, поэтому следующее сообщение, ваше или встроенное, заменяет предыдущее. + +Если передать текст, который в данный момент находится в области, программа чтения с экрана зачитает его повторно. + +Метод также работает в [режиме только для чтения](api/spreadsheet_readonly_config.md) и при отключённом [выделении](api/spreadsheet_selection_config.md). Он ничего не делает, пока Spreadsheet не добавлен на страницу, и после вызова метода `destructor()`. + +**Журнал изменений:** Добавлено в v6.0.4 + +**Связанные статьи:** +- [Статусные оповещения](accessibility.md#status-announcements) +- [Озвучивание пользовательской команды](accessibility.md#announcing-a-custom-command) +- [Настройка меню](customization.md#menu) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md index 2fa3deb8..f1da7390 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md @@ -13,7 +13,21 @@ description: Вы можете узнать о событии beforeAction в д ### Использование {#usage} ~~~jsx -beforeAction: (action: string, config: object) => void | boolean; +beforeAction: ( + action: string, + config: { + action?: string, + cell?: string, + row?: number, + col?: number, + val?: any, + prev?: any, + groupAction?: string, + pageId?: string | number, + pageName?: string, + // other properties of the action + } | object[] +) => void | boolean; ~~~ ### Параметры {#parameters} @@ -21,7 +35,18 @@ beforeAction: (action: string, config: object) => void | boolean; Колбэк события принимает следующие параметры: - `action` - (обязательный) имя действия. Полный список доступных действий см. [здесь](api/overview/actions_overview.md#list-of-actions) -- `config` - (обязательный) объект с параметрами действия +- `config` - (обязательный) объект с параметрами действия. Набор свойств зависит от действия. Объект может содержать: + - `action` - (необязательный) имя действия + - `cell` - (необязательный) идентификатор ячейки или диапазона ячеек, к которым применяется действие, например, `"A1"` или `"B2:D5"` + - `row` - (необязательный) индекс строки ячейки, начиная с нуля + - `col` - (необязательный) индекс столбца ячейки, начиная с нуля + - `val` - (необязательный) новое значение, которое применяет действие, например, значение ячейки, стиль или размер + - `prev` - (необязательный) предыдущее значение + - `groupAction` - (необязательный) имя действия, которое выполняется вместо `action`, когда `cell` является диапазоном ячеек, например, `"groupAction"`, `"groupRowAction"` или `"resizeCol"` + - `pageId` - (необязательный) идентификатор листа + - `pageName` - (необязательный) имя листа + + Когда несколько действий выполняются вместе, например, при вставке, параметр `action` равен `"groupAction"`, а `config` - массив таких объектов. ### Возвращаемое значение {#returns} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md index 70ec3ed1..4c148f78 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md @@ -1,7 +1,7 @@ --- sidebar_label: deleteColumn() title: Метод deleteColumn -description: Вы можете узнать о методе deleteColumn в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачивайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Удалите столбец или диапазон столбцов в DHTMLX Spreadsheet с помощью метода deleteColumn(), включая все столбцы объединённой ячейки. --- # deleteColumn() @@ -11,7 +11,9 @@ description: Вы можете узнать о методе deleteColumn в до @short: Удаляет столбец из таблицы :::info -Метод находит указанную ячейку, выделяет её, удаляет столбец, в котором она расположена, и сдвигает столбец слева на его место. +Метод удаляет столбец, в котором расположена указанная ячейка, и сдвигает столбцы справа от него влево. + +Если ячейка находится внутри объединённой ячейки, метод удаляет каждый столбец, который охватывает объединённая ячейка. ::: ### Использование {#usage} @@ -35,7 +37,27 @@ spreadsheet.deleteColumn("G2"); ~~~ :::note -Можно удалить несколько столбцов, передав диапазон идентификаторов ячеек в качестве параметра метода, например: "A1:C3". +Можно удалить несколько столбцов, передав диапазон идентификаторов ячеек в качестве параметра метода, например: "A1:C3". Если диапазон затрагивает объединённую ячейку, удаляются столбцы всей объединённой ячейки. Диапазон, который охватывает столбцы целиком, например, "B1:C100" на листе со 100 строками, удаляется как есть. ::: -**Полезная статья:** [Работа с таблицей](working_with_ssheet.md#addingremoving-rows-and-columns) +### Подробности {#details} + +При удалении столбца внутри объединённой ячейки удаляется вся объединённая ячейка со всеми её столбцами: + +~~~jsx +spreadsheet.mergeCells("B2:D2"); + +// removes columns B, C and D +spreadsheet.deleteColumn("C2"); +~~~ + +При удалении столбцов целиком объединённая ячейка, которая их охватывает, уменьшается. Объединённые ячейки справа от удалённых столбцов сдвигаются влево вместе со своими столбцами. Если удалённые столбцы зафиксированы, зафиксированная область уменьшается на количество удалённых зафиксированных столбцов. + +События [`beforeAction`](api/spreadsheet_beforeaction_event.md) и [`afterAction`](api/spreadsheet_afteraction_event.md) для действия `"deleteColumn"` получают ячейку, переданную в метод, а не диапазон удалённых столбцов. + +**Журнал изменений:** Удаление всех столбцов объединённой ячейки добавлено в v6.0.4 + +**Полезные статьи:** +- [Работа со строками и столбцами](work_with_rows_cols.md#removing-columns) +- [Объединение ячеек](merge_cells.md#removing-rows-and-columns-of-merged-cells) +- [Работа с таблицей](working_with_ssheet.md#addingremoving-rows-and-columns) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md index 2f020a5c..ca481000 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md @@ -1,7 +1,7 @@ --- sidebar_label: deleteRow() title: Метод deleteRow -description: Вы можете узнать о методе deleteRow в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачивайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Удалите строку или диапазон строк в DHTMLX Spreadsheet с помощью метода deleteRow(), включая все строки объединённой ячейки. --- # deleteRow() @@ -11,7 +11,9 @@ description: Вы можете узнать о методе deleteRow в док @short: Удаляет строку из таблицы :::info -Метод находит указанную ячейку, выделяет её, удаляет строку, в которой она расположена, и сдвигает строку ниже на её место. +Метод удаляет строку, в которой расположена указанная ячейка, и сдвигает строки ниже неё вверх. + +Если ячейка находится внутри объединённой ячейки, метод удаляет каждую строку, которую охватывает объединённая ячейка. ::: ### Использование {#usage} @@ -35,7 +37,27 @@ spreadsheet.deleteRow("G2"); ~~~ :::note -Можно удалить несколько строк, передав диапазон идентификаторов ячеек в качестве параметра метода, например: "A1:C3". +Можно удалить несколько строк, передав диапазон идентификаторов ячеек в качестве параметра метода, например: "A1:C3". Если диапазон затрагивает объединённую ячейку, удаляются строки всей объединённой ячейки. Диапазон, который охватывает строки целиком, например, "A2:Z3" на листе со столбцами от A до Z, удаляется как есть. ::: -**Полезная статья:** [Работа с таблицей](working_with_ssheet.md#addingremoving-rows-and-columns) +### Подробности {#details} + +При удалении строки внутри объединённой ячейки удаляется вся объединённая ячейка со всеми её строками: + +~~~jsx +spreadsheet.mergeCells("B2:B4"); + +// removes rows 2, 3 and 4 +spreadsheet.deleteRow("B3"); +~~~ + +При удалении строк целиком объединённая ячейка, которая их охватывает, уменьшается. Объединённые ячейки ниже удалённых строк сдвигаются вверх вместе со своими строками. Если удалённые строки зафиксированы, зафиксированная область уменьшается на количество удалённых зафиксированных строк. + +События [`beforeAction`](api/spreadsheet_beforeaction_event.md) и [`afterAction`](api/spreadsheet_afteraction_event.md) для действия `"deleteRow"` получают ячейку, переданную в метод, а не диапазон удалённых строк. + +**Журнал изменений:** Удаление всех строк объединённой ячейки добавлено в v6.0.4 + +**Полезные статьи:** +- [Работа со строками и столбцами](work_with_rows_cols.md#removing-rows) +- [Объединение ячеек](merge_cells.md#removing-rows-and-columns-of-merged-cells) +- [Работа с таблицей](working_with_ssheet.md#addingremoving-rows-and-columns) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md index 38ae789f..877dba97 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md @@ -1,7 +1,7 @@ --- sidebar_label: readonly title: конфигурация readonly -description: Вы можете узнать о конфигурации readonly в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: "Включите режим только для чтения в DHTMLX Spreadsheet с помощью свойства readonly: он блокирует изменение данных, но сохраняет навигацию с помощью клавиатуры, выделение, копирование и поиск." --- # readonly @@ -31,9 +31,41 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { }); ~~~ +### Подробности {#details} + +В режиме только для чтения панель инструментов, меню и строка формул скрыты, а контекстное меню и значок меню столбца недоступны. Вкладки листов остаются, но без кнопки добавления листа, контекстного меню листа и переименования двойным щелчком. + +Пользователи по-прежнему могут просматривать и копировать данные: + +- ячейка A1 активна после загрузки данных +- по ячейкам можно перемещаться с помощью клавиатуры и выделять их мышью, при этом срабатывают события выделения +- ячейки можно копировать с помощью `Ctrl (Cmd) + C` и искать с помощью `Ctrl (Cmd) + F` +- листы можно переключать на вкладках листов и с помощью клавиатуры +- ссылки в ячейках можно открывать, но кнопки редактирования и удаления ссылки в окне ссылки отключены + +Изменения данных отклоняются: + +- ввод текста, клавиши редактирования, вырезание и вставка, отмена и повтор действий, а также сочетания клавиш, которые форматируют ячейки, вставляют ссылку, добавляют лист или показывают скрытые строки и столбцы, игнорируются, а программы чтения с экрана сообщают "The sheet is read-only" +- методы, которые изменяют данные, например, [`setValue()`](api/spreadsheet_setvalue_method.md), [`setStyle()`](api/spreadsheet_setstyle_method.md) и [`deleteRow()`](api/spreadsheet_deleterow_method.md), а также метод [`startEdit()`](api/spreadsheet_startedit_method.md) игнорируются. Методы [`parse()`](api/spreadsheet_parse_method.md) и [`load()`](api/spreadsheet_load_method.md) по-прежнему загружают данные +- маркер заполнения скрыт +- размер столбцов и строк нельзя изменить перетаскиванием их границ, а двойной щелчок по границе столбца не подгоняет ширину столбца под данные + +Чтобы отключить также навигацию с помощью клавиатуры и выделение, установите для параметра [`selection`](api/spreadsheet_selection_config.md) значение `false`. В этом случае в Spreadsheet нет активной ячейки, а ячейки нельзя выделить мышью, с помощью клавиатуры или API: + +~~~jsx {3} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, + selection: false, + // other config parameters +}); +~~~ + +**Журнал изменений:** Навигация с помощью клавиатуры, выделение, копирование и поиск в режиме только для чтения добавлены в v6.0.4 + **Полезные статьи:** - [Конфигурация](configuration.md#read-only-mode) - [Кастомизация](customization.md#custom-read-only-mode) +- [Специальные возможности: настройка режима только для чтения](accessibility.md#read-only-setup) **Связанный пример:** [Spreadsheet. Readonly](https://snippet.dhtmlx.com/2w959gx2) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md new file mode 100644 index 00000000..f317db83 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md @@ -0,0 +1,63 @@ +--- +sidebar_label: selection +title: Конфигурация selection +description: Отключите выделение ячеек в DHTMLX Spreadsheet с помощью свойства selection, отдельно или вместе с режимом только для чтения, чтобы показывать данные без активной ячейки. +--- + +# selection + +### Описание {#description} + +@short: Необязательный. Включает/отключает выделение ячеек + +### Использование {#usage} + +~~~jsx +selection?: boolean; +~~~ + +### Конфигурация по умолчанию {#default-config} + +~~~jsx +selection: true +~~~ + +### Пример {#example} + +~~~jsx {2} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, + // other config parameters +}); +~~~ + +### Подробности {#details} + +Если для свойства задано значение `false`: + +- в Spreadsheet нет активной ячейки +- ячейки нельзя выделить мышью, клавиатурой или через API: методы [`setSelectedCell()`](api/selection_setselectedcell_method.md) и [`setFocusedCell()`](api/selection_setfocusedcell_method.md) игнорируются, а методы [`getSelectedCell()`](api/selection_getselectedcell_method.md) и [`getFocusedCell()`](api/selection_getfocusedcell_method.md) возвращают `undefined` +- ячейки нельзя редактировать из интерфейса: строка формул заблокирована, маркер заполнения скрыт, а метод [`startEdit()`](api/spreadsheet_startedit_method.md) игнорируется +- контекстное меню и значок меню столбца недоступны +- `Tab` останавливается на сетке один раз и переносит фокус дальше, а `Ctrl + F6` пропускает сетку + +Размер столбцов и строк по-прежнему можно изменять перетаскиванием их границ, а данные по-прежнему можно изменять через API, например, с помощью метода [`setValue()`](api/spreadsheet_setvalue_method.md). + +В сочетании со свойством [`readonly`](api/spreadsheet_readonly_config.md) параметр отключает клавиатурную навигацию и выделение, которые доступны в режиме только для чтения: + +~~~jsx {3} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, + selection: false, + // other config parameters +}); +~~~ + +Чтобы отключать и включать выделение во время выполнения, используйте методы [`selection.disable()`](api/selection_disable_method.md) и [`selection.enable()`](api/selection_enable_method.md). + +**Журнал изменений:** Добавлено в v6.0.4 + +**Связанные статьи:** +- [Выделение ячеек](configuration.md#selection-of-cells) +- [Режим только для чтения](configuration.md#read-only-mode) +- [Доступность: настройка режима только для чтения](accessibility.md#read-only-setup) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md index a5ea0ce9..86db9bac 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md @@ -35,4 +35,10 @@ spreadsheet.parse(data); spreadsheet.startEdit(); ~~~ +### Подробности {#details} + +Ввод текста в активной ячейке запускает редактирование через этот метод. Текст, набранный с помощью редактора метода ввода (IME), передаётся как `initialValue` по завершении набора. Поэтому события [`beforeEditStart`](api/spreadsheet_beforeeditstart_event.md) и [`afterEditStart`](api/spreadsheet_aftereditstart_event.md) получают введённый или набранный текст, а `beforeEditStart` может отменить редактирование. + +**Журнал изменений:** Запуск редактирования с текстом, набранным с помощью IME, добавлен в v6.0.4 + **Полезная статья:** [Работа с таблицей](working_with_cells.md#editing-a-cell) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/configuration.md b/i18n/ru/docusaurus-plugin-content-docs/current/configuration.md index ff8b52f6..db06da64 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/configuration.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/configuration.md @@ -1,7 +1,7 @@ --- sidebar_label: Конфигурация title: Конфигурация -description: Вы можете узнать о конфигурации библиотеки DHTMLX JavaScript Spreadsheet в документации. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Настройка DHTMLX Spreadsheet. Параметры панели инструментов, строки редактирования, меню, количества строк и столбцов, режима только для чтения, выделения ячеек и числовых форматов. --- # Конфигурация {#configuration} @@ -50,8 +50,41 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { Вы также можете [настроить поведение Spreadsheet в режиме только для чтения](customization.md#custom-read-only-mode). +~~~jsx {2} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, +}); +~~~ + +В режиме только для чтения панель инструментов, меню и строка формул скрыты. Пользователи могут перемещаться по ячейкам с помощью клавиатуры, выделять их мышью, копировать и искать в них. Попытки редактирования отклоняются и озвучиваются программами чтения с экрана как "The sheet is read-only". Маркер заполнения скрыт. Подробности смотрите в статье [`readonly`](api/spreadsheet_readonly_config.md#details). О том, как с Spreadsheet в режиме только для чтения работают пользователи клавиатуры и программ чтения с экрана, читайте в разделе [Read-only setup](accessibility.md#read-only-setup) руководства по доступности. + +Чтобы отключить навигацию с клавиатуры и выделение в режиме только для чтения, установите для параметра [`selection`](api/spreadsheet_selection_config.md) значение `false`: + +~~~jsx {3} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, + selection: false, +}); +~~~ + +## Выделение ячеек {#selection-of-cells} + +По умолчанию пользователи могут выделять ячейки мышью и с клавиатуры, а в Spreadsheet есть активная ячейка. Чтобы отключить выделение, установите для параметра конфигурации [`selection`](api/spreadsheet_selection_config.md) значение `false`: + +~~~jsx {2} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, +}); +~~~ + +В этом случае в Spreadsheet нет активной ячейки, ячейки нельзя выделять или редактировать из интерфейса, а контекстное меню недоступно. + +Чтобы отключать и включать выделение во время работы, используйте методы [`selection.disable()`](api/selection_disable_method.md) и [`selection.enable()`](api/selection_enable_method.md). Метод [`selection.isDisabled()`](api/selection_isdisabled_method.md) проверяет, отключено ли выделение. + +Без выделения сетка становится одной точкой табуляции, через которую проходит клавиатурный фокус. Смотрите раздел [Read-only setup](accessibility.md#read-only-setup) руководства по доступности. + ## Пользовательские числовые форматы ячеек {#custom-number-formats-for-cells} Вы можете применять 7 форматов по умолчанию к значениям ячеек: "Common", "Number", "Percent", "Currency", "Date", "Time", "Text". diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/customization.md b/i18n/ru/docusaurus-plugin-content-docs/current/customization.md index f8cd9a97..6004dc44 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/customization.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/customization.md @@ -1,7 +1,7 @@ --- sidebar_label: Кастомизация title: Кастомизация -description: Вы можете узнать о кастомизации библиотеки DHTMLX JavaScript Spreadsheet в документации. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Настройка DHTMLX Spreadsheet. Изменение иконок, добавление, обновление и удаление элементов управления панели инструментов, меню и контекстного меню, а также создание собственного режима только для чтения. --- # Кастомизация {#customization} @@ -31,6 +31,8 @@ description: Вы можете узнать о кастомизации библ Вы можете добавлять следующие типы элементов управления: `button`, `menuItem`, `separator` и `spacer`. +Как и остальные элементы управления [панели инструментов по умолчанию](#default-controls), элементы *Text color* и *Background color*, а также элемент *Border color* во всплывающем окне *Border* имеют тип [`navItem`](https://docs.dhtmlx.com/suite/toolbar/navitem/). Они отображают текущий цвет с помощью свойства [`html`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/), берут доступное имя из свойства [`value`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/), например "Text color: dark gray", и открывают всплывающее окно выбора цвета. Spreadsheet обновляет оба свойства элементов *Text color* и *Background color* при смене активной ячейки, а элемента *Border color* при выборе цвета границы. + Объект `button` имеет следующие свойства: - `type` - тип кнопки, установите значение "button" @@ -379,7 +381,8 @@ spreadsheet.menu.data.remove("undo"); - пункт меню **Columns** (id: "columns") - пункт меню *Add column* (id: "add-col") - пункт меню *Remove column* (id: "remove-col") - - пункт меню *Fit to data* (id: "fit-col") + - пункт меню *Fit to data* (id: "fit-col"), отображается в меню столбца и при выделении столбцов целиком + - пункт меню *Column width* (id: "col-width") - разделитель - пункт меню *Unfreeze columns* (id: "unfreeze-cols") - пункт меню *Freeze up to column [id]* (id: "freeze-cols") @@ -388,6 +391,7 @@ spreadsheet.menu.data.remove("undo"); - пункт меню **Rows** (id: "rows") - пункт меню *Add row* (id: "add-row") - пункт меню *Remove row* (id: "remove-row") + - пункт меню *Row height* (id: "row-height") - разделитель - пункт меню *Unfreeze rows* (id: "unfreeze-rows") - пункт меню *Freeze up to row [id]* (id: "freeze-rows") @@ -396,6 +400,7 @@ spreadsheet.menu.data.remove("undo"); - пункт меню **Sort** (id: "sort") - пункт меню *Sort A to Z* (id: "asc-sort") - пункт меню *Sort Z to A* (id: "desc-sort") +- пункт меню **Open filter** (id: "open-filter"), отображается, когда активная ячейка содержит значок фильтра - пункт меню **Insert link** (id: "link") ### Добавление элементов управления {#adding-controls-3} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/data_search.md b/i18n/ru/docusaurus-plugin-content-docs/current/data_search.md index 7de9fced..1c2f2643 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/data_search.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/data_search.md @@ -1,7 +1,7 @@ --- sidebar_label: Поиск данных title: Поиск данных -description: Вы можете узнать о поиске данных в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Поиск данных в DHTMLX Spreadsheet с помощью панели поиска. Откройте её по Ctrl (Cmd) + F или через меню Data, переходите между совпадениями и закрывайте клавишей Esc. --- # Поиск данных {#searching-for-data} @@ -12,3 +12,11 @@ description: Вы можете узнать о поиске данных в до - Или перейдите в меню: *Data* -> *Search* ![DHTMLX Spreadsheet search bar with a text input for finding data](/img/search_data.png) + +Введите в панели поиска текст, который нужно найти. Первая ячейка с этим текстом подсвечивается и прокручивается в область видимости, а счётчик показывает количество совпадений. Чтобы переходить между совпадениями, нажимайте кнопки со стрелками в панели поиска. + +Результаты поиска обновляются после редактирования ячеек и после открытия другого листа. Программы чтения с экрана озвучивают количество совпадений и адрес первого совпадения после того, как вы перестанете вводить текст, например "Results: 5. 1 of 5, B2" или "No results". При переходе к другому совпадению они озвучивают его позицию и адрес, например "2 of 5, B7". + +Чтобы закрыть панель поиска, нажмите **Esc** или кнопку закрытия. Фокус вернётся на активную ячейку. + +Для поиска данных с помощью API используйте метод [`search()`](api/spreadsheet_search_method.md). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/excel_import_export.md b/i18n/ru/docusaurus-plugin-content-docs/current/excel_import_export.md index b6555398..a3465d22 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/excel_import_export.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/excel_import_export.md @@ -1,7 +1,7 @@ --- sidebar_label: Импорт/экспорт Excel title: Импорт и экспорт Excel -description: Вы можете узнать об импорте и экспорте Excel в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Импорт данных из файлов Excel в DHTMLX Spreadsheet и экспорт в .xlsx через панель инструментов или меню File. --- # Импорт/экспорт Excel {#excel-importexport} @@ -37,3 +37,9 @@ description: Вы можете узнать об импорте и экспор ![DHTMLX Spreadsheet File menu with the Download As option for Microsoft Excel XLSX export](/img/file_export.png) 2\. Проверьте папку загрузок: там будет файл Excel с данными из Spreadsheet. + +Программы чтения с экрана озвучивают начало и завершение импорта и экспорта. + +:::note +Импорт и экспорт файлов Excel используют WebAssembly. Если браузер не поддерживает WebAssembly, команды Import и Export показывают сообщение с текстом ключа `wasmNotSupported` [локали](localization.md#default-locale). Метод [`load()`](api/spreadsheet_load_method.md) с типом `"xlsx"` и метод [`export.xlsx()`](api/export_xlsx_method.md) выбрасывают `Error` с тем же текстом, который можно перехватить в коде. +::: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/filtering_data.md b/i18n/ru/docusaurus-plugin-content-docs/current/filtering_data.md index 0d0e99e6..1bffca7a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/filtering_data.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/filtering_data.md @@ -1,7 +1,7 @@ --- sidebar_label: Фильтрация данных title: Фильтрация данных -description: Вы можете узнать о фильтрации данных в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Фильтрация данных в DHTMLX Spreadsheet по условию или по значениям, открытие фильтра с клавиатуры, очистка и удаление фильтров. --- # Фильтрация данных {#filtering-data} @@ -20,6 +20,20 @@ description: Вы можете узнать о фильтрации данных После этого справа от каждого заголовка столбца в диапазоне появится значок **фильтра**. +## Открытие фильтра с клавиатуры {#opening-a-filter-with-the-keyboard} + +Чтобы открыть фильтр столбца без мыши: + +- Переместите активную ячейку на ячейку заголовка столбца со значком **фильтра** + +- Нажмите `Shift + F10` или клавишу Menu, чтобы вызвать контекстное меню, и выберите *Open filter* + +![DHTMLX Spreadsheet context menu of a header cell with the filter icon and the Open filter command focused](/img/open_filter_context_menu.png) + +Команда *Open filter* появляется в контекстном меню только для ячеек со значком **фильтра**. Её можно выбрать и после щелчка правой кнопкой мыши по такой ячейке. В [режиме только для чтения](api/spreadsheet_readonly_config.md) контекстное меню и команда *Open filter* недоступны. + +Фокус переходит на всплывающее окно фильтра, а клавиша `Tab` перемещает между его элементами управления. Клавиша `Esc` закрывает окно и возвращает фокус на ячейку. Если в окне открыт выпадающий список или выбор даты, `Esc` сначала закрывает его. + ## Фильтрация по условию {#filtering-by-condition} - Нажмите значок **фильтра** нужного столбца diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides.md b/i18n/ru/docusaurus-plugin-content-docs/current/guides.md index 37fb258e..99b92956 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides.md @@ -1,12 +1,12 @@ --- sidebar_label: Обзор руководств title: Руководства для разработчиков и пользователей -description: Вы можете изучить руководства для разработчиков и пользователей в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: "Руководства для разработчиков и пользователей DHTMLX Spreadsheet: от инициализации, настройки и загрузки данных до редактирования ячеек, форматирования и работы с листами." --- # Руководства {#guides} -DHTMLX Spreadsheet включает широкий набор возможностей: импорт и экспорт данных в различных форматах, удобная работа с содержимым и стилями ячеек, гибкая структура таблицы, режим только для чтения, обширные возможности настройки внешнего вида и интеграция с популярными фреймворками. +DHTMLX Spreadsheet включает широкий набор возможностей: импорт и экспорт данных в различных форматах, удобная работа с содержимым и стилями ячеек, гибкая структура таблицы, режим только для чтения, обширные возможности настройки внешнего вида, доступность для пользователей клавиатуры и программ чтения с экрана и интеграция с популярными фреймворками. ## Руководства для разработчиков {#developer-guides} @@ -38,6 +38,12 @@ DHTMLX Spreadsheet включает широкий набор возможнос - [Интеграция со Svelte](svelte_integration.md) - демо на GitHub с использованием Spreadsheet в приложении Svelte - [Интеграция с Vue.js](vuejs_integration.md) - демо на GitHub с использованием Spreadsheet в приложении Vue +### Доступность {#accessibility} + +- [Доступность](accessibility.md) - поддержка WAI-ARIA, навигация с клавиатуры, озвучивание программами чтения с экрана и высококонтрастные темы +- [Настройка доступного Spreadsheet](accessibility.md#configuration-recipes) - конфигурации для пользователей клавиатуры и программ чтения с экрана, включая режим только для чтения +- [Отчёт о соответствии (VPAT)](accessibility_conformance_report.md) - соответствие WCAG 2.2 AA, Section 508 и EN 301 549 + ### Разработка с помощью ИИ {#ai-assisted-development} - [DHTMLX MCP server](mcp-server.md) - подключение ИИ-ассистентов для написания кода к актуальной документации Spreadsheet diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/hotkeys.md b/i18n/ru/docusaurus-plugin-content-docs/current/hotkeys.md index 299e7687..f86e4a4e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/hotkeys.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/hotkeys.md @@ -1,13 +1,21 @@ --- sidebar_label: Список горячих клавиш title: Горячие клавиши -description: Вы можете узнать о горячих клавишах в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства для разработчиков и справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Горячие клавиши DHTMLX Spreadsheet для редактирования, форматирования, навигации, выделения, поиска, работы с листами, строками и столбцами, всплывающими окнами и диалогами. --- # Список горячих клавиш {#hot-keys-list} Ниже представлен список горячих клавиш, которые можно использовать при работе с DHTMLX Spreadsheet. +:::note +Горячие клавиши для ячеек работают, пока фокус находится в ячейках или в строке формул. Горячие клавиши форматирования, отмены, поиска, вставки ссылки и добавления листа также работают, пока фокус находится на панели инструментов. Когда фокус находится на панели инструментов, строке меню или вкладках листов, клавиши со стрелками, **Home**, **End**, **Enter** и **Space** работают в пределах этой панели (см. [Перемещение фокуса](#moving-the-focus)). + +В [режиме только для чтения](api/spreadsheet_readonly_config.md) работают горячие клавиши навигации, выделения, копирования и поиска. Горячие клавиши, изменяющие лист, включая **Ctrl (Cmd) + Shift + 9**, **Ctrl (Cmd) + Shift + 0** и **Shift + F11**, отклоняются, а скринридеры озвучивают "The sheet is read-only". Контекстное меню недоступно, поэтому **Shift + F10** и клавиша Menu не работают. + +Чтобы узнать, как работает навигация с клавиатуры со скринридерами, прочитайте руководство [Accessibility](accessibility.md#keyboard-navigation). +::: + ## Редактирование {#editing} @@ -28,6 +36,10 @@ description: Вы можете узнать о горячих клавишах + + + +
Esc закрывает редактор ячейки без сохранения изменений
Alt (Option) + Enterоткрывает ссылку активной ячейки в новой вкладке
@@ -114,43 +126,43 @@ description: Вы можете узнать о горячих клавишах Shift + Enter - перемещает выделение на одну ячейку вверх (в столбце). Если выбран диапазон ячеек, перемещает выделение на одну ячейку вверх в пределах диапазона. Деактивируется при достижении первой ячейки в столбце. + перемещает выделение на одну ячейку вверх (в столбце). Если выбран диапазон ячеек, перемещает выделение на одну ячейку вверх в пределах диапазона. Tab - перемещает выделение на одну ячейку вправо (в строке). Если выбран диапазон ячеек, перемещает выделение на одну ячейку вправо в пределах диапазона. Деактивируется при достижении крайней правой ячейки в строке. + перемещает выделение на одну ячейку вправо (в строке). Из крайней правой ячейки перемещает выделение на первую ячейку той же строки. Если выбран диапазон ячеек, перемещает выделение на одну ячейку вправо в пределах диапазона. Из последней ячейки листа сохраняет изменённое значение и выводит фокус из ячеек на следующую часть страницы, например на вкладки листов. Tab + Shift - перемещает выделение на одну ячейку влево (в строке). Если выбран диапазон ячеек, перемещает выделение на одну ячейку влево в пределах диапазона. Деактивируется при достижении крайней левой ячейки в строке. + перемещает выделение на одну ячейку влево (в строке). Из крайней левой ячейки перемещает выделение на последнюю ячейку той же строки. Если выбран диапазон ячеек, перемещает выделение на одну ячейку влево в пределах диапазона. Из первой ячейки листа сохраняет изменённое значение и выводит фокус из ячеек на предыдущую часть страницы, например на строку формул. Клавиши со стрелками - обеспечивают навигацию по ячейкам листа + обеспечивают навигацию по ячейкам листа. Останавливаются на первой и последней видимой строке и столбце. Если выбран диапазон ячеек, стрелка у края листа сворачивает диапазон до активной ячейки Home - перемещает выделение к первой ячейке в строке + перемещает выделение к первой видимой ячейке в строке End - перемещает выделение к последней ячейке в строке + перемещает выделение к последней видимой ячейке в строке Ctrl (Cmd) + стрелка влево - перемещает выделение к первой ячейке в строке + перемещает выделение к первой видимой ячейке в строке Ctrl (Cmd) + стрелка вправо - перемещает выделение к последней ячейке в строке + перемещает выделение к последней видимой ячейке в строке Ctrl (Cmd) + стрелка вверх - перемещает выделение к первой ячейке в столбце + перемещает выделение к первой видимой ячейке в столбце Ctrl (Cmd) + стрелка вниз - перемещает выделение к последней ячейке в столбце + перемещает выделение к последней видимой ячейке в столбце Ctrl (Cmd) + Home @@ -175,6 +187,59 @@ description: Вы можете узнать о горячих клавишах +## Перемещение фокуса {#moving-the-focus} + +Панель инструментов, строка меню и вкладки листов являются единой точкой табуляции: Tab перемещает фокус на панель и с неё, при этом фокус попадает на элемент управления, который использовался последним. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ctrl + F6перемещает фокус на следующую часть Spreadsheet в порядке: меню, панель инструментов, лист (активная ячейка), вкладки листов, затем снова меню. Строка формул и скрытые части пропускаются. Сначала сохраняет значение редактируемой ячейки
Ctrl + Shift + F6перемещает фокус на предыдущую часть Spreadsheet
Стрелка влево/стрелка вправоперемещает фокус на предыдущий/следующий элемент управления панели инструментов, строки меню или вкладок листов
Home/Endперемещает фокус на первый/последний элемент управления панели
Enter/Spaceнажимает элемент управления в фокусе: выполняет команду, открывает выпадающий список или переключает на лист выбранной вкладки
Стрелка внизоткрывает выпадающий список элемента управления в фокусе и перемещает фокус на его первый пункт
Стрелка вверх/стрелка внизперемещает фокус между пунктами открытого выпадающего списка или меню
Стрелка вправооткрывает подменю пункта меню в фокусе
Стрелка влевозакрывает подменю. На первом уровне выпадающего списка закрывает список и возвращает фокус его элементу управления
Escзакрывает выпадающий список или меню и возвращает фокус элементу управления, который его открыл. Закрывает подсказку элемента управления панели инструментов. Без Esc подсказка остаётся открытой, пока на ней находится указатель
Shift + F10 или клавиша Menuоткрывает контекстное меню активной ячейки или вкладки листа в фокусе и перемещает фокус в него. После Ctrl (Cmd) + Space контекстное меню ячейки показывает команды для столбца. Esc закрывает контекстное меню и возвращает фокус на ячейку
+ ## Поиск {#search} @@ -185,11 +250,15 @@ description: Вы можете узнать о горячих клавишах - + - + + + + +
Ctrl (Cmd) + Gперемещает выделение к следующему найденному совпадениювыделяет следующее найденное совпадение
Ctrl (Cmd) + Shift + Gперемещает выделение к предыдущему найденному совпадениювыделяет предыдущее найденное совпадение
Escзакрывает строку поиска и возвращает фокус на активную ячейку
@@ -234,8 +303,110 @@ description: Вы можете узнать о горячих клавишах добавляет новый лист в таблицу - Alt + стрелка вверх / стрелка вниз - переключается на следующий/предыдущий лист + Alt (Option) + стрелка вверх + переключается на следующий лист. С последнего листа переключается на первый + + + Alt (Option) + стрелка вниз + переключается на предыдущий лист. С первого листа переключается на последний + + + Ctrl (Cmd) + Alt (Option) + Page Down + переключается на следующий лист + + + Ctrl (Cmd) + Alt (Option) + Page Up + переключается на предыдущий лист + + + + +## Работа со строками и столбцами {#work-with-rows-and-columns} + + + + + + + + + + + + +
Ctrl (Cmd) + Shift + 9показывает скрытые строки внутри выбранного диапазона
Ctrl (Cmd) + Shift + 0показывает скрытые столбцы внутри выбранного диапазона
+ +## Всплывающие окна панели инструментов {#toolbar-popups} + +Клавиши ниже работают во всплывающих окнах элементов *Text color*, *Background color* и *Border* панели инструментов. Всплывающее окно получает фокус при открытии. + + + + + + + + + + + + + + + + + + + + + + + + +
Клавиши со стрелкамиперемещают фокус между цветами палитры или между элементами управления всплывающего окна Border
Home/Endперемещает фокус на первый/последний цвет палитры
Enterприменяет цвет или границу в фокусе. После применения цвета текста или фона фокус возвращается на активную ячейку
Escвозвращает из режима пользовательского цвета к палитре. Во всплывающем окне цвета или стиля, открытом поверх окна Border, закрывает его и возвращает фокус на его кнопку в окне Border. В остальных случаях закрывает всплывающее окно и возвращает фокус его элементу управления на панели инструментов
Tab/Tab + Shiftзакрывает всплывающее окно и возвращает фокус его элементу управления на панели инструментов. В окне Border и окнах, открытых поверх него, закрывает их все и возвращает фокус элементу управления Border. В режиме пользовательского цвета перемещает фокус между элементами управления выбора цвета
+ +## Редактор списка {#list-editor} + +Клавиши ниже работают в редакторе ячейки со [списком значений](api/spreadsheet_setvalidation_method.md). + + + + + + + + + + + + + + + + + + + + +
Стрелка вверх/стрелка внизперемещают по списку значений
Enterвыбирает значение и закрывает редактор
Escзакрывает редактор без сохранения изменений
Tabсохраняет значение и перемещает выделение на одну ячейку вправо
+ +## Фильтр и диалоговые окна {#filter-and-dialogs} + +Клавиши ниже работают во всплывающем окне [фильтра](filtering_data.md#opening-a-filter-with-the-keyboard) и в диалоговых окнах [Column width и Row height](work_with_rows_cols.md#setting-column-width-and-row-height). + + + + + + + + + + + + + +
Escзакрывает всплывающее окно фильтра и возвращает фокус на ячейку
Enterприменяет размер в диалоговых окнах Column width и Row height
Escзакрывает диалоговые окна Column width и Row height без изменений
diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/localization.md b/i18n/ru/docusaurus-plugin-content-docs/current/localization.md index 35c10690..8d668193 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/localization.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/localization.md @@ -1,7 +1,7 @@ --- sidebar_label: Локализация title: Локализация -description: Вы можете узнать о локализации библиотеки DHTMLX JavaScript Spreadsheet в документации. Изучите руководства разработчика и справочник API, ознакомьтесь с примерами кода и живыми демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Локализация DHTMLX Spreadsheet. Изучите локаль по умолчанию, создайте собственную, переведите встроенные виджеты и всплывающее окно формул и примените локаль. --- # Локализация {#localization} @@ -23,6 +23,8 @@ const en = { textColor: "Text color", backgroundColor: "Background color", + fontSize: "Font size", + bold: "Bold", italic: "Italic", underline: "Underline", @@ -60,6 +62,10 @@ const en = { addRow: "Add row above", removeRow: "Remove row {row}", removeRows: "Remove rows {row}", + columnWidth: "Column width", + rowHeight: "Row height", + widthInPixels: "Width in pixels", + heightInPixels: "Height in pixels", row: "row", col: "col", freeze: "Freeze", @@ -82,8 +88,10 @@ const en = { text: "Text", date: "Date", time: "Time", + scientific: "Scientific", filter: "Filter", + openFilter: "Open filter", help: "Help", @@ -104,6 +112,9 @@ const en = { border_style: "Border style", // Tabbar + // the name of a new sheet is this prefix followed by a number: sheet1, sheet2 + defaultSheetName: "sheet", + addSheet: "Add sheet", deleteSheet: "Delete", renameSheet: "Rename", renameSheetAlert: "A sheet with the name $name already exists. Please enter another name. ", @@ -114,10 +125,14 @@ const en = { export: "Export", downloadAs: "Download as...", importAs: "Import as...", + xlsxFormat: "Microsoft Excel(.xlsx)", data: "Data", validation: "Data validation", search: "Search", + previousMatch: "Previous match", + nextMatch: "Next match", + closeSearch: "Close search", sort: "Sort", ascSort: "Sort A to Z", descSort: "Sort Z to A", @@ -177,17 +192,105 @@ const en = { spanUnmergeLockedError: "You can't unmerge locked cells!", spanOverFilteredRow: "You can't merge cells over a filtered row.", removeAlert: "You can't remove last $name!", + wasmNotSupported: "WebAssembly is not supported by your browser", + invalidValue: "Invalid value", + + // Accessible names, read by screen readers + // accessible name of a color button; {label} is the name of the control, {color} is a name from the colorpicker locale + aria_colorButton: "{label}: {color}", + // accessible names of the toolbars; the screen reader adds the word "toolbar" itself + aria_toolbarFormatting: "Formatting", + aria_toolbarBorders: "Borders", + aria_toolbarSheets: "Sheets", + aria_toolbarSearch: "Search", + aria_toolbarLink: "Link", + // accessible names of the line styles in the border style list + aria_borderStyleThin: "Thin line", + aria_borderStyleMedium: "Medium line", + aria_borderStyleThick: "Thick line", + aria_borderStyleDashed: "Dashed line", + aria_borderStyleDotted: "Dotted line", + aria_borderStyleDouble: "Double line", + // accessible names of the context menus; the screen reader adds the word "menu" itself + aria_cellMenu: "Cell", + aria_sheetMenu: "Sheet", + // accessible name of the menu bar; the screen reader adds the words "menu bar" itself + aria_menuBar: "Main", + // accessible name of the cell grid; the screen reader adds the word "grid" itself + aria_grid: "Spreadsheet", + // accessible name of the select-all corner, the first column header + aria_selectAll: "Select all", + // accessible name of the formula bar; {cell} is the address of the cell it shows, for example "B7" + aria_formulaBar: "Formula bar, {cell}", + // accessible name of the input that edits a cell; {cell} is the address of the cell, for example "B7" + aria_cellEditor: "Cell editor, {cell}", + // accessible name of the close icon of the formula help panel + aria_closeFormulaHelp: "Close formula help", + + // Cell descriptions, read with the content of the active cell + // read with the content of a cell that has a filter icon; the icon itself is hidden from assistive technology + aria_filter: "Filter", + aria_filterApplied: "Filter applied", + // read after the content of a selected cell that holds a link; Alt+Enter opens the link + aria_cellLink: "link", + // read after the content of a selected locked cell; the lock icon itself is hidden from assistive technology + aria_lockedState: "locked", + // read after the value of a cell with a formula error; the formula engine writes the error as #ERROR, #REF! or #SPILL! + aria_errorSyntax: "Syntax error. Check the formula", + aria_errorCalc: "Calculation error. Check the values and functions", + aria_errorRef: "Reference error. Check the cell references", + aria_errorSpill: "Spill error. Clear the cells the result needs", + // read after the value of a cell that breaks its list validation + aria_invalidValue: "Invalid value. Choose a value from the list", + + // Screen reader announcements + // announced when an editing key is pressed in the read-only mode + aria_readonlySheet: "The sheet is read-only", + // announced when Ctrl+Shift+9 or Ctrl+Shift+0 finds nothing to reveal + aria_noHiddenRows: "No hidden rows in the selection", + aria_noHiddenCols: "No hidden columns in the selection", + // announced when a selection of several cells changes; {range} is built from aria_rangeExtent + aria_selectedRange: "{range}, {count} cells", + aria_rangeExtent: "{start} to {end}", + // joins the ranges of a selection made with Ctrl + aria_rangeSeparator: ", ", + // announced after an action; {message} is one of the texts above + aria_cellMessage: "{cell}: {message}", + // announced when an action makes several errors appear; {first} is aria_cellMessage for the first of them + aria_newErrors: "{count} new errors. {first}", + // announced when an action puts several invalid values; {first} is aria_cellMessage for the first of them + aria_invalidValues: "{count} invalid values. {first}", + // announced once when an edit of a locked cell is refused; the second one when a range holds locked cells + aria_lockedCell: "The cell is locked", + aria_lockedCells: "Locked cells were not changed", + // announced when the search text changes; followed by aria_searchMatch for the first match + aria_searchResults: "Results: {count}.", + // announced for the current match; {cell} is its address, for example "B7" + aria_searchMatch: "{index} of {count}, {cell}", + aria_searchNoResults: "No results", + // announced when an export or an import of a file starts and ends + aria_exportStarted: "Exporting the file", + aria_exportDone: "The file is exported", + aria_importStarted: "Importing the file", + aria_importDone: "The file is imported", + // announced when the column width or the row height command is applied; {size} is the applied size + aria_columnWidthSet: "Column width set to {size} pixels", + aria_rowHeightSet: "Row height set to {size} pixels", }; ~~~ +Ключи, которые начинаются с `aria_`, не отображаются в интерфейсе. Скринридеры озвучивают их как названия элементов управления, как описания активной ячейки и как сообщения live-региона, который также использует метод [`announce()`](api/spreadsheet_announce_method.md). Части в фигурных скобках, например `{cell}` или `{count}`, заменяются значениями при озвучивании строки. Сохраняйте их в переведённых строках. Пример переведённых строк доступности смотрите в руководстве [Accessibility](accessibility.md#translated-accessibility-strings). + +Ключ `defaultSheetName` задаёт префикс имён листов по умолчанию. Spreadsheet добавляет к нему номер, поэтому значение по умолчанию `"sheet"` даёт имена "sheet1", "sheet2" и так далее. Например, со значением `"Tabelle"` (префикс, который использует Microsoft Excel в немецком языке) листы будут называться "Tabelle1", "Tabelle2" и так далее. + ## Пользовательская локаль {#custom-locale} Чтобы применить другую локаль, необходимо: -- предоставить переводы для всех текстовых меток в Spreadsheet, например для русской локали: +- предоставить переводы для всех текстовых меток в Spreadsheet, например для немецкой локали: ~~~jsx -const ru = { +const de = { // language settings }; ~~~ @@ -195,10 +298,48 @@ const ru = { - применить новую локаль, вызвав метод `dhx.i18n.setLocale()` перед инициализацией Spreadsheet: ~~~jsx -dhx.i18n.setLocale("spreadsheet", ru); +dhx.i18n.setLocale("spreadsheet", de); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); +~~~ + +## Локализация встроенных виджетов {#localizing-built-in-widgets} + +Внутри Spreadsheet используются виджеты Calendar, Colorpicker, Grid, Timepicker, Toolbar, Window и Message из DHTMLX Suite. Их строки хранятся в отдельных локалях, которые можно переводить так же, как локаль `spreadsheet`: + +| Локаль | Строки, используемые в Spreadsheet | +| ------ | --------------------------- | +| `calendar` | названия месяцев и дней в редакторе дат и в фильтре по датам | +| `colorpicker` | метки режима пользовательского цвета во всплывающих окнах выбора цвета на панели инструментов, название палитры и названия цветов, которые скринридеры озвучивают для образцов и кнопок цвета, например "Text color: dark gray" | +| `grid` | сообщение о количестве загруженных строк | +| `timepicker` | метки редактора времени | +| `toolbar` | название панели инструментов по умолчанию для скринридеров | +| `window` | название диалогового окна по умолчанию для скринридеров | +| `message` | названия для скринридеров диалогов alert и confirm и их кнопок | + +Вызывайте `dhx.i18n.setLocale()` с названием локали перед инициализацией Spreadsheet, так как панели инструментов, меню и контекстные меню читают локаль при создании: + +~~~jsx +const deColorpicker = { + cancel: "Abbrechen", + select: "Auswählen", + aria_palette: "Farbpalette", + aria_colorRed: "rot", + // other strings +}; + +const deMessage = { + aria_confirm: "Bestätigen" +}; + +dhx.i18n.setLocale("spreadsheet", de); +dhx.i18n.setLocale("colorpicker", deColorpicker); +dhx.i18n.setLocale("message", deMessage); + const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); ~~~ +Ключи локали плоские: передавайте каждый ключ на верхнем уровне объекта. Подробности смотрите в статье [Localization of screen-reader strings](https://docs.dhtmlx.com/suite/common_features/accessibility_support/#localization-of-screen-reader-strings) документации DHTMLX Suite. + ## Локаль формул по умолчанию {#default-locale-for-formulas} Объект `dhx.i18n.formulas` содержит локаль i18n для всплывающего окна формул Spreadsheet. Локаль формул по умолчанию выглядит следующим образом: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/merge_cells.md b/i18n/ru/docusaurus-plugin-content-docs/current/merge_cells.md index dffe6394..ba346b1a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/merge_cells.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/merge_cells.md @@ -1,7 +1,7 @@ --- sidebar_label: Объединение ячеек title: Объединение ячеек -description: Вы можете узнать об объединении ячеек в документации библиотеки DHTMLX JavaScript Spreadsheet. Изучите руководства разработчика и справочник API, ознакомьтесь с примерами кода и живыми демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Объединение и разделение ячеек в DHTMLX Spreadsheet через панель инструментов или меню Format, а также как удаление строк и столбцов влияет на объединённые ячейки. --- # Объединение ячеек {#merging-cells} @@ -45,3 +45,13 @@ description: Вы можете узнать об объединении ячее 2\. Перейдите в меню: *Format -> Unmerge* ![Меню Format в DHTMLX Spreadsheet с пунктом Unmerge для разделения объединённых ячеек](/img/unmerge_cells_via_menu.png) + +## Удаление строк и столбцов с объединёнными ячейками {#removing-rows-and-columns-of-merged-cells} + +Если удалить строку или столбец через объединённую ячейку, будут удалены все строки или столбцы, которые охватывает эта ячейка. Это работает так, когда выбрана ячейка или диапазон ячеек, а строка или столбец удаляется через панель инструментов, меню, контекстное меню или методы [`deleteRow()`](api/spreadsheet_deleterow_method.md) / [`deleteColumn()`](api/spreadsheet_deletecolumn_method.md). В контекстном меню название команды показывает весь диапазон, например, *Удалить строки 2-4*. + +![Контекстное меню DHTMLX Spreadsheet с подменю «Строки» и командой «Удалить строки 2-4» для объединённой ячейки](/img/remove_merged_rows_context_menu.png) + +Если выделены целые строки или столбцы, например, щелчком по их заголовкам или с помощью `Shift + Space` или `Ctrl (Cmd) + Space`, удаляются только выделенные строки или столбцы. Объединённая ячейка, которая их охватывает, становится меньше, а объединённая ячейка, в которой осталась одна ячейка, становится обычной ячейкой. + +Объединённые ячейки, расположенные ниже или правее удаляемых строк или столбцов, смещаются вместе с ними. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/react/overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/react/overview.md index 57f138eb..196e0bb0 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/react/overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/react/overview.md @@ -96,8 +96,8 @@ import "@dhx/react-spreadsheet/spreadsheet.react.css"; | Категория | Пропсы | Что происходит при изменении | |----------|-------|----------------------| -| **Только для инициализации** | `menu`, `editLine`, `toolbarBlocks`, `multiSheets`, `formats`, `localization`, `importModulePath`, `exportModulePath`, `spreadsheetLocale` | Виджет уничтожается и пересоздаётся. Данные таблицы сохраняются, но история отмены/повтора и состояние интерфейса (выделение, позиция прокрутки) сбрасываются. | -| **Во время выполнения** | `readonly`, `rowsCount`, `colsCount` | Применяются немедленно без потери данных или сброса состояния интерфейса. | +| **Только для инициализации** | `menu`, `editLine`, `toolbarBlocks`, `multiSheets`, `formats`, `localization`, `importModulePath`, `exportModulePath`, `spreadsheetLocale`, `readonly` | Виджет уничтожается и пересоздаётся. Данные таблицы сохраняются, но история отмены/повтора и состояние интерфейса (выделение, позиция прокрутки) сбрасываются. | +| **Во время выполнения** | `selection`, `rowsCount`, `colsCount` | Применяются немедленно без потери данных или сброса состояния интерфейса. | | **Данные** | `sheets`, `activeSheet` | Применяются инкрементально; обновляются только изменённые ячейки, диапазоны или настройки. | | **Повторная обработка** | `styles` | Изменения стилей требуют полной перезагрузки данных. Данные таблицы сохраняются, но история отмены/повтора и состояние интерфейса сбрасываются. | | **Состояние** | `search`, `theme`, `loadUrl` | Применяются через специализированные API виджета без побочных эффектов. | @@ -198,6 +198,10 @@ function App() { Свойство `instance` равно `null` до инициализации виджета и после его размонтирования. +:::info +Обработчики, добавленные через `ref.current.instance.events.on()`, удаляются при пересоздании виджета после изменения пропса, доступного только для инициализации, и при размонтировании компонента. Используйте [пропсы колбэков событий](react/events.md): компонент подключает их к каждому новому экземпляру виджета. +::: + ## Справочник API {#api-reference} | Документ | Содержание | diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/react/props.md b/i18n/ru/docusaurus-plugin-content-docs/current/react/props.md index 41bd20a5..876e7a1a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/react/props.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/react/props.md @@ -25,6 +25,7 @@ description: "Полный справочник всех пропсов комп | `importModulePath` | `string` | Путь к модулю импорта XLSX. JS API: [`importModulePath`](api/spreadsheet_importmodulepath_config.md). | | `exportModulePath` | `string` | Путь к модулю экспорта XLSX. JS API: [`exportModulePath`](api/spreadsheet_exportmodulepath_config.md). | | `spreadsheetLocale` | [`SpreadsheetLocale`](react/types.md#spreadsheetlocale) | Переводы интерфейса и локализованные имена формул. Отдельно от `localization`. | +| `readonly` | `boolean` | Включить режим только для чтения. Пользователи могут перемещаться по ячейкам, выделять, копировать их и выполнять поиск, а редактирование отклоняется. JS API: [`readonly`](api/spreadsheet_readonly_config.md). | @@ -40,7 +41,7 @@ description: "Полный справочник всех пропсов комп |------|------|-------------| | `rowsCount` | `number` | Количество строк в сетке. JS API: [`rowsCount`](api/spreadsheet_rowscount_config.md). | | `colsCount` | `number` | Количество столбцов в сетке. JS API: [`colsCount`](api/spreadsheet_colscount_config.md). | -| `readonly` | `boolean` | Включить режим только для чтения. JS API: [`readonly`](api/spreadsheet_readonly_config.md). | +| `selection` | `boolean` | Включить и отключить выделение ячеек. По умолчанию: `true`. При значении `false` в таблице нет активной ячейки, а ячейки нельзя выделять и редактировать из интерфейса. JS API: [`selection`](api/spreadsheet_selection_config.md). | ## Пропсы данных {#data-props} @@ -225,10 +226,18 @@ const [theme, setTheme] = useState("light"); ### Режим только для чтения {#read-only-mode} +В режиме только для чтения пользователи могут перемещаться по ячейкам с клавиатуры, выделять их мышью, копировать и выполнять поиск. Редактирование отклоняется, о чём сообщается программам экранного доступа. Поскольку `readonly` относится к пропсам только для инициализации, его изменение пересоздаёт виджет. Данные сохраняются, а история отмены/повтора и состояние интерфейса (выделение, позиция прокрутки) сбрасываются. + ~~~tsx ~~~ +Чтобы отключить также навигацию с клавиатуры и выделение, добавьте `selection={false}`. Пропс `selection` применяется во время выполнения, поэтому его можно переключать без пересоздания виджета: + +~~~tsx + +~~~ + ### Загрузка данных по URL {#loading-data-from-url} ~~~tsx diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/react/themes.md b/i18n/ru/docusaurus-plugin-content-docs/current/react/themes.md index 1e840152..d87b0192 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/react/themes.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/react/themes.md @@ -77,6 +77,9 @@ DHTMLX Spreadsheet использует многоуровневую систе /* цвета диапазонов таблицы */ --dhx-spreadsheet-range-background-1: #bee3f8; --dhx-spreadsheet-range-color-1: #2b6cb0; + + /* keyboard focus outline of the formula bar and the toolbar controls */ + --dhx-spreadsheet-focus-color: #2b6cb0; } ~~~ diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/react/types.md b/i18n/ru/docusaurus-plugin-content-docs/current/react/types.md index 6dcd711b..3f35cd45 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/react/types.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/react/types.md @@ -188,6 +188,13 @@ ref.current?.instance?.selection.setSelectedCell("A1:C5"); // Отмена/возврат ref.current?.instance?.undo(); ref.current?.instance?.redo(); + +// Turn the selection off and on +ref.current?.instance?.selection.disable(); +ref.current?.instance?.selection.enable(); + +// Send a status message to screen readers +ref.current?.instance?.announce("The report is saved"); ~~~ ## Перечисление Actions {#actions-enum} @@ -270,6 +277,7 @@ type SpreadsheetConfigProps = Omit< | `IStylesList` | Карта определений стилей. | | `IDataWithStyles` | Структура данных со встроенными стилями (используется `serialize()`/`parse()`). | | `ICellInfo` | Информация о ячейке, возвращаемая методами виджета. | +| `ISelection` | Интерфейс модуля выделения (`instance.selection`), включая методы [`enable()`](api/selection_enable_method.md), [`disable()`](api/selection_disable_method.md) и [`isDisabled()`](api/selection_isdisabled_method.md). | | `FileFormat` | Формат файла для загрузки данных (например, `"json"` или `"xlsx"`). | | `ToolbarBlocks` | Идентификаторы блоков панели инструментов (например, `"default"`, `"undo"` или `"font"`). | | `FilterConditions` | Перечисление доступных типов условий фильтрации. | diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/themes/themes.md b/i18n/ru/docusaurus-plugin-content-docs/current/themes/themes.md index f18841b9..6c44c029 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/themes/themes.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/themes/themes.md @@ -1,7 +1,7 @@ --- sidebar_label: Встроенные темы title: Встроенные темы -description: Вы можете узнать о встроенных темах библиотеки DHTMLX JavaScript Spreadsheet в документации. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: "Встроенные темы DHTMLX Spreadsheet: светлая и тёмная, а также их высококонтрастные варианты. Узнайте о CSS-переменных, специфичных для Spreadsheet, и о том, как установить тему." --- # Встроенные темы {#built-in-themes} @@ -13,7 +13,7 @@ description: Вы можете узнать о встроенных темах - [светлая высококонтрастная тема](#light-high-contrast-theme) ("contrast-light") - [тёмная высококонтрастная тема](#dark-high-contrast-theme) ("contrast-dark") -Темы Spreadsheet разработаны в соответствии с международными стандартами. Высококонтрастные темы помогают пользователям с нарушениями зрения. Подробнее читайте в статье [Поддержка доступности](https://docs.dhtmlx.com/suite/common_features/accessibility_support/). +Темы Spreadsheet разработаны в соответствии с международными стандартами. Высококонтрастные темы помогают пользователям с нарушениями зрения. О контрастности тем и индикаторе фокуса клавиатуры в Spreadsheet см. раздел [Высокий контраст и фокус](accessibility.md#high-contrast-and-focus) руководства по доступности. О доступности виджетов DHTMLX Suite читайте в статье [Поддержка доступности](https://docs.dhtmlx.com/suite/common_features/accessibility_support/). Все темы можно попробовать в примере ниже: @@ -377,14 +377,15 @@ description: Вы можете узнать о встроенных темах --dhx-spreadsheet-range-background-8: #ecb6ff; --dhx-spreadsheet-range-color-1: #00815a; - --dhx-spreadsheet-range-color-2: #bfc000; - --dhx-spreadsheet-range-color-3: #c55933; - --dhx-spreadsheet-range-color-4: #0cc1d6; - --dhx-spreadsheet-range-color-5: #0080a3; - --dhx-spreadsheet-range-color-6: #529a0a; + --dhx-spreadsheet-range-color-2: #8b7300; + --dhx-spreadsheet-range-color-3: #a34729; + --dhx-spreadsheet-range-color-4: #007a8c; + --dhx-spreadsheet-range-color-5: #135db1; + --dhx-spreadsheet-range-color-6: #2f6500; --dhx-spreadsheet-range-color-7: #6d767b; - --dhx-spreadsheet-range-color-8: #ba38e7; + --dhx-spreadsheet-range-color-8: #b82fe5; + --dhx-spreadsheet-focus-color: var(--dhx-color-primary); } ~~~ @@ -411,6 +412,17 @@ description: Вы можете узнать о встроенных темах --dhx-spreadsheet-range-color-7: #e4e4e4; --dhx-spreadsheet-range-color-8: #ecb6ff; + --dhx-spreadsheet-focus-color: hsl(var(--dhx-h-primary), var(--dhx-s-primary), calc(var(--dhx-l-primary) + 12% - var(--dhx-l-contrast-offset))); +} +~~~ + +Переменные `--dhx-spreadsheet-range-color-*` и `--dhx-spreadsheet-range-background-*` задают цвета, которыми отмечаются ссылки на ячейки в формуле во время её редактирования. В светлых темах цвета `--dhx-spreadsheet-range-color-*` имеют контрастность не менее 4.5:1 относительно фона строки формул. + +Переменная `--dhx-spreadsheet-focus-color` задаёт цвет контура фокуса клавиатуры строки формул и элементов панели инструментов, строки меню, вкладок листов, всплывающего окна Border, всплывающего окна ссылки и строки поиска. В тёмных темах этот цвет светлее основного, чтобы контур сохранял контрастность не менее 3:1. Переменную можно переопределить в [пользовательской теме](themes/custom_theme.md): + +~~~css +[data-dhx-theme='custom-theme-dark'] { + --dhx-spreadsheet-focus-color: #7fc8ff; } ~~~ diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/vuejs_integration.md b/i18n/ru/docusaurus-plugin-content-docs/current/vuejs_integration.md index df41a633..4639cfe5 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/vuejs_integration.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/vuejs_integration.md @@ -1,7 +1,7 @@ --- sidebar_label: Интеграция с Vue title: Интеграция с Vue -description: В документации вы можете узнать об интеграции библиотеки DHTMLX JavaScript Spreadsheet с Vue. Изучите руководства для разработчиков и справочник API, попробуйте примеры кода и живые демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Используйте DHTMLX Spreadsheet в приложении Vue. Создайте проект, добавьте Spreadsheet как компонент Vue, загрузите данные и обработайте события. --- # Интеграция с Vue {#integration-with-vue} @@ -260,6 +260,10 @@ export default { //... ~~~ +:::info +Метод `destructor()` удаляет обработчики событий, добавленные через `spreadsheet.events.on()`. При создании нового экземпляра Spreadsheet, например при повторном создании компонента, подключите обработчики к новому экземпляру. +::: + После этого можно запустить приложение и увидеть Spreadsheet с данными на странице. ![DHTMLX Spreadsheet, инициализированный с примером данных в приложении Vue 3](/img/integrations/trial_spreadsheet.png) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md index b3fba1a0..9f7ee84e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md @@ -8,6 +8,58 @@ description: В документации вы можете узнать, что Если вы обновляете Spreadsheet с более ранней версии, ознакомьтесь с [Миграцией на новую версию](migration.md). +## Версия 6.0.4 {#version-604} + +Выпущена в октябре , 2026 года + +### Новый функционал {#new-functionality-604} + +- Поддержка доступности, ориентированная на WCAG 2.2 AA, Section 508 и EN 301 549: управление всеми частями Spreadsheet с клавиатуры, поддержка программ чтения с экрана и видимый фокус во всех темах. См. руководство [Доступность](accessibility.md) и [Отчёт о соответствии требованиям доступности](accessibility_conformance_report.md) +- Возможность отключать и включать выделение ячеек: + - новое свойство конфигурации: [`selection`](api/spreadsheet_selection_config.md) + - новые методы модуля selection: [`enable()`](api/selection_enable_method.md), [`disable()`](api/selection_disable_method.md), [`isDisabled()`](api/selection_isdisabled_method.md) +- Метод [`announce()`](api/spreadsheet_announce_method.md) отправляет статусное сообщение программам чтения с экрана +- Новые команды [контекстного меню](customization.md#context-menu): [*Ширина столбца*, *Высота строки*](work_with_rows_cols.md#setting-column-width-and-row-height) и [*Открыть фильтр*](filtering_data.md#opening-a-filter-with-the-keyboard) + +### Обновления {#updates-604} + +- Навигация с клавиатуры (см. [Список горячих клавиш](hotkeys.md)): + - фокус остаётся на активной ячейке, `Tab` и `Shift + Tab` выводят фокус из последней и первой ячейки листа, а `Ctrl + F6` перемещает фокус между меню, панелью инструментов, листом и вкладками листов + - панель инструментов, строка меню и вкладки листов являются единой точкой табуляции, а навигация по ним выполняется стрелками + - добавлены новые сочетания клавиш, например, `Shift + F10` для контекстного меню и `Ctrl (Cmd) + Shift + 9` / `Ctrl (Cmd) + Shift + 0` для отображения скрытых строк и столбцов + - всплывающие окна выбора цвета и границ на панели инструментов получают фокус при открытии и закрываются по `Esc` и `Tab` +- Стрелки останавливаются на первой и последней видимой строке и столбце, а не переходят к противоположному краю, а нажатие стрелки на краю сокращает выделенный диапазон до активной ячейки +- Текст, введённый через редактор метода ввода (IME), отображается в активной ячейке и запускает редактирование через метод [`startEdit()`](api/spreadsheet_startedit_method.md), поэтому для него срабатывают события `beforeEditStart` и `afterEditStart` +- Метод [`setFocusedCell()`](api/selection_setfocusedcell_method.md) перемещает фокус клавиатуры на ячейку +- [Ссылка в ячейке](work_with_cells.md#inserting-a-hyperlink-into-a-cell) отображается как настоящая ссылка, которая открывается в новой вкладке, а `Alt (Option) + Enter` открывает ссылку активной ячейки +- [Режим только для чтения](api/spreadsheet_readonly_config.md) сохраняет навигацию с клавиатуры, выделение, копирование и поиск, а программы чтения с экрана озвучивают отклонённые изменения. Чтобы отключить выделение, используйте опцию `selection: false` +- [Удаление строки или столбца через объединённую ячейку](merge_cells.md#removing-rows-and-columns-of-merged-cells) удаляет все строки или столбцы объединённой ячейки +- Новые строки интерфейса и программ чтения с экрана в [локали `spreadsheet`](localization.md#default-locale), а также [перевод встроенных виджетов](localization.md#localizing-built-in-widgets) +- Переменная [`--dhx-spreadsheet-focus-color`](/themes/#spreadsheet-specific-styles) для фокуса клавиатуры и цвета ссылок на ячейки в формулах с более высокой контрастностью в светлых темах +- React Spreadsheet: свойство [`selection`](react/props.md#runtime-props), тип [`ISelection`](react/types.md#re-exported-upstream-types) и [`readonly`](react/props.md#init-only-props) как свойство, задаваемое только при инициализации + +### Исправления {#fixes-604} + +- Объединённая ячейка удалялась вместо смещения, когда удалялась строка или столбец перед ней. Теперь объединённая ячейка, в которой осталась одна ячейка, становится обычной ячейкой и сохраняет своё значение +- Удаление строки или столбца через объединённую ячейку удаляло только одну линию объединения +- Подписи контекстного меню для удаления строк и столбцов не показывали все строки или столбцы объединённой ячейки, которые будут удалены +- Строки не удалялись, если они охватывали весь отфильтрованный диапазон +- Закреплённая область не уменьшалась при удалении закреплённых строк или столбцов +- Автозаполнение выбрасывало ошибку, если в перетаскиваемых ячейках не было простого числа +- Страница зависала при нажатии `Home`, `End`, `Ctrl (Cmd) + Home`, `Ctrl (Cmd) + End` и `Ctrl (Cmd) + Стрелка`, когда первая или последняя строка или столбец были скрыты +- Размер шрифта терялся при копировании ячеек в Excel, вставке из Excel или внутри Spreadsheet +- Всплывающая подсказка о недопустимом значении появлялась вдали от недопустимой ячейки или не показывалась +- `Esc` и `Tab` не работали в редакторе списка после использования стрелок +- Поиск сначала подсвечивал второе совпадение и не обновлял результаты после редактирования или переключения листа +- Ошибка скрипта при импорте или экспорте в браузере без WebAssembly +- Слушатели документа и внутренние виджеты оставались после вызова `destructor()` +- Фокус клавиатуры терялся после закрытия строки поиска +- Закрытое контекстное меню открывалось снова +- Активная ячейка прокручивалась на одну ячейку короче до края области просмотра при навигации с клавиатуры +- React Spreadsheet: обратные вызовы событий и `onStateChange` не срабатывали после пересоздания Spreadsheet из-за изменения свойства, задаваемого только при инициализации +- React Spreadsheet: обработчики событий обёртки не удалялись при размонтировании +- React Spreadsheet: данные из `loadUrl` загружались дважды при монтировании и повторно поверх сохранённых данных после пересоздания Spreadsheet + ## Версия 6.0.3 {#version-603} Выпущена 24 августа 2026 года diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/work_with_cells.md b/i18n/ru/docusaurus-plugin-content-docs/current/work_with_cells.md index 9699a8b7..89ff1473 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/work_with_cells.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/work_with_cells.md @@ -1,7 +1,7 @@ --- sidebar_label: Редактирование ячеек title: Редактирование ячеек -description: В документации вы можете узнать о работе с ячейками в библиотеке DHTMLX JavaScript Spreadsheet. Изучите руководства для разработчиков и справочник API, попробуйте примеры кода и живые демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Редактирование ячеек в DHTMLX Spreadsheet. Ввод содержимого, вставка гиперссылок, использование выпадающих списков, заполнение нескольких ячеек, копирование ячеек в Excel и из Excel, блокировка ячеек. --- # Редактирование ячеек {#editing-cells} @@ -138,21 +138,34 @@ description: В документации вы можете узнать о ра - копирование значения -​Например, чтобы создать ряд 4,4,4,4..., введите 4 только в первой ячейке. +Например, чтобы создать ряд 4,4,4,4..., введите 4 только в первой ячейке. - следование шаблону - чтобы создать ряд 1, 2, 3, 4, 5, ..., введите 1 и 2 в первые две ячейки. - чтобы создать ряд 1, 3, 5, 7, 9, ..., введите 1 и 3 в первые две ячейки. - чтобы создать ряд 2, 4, 6, 8, 10, ..., введите 2 и 4 в первые две ячейки. - помимо чисел, в шаблоне можно использовать буквы, например, чтобы создать ряд 1, a, 2, b, 3, a, 4, b, ..., введите 1, a, 2, b в первые четыре ячейки. + - чтобы продолжить число в конце текста, введите первые значения, например, чтобы создать ряд item1, item2, item3, ..., введите item1 и item2 в первые две ячейки. + - чтобы создать ряд дат, введите дату в первую ячейку: каждая следующая ячейка получит следующий день. +- повторение текста + +Например, чтобы создать ряд North, South, North, South, ..., введите North и South в первые две ячейки. Числа в ячейках с форматом *Text* повторяются так же. 3\. Перетащите **маркер заполнения** ![Автозаполнение в DHTMLX Spreadsheet, перетаскивание маркера заполнения для копирования данных ячейки](/img/autofill.gif) +## Копирование ячеек в Excel и из Excel {#copying-cells-to-and-from-excel} + +Вы можете копировать ячейки с помощью **Ctrl (Cmd) + C** и вставлять их с помощью **Ctrl (Cmd) + V** внутри Spreadsheet, а также между Spreadsheet и Microsoft Excel: + +- внутри Spreadsheet ячейки сохраняют значения, формулы, стили, числовые форматы и ссылки. Ссылки на ячейки в формулах смещаются на новую позицию +- в Excel вставленные ячейки получают значения (результаты формул, а не сами формулы), стили (включая размер шрифта), объединённые ячейки и ссылки. Строки, скрытые фильтром, пропускаются +- ячейки, скопированные из Excel, при вставке в Spreadsheet сохраняют значения, стили (включая размер шрифта), числовые форматы, объединённые ячейки и ссылки + ## Блокировка ячеек {#locking-cells} -Вы можете блокировать ячейки, чтобы защитить их значения от изменений. При блокировке ячейки в её правом верхнем углу появляется серый значок «замка». Заблокированные ячейки не реагируют на попытки их редактирования. +Вы можете блокировать ячейки, чтобы защитить их значения от изменений. При блокировке ячейки в её правом верхнем углу появляется серый значок «замка». Заблокированные ячейки не реагируют на попытки их редактирования. Программы чтения с экрана озвучивают отклонённое редактирование: «The cell is locked» для одной ячейки или «Locked cells were not changed», если в выделенном диапазоне есть заблокированные ячейки. ![Заблокированные ячейки в DHTMLX Spreadsheet, помеченные серым значком замка в правом верхнем углу](/img/lockedcells.png) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/work_with_rows_cols.md b/i18n/ru/docusaurus-plugin-content-docs/current/work_with_rows_cols.md index f5b28291..e3312e96 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/work_with_rows_cols.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/work_with_rows_cols.md @@ -1,7 +1,7 @@ --- sidebar_label: Работа со строками и столбцами title: Работа со строками и столбцами -description: В документации вы можете узнать о работе со строками и столбцами в библиотеке DHTMLX JavaScript Spreadsheet. Изучите руководства для разработчиков и справочник API, попробуйте примеры кода и живые демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Работа со строками и столбцами в DHTMLX Spreadsheet. Добавление и удаление, автоподбор и установка ширины столбцов и высоты строк, закрепление, скрытие и отображение. --- # Работа со строками и столбцами {#work-with-rows-and-columns} @@ -54,6 +54,10 @@ DHTMLX Spreadsheet позволяет добавлять и удалять ст Чтобы удалить несколько строк одновременно: выделите строки, нажмите правой кнопкой мыши для вызова контекстного меню и выберите *Строки -> Удалить строки [ids]*. ::: +:::info +Если выбранная ячейка находится внутри объединённой ячейки, удаляются все строки этой объединённой ячейки. Подробности см. в статье [Объединение ячеек](merge_cells.md#removing-rows-and-columns-of-merged-cells). +::: + ### Добавление столбцов {#adding-columns} Чтобы добавить новый столбец, выполните следующие шаги: @@ -98,6 +102,10 @@ DHTMLX Spreadsheet позволяет добавлять и удалять ст Чтобы удалить несколько столбцов одновременно: выделите столбцы, нажмите правой кнопкой мыши для вызова контекстного меню и выберите *Столбцы -> Удалить столбцы [ids]*. ::: +:::info +Если выбранная ячейка находится внутри объединённой ячейки, удаляются все столбцы этой объединённой ячейки. Подробности см. в статье [Объединение ячеек](merge_cells.md#removing-rows-and-columns-of-merged-cells). +::: + ## Автоподбор ширины столбца {#autofit-column-width} Чтобы изменить ширину столбца так, чтобы она автоматически соответствовала самому длинному содержимому в столбце, вы можете: @@ -116,6 +124,50 @@ DHTMLX Spreadsheet позволяет добавлять и удалять ст ![Подменю «Столбцы» DHTMLX Spreadsheet с опцией «Подогнать под данные» для автоподбора ширины](/img/column_autofit.png) +## Установка ширины столбцов и высоты строк {#setting-column-width-and-row-height} + +### Установка ширины столбцов {#setting-column-width} + +Чтобы задать точную ширину столбцов, выполните следующие шаги: + +1\. Выделите столбец или ячейку в столбце. Чтобы изменить несколько столбцов, выделите диапазон ячеек, охватывающий их. + +2\. Нажмите правой кнопкой мыши на выделение либо нажмите `Shift + F10` или клавишу Menu и выберите *Столбцы -> Ширина столбца*. Та же команда доступна в меню значка с 3 точками столбца. + +![Контекстное меню DHTMLX Spreadsheet с подменю «Столбцы» и пунктом «Ширина столбца»](/img/column_width_context_menu.png) + +3\. В диалоге *Ширина столбца* введите ширину в пикселях и нажмите **Применить** или клавишу `Enter`. + +![Диалог «Ширина столбца» DHTMLX Spreadsheet с шириной в пикселях и кнопками «Отмена» и «Применить»](/img/column_width_dialog.png) + +### Установка высоты строк {#setting-row-height} + +Чтобы задать точную высоту строк, выполните следующие шаги: + +1\. Выделите строку или ячейку в строке. Чтобы изменить несколько строк, выделите диапазон ячеек, охватывающий их. + +2\. Нажмите правой кнопкой мыши на выделение либо нажмите `Shift + F10` или клавишу Menu и выберите *Строки -> Высота строки*. + +![Контекстное меню DHTMLX Spreadsheet с подменю «Строки» и пунктом «Высота строки»](/img/row_height_context_menu.png) + +3\. В диалоге *Высота строки* введите высоту в пикселях и нажмите **Применить** или клавишу `Enter`. + +![Диалог «Высота строки» DHTMLX Spreadsheet с высотой в пикселях и кнопками «Отмена» и «Применить»](/img/row_height_dialog.png) + +### Как применяется новый размер {#how-the-new-size-is-applied} + +Диалог показывает текущий размер первого столбца или строки выделенного диапазона и применяет новый размер ко всем столбцам или строкам этого диапазона. Если выделено несколько диапазонов, используется последний выделенный диапазон. + +Размер округляется до целых пикселей. Минимальная ширина столбца составляет 20 px, а минимальная высота строки - 10 px: меньшее положительное значение заменяется минимальным. Пока поле пусто или значение не является положительным числом, кнопка **Применить** неактивна. + +Кнопка **Отмена** или клавиша `Esc` закрывает диалог без изменений. Программы чтения с экрана озвучивают новый размер, например, «Column width set to 120 pixels». + +### Отмена изменения {#undoing-the-change} + +Новый размер можно отменить с помощью `Ctrl (Cmd) + Z`. + +Чтобы обработать изменение в коде, используйте [действия](api/overview/actions_overview.md#list-of-actions) `resizeCol` и `resizeRow`. + ## Закрепление/открепление строк и столбцов {#freezingunfreezing-rows-and-columns} ### Закрепление строк {#freezing-rows} @@ -212,6 +264,10 @@ DHTMLX Spreadsheet позволяет добавлять и удалять ст ![Контекстное меню DHTMLX Spreadsheet с подменю «Строки» и пунктом «Скрыть строки»](/img/hide_row_context_menu.png) +:::info +Если активная ячейка находится в строке, которая становится скрытой, активная ячейка перемещается в первую видимую строку ниже, а выделение сокращается до этой ячейки. Если ниже нет видимых строк, она перемещается в последнюю видимую строку выше. +::: + ### Отображение строк {#showing-rows} Чтобы показать скрытые строки, выполните одно из следующих действий: @@ -223,6 +279,7 @@ DHTMLX Spreadsheet позволяет добавлять и удалять ст ![Заголовок строк DHTMLX Spreadsheet со значком стрелки, указывающим на скрытые строки](/img/show_rows.png) - или выделите строки или несколько ячеек так, чтобы скрытые строки попали в выделение, нажмите правой кнопкой мыши для вызова контекстного меню и выберите *Строки -> Показать строки* +- или выделите строки или несколько ячеек так, чтобы скрытые строки попали в выделение, и нажмите `Ctrl (Cmd) + Shift + 9`. Например, выделите строки 2-4, чтобы показать скрытую строку 3. Если в выделении нет скрытых строк, программы чтения с экрана озвучивают «No hidden rows in the selection» (*На изображении ниже строка 8 скрыта*) @@ -244,6 +301,10 @@ DHTMLX Spreadsheet позволяет добавлять и удалять ст ![Контекстное меню DHTMLX Spreadsheet с подменю «Столбцы» и пунктом «Скрыть столбцы»](/img/hide_columns_context_menu.png) +:::info +Если активная ячейка находится в столбце, который становится скрытым, активная ячейка перемещается в первый видимый столбец правее, а выделение сокращается до этой ячейки. Если правее нет видимых столбцов, она перемещается в последний видимый столбец левее. +::: + ### Отображение столбцов {#showing-columns} Чтобы показать скрытые столбцы, выполните одно из следующих действий: @@ -259,3 +320,4 @@ DHTMLX Spreadsheet позволяет добавлять и удалять ст (*На изображении ниже столбец C скрыт*) ![Контекстное меню DHTMLX Spreadsheet с подменю «Столбцы» и пунктом «Показать столбцы»](/img/show_columns_context_menu.png) +- или выделите столбцы или несколько ячеек так, чтобы скрытые столбцы попали в выделение, и нажмите `Ctrl (Cmd) + Shift + 0`. Если в выделении нет скрытых столбцов, программы чтения с экрана озвучивают «No hidden columns in the selection» diff --git a/i18n/zh/docusaurus-plugin-content-docs/current.json b/i18n/zh/docusaurus-plugin-content-docs/current.json index 9635a464..eefd588e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current.json +++ b/i18n/zh/docusaurus-plugin-content-docs/current.json @@ -83,6 +83,10 @@ "message": "使用单元格", "description": "The generated-index page title for category 'Work with cells' in sidebar 'docs'" }, + "sidebar.docs.category.Accessibility": { + "message": "无障碍", + "description": "The label for category 'Accessibility' in sidebar 'docs'" + }, "sidebar.docs.category.Frameworks & integrations": { "message": "框架与集成", "description": "The label for category 'Frameworks & integrations' in sidebar 'docs'" diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/.sync b/i18n/zh/docusaurus-plugin-content-docs/current/.sync index 96f6c508..8fee4307 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/.sync +++ b/i18n/zh/docusaurus-plugin-content-docs/current/.sync @@ -1 +1 @@ -2b6d3c2fd433461ffce34526974de3f1ba5161a8 +1853f2853225a3d5774a2d166077a4404f555063 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/accessibility.md b/i18n/zh/docusaurus-plugin-content-docs/current/accessibility.md new file mode 100644 index 00000000..cfba9b56 --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-docs/current/accessibility.md @@ -0,0 +1,449 @@ +--- +sidebar_label: 无障碍 +title: 无障碍 +description: 让键盘用户和屏幕阅读器用户都能使用 DHTMLX Spreadsheet。了解以 WCAG 2.2 AA 为目标的 WAI-ARIA 支持、键盘导航、屏幕阅读器播报和高对比度主题。 +--- + +# DHTMLX Spreadsheet 的无障碍支持 + +本指南面向在需要满足无障碍要求的应用中嵌入 DHTMLX Spreadsheet 的开发者。您可以据此对照自己的检查清单评估该组件,并为键盘、屏幕阅读器和高对比度用户进行配置。 + +Spreadsheet 会在其标记中渲染 WAI-ARIA 角色和状态。键盘焦点始终停留在活动单元格上,工具栏、菜单栏和工作表标签各自只占一个 Tab 停靠点。对于没有独立元素的变化,例如被拒绝的编辑或搜索结果,会发送到实时区域,由屏幕阅读器朗读。 + +:::info 目标合规标准 +DHTMLX Spreadsheet 旨在满足 **WCAG 2.2 AA 级**、美国《康复法》**第 508 条**以及 **EN 301 549**(欧洲无障碍法案的技术基准)。 + +合规情况按准则逐条针对 DHTMLX Spreadsheet 6.0.4 进行说明。详细的**无障碍合规报告(VPAT® 2.5)**见:[无障碍合规报告](accessibility_conformance_report.md)。 +::: + +## 功能 {#capabilities} + +| 领域 | 支持情况 | +| ---- | ------- | +| 键盘操作 | 单元格上的每个命令都有对应按键。工具栏、菜单栏和工作表标签是单一的 Tab 停靠点,使用方向键在其中导航。列宽、行高和列筛选都有上下文菜单命令,因此无需拖动或点击图标 | +| WAI-ARIA 语义 | 单元格是包含 `columnheader`、`rowheader` 和 `gridcell` 元素的 `grid`。这些角色始终会被渲染 | +| 焦点模型 | 键盘焦点位于活动单元格上。Tab 进入工作表时停在活动单元格上,并从最后一个或第一个单元格离开。Ctrl + F6 在菜单、工具栏、工作表和工作表标签之间移动焦点 | +| 选择模型 | 活动单元格、单个范围和多个范围通过 `aria-selected` 暴露,并会播报范围的大小。可以使用 [`selection`](api/spreadsheet_selection_config.md) 选项关闭选择功能 | +| 只读模式 | 可以浏览、选择、复制和搜索工作表;编辑会被拒绝并播报,且上下文菜单不可用 | +| 屏幕阅读器 | 已使用 NVDA、JAWS 和 VoiceOver 测试 | +| 视觉无障碍 | 提供 `contrast-light` 和 `contrast-dark` 主题,在每个主题中都有可见的焦点指示器,并且提示不依赖颜色 | +| 文本缩放和页面缩放 | 在 200% 和 400% 缩放以及覆盖文本间距的情况下,布局仍可正常操作 | +| 自定义 | 提供用于发送自定义消息的公共 [`announce()`](api/spreadsheet_announce_method.md) 方法,以及适用于每个内置名称和播报内容的可翻译 `aria_*` 语言环境字符串 | +| 标准 | WCAG 2.2 AA、Section 508、EN 301 549 | + +## 涵盖范围 {#covered-areas} + +本指南涵盖 Spreadsheet 组件: + +- 单元格、列头和行头、合并单元格以及冻结的行和列 +- 选择:活动单元格、范围和多个范围 +- 公式栏和单元格编辑器,包括带值列表的单元格的编辑器 +- 带有颜色和边框弹出框的工具栏、菜单栏和上下文菜单 +- 工作表标签 +- 排序、筛选、搜索、数据验证、单元格中的链接、导入和导出 +- 主题和焦点指示器 + +最终页面的无障碍程度还取决于宿主应用。请参阅[宿主页面的职责](#host-page-responsibilities)。 + +## WAI-ARIA 支持 {#wai-aria-support} + +Spreadsheet 会自动为其标记添加 WAI-ARIA 角色和属性,且无法关闭。组件的每个部分都有各自的角色和名称,名称来自[语言环境](#localization)。 + +### Spreadsheet 容器 {#spreadsheet-container} + +Spreadsheet 的各个部分都是独立的具名控件: + +| 部分 | 角色 / 属性 | 无障碍名称 | +| ---- | ---------------- | --------------- | +| 菜单栏 | `role="menubar"` + `aria-label` | "Main" | +| 工具栏 | `role="toolbar"` + `aria-label` | "Formatting" | +| 公式栏 | 输入框上的 `aria-label` | "Formula bar, B7",其中包含活动单元格的地址 | +| 单元格 | `role="grid"` + `aria-label` | "Spreadsheet" | +| 工作表标签 | `role="toolbar"` + `aria-label` | "Sheets" | +| 实时区域 | `role="status"`、`aria-live="polite"`、`aria-atomic="true"` | 视觉上隐藏,位于网格旁边,在 `role="grid"` 之外 | + +Spreadsheet 的根元素没有地标角色,因此您可以将其放在适合您页面的地标内。 + +### 单元格表面 {#cell-surface} + +以下属性描述单元格的整体情况,由 `.dhx_grid-content` 元素承载: + +| 选择器 | 角色 / 属性 | 用途 | +| -------- | ---------------- | ------- | +| `.dhx_grid-content` | `role="grid"` | 可交互的单元格网格 | +| `.dhx_grid-content` | `aria-label` | "Spreadsheet",来自 `aria_grid` 语言环境键 | +| `.dhx_grid-content` | `aria-rowcount` | 工作表的行数加上标题行 | +| `.dhx_grid-content` | `aria-colcount` | 可见列数加上行号列 | +| `.dhx_grid-content` | `aria-readonly` | 在[只读模式](api/spreadsheet_readonly_config.md)下以及[选择](api/spreadsheet_selection_config.md)功能关闭时为 `"true"` | +| `.dhx_grid-content` | `aria-multiselectable` | `"true"`;选择功能关闭时为 `"false"` | + +### 行和单元格 {#rows-and-cells} + +下表列出了行和单元格的角色,以及位置和状态属性: + +| 选择器 | 角色 / 属性 | 用途 | +| -------- | ---------------- | ------- | +| 行 | `role="row"` + `aria-rowindex` | 工作表的一行。由于列头是第一行,工作表的第 1 行具有 `aria-rowindex="2"` | +| 单元格 | `role="gridcell"` + `aria-colindex` | 一个单元格。由于行号是第一列,A 列具有 `aria-colindex="2"` | +| 行号 | `role="rowheader"` | 行的标题 | +| 单元格 | `aria-selected` | 在活动单元格和所选范围的每个单元格上为 `"true"` | +| 单元格 | `aria-readonly` | 在只读模式下、[选择](api/spreadsheet_selection_config.md)功能关闭时以及[锁定的单元格](work_with_cells.md#locking-cells)上为 `"true"` | +| 单元格 | `tabindex` | 活动单元格上为 `"0"`,其他单元格上为 `"-1"`,因此这些单元格只占一个 Tab 停靠点 | +| 活动单元格 | DOM 焦点 | 键盘焦点位于活动单元格本身,而不是单独的输入框上。编辑单元格时,焦点位于单元格编辑器上 | +| 合并单元格 | `aria-colspan` / `aria-rowspan` | 合并单元格跨越的列数或行数。被其覆盖的单元格使用 `aria-hidden="true"` 隐藏 | +| 单元格中的链接 | 带有 `target="_blank"` 和 `rel="noopener noreferrer"` 的 `
` | 使用 `http`、`https`、`mailto`、`ftp` 或 `tel` 协议的链接 | + +单元格还包含视觉上隐藏的文本,屏幕阅读器会将其与值一起朗读: + +| 隐藏文本 | 出现时机 | +| ----------- | ---- | +| 单元格地址,例如 "B7" | 在活动单元格和所选范围的每个单元格上。屏幕阅读器会在值之前朗读地址 | +| "link" | 在带链接的已选单元格上。Alt + Enter 打开链接 | +| "locked" | 在已锁定的已选单元格上 | +| 公式错误的描述,例如 "Reference error. Check the cell references" | 在带公式错误的单元格上 | +| "Invalid value. Choose a value from the list" | 在其值不在[值列表](work_with_cells.md#using-drop-down-lists-in-cells)中的单元格上 | +| "Filter" / "Filter applied" | 在带筛选图标的单元格上 | + +### 列头和行头 {#column-and-row-headers} + +| 选择器 | 角色 / 属性 | 用途 | +| -------- | ---------------- | ------- | +| 列字母 | `role="columnheader"` + `aria-colindex` | 列的标题 | +| 全选角落 | `role="columnheader"` | 名称为 "Select all" | +| 行号 | `role="rowheader"` | 行的标题 | +| 列菜单图标、隐藏行和隐藏列的图标 | `aria-hidden="true"` | 装饰性元素。相关命令位于上下文菜单中 | + +标题不是 Tab 停靠点。点击列字母、行号或角落会选中相应的行或列,并将焦点返回到活动单元格。 + +### 公式栏和编辑器 {#formula-bar-and-editors} + +| 选择器 | 角色 / 属性 | 用途 | +| -------- | ---------------- | ------- | +| 公式栏输入框 | `aria-label` | "Formula bar, B7",其中包含活动单元格的地址。在已锁定的单元格上,输入框为 `readonly`,因此仍可读取其值。选择功能关闭时,公式栏为空且被锁定 | +| 单元格编辑器输入框 | `aria-label` | "Cell editor, B7" | +| 带值列表的单元格的编辑器 | `role="combobox"`、`aria-controls`、`aria-expanded`、`aria-activedescendant` | 值列表是由 `option` 元素组成的 `listbox`,高亮的选项带有 `aria-selected` | +| 值无效的编辑器 | `aria-invalid="true"` | 单元格已保存的值不在其值列表中。该属性在值保存后更新,而不是在用户输入时更新 | +| 公式帮助的关闭图标 | `role="button"` + `aria-label` | "Close formula help" | + +### 工具栏和菜单 {#toolbar-and-menus} + +| 选择器 | 角色 / 属性 | 用途 | +| -------- | ---------------- | ------- | +| 工具栏 | `role="toolbar"` + `aria-label` | "Formatting";边框弹出框、搜索栏和链接弹出框的工具栏分别命名为 "Borders"、"Search" 和 "Link" | +| 工具栏按钮 | `aria-label` | 按钮的值。图标按钮以其工具提示命名,例如 "Bold (ctrl+b)"。图标使用 `aria-hidden="true"` 隐藏 | +| 加粗、斜体、下划线、删除线、锁定、筛选 | `aria-pressed` | 格式或筛选是否开启 | +| 打开下拉菜单的按钮 | `aria-haspopup="menu"`、`aria-expanded` | 下拉菜单是以其按钮命名的 `menu` | +| 对齐、文本换行、数字格式 | `role="menuitemradio"` + `aria-checked` | 互斥选项组中的一个选项 | +| 文本颜色、背景颜色、边框颜色 | `aria-label` | 控件名称及当前颜色,例如 "Text color: dark gray" | +| 调色板 | 由 `gridcell` 元素组成的 `role="grid"` | 该网格名称为 "Color palette"。每个颜色单元格以其颜色命名,已选中的颜色带有 `aria-selected="true"` | +| 边框样式列表 | 由 `option` 元素组成的 `role="listbox"` | 选项名称为 "Thin line"、"Medium line"、"Thick line"、"Dashed line"、"Dotted line"、"Double line" | +| 菜单栏 | `role="menubar"` + `aria-label` | "Main"。其菜单项会打开带有 `role="menu"` 的弹出框。在弹出框中,格式菜单项具有 `role="menuitemcheckbox"`,对齐、文本换行和数字格式菜单项具有 `role="menuitemradio"`。两者都通过 `aria-checked` 报告其状态 | +| 上下文菜单 | `role="menu"` + `aria-label` | 单元格的菜单为 "Cell",工作表标签的菜单为 "Sheet" | + +### 工作表标签 {#sheet-tabs} + +| 选择器 | 角色 / 属性 | 用途 | +| -------- | ---------------- | ------- | +| 工作表标签栏 | `role="toolbar"` + `aria-label` | "Sheets" | +| 工作表标签 | `button` + `aria-pressed` | 标签以其工作表命名。活动工作表的标签具有 `aria-pressed="true"` | +| 添加工作表按钮 | `aria-label` | "Add sheet" | + +### 对话框 {#dialogs} + +| 选择器 | 角色 / 属性 | 用途 | +| -------- | ---------------- | ------- | +| 列宽和行高对话框 | `role="dialog"`、`aria-modal="true"`、`aria-label` | 以对话框标题命名。输入框的标签为 "Width in pixels" / "Height in pixels" | +| 搜索栏 | `role="dialog"` + `aria-label` | 名称为 "Search"。搜索输入框的标签为 "Search",按钮名称为 "Previous match"、"Next match" 和 "Close search" | +| 插入链接、数据验证 | `role="dialog"` + `aria-label` | 以对话框标题命名 | +| 警告框 | `role="alertdialog"`、`aria-modal="true"`、`aria-labelledby`、`aria-describedby` | 以警告框标题命名,并由其文本描述 | + +### 隐藏元素和装饰性元素 {#hidden-and-decorative-elements} + +Spreadsheet 使用 `aria-hidden="true"` 对辅助技术隐藏装饰性部分,包括锁定图标、筛选图标和列菜单图标、隐藏行和隐藏列的图标,以及全选图标。绘制选择区域、复制和搜索高亮以及填充柄的图层也会被隐藏。公式栏中公式的彩色副本,以及被合并单元格覆盖的单元格同样如此。布局包装元素具有 `role="presentation"`。网格前后的焦点哨兵元素仅用于将焦点传递给活动单元格。 + +## 选择和编辑模型 {#selection-and-editing-model} + +DOM 焦点位于活动单元格本身,因此屏幕阅读器朗读的是单元格,而不是单独的输入框。活动单元格移动时,屏幕阅读器首先朗读新单元格的地址,然后是其值和隐藏描述。当用户使用键盘或鼠标选择范围时,屏幕阅读器会在选择不再变化后播报该范围的大小。被多个范围共有的单元格只计一次,隐藏行和隐藏列中的单元格也会被计入。编辑单元格时不会有任何播报。当范围缩减为活动单元格时,会播报该单元格的地址。 + +| 情形 | 屏幕阅读器获得的内容 | +| --------- | --------------------------- | +| 活动单元格移动 | 带有地址、值和描述的单元格,例如 "B7, 120, locked" | +| 选择一个范围 | "B2 to D7, 18 cells" | +| 使用 Ctrl 选择多个范围 | "B2 to B4, D2 to D4, 6 cells" | +| 通过 Enter、F2 或输入打开编辑器 | 名称为 "Cell editor, B7" 的编辑器输入框 | +| 打开带值列表的单元格的编辑器 | 已展开的组合框。按下 ↑ 或 ↓ 后,会朗读列表中高亮的选项 | +| 编辑已保存 | 会播报已编辑单元格及依赖它们的单元格中新出现的公式错误,以及已编辑单元格中的无效值 | +| 对锁定单元格的编辑被拒绝 | "The cell is locked" | +| 在只读模式下按下编辑键 | "The sheet is read-only" | + +Enter、F2 或输入会打开编辑器。Enter 保存值并向下移动,Tab 保存值并向右移动,Esc 取消编辑。 + +## 键盘导航 {#keyboard-navigation} + +Spreadsheet 在页面上出现后键盘即可使用,无需任何配置。下表概述了键盘模型。完整的快捷键集合请参阅[快捷键列表](hotkeys.md)。 + +![通过向下箭头键打开的工具栏水平对齐下拉菜单,焦点位于其第一项](/img/accessibility/toolbar_dropdown_focus.png) + +### 单元格 {#cells} + +| 按键 | 操作 | +| ---- | ------ | +| 方向键 | 移动活动单元格。活动单元格会停在第一个和最后一个可见的行和列 | +| Shift + 方向键 | 扩展所选范围 | +| Home / End | 移至该行的第一个或最后一个可见单元格 | +| Ctrl + 方向键、Ctrl + Home / End | 移至工作表的边缘 | +| Tab / Shift + Tab | 在行内向右或向左移动。从工作表的最后一个或第一个单元格出发,将焦点移出单元格,移至页面的下一个或上一个部分,例如工作表标签或公式栏 | +| Enter、F2 | 打开编辑器 | +| Esc | 关闭编辑器且不保存 | +| Ctrl + Space / Shift + Space | 选择列或行 | +| Ctrl + Shift + 9 / 0 | 显示所选范围内的隐藏行或列 | +| Alt + Enter | 打开活动单元格的链接 | +| Shift + F10 或 Menu 键 | 打开上下文菜单,其中包含针对单元格的命令;在 Ctrl + Space 之后则为针对列的命令 | +| Alt + ↑ / ↓、Ctrl + Alt + Page Down / Page Up | 切换到下一个或上一个工作表 | + +### 在各部分之间移动 {#moving-between-the-parts} + +| 按键 | 操作 | +| ---- | ------ | +| Ctrl + F6 / Ctrl + Shift + F6 | 将焦点移至下一个或上一个部分:菜单、工具栏、工作表、工作表标签。公式栏和隐藏的部分会被跳过。进行中的编辑会先被保存 | +| Tab / Shift + Tab | 按页面的 Tab 顺序将焦点移至下一个或上一个部分。每个栏只占一个 Tab 停靠点,焦点会落在最近使用的控件上 | + +### 工具栏、菜单栏和工作表标签 {#toolbar-menu-bar-and-sheet-tabs} + +| 按键 | 操作 | +| ---- | ------ | +| ← / →、Home / End | 在栏的控件之间移动 | +| Enter / Space | 按下控件:执行命令、打开下拉菜单或切换到工作表 | +| ↓ | 打开下拉菜单并将焦点移至其第一项 | +| ↑ / ↓ | 在已打开的下拉菜单或菜单的各项之间移动 | +| → / ← | 打开或关闭子菜单 | +| Esc | 关闭下拉菜单或菜单,并将焦点返回到其控件 | + +### 弹出框和对话框 {#popups-and-dialogs} + +| 按键 | 操作 | +| ---- | ------ | +| 方向键、Home / End | 在调色板的颜色之间移动 | +| Enter | 应用颜色、边框,或列宽和行高对话框中的尺寸 | +| Esc | 关闭弹出框、对话框或搜索栏,并将焦点返回到打开它的控件或单元格。在自定义颜色模式下,返回调色板。在从边框弹出框打开的颜色或样式弹出框中,关闭该弹出框并将焦点返回到边框弹出框中的对应按钮 | +| Tab / Shift + Tab | 在对话框或自定义颜色模式的控件之间移动。在颜色弹出框或边框弹出框中,关闭该弹出框并将焦点返回到其工具栏按钮 | +| ↑ / ↓、Enter | 在单元格的值列表中移动并选择一个值 | + +:::note +仅限指针的操作都有键盘替代方式。上下文菜单中的 *Column width* 和 *Row height* 命令无需拖动即可设置精确的尺寸,*Open filter* 命令无需点击图标即可打开筛选器。 +::: + +## 辅助技术 {#assistive-technology} + +DHTMLX 团队使用以下屏幕阅读器测试 Spreadsheet: + +| 屏幕阅读器 | 浏览器 | 平台 | +| ------------- | ------- | -------- | +| NVDA | Firefox | Windows | +| JAWS | Chrome | Windows | +| VoiceOver | Safari | macOS | + +屏幕阅读器从各状态所属的元素获取该状态: + +| 状态 | 暴露方式 | 朗读位置 | +| ----- | --------------- | ------- | +| 位置 | `aria-rowindex`、`aria-colindex`,以及单元格文本中的单元格地址 | 每个单元格。地址包含在活动单元格和所选范围内单元格的文本中 | +| 选择 | `aria-selected` | 活动单元格和所选范围内的单元格 | +| 可编辑性 | `aria-readonly` | 只读模式下以及选择功能关闭时的网格和单元格,以及锁定的单元格 | +| 合并单元格 | `aria-colspan`、`aria-rowspan` | 合并单元格 | +| 行头 | `role="rowheader"` | 行号 | +| 切换状态 | `aria-pressed` | 加粗、斜体、下划线、删除线、锁定和筛选按钮,以及工作表标签 | +| 选中状态 | `aria-checked` | 菜单栏的格式菜单项,以及对齐、文本换行和数字格式菜单项 | +| 错误和无效值 | 单元格中的隐藏文本、`aria-invalid` | 单元格及其编辑器 | +| 链接 | `` 和隐藏文本 "link" | 带链接的单元格 | + +## 高对比度和焦点 {#high-contrast-and-focus} + +### 主题 {#themes} + +Spreadsheet 有四个内置主题:`light`(默认)、`dark`、`contrast-light` 和 `contrast-dark`。`contrast-light` 和 `contrast-dark` 主题满足 WCAG AA 对文本的对比度要求。可以使用 `dhx.setTheme()` 方法或 `data-dhx-theme` 属性切换主题: + +~~~jsx +dhx.setTheme("contrast-light"); // or "contrast-dark" +~~~ + +详情请参阅[内置主题](/themes/)一文。 + +在浅色主题中,标记公式单元格引用的颜色的对比度至少为 4.5:1。 + +`contrast-light` 主题在白色背景上绘制深色文本和边框。在下面的 Spreadsheet 中,带有筛选图标的单元格的上下文菜单通过键盘打开。获得焦点的命令 [*Open filter*](filtering_data.md#opening-a-filter-with-the-keyboard) 以虚线轮廓标记,活动单元格以主题主色的实线边框标记: + +![contrast-light 主题中的 Spreadsheet](/img/accessibility/spreadsheet_contrast_light.png) + +`contrast-dark` 主题在深色背景上绘制浅色文本和边框。当焦点位于工具栏控件上时,该控件以 `--dhx-spreadsheet-focus-color` 颜色的焦点环标记,在深色主题中,该颜色比活动单元格边框的主色更浅: + +![contrast-dark 主题中的 Spreadsheet](/img/accessibility/spreadsheet_contrast_dark.png) + +### 焦点指示器 {#focus-indicator} + +键盘焦点在每个主题中都可见: + +- 活动单元格具有主题主色的 2px 实线边框 +- 获得键盘焦点的单元格和单元格编辑器具有主题主色的 2px 轮廓 +- 公式栏,以及工具栏、菜单栏、工作表标签、边框弹出框、链接弹出框和搜索栏的控件,具有 `--dhx-spreadsheet-focus-color` 变量颜色的 2px 轮廓 +- 在调色板、边框样式列表、工具栏和菜单栏的下拉菜单以及上下文菜单中,获得焦点的项具有 `--dhx-color-focused` 颜色的 1px 虚线轮廓 +- 在单元格的列表编辑器中,焦点保留在编辑器内,列表的当前项以背景色高亮显示 + +在深色主题中,`--dhx-spreadsheet-focus-color` 变量比主色更浅,并且可以在[自定义主题](themes/custom_theme.md)中重新定义。每个指示器在每个主题中的对比度见[无障碍合规报告](accessibility_conformance_report.md)。 + +### 颜色和缩放 {#color-and-zoom} + +- **颜色不是唯一的提示。** 活动单元格和选区同时具有边框和填充,无效值具有标记和隐藏描述,格式按钮通过 `aria-pressed` 报告其状态。颜色按钮的无障碍名称中包含颜色名称。 +- **缩放和重排。** Spreadsheet 在 200% 和 400% 缩放下仍可操作。单元格可向两个方向滚动,工具栏、菜单栏和工作表标签适配 320 CSS px 的宽度。 +- **文本间距。** 在应用 WCAG 文本间距覆盖时,不会有控件标签被截断,并且当标签增多时,工作表标签栏可以滚动。 +- **滚动到可见区域。** 活动单元格会滚动到可见区域,并位于冻结的行和列旁边。 + +## 状态播报 {#status-announcements} + +Spreadsheet 通过礼貌(polite)实时区域播报没有独立元素的变化,因此屏幕阅读器会先读完当前这句话: + +| 事件 | 播报文本 | 语言环境键 | +| ----- | -------------- | ---------- | +| 选择一个范围 | "B2 to D7, 18 cells" | `aria_selectedRange`、`aria_rangeExtent`、`aria_rangeSeparator` | +| 编辑导致公式错误或无效值 | "B7: Reference error. Check the cell references" | `aria_cellMessage` | +| 编辑导致多个错误 / 无效值 | "3 new errors. B7: ..." / "3 invalid values. B7: ..." | `aria_newErrors`、`aria_invalidValues` | +| 对锁定的单元格 / 范围的编辑被拒绝 | "The cell is locked" / "Locked cells were not changed" | `aria_lockedCell`、`aria_lockedCells` | +| 在只读模式下按下编辑键 | "The sheet is read-only" | `aria_readonlySheet` | +| 输入搜索文本 | "Results: 5. 1 of 5, B2" 或 "No results" | `aria_searchResults`、`aria_searchMatch`、`aria_searchNoResults` | +| 显示下一个或上一个匹配项 | "2 of 5, B7" | `aria_searchMatch` | +| 导出 Excel 文件 | "Exporting the file"、"The file is exported" | `aria_exportStarted`、`aria_exportDone` | +| 导入在文件对话框中选择的文件 | "Importing the file"、"The file is imported" | `aria_importStarted`、`aria_importDone` | +| 应用列宽 / 行高命令 | "Column width set to 120 pixels" | `aria_columnWidthSet`、`aria_rowHeightSet` | +| Ctrl + Shift + 9 / 0 没有找到可显示的内容 | "No hidden rows in the selection" | `aria_noHiddenRows`、`aria_noHiddenCols` | + +若要播报您自己命令的结果,请调用 [`announce()`](api/spreadsheet_announce_method.md) 方法: + +~~~jsx +spreadsheet.announce("The report is saved"); +~~~ + +## 本地化 {#localization} + +无障碍名称、单元格描述和播报内容以带有 `aria_` 前缀的键存储在 `spreadsheet` 语言环境中,与界面标签放在一起。请在初始化 Spreadsheet 之前使用 `dhx.i18n.setLocale()` 方法翻译它们: + +~~~jsx +dhx.i18n.setLocale("spreadsheet", { + // other keys of the locale + aria_grid: "Tabelle", + aria_cellEditor: "Zelleneditor, {cell}", + aria_readonlySheet: "Das Blatt ist schreibgeschützt", + aria_selectedRange: "{range}, {count} Zellen", + aria_rangeExtent: "{start} bis {end}" +}); + +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); +~~~ + +花括号中的部分,例如 `{cell}` 或 `{count}`,会被替换为相应的值,必须保留在翻译后的字符串中。颜色名称和警告框按钮的名称来自 `colorpicker` 和 `message` 语言环境。完整的键列表请参阅[本地化](localization.md#default-locale),其他语言环境请参阅[本地化内置组件](localization.md#localizing-built-in-widgets)。 + +## 配置示例 {#configuration-recipes} + +### 无障碍默认设置 {#accessible-default-setup} + +Spreadsheet 的键盘和 WAI-ARIA 输出无需任何配置。若要满足 WCAG AA 对文本的对比度要求,请选择对比度主题。设置主题的其他方式请参阅[内置主题](/themes/): + +~~~jsx +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { + // the keyboard navigation and the WAI-ARIA output need no configuration +}); +spreadsheet.parse(data); + +dhx.setTheme("contrast-light"); // or "contrast-dark" +~~~ + +### 只读设置 {#read-only-setup} + +使用 [`readonly`](api/spreadsheet_readonly_config.md) 选项显示用户可以阅读和复制但不能修改的数据。键盘和屏幕阅读器用户仍然可以在单元格间移动: + +~~~jsx +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { + readonly: true +}); +spreadsheet.parse(data); +~~~ + +若要在没有活动单元格和选择的情况下显示数据,请添加 [`selection: false`](api/spreadsheet_selection_config.md)。此时网格会成为一个键盘可直接通过的 Tab 停靠点。 + +### 翻译无障碍字符串 {#translated-accessibility-strings} + +屏幕阅读器从四个语言环境中读取无障碍字符串:`spreadsheet` 包含名称、单元格描述和播报内容,`colorpicker` 包含颜色名称,`message` 包含警告框按钮的名称,`grid` 包含已加载行数的播报内容。请在创建 Spreadsheet 之前设置这四个语言环境。键的说明请参阅[本地化内置组件](localization.md#localizing-built-in-widgets): + +~~~jsx +const deSpreadsheet = { + // other keys of the locale + aria_grid: "Tabelle", + aria_readonlySheet: "Das Blatt ist schreibgeschützt" +}; +const deColorpicker = { + aria_palette: "Farbpalette", + aria_colorRed: "rot" +}; +const deMessage = { + aria_confirm: "Bestätigen" +}; +const deGrid = { + aria_rowsLoaded: "{count} Zeilen geladen" +}; + +dhx.i18n.setLocale("spreadsheet", deSpreadsheet); +dhx.i18n.setLocale("colorpicker", deColorpicker); +dhx.i18n.setLocale("message", deMessage); +dhx.i18n.setLocale("grid", deGrid); + +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); +~~~ + +### 播报自定义命令 {#announcing-a-custom-command} + +当您自己的命令更改数据时,请使用 [`announce()`](api/spreadsheet_announce_method.md) 方法告知屏幕阅读器用户结果。下面的示例添加了一个清空活动工作表的[菜单](customization.md#menu)命令: + +~~~jsx +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); + +spreadsheet.menu.data.add({ id: "clear-sheet", value: "Clear sheet" }); + +spreadsheet.menu.events.on("click", function (id) { + if (id === "clear-sheet") { + spreadsheet.sheets.clear(); + spreadsheet.announce("The sheet is cleared"); + } +}); +~~~ + +## 宿主页面的职责 {#host-page-responsibilities} + +有一些要求属于页面层面,而不在组件内部。请确保宿主页面: + +- 设置文档语言,例如 ``,并设置页面标题 +- 在 Spreadsheet 上方放置标题,并将其置于地标内,例如 `
` +- 如果 Spreadsheet 之前有很长的导航,则提供跳转链接 +- 为任何用单元格颜色标记的状态提供第二种提示,例如文本或图标,因为单元格样式的颜色属于您的数据 +- 检查您在单元格样式和自定义主题中设置的颜色的对比度 + +## 测试和方法 {#testing-and-methodology} + +DHTMLX 团队基于组件源代码并在浏览器中验证 Spreadsheet 6.0.4 的无障碍性: + +1. **自动化测试**:在 `light`、`dark`、`contrast-light` 和 `contrast-dark` 主题中使用 [axe-core](https://github.com/dequelabs/axe-core),并在搜索栏、列表编辑器、对话框和警告框处于打开状态时进行测试。 +2. **人工源代码审查**:检查各部分的角色、状态和名称,键盘处理程序和焦点区域,以及主题令牌及其对比度。 +3. **人工测试**:对单元格、各栏、菜单和对话框进行仅键盘操作的走查,使用 NVDA、JAWS 和 VoiceOver 进行屏幕阅读器测试,200% 和 400% 缩放,320 CSS px 下的重排,以及 WCAG 文本间距覆盖。 +4. **合规报告**:结果按准则逐条发布在[无障碍合规报告](accessibility_conformance_report.md)中,包括 Spreadsheet 部分支持的准则。 + +## 相关资源 {#resources} + +- [无障碍合规报告(VPAT 2.5)](accessibility_conformance_report.md) +- [快捷键列表](hotkeys.md) +- [`readonly`](api/spreadsheet_readonly_config.md) +- [`selection`](api/spreadsheet_selection_config.md) +- [`announce()`](api/spreadsheet_announce_method.md) +- [本地化](localization.md) +- [内置主题](/themes/) +- [WCAG 2.2](https://www.w3.org/TR/WCAG22/) +- [WAI-ARIA 1.2](https://www.w3.org/TR/wai-aria-1.2/) +- [WAI-ARIA Authoring Practices: Grid pattern](https://www.w3.org/WAI/ARIA/apg/patterns/grid/) +- [WAI-ARIA Authoring Practices: Toolbar pattern](https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/accessibility_conformance_report.md b/i18n/zh/docusaurus-plugin-content-docs/current/accessibility_conformance_report.md new file mode 100644 index 00000000..23062783 --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-docs/current/accessibility_conformance_report.md @@ -0,0 +1,204 @@ +--- +sidebar_label: 合规性报告 (VPAT) +title: 无障碍合规性报告 +description: 基于 VPAT 2.5 的 DHTMLX Spreadsheet 无障碍合规性报告,涵盖对 WCAG 2.2 AA、Section 508 和 EN 301 549 的符合情况。 +--- + +# 无障碍合规性报告 + +本报告说明 DHTMLX Spreadsheet 对主要无障碍标准的符合情况,采用 **VPAT® 2.5(国际版)** 的结构。如需了解无障碍功能的任务导向概述及其配置方法,请参阅[无障碍](accessibility.md)指南。 + +**产品名称/版本:** DHTMLX Spreadsheet v6.0.4 + +**报告日期:** 2026 年 10 月 + +**产品描述:** DHTMLX Spreadsheet 是用于 Web 应用程序的 JavaScript 电子表格组件。其界面由菜单栏、工具栏、公式栏、带行列标题的单元格网格以及工作表标签组成。其功能包括公式、单元格格式设置、合并单元格、冻结行和列、排序、筛选、搜索、数据验证、单元格链接以及 Excel 导入和导出。该组件嵌入在宿主 Web 应用程序中。 + +**联系方式:** [info@dhtmlx.com](mailto:info@dhtmlx.com) + +## 说明 {#notes} + +- 本报告评估的是 DHTMLX Spreadsheet 的**推荐无障碍配置**:即默认配置(WAI-ARIA 输出和键盘导航始终开启),并通过 `dhx.setTheme()` 或 `data-dhx-theme` 属性设置 `contrast-light` 或 `contrast-dark` 主题。备注中会指出哪些符合级别取决于此配置。设置方法请参阅[无障碍](accessibility.md)指南。 +- DHTMLX Spreadsheet 是由宿主应用程序渲染的 **Web 内容**。页面级的职责(页面标题、``、跳过/绕过机制以及站点级导航)属于宿主应用程序,在报告中标记为*不适用*并附有说明。 +- 在 WCAG 表格中,仅填写 **Web** 一项的响应。*电子文档*、*软件*、*封闭式*和*创作工具*各行均为*不适用*:本产品不是独立(非 Web)软件、封闭式功能、创作工具或电子文档。 +- 作者通过单元格样式应用于单元格的颜色属于文档数据,不作为产品的一部分进行评估。 + +**所用评估方法:** + +- 自动化测试:在 `light`、`dark`、`contrast-light` 和 `contrast-dark` 主题下使用 axe-core,并分别打开搜索栏、列表编辑器、对话框和警告框。 +- 对组件源代码和样式表进行人工代码审查:包括小部件各部分的角色和 ARIA 属性、键盘处理程序和焦点区域、无障碍名称及其本地化键,以及主题颜色令牌,并计算了四种主题的对比度。 +- 辅助技术测试:在 Windows 上使用 **NVDA + Firefox** 和 **JAWS + Chrome**,在 macOS 上使用 **VoiceOver + Safari** 进行人工测试。 +- 浏览器覆盖设置:200% / 400% 缩放、320 CSS px 宽度下的重排,以及 WCAG 文本间距覆盖。 + +## 适用标准/指南 {#applicable-standards--guidelines} + +| 标准/指南 | 是否包含在报告中 | +|---|---| +| Web Content Accessibility Guidelines 2.0 | A 级(否)· AA 级(否)· AAA 级(否) | +| Web Content Accessibility Guidelines 2.1 | A 级(否)· AA 级(否)· AAA 级(否) | +| Web Content Accessibility Guidelines 2.2 | A 级(**是**)· AA 级(**是**)· AAA 级(否) | +| Revised Section 508 standards(2017 年 1 月 18 日发布;2018 年 1 月 22 日更正) | (**是**) | +| EN 301 549 - V3.1.1 (2019-11) 和 V3.2.1 (2021-03) | (**是**) | + +*WCAG 2.0 和 2.1 不单独报告。WCAG 标注为"2.1 and 2.2"的成功标准之所以作答,是因为它们属于 WCAG 2.2,并被 EN 301 549 引用。* + +## 术语 {#terms} + +- **支持(Supports):** 产品的功能至少有一种方式在没有已知缺陷的情况下满足该标准,或通过等效便利措施满足该标准。 +- **部分支持(Partially Supports):** 产品的部分功能不满足该标准。 +- **不支持(Does Not Support):** 产品的大部分功能不满足该标准。 +- **不适用(Not Applicable):** 该标准与产品无关。 + +## WCAG 2.x 报告 {#wcag-2x-report} + +DHTMLX Spreadsheet 是 Web 内容,因此下表仅填写 **Web** 一项的响应。"需要符合 AA 级的主题"属于配置依赖,而非缺陷。成功标准 4.1.1 解析(Parsing)已在 WCAG 2.2 中移除,因此不予报告。 + +### 表 1:成功标准,A 级 {#table-1-success-criteria-level-a} + +| 标准 | 符合级别 | 备注和说明 | +|---|---|---| +| **1.1.1** 非文本内容 | 支持 | 图标为字体字形。仅含图标的控件从本地化文本或工具提示中获取无障碍名称,例如 "Add sheet"、"Close search" 和 "Select all"。颜色按钮带有颜色名称,例如 "Text color: dark gray"。装饰性图标(锁定、筛选、列菜单、隐藏行标记)、选区图层以及被合并单元格覆盖的单元格均通过 `aria-hidden="true"` 隐藏;它们所表示的状态由单元格中的文本传达,例如 "locked" 和 "Filter applied"。 | +| **1.2.1** 纯音频和纯视频(预录制) | 不适用 | 产品不包含音频或视频内容。 | +| **1.2.2** 字幕(预录制) | 不适用 | 没有预录制的多媒体。 | +| **1.2.3** 音频描述或媒体替代(预录制) | 不适用 | 没有预录制的多媒体。 | +| **1.3.1** 信息和关系 | 支持 | 单元格是名为 "Spreadsheet" 的 `grid`,具有 `row`、`columnheader`、`rowheader` 和 `gridcell` 角色。位置通过 `aria-rowindex`/`aria-colindex` 以及 `aria-rowcount`/`aria-colcount` 提供;合并单元格的范围通过 `aria-colspan`/`aria-rowspan` 提供;可编辑性通过 `aria-readonly` 提供;选择状态通过 `aria-selected` 和 `aria-multiselectable` 提供。工具栏、菜单栏和工作表标签分别是带名称的 `toolbar` 和 `menubar` 元素;格式切换按钮在工具栏中具有 `aria-pressed`,在菜单栏中是 `menuitemcheckbox`,互斥的格式选项是带 `aria-checked` 的 `menuitemradio`。 | +| **1.3.2** 有意义的序列 | 支持 | DOM 顺序和阅读顺序与视觉顺序一致:菜单栏、工具栏、公式栏、单元格和工作表标签。单元格通过 `aria-rowindex`/`aria-colindex` 携带其在工作表中的位置,因此当行和列滚动出 DOM 时,序列仍然保持不变。 | +| **1.3.3** 感官特征 | 支持 | 没有任何说明或标签仅依赖形状、大小或空间位置;交互元素带有文本或 ARIA 名称。 | +| **1.4.1** 颜色的使用 | 支持 | 每个以颜色显示的状态同时具有边框、填充、标记或文本:活动单元格、选定范围、搜索匹配项、已复制范围和无效单元格,并配合 `aria-selected` 或单元格中的文本。被筛选隐藏的行会在行号中留下间隔。颜色按钮的无障碍名称中包含颜色名称。 | +| **1.4.2** 音频控制 | 不适用 | 产品不产生自动播放的音频。 | +| **2.1.1** 键盘 | 支持 | 单元格上的每个命令都有对应按键,列于[快捷键列表](hotkeys.md);`Shift`+`F10` 或 Menu 键可打开上下文菜单。`Ctrl`+`F6` 在菜单、工具栏、工作表和工作表标签之间移动焦点。各栏、其下拉菜单和弹出窗口以及列表编辑器可使用方向键、`Home`、`End`、`Enter` 和 `Esc` 操作。列宽、行高和列筛选均有上下文菜单命令。 | +| **2.1.2** 无键盘陷阱 | 支持 | 在工作表最后一个单元格上按 `Tab`、在第一个单元格上按 `Shift`+`Tab`,焦点会移出单元格,进入页面的下一部分或上一部分;`Ctrl`+`F6` 在 Spreadsheet 的各部分之间移动焦点。在列表编辑器中,`Tab` 结束编辑,`Esc` 取消编辑,使用方向键之后也是如此。`Esc` 和 `Tab` 会关闭工具栏弹出窗口,并将焦点返回到其按钮。 | +| **2.1.4** 字符键快捷键 | 支持 | 每个快捷键都使用修饰键(`Ctrl`、`Alt`、`Shift`)或非字符键(`F2`、`F6`、`F10`、`F11`、`Enter`、`Esc`、`Delete`、方向键)。在单元格上输入字符会将其录入单元格,这正是单元格的用途,不会执行命令。 | +| **2.2.1** 时间可调 | 不适用 | 产品不设置时间限制。 | +| **2.2.2** 暂停、停止、隐藏 | 支持 | 没有自动更新、移动、闪烁或滚动的内容。没有任何动画持续超过 5 秒。 | +| **2.3.1** 三次闪光或低于阈值 | 支持 | 产品不包含闪烁内容。 | +| **2.4.1** 绕过块 | 不适用 | 适用于页面级;绕过机制属于宿主应用程序。 | +| **2.4.2** 页面标题 | 不适用 | 页面标题由宿主应用程序负责。 | +| **2.4.3** 焦点顺序 | 支持 | 单元格在活动单元格上构成一个 Tab 停靠点,工具栏、菜单栏和工作表标签各为一个 Tab 停靠点,并按视觉顺序排列。`Tab` 在最后一个和第一个单元格处离开工作表。对话框会获取焦点,将 `Tab` 保持在对话框内,并在关闭时将焦点返回到活动单元格;菜单、上下文菜单和弹出窗口会将焦点返回到打开它们的控件;应用文本颜色或背景颜色后,焦点返回到活动单元格。活动单元格获得焦点时会滚动到可见区域。 | +| **2.4.4** 链接目的(在上下文中) | 支持 | 单元格中的链接渲染为 `` 元素,其文本为作者设置的链接文本或地址。选中单元格时,单元格文本会附加 "link",`Alt`+`Enter` 可打开该链接。 | +| **2.5.1** 指针手势 | 支持 | 没有任何操作需要多点触控或基于路径的手势;每个拖动操作都有非拖动的替代方式(参见 2.5.7)。 | +| **2.5.2** 指针取消 | 支持 | 调整列和行大小以及填充柄操作在释放时生效,且一次撤销即可还原其中每一项操作。工具栏、菜单和工作表标签的命令在 `click` 时执行。 | +| **2.5.3** 标签中的名称 | 支持 | 带有可见文本的控件以该文本作为其无障碍名称:菜单项、上下文菜单命令、工作表标签和对话框按钮。图标按钮以其工具提示命名,颜色按钮以其工具提示加颜色名称命名。 | +| **2.5.4** 动作激活 | 不适用 | 没有任何功能通过设备动作或用户动作来操作。 | +| **3.1.1** 页面语言 | 不适用 | 文档语言(``)由宿主应用程序设置。 | +| **3.2.1** 获得焦点时 | 支持 | 获得焦点从不改变上下文。点击列字母、行号或左上角单元格会选中相应的行列,并将焦点保持在活动单元格上。 | +| **3.2.2** 输入时 | 支持 | 更改值不会改变上下文。编辑单元格、从列表中选择值或在搜索栏中输入内容,都会就地更新工作表,这正是这些控件的既定用途。 | +| **3.2.6** 一致的帮助(仅 2.2) | 不适用 | 小部件不提供帮助机制;这属于页面级问题。 | +| **3.3.1** 错误识别 | 支持 | 公式错误和无效的列表值会在单元格内容中说明,例如 "Reference error. Check the cell references" 和 "Invalid value. Choose a value from the list"。编辑导致的新公式错误和无效值会通过实时区域播报,无效值的编辑器具有 `aria-invalid="true"`。 | +| **3.3.2** 标签或说明 | 支持 | 单元格编辑器名为 "Cell editor, B7",公式栏名为 "Formula bar, B7",其中包含被编辑单元格的地址。对话框字段带有标签,例如 "Width in pixels",搜索栏按钮分别命名为 "Previous match"、"Next match" 和 "Close search"。 | +| **3.3.7** 冗余输入(仅 2.2) | 支持 | 产品不包含要求重复输入已填写信息的多步骤流程。 | +| **4.1.2** 名称、角色、值 | 支持 | 每个部分都提供角色、状态以及来自本地化文本的名称:单元格(`grid`、`row`、`gridcell`、`columnheader`、`rowheader`、`aria-selected`、`aria-readonly`)、工具栏和菜单栏(`toolbar`、`menubar`)、格式、锁定和筛选按钮以及工作表标签(`aria-pressed`)、菜单栏的格式项(`menuitemcheckbox`、`aria-checked`)以及互斥格式(`menuitemradio`、`aria-checked`)。警告框是带有 `aria-modal="true"` 的 `alertdialog`。列表编辑器是控制 `listbox` 的 `combobox`,带有 `aria-expanded` 和 `aria-activedescendant`。 | + +### 表 2:成功标准,AA 级 {#table-2-success-criteria-level-aa} + +| 标准 | 符合级别 | 备注和说明 | +|---|---|---| +| **1.2.4** 字幕(直播) | 不适用 | 没有直播多媒体。 | +| **1.2.5** 音频描述(预录制) | 不适用 | 没有预录制的视频。 | +| **1.3.4** 方向 | 支持 | 内容不限于单一显示方向。 | +| **1.3.5** 识别输入目的 | 不适用 | 产品的编辑器收集的是文档数据,而非 WCAG 输入目的列表所涵盖的用户个人信息。 | +| **1.4.3** 对比度(最小值) | 支持 | `contrast-light` 和 `contrast-dark` 主题满足 AA 级:在打开搜索栏、列表编辑器、列宽对话框和警告框的情况下,两种主题中均没有产品文本的对比度低于 4.5:1。公式引用颜色在 light 和 `contrast-light` 主题中为 4.59:1 至 7.04:1,在深色主题中为 7.62:1 至 12.26:1。在默认的 light 主题中,对话框字段标签和警告文本等次要文本约为 3.95:1。要满足该标准,需要选择其中一个对比度主题,且只要采用一种受支持的方法即可满足。 | +| **1.4.4** 调整文本大小 | 支持 | 文本可放大到 200% 而不丢失内容或功能;工具栏、公式栏、工作表标签和对话框仍可正常使用。 | +| **1.4.5** 文本图像 | 支持 | 所有文本均渲染为真实文本。图标为字体字形;产品不使用位图图像。 | +| **1.4.10** 重排 | 支持 | 单元格是二维内容,该标准对其免除重排要求,可在水平和垂直方向滚动。工具栏、菜单栏和工作表标签可适应 320 CSS px 的宽度。 | +| **1.4.11** 非文本对比度 | 支持 | 单元格、公式栏和各栏控件的焦点指示器宽 2px,并使用主题颜色绘制;以下对比度数值依次对应默认 light、`contrast-light`、dark 和 `contrast-dark` 主题。活动单元格以 `--dhx-color-primary` 颜色的 2px 实线边框标记:与单元格背景的对比度约为 3.9:1、7.7:1、3.4:1 和 5.3:1。具有键盘焦点的单元格和单元格编辑器会获得同色的 2px 轮廓,对比度相同;在选定范围内约为 3.3:1、6.0:1、3.1:1 和 4.2:1。公式栏会获得 `--dhx-spreadsheet-focus-color` 颜色的 2px 轮廓:与其背景的对比度约为 3.9:1、7.7:1、5.3:1 和 6.5:1。工具栏、菜单栏和工作表标签的控件获得相同的轮廓:与栏背景的对比度约为 3.7:1、7.2:1、3.9:1 和 4.9:1。所有数值均高于 3:1 的要求。 | +| **1.4.12** 文本间距 | 支持 | 应用 WCAG 文本间距覆盖后,没有控件标签被截断;当标签增多时,工作表标签栏可滚动。 | +| **1.4.13** 悬停或焦点触发的内容 | 支持 | 工具栏工具提示在悬停时保持显示,并可通过 `Esc` 关闭,且无需移动指针或焦点。无效值工具提示用于报告输入错误,在单元格处于活动状态时保持显示,并可通过 `Esc` 移除。 | +| **2.4.5** 多种方式 | 不适用 | 适用于在一组网页中定位页面;对于单个嵌入式组件不在范围内(属于宿主应用程序的问题)。 | +| **2.4.6** 标题和标签 | 支持 | 主要部分的无障碍名称来自本地化文本:"Spreadsheet"(网格)、"Formatting"(工具栏)、"Borders"、"Search" 和 "Link"(分别为边框弹出窗口、搜索栏和链接弹出窗口的工具栏)、"Main"(菜单栏)、"Cell" 和 "Sheet"(分别为单元格和工作表标签的上下文菜单)、"Sheets"(工作表标签栏)、"Formula bar, B7"(公式栏)和 "Cell editor, B7"(单元格编辑器)。全选角落单元格命名为 "Select all",搜索栏命名为 "Search",其按钮分别命名为 "Previous match"、"Next match" 和 "Close search",添加工作表的按钮命名为 "Add sheet",其他对话框以其标题命名。 | +| **2.4.7** 焦点可见 | 支持 | 键盘焦点位置始终可见。活动单元格始终带有 2px 实线边框,获得焦点的单元格或单元格编辑器带有 2px 轮廓,二者均使用主题的主色。公式栏以及工具栏、菜单栏、工作表标签、边框弹出窗口、链接弹出窗口和搜索栏的控件会显示 `--dhx-spreadsheet-focus-color` 颜色的 2px 焦点环。在调色板、边框样式列表、工具栏和菜单栏的下拉菜单以及上下文菜单中,获得焦点的项带有 1px 虚线轮廓。在列表编辑器中,获得焦点的项以背景色高亮显示。焦点指示器在每个内置主题中均会显示。 | +| **2.4.11** 焦点不被遮挡(最小)(仅 2.2) | 支持 | 活动单元格会滚动到冻结行和列旁边的可见区域,因此不会被遗留在冻结区域之后。 | +| **2.5.7** 拖动动作(仅 2.2) | 支持 | 范围选择可使用 `Shift`+方向键和 `Ctrl`+`Space`/`Shift`+`Space`。列宽和行高通过上下文菜单中的*列宽*和*行高*命令设置,并支持撤销。隐藏的行和列可通过 `Ctrl`+`Shift`+`9`/`0` 以及*显示行*/*显示列*命令显示。填充单元格可通过 [`groupFill`](api/spreadsheet_groupfill_event.md) 事件实现,该事件可绑定到上下文菜单命令。 | +| **2.5.8** 目标尺寸(最小)(仅 2.2) | 部分支持 | 填充柄为 12 x 12 CSS px。列和行的调整手柄有等效的控件,即*列宽*和*行高*命令。全选角落单元格是 40 x 32 CSS px 的角落标题单元格,工具栏和菜单控件大于 24 x 24 CSS px。 | +| **3.1.2** 部分内容的语言 | 不适用 | 小部件在其内容中不混用语言;语言由宿主负责。 | +| **3.2.3** 一致的导航 | 不适用 | 适用于一组网页;属于宿主应用程序的问题。 | +| **3.2.4** 一致的标识 | 支持 | 功能相同的命令在工具栏、菜单栏和上下文菜单中具有相同的名称和图标,以及相同的按键。 | +| **3.3.3** 错误建议 | 支持 | 错误描述会给出修复建议:引用错误提示 "Check the cell references",无效的列表值提示 "Choose a value from the list"。 | +| **3.3.4** 错误预防(法律、财务、数据) | 支持 | 对数据的每项更改都可通过撤销(`Ctrl`+`Z`)还原,并可通过重做重复执行。宿主应用程序还可以通过 [`beforeAction`](api/spreadsheet_beforeaction_event.md) 事件取消任何操作。 | +| **3.3.8** 无障碍身份验证(最小)(仅 2.2) | 不适用 | 产品不执行身份验证。 | +| **4.1.3** 状态消息 | 支持 | 状态变化通过位于网格之外的视觉隐藏实时区域(`role="status"`、`aria-live="polite"`、`aria-atomic="true"`)播报,且不移动焦点。它会报告选定范围、新的公式错误和无效值、对锁定单元格或只读工作表的被拒绝编辑、搜索结果、导入和导出的开始与结束、新的列宽和行高,以及没有可显示的隐藏行或列的选择。宿主应用程序可通过公共的 [`announce()`](api/spreadsheet_announce_method.md) 方法使用同一区域,并且每条内置消息都可通过 `aria_*` 本地化键进行本地化。 | + +## Revised Section 508 报告 {#revised-section-508-report} + +与 WCAG 对应的条款已在上文的 WCAG 2.x 报告中作答,此处予以引用。第 4 章(硬件)为不适用,因为 DHTMLX Spreadsheet 是软件组件,没有硬件或物理控件。 + +### 第 3 章:功能性能标准 {#chapter-3-functional-performance-criteria} + +| 标准 | 符合级别 | 备注和说明 | +|---|---|---| +| 302.1 无视觉 | 支持 | 可通过屏幕阅读器操作,依托带有列标题和行标题的 `grid` 模型、随每个单元格朗读的单元格地址和描述、具名的工具栏和菜单、实时区域以及键盘模型。参见 WCAG 1.3.1、2.1.1、4.1.2、4.1.3。 | +| 302.2 有限视觉 | 支持 | 支持缩放、文本调整大小和重排,焦点在每个主题中均可见,`contrast-light` / `contrast-dark` 主题满足 AA 级对比度。参见 WCAG 1.4.3、1.4.4、1.4.10、1.4.11、2.4.7。 | +| 302.3 无颜色感知 | 支持 | 没有任何信息仅通过颜色传达:活动单元格、选区、搜索匹配项和无效值除颜色外,各自在单元格中带有边框、标记或文本,且颜色按钮会给出颜色名称。参见 WCAG 1.4.1。 | +| 302.4 无听觉 | 支持 | 没有任何信息通过声音传达。 | +| 302.5 有限听觉 | 支持 | 没有任何信息通过声音传达。 | +| 302.6 无语音 | 支持 | 操作产品不需要语音输入。 | +| 302.7 有限操作能力 | 支持 | 每项功能均可通过键盘使用;不需要基于路径的手势,每个拖动操作都有键盘或命令替代方式。参见 WCAG 2.1.1、2.5.1、2.5.7、2.5.8。 | +| 302.8 有限触及和力量 | 支持 | 可通过键盘操作;没有身体触及、力度或时间方面的要求。 | +| 302.9 有限语言、认知和学习能力 | 支持 | 命令在工具栏、菜单和上下文菜单中具有相同的名称,公式错误的描述附带更正方法,并且每项更改都可通过撤销还原。参见 WCAG 3.2.4、3.3.3、3.3.4。 | + +### 第 5 章:软件 {#chapter-5-software} + +| 标准 | 符合级别 | 备注和说明 | +|---|---|---| +| 501.1 范围 - 纳入 WCAG 2.0 AA | 参见 WCAG 2.x 部分 | 参见上文的 WCAG 2.x 报告。 | +| 502 与辅助技术的互操作性 | 不适用 | 适用于非 Web(平台)软件。DHTMLX Spreadsheet 是 Web 内容,向浏览器无障碍树公开标准的 DOM 和 ARIA;互操作性由 WCAG 结果涵盖(第 9 条 / 501.1)。 | +| 503 应用程序 | 不适用 | 适用于非 Web 的平台软件;本产品是 Web 内容。 | +| 504 创作工具 | 不适用 | DHTMLX Spreadsheet 不是 Web 内容的创作工具:它编辑的是电子表格数据,而非与无障碍相关的 Web 内容。 | + +### 第 6 章:支持文档和服务 {#chapter-6-support-documentation-and-services} + +| 标准 | 符合级别 | 备注和说明 | +|---|---|---| +| 602.2 无障碍和兼容性功能 | 支持 | 文档描述了产品的无障碍功能:[无障碍](accessibility.md)指南涵盖 WAI-ARIA 模型、键盘模型、只读模式和选择选项、主题和焦点指示器、[`announce()`](api/spreadsheet_announce_method.md) API 以及[可本地化的 `aria_*` 字符串](accessibility.md#localization);[快捷键列表](hotkeys.md)列出了每个快捷键。 | +| 602.3 电子支持文档 | 支持(参见 WCAG 2.x 部分) | 文档站点以 Web 内容形式提供,并持续维护以满足 WCAG 2.2 AA。 | +| 602.4 非电子支持文档的替代格式 | 不适用 | 文档仅以电子形式提供;没有非电子(印刷)形式的支持文档。 | +| 603.2 无障碍和兼容性功能的信息 | 支持 | 产品的无障碍功能已在[无障碍](accessibility.md)指南中公开记录,也可应要求通过支持渠道提供。 | +| 603.3 满足沟通需求 | 支持 | 通过基于文本的电子邮件渠道提供支持;用户使用自己的辅助技术进行交互。 | + +## EN 301 549 报告 {#en-301-549-report} + +第 9 条(Web)直接对应上文的 WCAG 2.x 报告,是针对这一 Web 产品的实质性评估。电话、视频和硬件相关条款(第 6、7、8、13 条)为不适用。 + +### 第 4 条:功能性能陈述 {#clause-4-functional-performance-statements} + +这些内容与 Section 508 第 3 章的结果一致(结论相同)。 + +| 标准 | 符合级别 | 备注和说明 | +|---|---|---| +| 4.2.1 无视觉使用 | 支持 | 参见 508 302.1(可通过屏幕阅读器操作,依托网格模型、单元格描述、具名控件、实时区域和键盘模型)。 | +| 4.2.2 有限视觉使用 | 支持 | 参见 508 302.2(通过对比度主题满足 AA 级对比度,每个主题中焦点均可见;支持缩放和重排)。 | +| 4.2.3 无颜色感知使用 | 支持 | 参见 508 302.3(每个颜色提示都附带边框、标记或文本)。 | +| 4.2.4 无听觉使用 | 支持 | 没有任何信息通过声音传达。 | +| 4.2.5 有限听觉使用 | 支持 | 没有任何信息通过声音传达。 | +| 4.2.6 无或有限发声能力使用 | 支持 | 不需要语音输入。 | +| 4.2.7 有限操作或力量使用 | 支持 | 参见 508 302.7(可通过键盘操作,无需手势,每个拖动操作都有替代方式)。 | +| 4.2.8 有限触及使用 | 支持 | 没有身体触及方面的要求(软件组件)。 | +| 4.2.9 最大限度减少光敏性癫痫触发因素 | 支持 | 没有闪烁内容(参见 WCAG 2.3.1)。 | +| 4.2.10 有限认知、语言或学习能力使用 | 支持 | 参见 508 302.9(命令名称一致、错误有描述、更改可还原)。 | +| 4.2.11 隐私 | 支持 | 无障碍功能与其他所有人使用同一界面;不存在单独的、隐私性较低的模式。 | + +### 第 5 条:通用要求 {#clause-5-generic-requirements} + +**大部分不适用。** 第 5 条涉及封闭式功能和硬件类要求。DHTMLX Spreadsheet 是开放的 Web 软件,可与平台和浏览器的辅助技术协同工作,因此封闭式功能子条款、生物识别(5.3)、可操作部件(5.5)以及锁定/切换控件状态(5.6)均为不适用。如果某项通用要求通过常规的辅助技术支持得以满足,则由第 9 条(Web)和 WCAG 结果涵盖。 + +### 第 9 条:Web {#clause-9-web} + +**参见 WCAG 2.x 部分。** 第 9.1.1.1-9.4.1.3 条对应上文表 1 和表 2 中的 WCAG 2.2 A 级/AA 级结果。 + +### 第 11 条:软件 {#clause-11-software} + +**不适用(按第 9 条评估)。** DHTMLX Spreadsheet 是 Web 内容,按第 9 条(Web)评估;它不是非 Web 软件。与 WCAG 对应的软件条款(11.1.1.1-11.4.1.3)由 WCAG 2.x 结果涵盖。11.8(创作工具)为不适用,因为本产品不是创作工具。 + +### 第 12 条:文档和支持服务 {#clause-12-documentation-and-support-services} + +| 标准 | 符合级别 | 备注和说明 | +|---|---|---| +| 12.1.1 无障碍和兼容性功能 | 支持 | [无障碍](accessibility.md)指南记录了产品的无障碍功能:WAI-ARIA 模型、键盘模型、只读模式和选择选项、主题、焦点指示器、[`announce()`](api/spreadsheet_announce_method.md) API 以及[可本地化的 `aria_*` 字符串](accessibility.md#localization)。 | +| 12.1.2 无障碍文档 | 支持(参见 WCAG 2.x 部分) | 文档站点以 Web 内容形式提供,并持续维护以满足 WCAG 2.2 AA。 | +| 12.2.2 无障碍和兼容性功能的信息 | 支持 | 无障碍功能已公开记录,也可应要求由支持团队提供。 | +| 12.2.3 有效沟通 | 支持 | 通过基于文本的电子邮件渠道提供支持;用户使用自己的辅助技术进行交互。 | +| 12.2.4 无障碍文档 | 支持(参见 WCAG 2.x 部分) | 依据与 12.1.2 相同:文档站点持续维护以满足 WCAG 2.2 AA。 | + +## 法律声明 {#legal-disclaimer} + +本报告仅供参考,描述的是所列产品版本在报告日期时的无障碍情况。本报告按"原样"提供,不附带任何形式的保证,也不构成合同承诺或担保。无障碍支持可能在后续版本中发生变化,且结果仅适用于所评估的配置。"VPAT" 和 "Voluntary Product Accessibility Template" 是 Information Technology Industry Council (ITI) 的注册服务商标。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/angular_integration.md b/i18n/zh/docusaurus-plugin-content-docs/current/angular_integration.md index 1ca0ce21..74e40c84 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/angular_integration.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/angular_integration.md @@ -1,7 +1,7 @@ --- sidebar_label: 与 Angular 集成 title: Angular 集成 -description: 您可以在文档中了解 DHTMLX JavaScript Spreadsheet 库的 Angular 集成方式。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: "在 Angular 应用中使用 DHTMLX Spreadsheet。创建项目,将 Spreadsheet 添加为 Angular 组件,加载数据并处理事件。" --- # 与 Angular 集成 {#integration-with-angular} @@ -234,6 +234,10 @@ ngOnDestroy() { } ~~~ +:::info +`destructor()` 方法会移除通过 `spreadsheet.events.on()` 附加的事件处理器。创建新的 Spreadsheet 实例时(例如再次创建组件时),请将处理器附加到新实例上。 +::: + ### 第三步:将 Spreadsheet 添加到应用 {#step-3-adding-spreadsheet-into-the-app} 要将 `SpreadsheetComponent` 组件添加到应用中,打开 *src/app/app.component.ts* 文件,并将默认代码替换为以下内容: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/api_overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/api_overview.md index 4ed58314..d177bf37 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/api_overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/api_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: API 概览 title: API 概览 -description: 您可以在文档中查看 DHTMLX JavaScript Spreadsheet 库的 API 概览。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载免费 30 天试用版的 DHTMLX Spreadsheet。 +description: DHTMLX Spreadsheet API 概览,涵盖构造函数、方法、事件、属性,以及 Sheet Manager、Selection、Event Bus 和导出模块。 --- # API 概览 {#api-overview} @@ -27,6 +27,9 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { | [](api/spreadsheet_addcolumn_method.md) | @getshort(api/spreadsheet_addcolumn_method.md) | | [](api/spreadsheet_addformula_method.md) | @getshort(api/spreadsheet_addformula_method.md) | | [](api/spreadsheet_addrow_method.md) | @getshort(api/spreadsheet_addrow_method.md) | +| [](api/spreadsheet_announce_method.md) | @getshort(api/spreadsheet_announce_method.md) | +| [](api/spreadsheet_announce_method.md) | @getshort(api/spreadsheet_announce_method.md) | +| [](api/spreadsheet_announce_method.md) | @getshort(api/spreadsheet_announce_method.md) | | [](api/spreadsheet_clear_method.md) | @getshort(api/spreadsheet_clear_method.md) | | [](api/spreadsheet_deletecolumn_method.md) | @getshort(api/spreadsheet_deletecolumn_method.md) | | [](api/spreadsheet_deleterow_method.md) | @getshort(api/spreadsheet_deleterow_method.md) | @@ -99,6 +102,9 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { | [](api/spreadsheet_multisheets_config.md) | @getshort(api/spreadsheet_multisheets_config.md) | | [](api/spreadsheet_readonly_config.md) | @getshort(api/spreadsheet_readonly_config.md) | | [](api/spreadsheet_rowscount_config.md) | @getshort(api/spreadsheet_rowscount_config.md) | +| [](api/spreadsheet_selection_config.md) | @getshort(api/spreadsheet_selection_config.md) | +| [](api/spreadsheet_selection_config.md) | @getshort(api/spreadsheet_selection_config.md) | +| [](api/spreadsheet_selection_config.md) | @getshort(api/spreadsheet_selection_config.md) | | [](api/spreadsheet_toolbarblocks_config.md) | @getshort(api/spreadsheet_toolbarblocks_config.md) | @@ -118,8 +124,17 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { | 名称 | 描述 | | :--------------------------------------------- | :---------------------------------------------------- | +| [](api/selection_enable_method.md) | @getshort(api/selection_enable_method.md) | +| [](api/selection_disable_method.md) | @getshort(api/selection_disable_method.md) | +| [](api/selection_enable_method.md) | @getshort(api/selection_enable_method.md) | +| [](api/selection_disable_method.md) | @getshort(api/selection_disable_method.md) | +| [](api/selection_enable_method.md) | @getshort(api/selection_enable_method.md) | +| [](api/selection_disable_method.md) | @getshort(api/selection_disable_method.md) | | [](api/selection_getfocusedcell_method.md) | @getshort(api/selection_getfocusedcell_method.md) | | [](api/selection_getselectedcell_method.md) | @getshort(api/selection_getselectedcell_method.md) | +| [](api/selection_isdisabled_method.md) | @getshort(api/selection_isdisabled_method.md) | +| [](api/selection_isdisabled_method.md) | @getshort(api/selection_isdisabled_method.md) | +| [](api/selection_isdisabled_method.md) | @getshort(api/selection_isdisabled_method.md) | | [](api/selection_removeselectedcell_method.md) | @getshort(api/selection_removeselectedcell_method.md) | | [](api/selection_setfocusedcell_method.md) | @getshort(api/selection_setfocusedcell_method.md) | | [](api/selection_setselectedcell_method.md) | @getshort(api/selection_setselectedcell_method.md) | diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md index fd4417e8..8dcad3d2 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md @@ -67,8 +67,8 @@ spreadsheet.events.on("beforeColumnAdd", function(cell){ | **merge** | 合并一组单元格时执行该操作 | | **removeCellStyles** | 清除单元格样式时执行该操作 | | **renameSheet** | 重命名工作表时执行该操作 | -| **resizeCol** | 调整列宽时执行该操作 | -| **resizeRow** | 调整行高时执行该操作 | +| **resizeCol** | 通过拖动列边框或使用*列宽*命令调整列宽时执行该操作 | +| **resizeRow** | 通过拖动行边框或使用*行高*命令调整行高时执行该操作 | | **setCellFormat** | 更改单元格格式时执行该操作 | | **setCellValue** | 更改或删除单元格值时执行该操作 | | **setValidation** | 为单元格设置数据验证时执行该操作 | @@ -78,6 +78,13 @@ spreadsheet.events.on("beforeColumnAdd", function(cell){ | **toggleFreeze** | 冻结/取消冻结列/行时执行该操作 | | **unmerge** | 拆分单元格时执行该操作 | +:::note +在 [`beforeAction`](api/spreadsheet_beforeaction_event.md) 和 [`afterAction`](api/spreadsheet_afteraction_event.md) 事件的 `config` 对象中,**resizeCol** 和 **resizeRow** 操作会传递: + +- `cell` - 被调整列宽或行高的单元格或单元格范围 +- `val` - 新的宽度或高度(单位为像素)。仅在使用*列宽*和*行高*命令时设置,拖动调整时不设置 +::: + **更新日志:** - **toggleFreeze** 和 **toggleVisibility** 操作在 v5.2 中新增 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/methods_overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/methods_overview.md index 3852c1a3..c828f2d7 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/methods_overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/methods_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: 方法概览 title: 方法概览 -description: 您可以在文档中查看 DHTMLX JavaScript Spreadsheet 库的方法概览。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: DHTMLX Spreadsheet 方法列表,涵盖数据加载与保存、单元格编辑、样式设置、合并、排序、筛选以及工作表管理。 --- # 方法概览 {#methods-overview} @@ -11,6 +11,9 @@ description: 您可以在文档中查看 DHTMLX JavaScript Spreadsheet 库的方 | [](api/spreadsheet_addcolumn_method.md) | @getshort(../spreadsheet_addcolumn_method.md) | | [](api/spreadsheet_addformula_method.md) | @getshort(../spreadsheet_addformula_method.md) | | [](api/spreadsheet_addrow_method.md) | @getshort(../spreadsheet_addrow_method.md) | +| [](api/spreadsheet_announce_method.md) | @getshort(../spreadsheet_announce_method.md) | +| [](api/spreadsheet_announce_method.md) | @getshort(../spreadsheet_announce_method.md) | +| [](api/spreadsheet_announce_method.md) | @getshort(../spreadsheet_announce_method.md) | | [](api/spreadsheet_clear_method.md) | @getshort(../spreadsheet_clear_method.md) | | [](api/spreadsheet_deletecolumn_method.md) | @getshort(../spreadsheet_deletecolumn_method.md) | | [](api/spreadsheet_deleterow_method.md) | @getshort(../spreadsheet_deleterow_method.md) | diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/properties_overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/properties_overview.md index 67519b6f..6dc7aa6b 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/properties_overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/properties_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: 属性概览 title: 属性概览 -description: 您可以在文档中查看 DHTMLX JavaScript Spreadsheet 库的属性概览。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: DHTMLX Spreadsheet 配置属性列表,用于设置工具栏、菜单、只读模式、选择、网格大小等。 --- # 属性概览 {#properties-overview} @@ -18,4 +18,7 @@ description: 您可以在文档中查看 DHTMLX JavaScript Spreadsheet 库的属 | [](api/spreadsheet_multisheets_config.md) | @getshort(../spreadsheet_multisheets_config.md) | | [](api/spreadsheet_readonly_config.md) | @getshort(../spreadsheet_readonly_config.md) | | [](api/spreadsheet_rowscount_config.md) | @getshort(../spreadsheet_rowscount_config.md) | +| [](api/spreadsheet_selection_config.md) | @getshort(../spreadsheet_selection_config.md) | +| [](api/spreadsheet_selection_config.md) | @getshort(../spreadsheet_selection_config.md) | +| [](api/spreadsheet_selection_config.md) | @getshort(../spreadsheet_selection_config.md) | | [](api/spreadsheet_toolbarblocks_config.md) | @getshort(../spreadsheet_toolbarblocks_config.md) | diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/selection_overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/selection_overview.md index ee7839b9..696302cd 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/selection_overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/selection_overview.md @@ -1,15 +1,24 @@ --- sidebar_label: Selection 方法概览 title: Selection 方法概览 -description: 您可以在文档中查看 DHTMLX JavaScript Spreadsheet 库的 Selection 方法概览。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: DHTMLX Spreadsheet Selection 模块方法列表,用于选择单元格、设置焦点,以及关闭和开启单元格选择。 --- # Selection 方法概览 {#selection-methods-overview} | 名称 | 描述 | | :--------------------------------------------- | :---------------------------------------------------- | +| [](api/selection_enable_method.md) | @getshort(../selection_enable_method.md) | +| [](api/selection_disable_method.md) | @getshort(../selection_disable_method.md) | +| [](api/selection_enable_method.md) | @getshort(../selection_enable_method.md) | +| [](api/selection_disable_method.md) | @getshort(../selection_disable_method.md) | +| [](api/selection_enable_method.md) | @getshort(../selection_enable_method.md) | +| [](api/selection_disable_method.md) | @getshort(../selection_disable_method.md) | | [](api/selection_getfocusedcell_method.md) | @getshort(../selection_getfocusedcell_method.md) | | [](api/selection_getselectedcell_method.md) | @getshort(../selection_getselectedcell_method.md) | +| [](api/selection_isdisabled_method.md) | @getshort(../selection_isdisabled_method.md) | +| [](api/selection_isdisabled_method.md) | @getshort(../selection_isdisabled_method.md) | +| [](api/selection_isdisabled_method.md) | @getshort(../selection_isdisabled_method.md) | | [](api/selection_removeselectedcell_method.md) | @getshort(../selection_removeselectedcell_method.md) | | [](api/selection_setfocusedcell_method.md) | @getshort(../selection_setfocusedcell_method.md) | | [](api/selection_setselectedcell_method.md) | @getshort(../selection_setselectedcell_method.md) | diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_disable_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_disable_method.md new file mode 100644 index 00000000..6c10a701 --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_disable_method.md @@ -0,0 +1,47 @@ +--- +sidebar_label: disable() +title: disable selection 方法 +description: 通过 selection.disable() 方法在运行时关闭 DHTMLX Spreadsheet 中的单元格选择功能,该方法会移除活动单元格,并忽略通过鼠标、键盘和 API 进行的选择操作。 +--- + +# disable() + +### 描述 {#description} + +@short: 关闭单元格选择功能 + +### 用法 {#usage} + +~~~jsx +disable(): void; +~~~ + +### 示例 {#example} + +~~~jsx {6} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + // 配置参数 +}); +spreadsheet.parse(data); + +spreadsheet.selection.disable(); +~~~ + +### 详情 {#details} + +该方法会: + +- 结束单元格的编辑并保存已输入的值 +- 移除每个工作表中的选中单元格和活动单元格 +- 在调用 [`enable()`](api/selection_enable_method.md) 方法之前,忽略通过鼠标、键盘和 API 进行的选择操作 + +关闭选择功能后,[`getSelectedCell()`](api/selection_getselectedcell_method.md) 和 [`getFocusedCell()`](api/selection_getfocusedcell_method.md) 方法将返回 `undefined`。其他效果与 [`selection: false`](api/spreadsheet_selection_config.md#details) 配置选项相同。 + +如果选择功能已处于关闭状态,则该方法不执行任何操作。 + +**更新日志:** 在 v6.0.4 中新增 + +**相关文章:** +- [`selection`](api/spreadsheet_selection_config.md) +- [`enable()`](api/selection_enable_method.md) +- [无障碍:只读设置](accessibility.md#read-only-setup) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_enable_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_enable_method.md new file mode 100644 index 00000000..878e2972 --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_enable_method.md @@ -0,0 +1,42 @@ +--- +sidebar_label: enable() +title: enable selection 方法 +description: 通过 selection.enable() 方法重新开启 DHTMLX Spreadsheet 中的单元格选择功能,该方法会将 A1 单元格设为活动单元格并触发选择相关事件。 +--- + +# enable() + +### 描述 {#description} + +@short: 开启单元格选择功能 + +### 用法 {#usage} + +~~~jsx +enable(): void; +~~~ + +### 示例 {#example} + +~~~jsx {7} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, + // 其他配置参数 +}); +spreadsheet.parse(data); + +spreadsheet.selection.enable(); +~~~ + +### 详情 {#details} + +该方法会将当前工作表的 A1 单元格设为活动单元格。针对 A1 单元格会触发 [`beforeSelectionSet`](api/spreadsheet_beforeselectionset_event.md)、[`beforeFocusSet`](api/spreadsheet_beforefocusset_event.md)、[`afterFocusSet`](api/spreadsheet_afterfocusset_event.md) 和 [`afterSelectionSet`](api/spreadsheet_afterselectionset_event.md) 事件。 + +如果选择功能已处于开启状态,则该方法不执行任何操作。 + +**更新日志:** 在 v6.0.4 中新增 + +**相关文章:** +- [`selection`](api/spreadsheet_selection_config.md) +- [`disable()`](api/selection_disable_method.md) +- [无障碍:只读设置](accessibility.md#read-only-setup) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md new file mode 100644 index 00000000..aa24216b --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md @@ -0,0 +1,41 @@ +--- +sidebar_label: isDisabled() +title: isDisabled selection 方法 +description: 通过 selection.isDisabled() 方法检查 DHTMLX Spreadsheet 中的单元格选择功能是否已关闭。 +--- + +# isDisabled() + +### 描述 {#description} + +@short: 检查单元格选择功能是否已关闭 + +### 用法 {#usage} + +~~~jsx +isDisabled(): boolean; +~~~ + +### 返回值 {#returns} + +如果选择功能已关闭,该方法返回 `true`;否则返回 `false` + +### 示例 {#example} + +~~~jsx {7} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, + // 其他配置参数 +}); +spreadsheet.parse(data); + +const disabled = spreadsheet.selection.isDisabled(); // -> true +~~~ + +**更新日志:** 在 v6.0.4 中新增 + +**相关文章:** +- [`selection`](api/spreadsheet_selection_config.md) +- [`enable()`](api/selection_enable_method.md) +- [`disable()`](api/selection_disable_method.md) +- [无障碍:只读设置](accessibility.md#read-only-setup) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md index 914cab5f..e8cb55ef 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setFocusedCell() title: setFocusedCell selection 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 setFocusedCell selection 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 selection.setFocusedCell() 方法在 DHTMLX Spreadsheet 中激活单元格并将键盘焦点移到该单元格。 --- # setFocusedCell() @@ -13,12 +13,13 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 se ### 用法 {#usage} ~~~jsx -setFocusedCell(cell: string): void; +setFocusedCell(cell: string, scroll?: boolean): void; ~~~ ### 参数 {#parameters} - `cell` - (必填)要设置焦点的单元格 id +- `scroll` - (可选)是否将 Spreadsheet 滚动到该单元格,默认为 `true` ### 示例 {#example} @@ -31,4 +32,24 @@ spreadsheet.parse(data); spreadsheet.selection.setFocusedCell("D4"); ~~~ -**相关文章:** [使用 Spreadsheet](working_with_ssheet.md) +### 详情 {#details} + +该方法会激活指定的单元格,并在重绘后将键盘焦点移到该单元格。在以下情况下,键盘焦点不会被移动: + +- 焦点位于 Spreadsheet 之外的元素中 +- 焦点通过键盘位于工具栏、菜单或工作表标签上 +- 焦点位于已打开的单元格编辑器中 + +如果键盘焦点位于页面 body 上(例如页面刚加载完成时),该方法会将焦点移到该单元格。 + +通过其他方式更改活动单元格(例如通过其他 API 方法)时,同样适用上述规则。 + +如果 [`beforeFocusSet`](api/spreadsheet_beforefocusset_event.md) 事件的处理函数返回 `false`,则活动单元格不会改变,键盘焦点也不会移动。 + +当通过 [`selection: false`](api/spreadsheet_selection_config.md) 配置项或 [`selection.disable()`](api/selection_disable_method.md) 方法关闭 selection 时,该方法不执行任何操作。 + +**更新日志:** 将键盘焦点移到单元格的功能在 v6.0.4 中新增 + +**相关文章:** +- [使用 Spreadsheet](working_with_ssheet.md) +- [无障碍访问:键盘导航](accessibility.md#keyboard-navigation) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md index 7bd1af66..c81ed84f 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md @@ -13,12 +13,13 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 se ### 用法 {#usage} ~~~jsx -setSelectedCell(cell: string): void; +setSelectedCell(cell: string, scroll?: boolean): void; ~~~ ### 参数 {#parameters} - `cell` - (必填)选中单元格的 id 或单元格区域 +- `scroll` - (可选)是否将 Spreadsheet 滚动到该单元格,默认为 `true` ### 示例 {#example} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md index f6bfa8c2..81e2619d 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md @@ -13,7 +13,21 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 af ### 用法 {#usage} ~~~jsx -afterAction: (action: string, config: object) => void; +afterAction: ( + action: string, + config: { + action?: string, + cell?: string, + row?: number, + col?: number, + val?: any, + prev?: any, + groupAction?: string, + pageId?: string | number, + pageName?: string, + // other properties of the action + } | object[] +) => void; ~~~ ### 参数 {#parameters} @@ -21,7 +35,18 @@ afterAction: (action: string, config: object) => void; 事件的 callback 接收以下参数: - `action` - (必填)操作名称。查看可用操作的完整列表,请参阅[此处](api/overview/actions_overview.md#list-of-actions) -- `config` - (必填)包含操作参数的对象 +- `config` - (必填)包含操作参数的对象。属性集合取决于具体操作。该对象可包含: + - `action` - (可选)操作名称 + - `cell` - (可选)操作所应用的单元格或单元格区域的 id,例如 `"A1"` 或 `"B2:D5"` + - `row` - (可选)该单元格所在行的从零开始的索引 + - `col` - (可选)该单元格所在列的从零开始的索引 + - `val` - (可选)操作应用的新值,例如单元格的值、样式或尺寸 + - `prev` - (可选)先前的值 + - `groupAction` - (可选)当 `cell` 为单元格区域时,代替 `action` 执行的操作名称,例如 `"groupAction"`、`"groupRowAction"` 或 `"resizeCol"` + - `pageId` - (可选)工作表的 id + - `pageName` - (可选)工作表的名称 + + 当多个操作一起执行时(例如粘贴时),`action` 参数为 `"groupAction"`,`config` 是由此类对象组成的数组。 ### 示例 {#example} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md new file mode 100644 index 00000000..56dafb46 --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md @@ -0,0 +1,67 @@ +--- +sidebar_label: announce() +title: announce 方法 +description: 通过 announce() 方法向 DHTMLX Spreadsheet 的屏幕阅读器用户发送状态消息,例如报告自定义工具栏或菜单命令的执行结果。 +--- + +# announce() + +### 描述 {#description} + +@short: 向屏幕阅读器用户播报一条消息 + +### 用法 {#usage} + +~~~jsx +announce(message: string): void; +~~~ + +### 参数 {#parameters} + +- `message` - (必填)要播报的文本。传入空字符串将清除消息 + +### 示例 {#example} + +在下面的示例中,自定义菜单命令会统计所选范围内的空单元格数量,并播报统计结果: + +~~~jsx {18} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + menu: true, + // other config parameters +}); +spreadsheet.parse(data); + +spreadsheet.menu.data.add({ + id: "count-empty", + value: "Count empty cells" +}); + +spreadsheet.menu.events.on("click", function (id) { + if (id === "count-empty") { + let count = 0; + spreadsheet.eachCell(function (cell, value) { + if (value === "" || value === undefined || value === null) count++; + }, spreadsheet.selection.getSelectedCell()); + spreadsheet.announce(count + " empty cells in the selection"); + } +}); +~~~ + +### 详情 {#details} + +使用该方法可以向屏幕阅读器用户告知某个没有自身可见元素的操作的结果,例如自定义工具栏或菜单命令。 + +消息会发送到紧随网格元素之后的一个视觉隐藏的实时区域(`role="status"`、`aria-live="polite"`、`aria-atomic="true"`)。屏幕阅读器会在读完当前语音后朗读该消息,且键盘焦点不会移动。 + +Spreadsheet 自身的消息也通过同一区域播报:所选范围、新的公式错误和无效值、被拒绝的编辑、搜索结果、导入和导出的开始与结束,以及新的列宽和行高(参见[状态播报列表](accessibility.md#status-announcements))。该区域一次只保存一条消息,因此后到的消息(无论是您自己的还是内置的)会替换前一条。 + +如果传入的文本与该区域当前的文本相同,屏幕阅读器会再次朗读它。 + +该方法在[只读模式](api/spreadsheet_readonly_config.md)下以及[选择](api/spreadsheet_selection_config.md)功能关闭时同样有效。在 Spreadsheet 附加到页面之前以及调用 `destructor()` 方法之后,该方法不执行任何操作。 + +**更新日志:** 在 v6.0.4 中新增 + +**相关文章:** +- [状态播报](accessibility.md#status-announcements) +- [播报自定义命令](accessibility.md#announcing-a-custom-command) +- [自定义菜单](customization.md#menu) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md index 46cb7834..3c968fae 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md @@ -13,7 +13,21 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 be ### 用法 {#usage} ~~~jsx -beforeAction: (action: string, config: object) => void | boolean; +beforeAction: ( + action: string, + config: { + action?: string, + cell?: string, + row?: number, + col?: number, + val?: any, + prev?: any, + groupAction?: string, + pageId?: string | number, + pageName?: string, + // other properties of the action + } | object[] +) => void | boolean; ~~~ ### 参数 {#parameters} @@ -21,7 +35,18 @@ beforeAction: (action: string, config: object) => void | boolean; 事件的回调函数接受以下参数: - `action` - (必填)操作的名称。完整的可用操作列表请查看[此处](api/overview/actions_overview.md#list-of-actions) -- `config` - (必填)包含操作参数的对象 +- `config` - (必填)包含操作参数的对象。属性集合取决于具体操作。该对象可包含: + - `action` - (可选)操作名称 + - `cell` - (可选)操作所应用的单元格或单元格区域的 id,例如 `"A1"` 或 `"B2:D5"` + - `row` - (可选)该单元格所在行的从零开始的索引 + - `col` - (可选)该单元格所在列的从零开始的索引 + - `val` - (可选)操作应用的新值,例如单元格的值、样式或尺寸 + - `prev` - (可选)先前的值 + - `groupAction` - (可选)当 `cell` 为单元格区域时,代替 `action` 执行的操作名称,例如 `"groupAction"`、`"groupRowAction"` 或 `"resizeCol"` + - `pageId` - (可选)工作表的 id + - `pageName` - (可选)工作表的名称 + + 当多个操作一起执行时(例如粘贴时),`action` 参数为 `"groupAction"`,`config` 是由此类对象组成的数组。 ### 返回值 {#returns} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md index 1deb43a7..daccfec1 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md @@ -1,7 +1,7 @@ --- sidebar_label: deleteColumn() title: deleteColumn 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 deleteColumn 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费试用版本。 +description: 使用 deleteColumn() 方法从 DHTMLX Spreadsheet 中删除一列或一个列区域,包括合并单元格所跨的所有列。 --- # deleteColumn() @@ -11,7 +11,9 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 de @short: 从电子表格中删除一列 :::info -该方法会查找指定单元格,选中它,删除该单元格所在的列,并将左侧的列移至该位置。 +该方法会删除指定单元格所在的列,并将其右侧的列向左移动。 + +如果该单元格位于合并单元格内,该方法会删除合并单元格所跨的每一列。 ::: ### 用法 {#usage} @@ -35,7 +37,27 @@ spreadsheet.deleteColumn("G2"); ~~~ :::note -您可以通过提供单元格 id 范围作为方法参数来删除多列,例如:"A1:C3"。 +您可以通过提供单元格 id 范围作为方法参数来删除多列,例如:"A1:C3"。如果该区域涉及合并单元格,则会删除整个合并单元格所跨的列。覆盖整列的区域(例如在有 100 行的工作表中的 "B1:C100")将按原样删除。 ::: -**相关文章:** [使用电子表格](working_with_ssheet.md#addingremoving-rows-and-columns) +### 详情 {#details} + +删除合并单元格内的某一列时,整个合并单元格及其所有列都会被删除: + +~~~jsx +spreadsheet.mergeCells("B2:D2"); + +// removes columns B, C and D +spreadsheet.deleteColumn("C2"); +~~~ + +删除整列时,跨越这些列的合并单元格会变小。位于被删除列右侧的合并单元格会连同其列一起向左移动。如果被删除的列是固定列,则固定区域会减少被删除的固定列数。 + +`"deleteColumn"` 操作的 [`beforeAction`](api/spreadsheet_beforeaction_event.md) 和 [`afterAction`](api/spreadsheet_afteraction_event.md) 事件接收的是传给该方法的单元格,而不是被删除列的区域。 + +**更新日志:** 删除合并单元格的所有列的功能在 v6.0.4 中新增 + +**相关文章:** +- [使用行和列](work_with_rows_cols.md#removing-columns) +- [合并单元格](merge_cells.md#removing-rows-and-columns-of-merged-cells) +- [使用电子表格](working_with_ssheet.md#addingremoving-rows-and-columns) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md index a9492ccf..32a45a02 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md @@ -1,7 +1,7 @@ --- sidebar_label: deleteRow() title: deleteRow 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 deleteRow 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费试用版本。 +description: 使用 deleteRow() 方法从 DHTMLX Spreadsheet 中删除一行或一个行区域,包括合并单元格所跨的所有行。 --- # deleteRow() @@ -11,7 +11,9 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 de @short: 从电子表格中删除一行 :::info -该方法会查找指定单元格,选中它,删除该单元格所在的行,并将下方的行移至该位置。 +该方法会删除指定单元格所在的行,并将其下方的行向上移动。 + +如果该单元格位于合并单元格内,该方法会删除合并单元格所跨的每一行。 ::: ### 用法 {#usage} @@ -35,7 +37,27 @@ spreadsheet.deleteRow("G2"); ~~~ :::note -您可以通过提供单元格 id 范围作为方法参数来删除多行,例如:"A1:C3"。 +您可以通过提供单元格 id 范围作为方法参数来删除多行,例如:"A1:C3"。如果该区域涉及合并单元格,则会删除整个合并单元格所跨的行。覆盖整行的区域(例如在 A 到 Z 列的工作表中的 "A2:Z3")将按原样删除。 ::: -**相关文章:** [使用电子表格](working_with_ssheet.md#addingremoving-rows-and-columns) +### 详情 {#details} + +删除合并单元格内的某一行时,整个合并单元格及其所有行都会被删除: + +~~~jsx +spreadsheet.mergeCells("B2:B4"); + +// removes rows 2, 3 and 4 +spreadsheet.deleteRow("B3"); +~~~ + +删除整行时,跨越这些行的合并单元格会变小。位于被删除行下方的合并单元格会连同其行一起向上移动。如果被删除的行是固定行,则固定区域会减少被删除的固定行数。 + +`"deleteRow"` 操作的 [`beforeAction`](api/spreadsheet_beforeaction_event.md) 和 [`afterAction`](api/spreadsheet_afteraction_event.md) 事件接收的是传给该方法的单元格,而不是被删除行的区域。 + +**更新日志:** 删除合并单元格的所有行的功能在 v6.0.4 中新增 + +**相关文章:** +- [使用行和列](work_with_rows_cols.md#removing-rows) +- [合并单元格](merge_cells.md#removing-rows-and-columns-of-merged-cells) +- [使用电子表格](working_with_ssheet.md#addingremoving-rows-and-columns) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md index 3be12162..00546e85 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md @@ -1,7 +1,7 @@ --- sidebar_label: readonly title: readonly 配置项 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 readonly 配置项。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 readonly 属性开启 DHTMLX Spreadsheet 的只读模式,该模式会阻止数据更改,但保留键盘导航、选择、复制和搜索功能。 --- # readonly @@ -31,9 +31,41 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { }); ~~~ +### 详情 {#details} + +在只读模式下,工具栏、菜单和公式栏会被隐藏,上下文菜单和列菜单图标不可用。工作表标签保留,但没有添加工作表的按钮、工作表上下文菜单,也不能通过双击重命名。 + +用户仍然可以阅读和复制数据: + +- 数据加载后,A1 单元格处于激活状态 +- 可以使用键盘在单元格间导航并用鼠标选择单元格,这些操作会触发 selection 事件 +- 可以使用 `Ctrl (Cmd) + C` 复制单元格,使用 `Ctrl (Cmd) + F` 搜索 +- 可以在工作表标签中以及通过键盘切换工作表 +- 可以打开单元格中的链接,但链接弹窗中用于编辑和删除链接的按钮被禁用 + +数据更改会被拒绝: + +- 输入、编辑键、剪切和粘贴、撤销和重做,以及用于设置单元格格式、插入链接、添加工作表或显示隐藏行和列的快捷键都会被忽略,屏幕阅读器会播报“The sheet is read-only” +- 编辑数据的方法(例如 [`setValue()`](api/spreadsheet_setvalue_method.md)、[`setStyle()`](api/spreadsheet_setstyle_method.md) 和 [`deleteRow()`](api/spreadsheet_deleterow_method.md))以及 [`startEdit()`](api/spreadsheet_startedit_method.md) 方法会被忽略。[`parse()`](api/spreadsheet_parse_method.md) 和 [`load()`](api/spreadsheet_load_method.md) 方法仍可加载数据 +- 填充柄被隐藏 +- 不能通过拖动边框来调整列和行的大小,双击列边框也不会使列宽适应数据 + +若要同时关闭键盘导航和选择功能,请将 [`selection`](api/spreadsheet_selection_config.md) 选项设置为 `false`。此时 Spreadsheet 没有活动单元格,也无法通过鼠标、键盘或 API 选择单元格: + +~~~jsx {3} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, + selection: false, + // other config parameters +}); +~~~ + +**更新日志:** 只读模式下的键盘导航、选择、复制和搜索功能在 v6.0.4 中新增 + **相关文章:** - [配置](configuration.md#read-only-mode) - [自定义](customization.md#custom-read-only-mode) +- [无障碍访问:只读设置](accessibility.md#read-only-setup) **相关示例:** [Spreadsheet. 只读模式](https://snippet.dhtmlx.com/2w959gx2) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md new file mode 100644 index 00000000..20b0f109 --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md @@ -0,0 +1,63 @@ +--- +sidebar_label: selection +title: selection 配置 +description: 通过 selection 属性关闭 DHTMLX Spreadsheet 中的单元格选择功能(可单独使用,也可与只读模式结合使用),以在没有活动单元格的情况下展示数据。 +--- + +# selection + +### 描述 {#description} + +@short: 可选。启用/禁用单元格选择功能 + +### 用法 {#usage} + +~~~jsx +selection?: boolean; +~~~ + +### 默认配置 {#default-config} + +~~~jsx +selection: true +~~~ + +### 示例 {#example} + +~~~jsx {2} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, + // other config parameters +}); +~~~ + +### 详情 {#details} + +当该属性设置为 `false` 时: + +- Spreadsheet 没有活动单元格 +- 无法通过鼠标、键盘或 API 选择单元格:[`setSelectedCell()`](api/selection_setselectedcell_method.md) 和 [`setFocusedCell()`](api/selection_setfocusedcell_method.md) 方法会被忽略,[`getSelectedCell()`](api/selection_getselectedcell_method.md) 和 [`getFocusedCell()`](api/selection_getfocusedcell_method.md) 方法返回 `undefined` +- 无法通过界面编辑单元格:公式栏被锁定,填充柄被隐藏,[`startEdit()`](api/spreadsheet_startedit_method.md) 方法会被忽略 +- 上下文菜单和列菜单图标不可用 +- `Tab` 键在网格上仅停留一次,然后将焦点移到后面的元素,`Ctrl + F6` 会跳过网格 + +仍可通过拖动边框调整列和行的大小,也仍可通过 API 更改数据,例如使用 [`setValue()`](api/spreadsheet_setvalue_method.md) 方法。 + +与 [`readonly`](api/spreadsheet_readonly_config.md) 属性结合使用时,该选项会关闭只读模式下可用的键盘导航和选择功能: + +~~~jsx {3} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, + selection: false, + // other config parameters +}); +~~~ + +若要在运行时关闭和开启选择功能,请使用 [`selection.disable()`](api/selection_disable_method.md) 和 [`selection.enable()`](api/selection_enable_method.md) 方法。 + +**更新日志:** 在 v6.0.4 中新增 + +**相关文章:** +- [单元格选择](configuration.md#selection-of-cells) +- [只读模式](configuration.md#read-only-mode) +- [无障碍:只读设置](accessibility.md#read-only-setup) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md index f59ed30f..d9719341 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md @@ -35,4 +35,10 @@ spreadsheet.parse(data); spreadsheet.startEdit(); ~~~ +### 详情 {#details} + +在活动单元格中输入内容时,会通过该方法开始编辑。使用输入法编辑器 (IME) 组合的文本会在组合结束时作为 `initialValue` 传入。因此 [`beforeEditStart`](api/spreadsheet_beforeeditstart_event.md) 和 [`afterEditStart`](api/spreadsheet_aftereditstart_event.md) 事件会接收到输入或组合的文本,并且 `beforeEditStart` 可以取消编辑。 + +**更新日志:** 使用 IME 组合的文本开始编辑的功能在 v6.0.4 中新增 + **相关文章:** [使用电子表格](working_with_cells.md#editing-a-cell) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/configuration.md b/i18n/zh/docusaurus-plugin-content-docs/current/configuration.md index 40916c7d..90121ec5 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/configuration.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/configuration.md @@ -1,7 +1,7 @@ --- sidebar_label: 配置 title: 配置 -description: 您可以在文档中了解 DHTMLX JavaScript Spreadsheet 库的配置方式。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 配置 DHTMLX Spreadsheet。设置工具栏、编辑栏、菜单、行数和列数、只读模式、单元格选择以及数字格式。 --- # 配置 {#configuration} @@ -48,10 +48,43 @@ Spreadsheet 的菜单默认隐藏。您可以通过相应的配置选项 [`menu` 您还可以通过 [`readonly`](api/spreadsheet_readonly_config.md) 配置选项启用只读模式,以防止对 Spreadsheet 单元格进行编辑。 +~~~jsx {2} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, +}); +~~~ + +在只读模式下,工具栏、菜单和公式栏会被隐藏。用户可以使用键盘在单元格间导航,使用鼠标选择单元格,以及复制和搜索单元格。编辑操作会被拒绝,并向屏幕阅读器播报"The sheet is read-only"。填充柄会被隐藏。详细信息请参阅 [`readonly`](api/spreadsheet_readonly_config.md#details) 文章。要了解键盘和屏幕阅读器用户如何使用只读 Spreadsheet,请参阅无障碍指南的[只读设置](accessibility.md#read-only-setup)部分。 + +要在只读模式下关闭键盘导航和选择,请将 [`selection`](api/spreadsheet_selection_config.md) 选项设置为 `false`: + +~~~jsx {3} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + readonly: true, + selection: false, +}); +~~~ + 您也可以[自定义 Spreadsheet 的只读行为](customization.md#custom-read-only-mode)。 +## 单元格选择 {#selection-of-cells} + +默认情况下,用户可以使用鼠标和键盘选择单元格,并且 Spreadsheet 具有活动单元格。要关闭选择,请将 [`selection`](api/spreadsheet_selection_config.md) 配置选项设置为 `false`: + +~~~jsx {2} +const spreadsheet = new dhx.Spreadsheet("spreadsheet", { + selection: false, +}); +~~~ + +此时,Spreadsheet 没有活动单元格,无法通过界面选择或编辑单元格,上下文菜单也不可用。 + +要在运行时关闭和开启选择,请使用 [`selection.disable()`](api/selection_disable_method.md) 和 [`selection.enable()`](api/selection_enable_method.md) 方法。[`selection.isDisabled()`](api/selection_isdisabled_method.md) 方法用于检查选择是否已关闭。 + +没有选择时,网格会成为键盘可直接跳过的单个 Tab 停靠点。请参阅无障碍指南的[只读设置](accessibility.md#read-only-setup)部分。 + ## 单元格自定义数字格式 {#custom-number-formats-for-cells} 您可以对单元格值应用 7 种默认格式:"Common"(通用)、"Number"(数字)、"Percent"(百分比)、"Currency"(货币)、"Date"(日期)、"Time"(时间)、"Text"(文本)。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/customization.md b/i18n/zh/docusaurus-plugin-content-docs/current/customization.md index 1c8fa13f..70e3ddc5 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/customization.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/customization.md @@ -1,7 +1,7 @@ --- sidebar_label: 自定义 title: 自定义 -description: 您可以在文档中了解 DHTMLX JavaScript Spreadsheet 库的自定义方式。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 自定义 DHTMLX Spreadsheet。更改图标,添加、更新和删除工具栏、菜单和上下文菜单的控件,或构建自定义只读模式。 --- # 自定义 {#customization} @@ -31,6 +31,8 @@ DHTMLX Spreadsheet 默认使用基于 [Material Design](https://pictogrammers.co 您可以添加以下类型的控件:`button`、`menuItem`、`separator` 和 `spacer`。 +与[默认工具栏](#default-controls)的其他控件一样,*文字颜色*和*背景颜色*控件,以及*边框*弹出窗口中的*边框颜色*控件,均为 [`navItem`](https://docs.dhtmlx.com/suite/toolbar/navitem/) 类型。它们通过 [`html`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/) 属性绘制当前颜色,通过 [`value`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/) 属性获取无障碍名称(例如"Text color: dark gray"),并打开颜色弹出窗口。当活动单元格更改时,Spreadsheet 会更新*文字颜色*和*背景颜色*控件的这两个属性;选择边框颜色时,会更新*边框颜色*控件的这两个属性。 + `button` 对象具有以下属性: - `type` - 按钮类型,设置为 "button" @@ -379,7 +381,8 @@ spreadsheet.menu.data.remove("undo"); - **列(Columns)** menuItem(id: "columns") - *添加列(Add column)* menuItem(id: "add-col") - *删除列(Remove column)* menuItem(id: "remove-col") - - *适应数据宽度(Fit to data)* menuItem(id: "fit-col") + - *适应数据宽度(Fit to data)* menuItem(id: "fit-col"),显示在列菜单中以及选中整列时 + - *列宽(Column width)* menuItem(id: "col-width") - 分隔符 - *取消冻结列(Unfreeze columns)* menuItem(id: "unfreeze-cols") - *冻结到第 [id] 列(Freeze up to column [id])* menuItem(id: "freeze-cols") @@ -388,6 +391,7 @@ spreadsheet.menu.data.remove("undo"); - **行(Rows)** menuItem(id: "rows") - *添加行(Add row)* menuItem(id: "add-row") - *删除行(Remove row)* menuItem(id: "remove-row") + - *行高(Row height)* menuItem(id: "row-height") - 分隔符 - *取消冻结行(Unfreeze rows)* menuItem(id: "unfreeze-rows") - *冻结到第 [id] 行(Freeze up to row [id])* menuItem(id: "freeze-rows") @@ -396,6 +400,7 @@ spreadsheet.menu.data.remove("undo"); - **排序(Sort)** menuItem(id: "sort") - *升序排序(Sort A to Z)* menuItem(id: "asc-sort") - *降序排序(Sort Z to A)* menuItem(id: "desc-sort") +- **打开筛选(Open filter)** menuItem(id: "open-filter"),当活动单元格带有筛选图标时显示 - **插入链接(Insert link)** menuItem(id: "link") ### 添加控件 {#adding-controls-3} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/data_search.md b/i18n/zh/docusaurus-plugin-content-docs/current/data_search.md index efe458d8..a781e454 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/data_search.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/data_search.md @@ -1,7 +1,7 @@ --- sidebar_label: 搜索数据 title: 搜索数据 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解数据搜索的相关内容。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用搜索栏在 DHTMLX Spreadsheet 中搜索数据。通过 Ctrl(Cmd)+ F 或"数据"菜单打开搜索栏,在匹配项之间移动,并使用 Esc 关闭。 --- # 搜索数据 {#searching-for-data} @@ -12,3 +12,11 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解数 - 或通过菜单操作:*数据* -> *搜索* ![DHTMLX Spreadsheet 搜索栏,带有用于查找数据的文本输入框](/img/search_data.png) + +在搜索栏中输入要查找的文本。包含该文本的第一个单元格会被高亮并滚动到可见区域,计数器显示匹配项的数量。要在匹配项之间移动,请单击搜索栏中的箭头按钮。 + +编辑单元格以及切换到另一个工作表后,搜索结果会更新。停止输入后,屏幕阅读器会播报匹配项数量和第一个匹配项的地址,例如 "Results: 5. 1 of 5, B2" 或 "No results"。移动到另一个匹配项时,会播报其位置和地址,例如 "2 of 5, B7"。 + +要关闭搜索栏,请按 **Esc** 或单击关闭按钮。焦点会返回到活动单元格。 + +要通过 API 搜索数据,请使用 [`search()`](api/spreadsheet_search_method.md) 方法。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/excel_import_export.md b/i18n/zh/docusaurus-plugin-content-docs/current/excel_import_export.md index a3ab0d99..a76acd88 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/excel_import_export.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/excel_import_export.md @@ -1,7 +1,7 @@ --- sidebar_label: Excel 导入/导出 title: Excel 导入与导出 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 Excel 导入与导出的相关内容。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 通过工具栏或"文件"菜单,将 Excel 文件中的数据导入 DHTMLX Spreadsheet,并导出为 .xlsx 文件。 --- # Excel 导入/导出 {#excel-importexport} @@ -37,3 +37,9 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 Ex ![DHTMLX Spreadsheet 文件菜单中用于导出 Microsoft Excel XLSX 文件的"下载为"选项](/img/file_export.png) 2\. 在您的下载目录中查找包含 Spreadsheet 数据的 Excel 文件。 + +屏幕阅读器会播报导入和导出的开始与结束。 + +:::note +Excel 文件的导入和导出使用 WebAssembly。如果浏览器不支持 WebAssembly,"导入"和"导出"命令会显示一条消息,内容为 `wasmNotSupported` [本地化](localization.md#default-locale)键的文本。使用 `"xlsx"` 类型的 [`load()`](api/spreadsheet_load_method.md) 方法和 [`export.xlsx()`](api/export_xlsx_method.md) 方法会抛出带有相同文本的 `Error`,您可以在代码中捕获它。 +::: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/filtering_data.md b/i18n/zh/docusaurus-plugin-content-docs/current/filtering_data.md index 332a8c85..285753f6 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/filtering_data.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/filtering_data.md @@ -1,7 +1,7 @@ --- sidebar_label: 筛选数据 title: 筛选数据 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解数据筛选的相关内容。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 按条件或按值筛选 DHTMLX Spreadsheet 中的数据,使用键盘打开筛选器,并清除或移除筛选。 --- # 筛选数据 {#filtering-data} @@ -20,6 +20,20 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解数 之后,**筛选**图标将出现在选定范围内每个列标题的右侧。 +## 使用键盘打开筛选器 {#opening-a-filter-with-the-keyboard} + +不使用鼠标打开某一列的筛选器: + +- 将活动单元格移动到带有**筛选**图标的列标题单元格 + +- 按 `Shift + F10` 或 Menu 键调出上下文菜单,然后选择*打开筛选* + +![DHTMLX Spreadsheet 带有筛选图标的标题单元格的上下文菜单,其中"打开筛选"命令处于焦点状态](/img/open_filter_context_menu.png) + +*打开筛选*命令仅在带有**筛选**图标的单元格的上下文菜单中显示。右键单击此类单元格后,您也可以选择该命令。在[只读模式](api/spreadsheet_readonly_config.md)下,上下文菜单和*打开筛选*命令不可用。 + +筛选弹出窗口会获得焦点,`Tab` 键在其控件之间移动。`Esc` 键关闭弹出窗口并使焦点返回到单元格。如果弹出窗口中打开了下拉列表或日期选择器,`Esc` 会先关闭它。 + ## 按条件筛选 {#filtering-by-condition} - 单击目标列的**筛选**图标 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/guides.md b/i18n/zh/docusaurus-plugin-content-docs/current/guides.md index b3f8e60f..3a4da196 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/guides.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/guides.md @@ -1,12 +1,12 @@ --- sidebar_label: 指南概览 title: 开发者与用户指南 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中查阅开发者与用户指南。浏览 API 参考、尝试代码示例和在线演示,并下载免费 30 天试用版 DHTMLX Spreadsheet。 +description: DHTMLX Spreadsheet 的开发者指南和用户指南,涵盖初始化、配置、数据加载,以及单元格编辑、格式设置和工作表操作。 --- # 指南 {#guides} -DHTMLX Spreadsheet 提供了丰富的功能:支持多种格式的数据导入与导出、便捷的单元格内容与样式操作、灵活的表格结构、只读模式、广泛的外观自定义,以及与主流框架的集成。 +DHTMLX Spreadsheet 提供了丰富的功能:支持多种格式的数据导入与导出、便捷的单元格内容与样式操作、灵活的表格结构、只读模式、广泛的外观自定义、键盘和屏幕阅读器无障碍支持,以及与主流框架的集成。 ## 开发者指南 {#developer-guides} @@ -38,6 +38,12 @@ DHTMLX Spreadsheet 提供了丰富的功能:支持多种格式的数据导入 - [与 Svelte 集成](svelte_integration.md) - 在 Svelte 应用中使用 Spreadsheet 的 GitHub 示例 - [与 Vue.js 集成](vuejs_integration.md) - 在 Vue 应用中使用 Spreadsheet 的 GitHub 示例 +### 无障碍 {#accessibility} + +- [无障碍](accessibility.md) - WAI-ARIA 支持、键盘导航、屏幕阅读器播报和高对比度主题 +- [设置无障碍的 Spreadsheet](accessibility.md#configuration-recipes) - 面向键盘和屏幕阅读器用户的配置,包括只读模式 +- [符合性报告(VPAT)](accessibility_conformance_report.md) - 对 WCAG 2.2 AA、Section 508 和 EN 301 549 的符合情况 + ### AI 辅助开发 {#ai-assisted-development} - [DHTMLX MCP 服务器](mcp-server.md) - 将 AI 编程助手连接到实时 Spreadsheet 文档 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/hotkeys.md b/i18n/zh/docusaurus-plugin-content-docs/current/hotkeys.md index 3e10c1f6..2df2c5cc 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/hotkeys.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/hotkeys.md @@ -1,13 +1,21 @@ --- sidebar_label: 快捷键列表 title: 快捷键 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解快捷键的相关内容。浏览开发者指南和 API 参考、尝试代码示例和在线演示,并下载免费 30 天试用版 DHTMLX Spreadsheet。 +description: DHTMLX Spreadsheet 的键盘快捷键:编辑、格式化、导航、选择、搜索、使用工作表、行和列、弹窗及对话框。 --- # 快捷键列表 {#hot-keys-list} 以下是在使用 DHTMLX Spreadsheet 时可以使用的快捷键列表。 +:::note +单元格快捷键在焦点位于单元格或公式栏时有效。格式化、撤销、搜索、链接和添加工作表的快捷键在焦点位于工具栏时也有效。当焦点位于工具栏、菜单栏或工作表标签页时,方向键、**Home**、**End**、**Enter** 和 **Space** 在该栏内起作用(请参见[移动焦点](#moving-the-focus))。 + +在[只读模式](api/spreadsheet_readonly_config.md)下,导航、选择、复制和搜索的快捷键有效。会修改工作表的快捷键(包括 **Ctrl (Cmd) + Shift + 9**、**Ctrl (Cmd) + Shift + 0** 和 **Shift + F11**)会被拒绝,屏幕阅读器会播报 "The sheet is read-only"。上下文菜单不可用,因此 **Shift + F10** 和 Menu 键不起作用。 + +要了解键盘导航如何配合屏幕阅读器使用,请查看[无障碍](accessibility.md#keyboard-navigation)指南。 +::: + ## 编辑 {#editing} @@ -28,6 +36,10 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解快 + + + +
Esc 关闭单元格中的编辑器,不保存更改
Alt (Option) + Enter在新标签页中打开活动单元格的链接
@@ -114,43 +126,43 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解快 Shift + Enter - 将选中项向上移动一个单元格(在列中)。如果选中了单元格区域,则在区域范围内向上移动一个单元格。到达列的第一个单元格时停止。 + 将选中项向上移动一个单元格(在列中)。如果选中了单元格区域,则在区域范围内向上移动一个单元格。 Tab - 将选中项向右移动一个单元格(在行中)。如果选中了单元格区域,则在区域范围内向右移动一个单元格。到达行的最右侧单元格时停止。 + 将选中项向右移动一个单元格(在行中)。从最右侧单元格开始,将选中项移至同一行的第一个单元格。如果选中了单元格区域,则在区域范围内向右移动一个单元格。从工作表的最后一个单元格开始,保存已编辑的值,并将焦点从单元格移至页面的下一部分,例如工作表标签页。 Tab + Shift - 将选中项向左移动一个单元格(在行中)。如果选中了单元格区域,则在区域范围内向左移动一个单元格。到达行的最左侧单元格时停止。 + 将选中项向左移动一个单元格(在行中)。从最左侧单元格开始,将选中项移至同一行的最后一个单元格。如果选中了单元格区域,则在区域范围内向左移动一个单元格。从工作表的第一个单元格开始,保存已编辑的值,并将焦点从单元格移至页面的上一部分,例如公式栏。 方向键 - 在工作表的单元格之间导航 + 在工作表的单元格之间导航。在第一个和最后一个可见的行和列处停止。如果选中了单元格区域,在工作表边缘按方向键会将区域折叠为活动单元格 Home - 将选中项移至行中的第一个单元格 + 将选中项移至行中的第一个可见单元格 End - 将选中项移至行中的最后一个单元格 + 将选中项移至行中的最后一个可见单元格 Ctrl (Cmd) + 左方向键 - 将选中项移至行中的第一个单元格 + 将选中项移至行中的第一个可见单元格 Ctrl (Cmd) + 右方向键 - 将选中项移至行中的最后一个单元格 + 将选中项移至行中的最后一个可见单元格 Ctrl (Cmd) + 上方向键 - 将选中项移至列中的第一个单元格 + 将选中项移至列中的第一个可见单元格 Ctrl (Cmd) + 下方向键 - 将选中项移至列中的最后一个单元格 + 将选中项移至列中的最后一个可见单元格 Ctrl (Cmd) + Home @@ -175,6 +187,59 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解快 +## 移动焦点 {#moving-the-focus} + +工具栏、菜单栏和工作表标签页各自是单个 Tab 停靠点:Tab 将焦点移入和移出某个栏,焦点会落在最后使用过的控件上。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ctrl + F6按以下顺序将焦点移至 Spreadsheet 的下一部分:菜单、工具栏、工作表(活动单元格)、工作表标签页,然后返回菜单。公式栏和隐藏的部分会被跳过。会先保存已编辑单元格的值
Ctrl + Shift + F6将焦点移至 Spreadsheet 的上一部分
Left Arrow/Right Arrow Key将焦点移至工具栏、菜单栏或工作表标签页的上一个/下一个控件
Home/End将焦点移至栏中的第一个/最后一个控件
Enter/Space按下获得焦点的控件:执行命令、打开下拉列表,或切换到获得焦点的标签页所对应的工作表
Down Arrow Key打开获得焦点的控件的下拉列表,并将焦点移至其第一项
Up Arrow/Down Arrow Key在已打开的下拉列表或菜单的各项之间移动焦点
Right Arrow Key打开获得焦点的菜单项的子菜单
Left Arrow Key关闭子菜单。在下拉列表的第一级中,关闭下拉列表并将焦点返回到其控件
Esc关闭下拉列表或菜单,并将焦点返回到打开它的控件。关闭工具栏控件的提示。如果不按 Esc,只要指针停留在提示上,提示就会保持打开
Shift + F10 or Menu key打开活动单元格或获得焦点的工作表标签页的上下文菜单,并将焦点移入其中。在按下 Ctrl (Cmd) + Space 之后,单元格的上下文菜单会显示针对列的命令。Esc 关闭上下文菜单并将焦点返回到单元格
+ ## 搜索 {#search} @@ -185,11 +250,15 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解快 - + - + + + + +
Ctrl (Cmd) + G将选中项移至下一个匹配结果高亮显示下一个匹配结果
Ctrl (Cmd) + Shift + G将选中项移至上一个匹配结果高亮显示上一个匹配结果
Esc关闭搜索框,并将焦点返回到活动单元格
@@ -234,8 +303,110 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解快 在电子表格中添加新工作表 - Alt + 上方向键/下方向键 - 切换到下一个/上一个工作表 + Alt (Option) + Arrow Up + 切换到下一个工作表。从最后一个工作表切换到第一个 + + + Alt (Option) + Arrow Down + 切换到上一个工作表。从第一个工作表切换到最后一个 + + + Ctrl (Cmd) + Alt (Option) + Page Down + 切换到下一个工作表 + + + Ctrl (Cmd) + Alt (Option) + Page Up + 切换到上一个工作表 + + + + +## 使用行和列 {#work-with-rows-and-columns} + + + + + + + + + + + + +
Ctrl (Cmd) + Shift + 9显示所选区域内的隐藏行
Ctrl (Cmd) + Shift + 0显示所选区域内的隐藏列
+ +## 工具栏弹窗 {#toolbar-popups} + +以下按键在工具栏的 *Text color*、*Background color* 和 *Border* 控件的弹窗中有效。弹窗打开时会获得焦点。 + + + + + + + + + + + + + + + + + + + + + + + + +
Arrow keys在调色板的颜色之间或 Border 弹窗的控件之间移动焦点
Home/End将焦点移至调色板的第一个/最后一个颜色
Enter应用获得焦点的颜色或边框。应用文本颜色或背景颜色后,焦点返回到活动单元格
Esc从自定义颜色模式返回调色板。在 Border 弹窗之上打开的颜色或样式弹窗中,关闭该弹窗并将焦点返回到 Border 弹窗中的对应按钮。其他情况下,关闭弹窗并将焦点返回到其工具栏控件
Tab/Tab + Shift关闭弹窗并将焦点返回到其工具栏控件。在 Border 弹窗及其上打开的弹窗中,关闭所有弹窗并将焦点返回到 Border 控件。在自定义颜色模式中,在取色器的控件之间移动焦点
+ +## 列表编辑器 {#list-editor} + +以下按键在带有[值列表](api/spreadsheet_setvalidation_method.md)的单元格编辑器中有效。 + + + + + + + + + + + + + + + + + + + + +
Up Arrow/Down Arrow Key在值列表中移动
Enter选择该值并关闭编辑器
Esc关闭编辑器,不保存更改
Tab保存该值并将选中项向右移动一个单元格
+ +## 筛选器和对话框 {#filter-and-dialogs} + +以下按键在[筛选器](filtering_data.md#opening-a-filter-with-the-keyboard)的弹窗以及[列宽和行高](work_with_rows_cols.md#setting-column-width-and-row-height)对话框中有效。 + + + + + + + + + + + + + +
Esc关闭筛选器弹窗,并将焦点返回到单元格
Enter在列宽和行高对话框中应用尺寸
Esc关闭列宽和行高对话框,不应用更改
diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/localization.md b/i18n/zh/docusaurus-plugin-content-docs/current/localization.md index 851cf43e..38e51d9f 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/localization.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/localization.md @@ -1,7 +1,7 @@ --- sidebar_label: 本地化 title: 本地化 -description: 您可以在文档中了解 DHTMLX JavaScript Spreadsheet 库的本地化功能。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 本地化 DHTMLX Spreadsheet。了解默认语言区域、创建自定义语言区域、翻译内置组件和公式弹窗,以及应用语言区域。 --- # 本地化 {#localization} @@ -23,6 +23,8 @@ const en = { textColor: "Text color", backgroundColor: "Background color", + fontSize: "Font size", + bold: "Bold", italic: "Italic", underline: "Underline", @@ -60,6 +62,10 @@ const en = { addRow: "Add row above", removeRow: "Remove row {row}", removeRows: "Remove rows {row}", + columnWidth: "Column width", + rowHeight: "Row height", + widthInPixels: "Width in pixels", + heightInPixels: "Height in pixels", row: "row", col: "col", freeze: "Freeze", @@ -82,8 +88,10 @@ const en = { text: "Text", date: "Date", time: "Time", + scientific: "Scientific", filter: "Filter", + openFilter: "Open filter", help: "Help", @@ -104,6 +112,9 @@ const en = { border_style: "Border style", // Tabbar + // the name of a new sheet is this prefix followed by a number: sheet1, sheet2 + defaultSheetName: "sheet", + addSheet: "Add sheet", deleteSheet: "Delete", renameSheet: "Rename", renameSheetAlert: "A sheet with the name $name already exists. Please enter another name. ", @@ -114,10 +125,14 @@ const en = { export: "Export", downloadAs: "Download as...", importAs: "Import as...", + xlsxFormat: "Microsoft Excel(.xlsx)", data: "Data", validation: "Data validation", search: "Search", + previousMatch: "Previous match", + nextMatch: "Next match", + closeSearch: "Close search", sort: "Sort", ascSort: "Sort A to Z", descSort: "Sort Z to A", @@ -177,17 +192,105 @@ const en = { spanUnmergeLockedError: "You can't unmerge locked cells!", spanOverFilteredRow: "You can't merge cells over a filtered row.", removeAlert: "You can't remove last $name!", + wasmNotSupported: "WebAssembly is not supported by your browser", + invalidValue: "Invalid value", + + // Accessible names, read by screen readers + // accessible name of a color button; {label} is the name of the control, {color} is a name from the colorpicker locale + aria_colorButton: "{label}: {color}", + // accessible names of the toolbars; the screen reader adds the word "toolbar" itself + aria_toolbarFormatting: "Formatting", + aria_toolbarBorders: "Borders", + aria_toolbarSheets: "Sheets", + aria_toolbarSearch: "Search", + aria_toolbarLink: "Link", + // accessible names of the line styles in the border style list + aria_borderStyleThin: "Thin line", + aria_borderStyleMedium: "Medium line", + aria_borderStyleThick: "Thick line", + aria_borderStyleDashed: "Dashed line", + aria_borderStyleDotted: "Dotted line", + aria_borderStyleDouble: "Double line", + // accessible names of the context menus; the screen reader adds the word "menu" itself + aria_cellMenu: "Cell", + aria_sheetMenu: "Sheet", + // accessible name of the menu bar; the screen reader adds the words "menu bar" itself + aria_menuBar: "Main", + // accessible name of the cell grid; the screen reader adds the word "grid" itself + aria_grid: "Spreadsheet", + // accessible name of the select-all corner, the first column header + aria_selectAll: "Select all", + // accessible name of the formula bar; {cell} is the address of the cell it shows, for example "B7" + aria_formulaBar: "Formula bar, {cell}", + // accessible name of the input that edits a cell; {cell} is the address of the cell, for example "B7" + aria_cellEditor: "Cell editor, {cell}", + // accessible name of the close icon of the formula help panel + aria_closeFormulaHelp: "Close formula help", + + // Cell descriptions, read with the content of the active cell + // read with the content of a cell that has a filter icon; the icon itself is hidden from assistive technology + aria_filter: "Filter", + aria_filterApplied: "Filter applied", + // read after the content of a selected cell that holds a link; Alt+Enter opens the link + aria_cellLink: "link", + // read after the content of a selected locked cell; the lock icon itself is hidden from assistive technology + aria_lockedState: "locked", + // read after the value of a cell with a formula error; the formula engine writes the error as #ERROR, #REF! or #SPILL! + aria_errorSyntax: "Syntax error. Check the formula", + aria_errorCalc: "Calculation error. Check the values and functions", + aria_errorRef: "Reference error. Check the cell references", + aria_errorSpill: "Spill error. Clear the cells the result needs", + // read after the value of a cell that breaks its list validation + aria_invalidValue: "Invalid value. Choose a value from the list", + + // Screen reader announcements + // announced when an editing key is pressed in the read-only mode + aria_readonlySheet: "The sheet is read-only", + // announced when Ctrl+Shift+9 or Ctrl+Shift+0 finds nothing to reveal + aria_noHiddenRows: "No hidden rows in the selection", + aria_noHiddenCols: "No hidden columns in the selection", + // announced when a selection of several cells changes; {range} is built from aria_rangeExtent + aria_selectedRange: "{range}, {count} cells", + aria_rangeExtent: "{start} to {end}", + // joins the ranges of a selection made with Ctrl + aria_rangeSeparator: ", ", + // announced after an action; {message} is one of the texts above + aria_cellMessage: "{cell}: {message}", + // announced when an action makes several errors appear; {first} is aria_cellMessage for the first of them + aria_newErrors: "{count} new errors. {first}", + // announced when an action puts several invalid values; {first} is aria_cellMessage for the first of them + aria_invalidValues: "{count} invalid values. {first}", + // announced once when an edit of a locked cell is refused; the second one when a range holds locked cells + aria_lockedCell: "The cell is locked", + aria_lockedCells: "Locked cells were not changed", + // announced when the search text changes; followed by aria_searchMatch for the first match + aria_searchResults: "Results: {count}.", + // announced for the current match; {cell} is its address, for example "B7" + aria_searchMatch: "{index} of {count}, {cell}", + aria_searchNoResults: "No results", + // announced when an export or an import of a file starts and ends + aria_exportStarted: "Exporting the file", + aria_exportDone: "The file is exported", + aria_importStarted: "Importing the file", + aria_importDone: "The file is imported", + // announced when the column width or the row height command is applied; {size} is the applied size + aria_columnWidthSet: "Column width set to {size} pixels", + aria_rowHeightSet: "Row height set to {size} pixels", }; ~~~ +以 `aria_` 开头的键不会显示在界面中。屏幕阅读器会将它们作为控件的名称、活动单元格的描述,以及实时区域的消息来朗读,[`announce()`](api/spreadsheet_announce_method.md) 方法也使用该实时区域。花括号中的部分(例如 `{cell}` 或 `{count}`)会在朗读字符串时被替换为相应的值。请在翻译后的字符串中保留它们。有关已翻译的无障碍字符串示例,请查看[无障碍](accessibility.md#translated-accessibility-strings)指南。 + +`defaultSheetName` 键用于设置默认工作表名称的前缀。Spreadsheet 会在其后添加一个数字,因此默认值 `"sheet"` 会生成名称 "sheet1"、"sheet2" 等。例如,使用 `"Tabelle"`(Microsoft Excel 在德语中使用的前缀),工作表将被命名为 "Tabelle1"、"Tabelle2" 等。 + ## 自定义语言区域 {#custom-locale} 要应用不同的语言区域,您需要: -- 为 Spreadsheet 中的所有文本标签提供翻译,例如,俄语区域: +- 为 Spreadsheet 中的所有文本标签提供翻译,例如,德语区域: ~~~jsx -const ru = { +const de = { // 语言设置 }; ~~~ @@ -195,10 +298,48 @@ const ru = { - 在初始化 Spreadsheet 之前,通过调用 `dhx.i18n.setLocale()` 方法应用新的语言区域: ~~~jsx -dhx.i18n.setLocale("spreadsheet", ru); +dhx.i18n.setLocale("spreadsheet", de); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); +~~~ + +## 本地化内置组件 {#localizing-built-in-widgets} + +Spreadsheet 在内部使用 DHTMLX Suite 的 Calendar、Colorpicker、Grid、Timepicker、Toolbar、Window 和 Message 组件。它们的字符串存储在单独的语言区域中,您可以用与 `spreadsheet` 语言区域相同的方式翻译它们: + +| 语言区域 | Spreadsheet 中使用的字符串 | +| ------ | --------------------------- | +| `calendar` | 日期编辑器和日期筛选器中的月份和星期名称 | +| `colorpicker` | 工具栏颜色弹窗中自定义颜色模式的标签、调色板的名称,以及屏幕阅读器为色块和颜色按钮朗读的颜色名称,例如 "Text color: dark gray" | +| `grid` | 已加载行数的播报 | +| `timepicker` | 时间编辑器的标签 | +| `toolbar` | 工具栏的默认无障碍名称 | +| `window` | 对话框的默认无障碍名称 | +| `message` | alert 和 confirm 对话框及其按钮的无障碍名称 | + +请在初始化 Spreadsheet 之前使用语言区域的名称调用 `dhx.i18n.setLocale()`,因为工具栏、菜单和上下文菜单会在创建时读取语言区域: + +~~~jsx +const deColorpicker = { + cancel: "Abbrechen", + select: "Auswählen", + aria_palette: "Farbpalette", + aria_colorRed: "rot", + // other strings +}; + +const deMessage = { + aria_confirm: "Bestätigen" +}; + +dhx.i18n.setLocale("spreadsheet", de); +dhx.i18n.setLocale("colorpicker", deColorpicker); +dhx.i18n.setLocale("message", deMessage); + const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); ~~~ +语言区域的键是扁平的:请在对象的顶层传入每个键。详情请查看 DHTMLX Suite 文档中的 [Localization of screen-reader strings](https://docs.dhtmlx.com/suite/common_features/accessibility_support/#localization-of-screen-reader-strings) 文章。 + ## 公式的默认语言区域 {#default-locale-for-formulas} `dhx.i18n.formulas` 对象包含 Spreadsheet 公式弹窗的 i18n 语言区域。公式的默认语言区域如下: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/merge_cells.md b/i18n/zh/docusaurus-plugin-content-docs/current/merge_cells.md index 273fbbc1..aaf3a623 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/merge_cells.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/merge_cells.md @@ -1,7 +1,7 @@ --- sidebar_label: 合并单元格 title: 合并单元格 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解有关合并单元格的内容。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 通过工具栏或格式菜单在 DHTMLX Spreadsheet 中合并和拆分单元格,并了解删除行和列如何影响合并单元格。 --- # 合并单元格 {#merging-cells} @@ -45,3 +45,13 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解有 2\. 在菜单中选择:*格式 -> 取消合并* ![DHTMLX Spreadsheet Format menu with the Unmerge option for splitting merged cells](/img/unmerge_cells_via_menu.png) + +## 删除合并单元格所在的行和列 {#removing-rows-and-columns-of-merged-cells} + +通过合并单元格删除行或列时,该合并单元格跨越的所有行或列都会被删除。选中单个单元格或单元格区域,并通过工具栏、菜单、上下文菜单或 [`deleteRow()`](api/spreadsheet_deleterow_method.md) / [`deleteColumn()`](api/spreadsheet_deletecolumn_method.md) 方法删除行或列时,都是这样处理的。上下文菜单会在命令名称中显示完整范围,例如 *删除第 2-4 行*。 + +![DHTMLX Spreadsheet context menu with the Rows submenu showing Remove rows 2-4 for a merged cell](/img/remove_merged_rows_context_menu.png) + +选中整行或整列时(例如单击其表头,或使用 `Shift + Space` 或 `Ctrl (Cmd) + Space`),只会删除选中的行或列。跨越这些行或列的合并单元格会相应缩小,只剩一个单元格的合并单元格会变成普通单元格。 + +位于被删除行下方或被删除列右侧的合并单元格会随之移动。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/react/overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/react/overview.md index ce34b43d..c14306ad 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/react/overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/react/overview.md @@ -96,8 +96,8 @@ Props 按组件处理变更的方式分为以下几类: | 类别 | Props | 变更时的行为 | |----------|-------|----------------------| -| **仅初始化** | `menu`、`editLine`、`toolbarBlocks`、`multiSheets`、`formats`、`localization`、`importModulePath`、`exportModulePath`、`spreadsheetLocale` | widget 被销毁并重新创建。电子表格数据会被保留,但撤销/重做历史记录及 UI 状态(选区、滚动位置)将被重置。 | -| **运行时** | `readonly`、`rowsCount`、`colsCount` | 立即生效,不会造成数据丢失或 UI 状态重置。 | +| **仅初始化** | `menu`、`editLine`、`toolbarBlocks`、`multiSheets`、`formats`、`localization`、`importModulePath`、`exportModulePath`、`spreadsheetLocale`、`readonly` | widget 被销毁并重新创建。电子表格数据会被保留,但撤销/重做历史记录及 UI 状态(选区、滚动位置)将被重置。 | +| **运行时** | `selection`、`rowsCount`、`colsCount` | 立即生效,不会造成数据丢失或 UI 状态重置。 | | **数据** | `sheets`、`activeSheet` | 增量应用;仅更新已变更的单元格、区域或设置。 | | **重新解析** | `styles` | 样式变更需要完整的数据重新加载。电子表格数据会被保留,但撤销/重做历史记录及 UI 状态将被重置。 | | **状态** | `search`、`theme`、`loadUrl` | 通过专用 widget API 应用,无副作用。 | @@ -198,6 +198,10 @@ function App() { `instance` 属性在 widget 初始化之前及卸载之后均为 `null`。 +:::info +通过 `ref.current.instance.events.on()` 附加的处理器,会在修改仅初始化 prop 后 widget 被重新创建时,以及组件卸载时被移除。请使用[事件回调 props](react/events.md),组件会将其附加到每个新的 widget 实例上。 +::: + ## API 参考 {#api-reference} | 文档 | 内容 | diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/react/props.md b/i18n/zh/docusaurus-plugin-content-docs/current/react/props.md index 5be5b263..499f4cd0 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/react/props.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/react/props.md @@ -25,6 +25,7 @@ description: "ReactSpreadsheet 组件所有 props 的完整参考,包含类型 | `importModulePath` | `string` | XLSX 导入模块的路径。JS API 参见:[`importModulePath`](api/spreadsheet_importmodulepath_config.md)。 | | `exportModulePath` | `string` | XLSX 导出模块的路径。JS API 参见:[`exportModulePath`](api/spreadsheet_exportmodulepath_config.md)。 | | `spreadsheetLocale` | [`SpreadsheetLocale`](react/types.md#spreadsheetlocale) | UI 翻译及本地化公式名称。与 `localization` 独立。 | +| `readonly` | `boolean` | 启用只读模式。用户可以导航、选择、复制和搜索单元格,编辑操作会被拒绝。JS API 参见:[`readonly`](api/spreadsheet_readonly_config.md)。 | @@ -40,7 +41,7 @@ description: "ReactSpreadsheet 组件所有 props 的完整参考,包含类型 |------|------|-------------| | `rowsCount` | `number` | 表格的行数。JS API 参见:[`rowsCount`](api/spreadsheet_rowscount_config.md)。 | | `colsCount` | `number` | 表格的列数。JS API 参见:[`colsCount`](api/spreadsheet_colscount_config.md)。 | -| `readonly` | `boolean` | 启用只读模式。JS API 参见:[`readonly`](api/spreadsheet_readonly_config.md)。 | +| `selection` | `boolean` | 开启或关闭单元格选择。默认值:`true`。设为 `false` 时,电子表格没有活动单元格,也无法通过 UI 选择或编辑单元格。JS API 参见:[`selection`](api/spreadsheet_selection_config.md)。 | ## 数据 props {#data-props} @@ -225,10 +226,18 @@ const [theme, setTheme] = useState("light"); ### 只读模式 {#read-only-mode} +在只读模式下,用户可以使用键盘在单元格间导航,用鼠标选择单元格,以及复制和搜索单元格。编辑操作会被拒绝,并向屏幕阅读器播报。由于 `readonly` 是仅初始化 prop,修改它会重新创建 widget。数据会被保留,而撤销/重做历史记录及 UI 状态(选区、滚动位置)将被重置。 + ~~~tsx ~~~ +若要同时关闭键盘导航和选择,请添加 `selection={false}`。`selection` prop 在运行时生效,因此无需重新创建 widget 即可切换: + +~~~tsx + +~~~ + ### 从 URL 加载数据 {#loading-data-from-url} ~~~tsx diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/react/themes.md b/i18n/zh/docusaurus-plugin-content-docs/current/react/themes.md index 4d659e95..b0f9b56d 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/react/themes.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/react/themes.md @@ -77,6 +77,9 @@ DHTMLX Spreadsheet 使用分层 CSS 变量系统。您可以覆盖这些变量 /* 电子表格区域颜色 */ --dhx-spreadsheet-range-background-1: #bee3f8; --dhx-spreadsheet-range-color-1: #2b6cb0; + + /* 公式栏和工具栏控件的键盘焦点轮廓 */ + --dhx-spreadsheet-focus-color: #2b6cb0; } ~~~ diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/react/types.md b/i18n/zh/docusaurus-plugin-content-docs/current/react/types.md index 785aef28..77964652 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/react/types.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/react/types.md @@ -188,6 +188,13 @@ ref.current?.instance?.selection.setSelectedCell("A1:C5"); // 撤销/重做 ref.current?.instance?.undo(); ref.current?.instance?.redo(); + +// 关闭和开启选区 +ref.current?.instance?.selection.disable(); +ref.current?.instance?.selection.enable(); + +// 向屏幕阅读器发送状态消息 +ref.current?.instance?.announce("The report is saved"); ~~~ ## Actions 枚举 {#actions-enum} @@ -270,6 +277,7 @@ type SpreadsheetConfigProps = Omit< | `IStylesList` | 样式定义映射。 | | `IDataWithStyles` | 含内嵌样式的数据结构(由 `serialize()`/`parse()` 使用)。 | | `ICellInfo` | widget 方法返回的单元格信息。 | +| `ISelection` | 选区模块接口(`instance.selection`),包括 [`enable()`](api/selection_enable_method.md)、[`disable()`](api/selection_disable_method.md) 和 [`isDisabled()`](api/selection_isdisabled_method.md) 方法。 | | `FileFormat` | 数据加载的文件格式(例如 `"json"` 或 `"xlsx"`)。 | | `ToolbarBlocks` | 工具栏块标识符(例如 `"default"`、`"undo"` 或 `"font"`)。 | | `FilterConditions` | 可用筛选条件类型的枚举。 | diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/themes/themes.md b/i18n/zh/docusaurus-plugin-content-docs/current/themes/themes.md index c429842d..d02602b1 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/themes/themes.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/themes/themes.md @@ -1,7 +1,7 @@ --- sidebar_label: 内置主题 title: 内置主题 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解内置主题。浏览开发者指南和 API 参考,试用代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费评估版本。 +description: DHTMLX Spreadsheet 的内置主题,包括浅色和深色及其高对比度变体。了解 Spreadsheet 专属的 CSS 变量以及如何设置主题。 --- # 内置主题 {#built-in-themes} @@ -13,7 +13,7 @@ DHTMLX Spreadsheet 库提供 4 个预定义主题: - [浅色高对比度主题](#light-high-contrast-theme)("contrast-light") - [深色高对比度主题](#dark-high-contrast-theme)("contrast-dark") -Spreadsheet 主题根据国际标准开发。高对比度主题有助于视力障碍用户使用。更多详情,请阅读[无障碍支持](https://docs.dhtmlx.com/suite/common_features/accessibility_support/)文章。 +Spreadsheet 主题根据国际标准开发。高对比度主题有助于视力障碍用户使用。有关 Spreadsheet 中主题的对比度和键盘焦点指示器,请查阅无障碍指南的[高对比度与焦点](accessibility.md#high-contrast-and-focus)部分。有关 DHTMLX Suite 组件的无障碍性,请阅读[无障碍支持](https://docs.dhtmlx.com/suite/common_features/accessibility_support/)文章。 您可以在下面的示例中试用所有主题: @@ -377,14 +377,15 @@ Spreadsheet 组件专用变量列表如下: --dhx-spreadsheet-range-background-8: #ecb6ff; --dhx-spreadsheet-range-color-1: #00815a; - --dhx-spreadsheet-range-color-2: #bfc000; - --dhx-spreadsheet-range-color-3: #c55933; - --dhx-spreadsheet-range-color-4: #0cc1d6; - --dhx-spreadsheet-range-color-5: #0080a3; - --dhx-spreadsheet-range-color-6: #529a0a; + --dhx-spreadsheet-range-color-2: #8b7300; + --dhx-spreadsheet-range-color-3: #a34729; + --dhx-spreadsheet-range-color-4: #007a8c; + --dhx-spreadsheet-range-color-5: #135db1; + --dhx-spreadsheet-range-color-6: #2f6500; --dhx-spreadsheet-range-color-7: #6d767b; - --dhx-spreadsheet-range-color-8: #ba38e7; + --dhx-spreadsheet-range-color-8: #b82fe5; + --dhx-spreadsheet-focus-color: var(--dhx-color-primary); } ~~~ @@ -411,6 +412,17 @@ Spreadsheet 组件专用变量列表如下: --dhx-spreadsheet-range-color-7: #e4e4e4; --dhx-spreadsheet-range-color-8: #ecb6ff; + --dhx-spreadsheet-focus-color: hsl(var(--dhx-h-primary), var(--dhx-s-primary), calc(var(--dhx-l-primary) + 12% - var(--dhx-l-contrast-offset))); +} +~~~ + +`--dhx-spreadsheet-range-color-*` 和 `--dhx-spreadsheet-range-background-*` 变量用于设置编辑公式时标记单元格引用的颜色。在浅色主题中,`--dhx-spreadsheet-range-color-*` 颜色与公式栏背景的对比度至少为 4.5:1。 + +`--dhx-spreadsheet-focus-color` 变量用于设置公式栏,以及工具栏、菜单栏、工作表标签、Border 弹出窗口、链接弹出窗口和搜索栏中各控件的键盘焦点轮廓颜色。在深色主题中,该颜色比主色更浅,从而使轮廓保持至少 3:1 的对比度。您可以在[自定义主题](themes/custom_theme.md)中重新定义该变量: + +~~~css +[data-dhx-theme='custom-theme-dark'] { + --dhx-spreadsheet-focus-color: #7fc8ff; } ~~~ diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/vuejs_integration.md b/i18n/zh/docusaurus-plugin-content-docs/current/vuejs_integration.md index 9d91a388..00d8a094 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/vuejs_integration.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/vuejs_integration.md @@ -1,7 +1,7 @@ --- sidebar_label: 与 Vue 集成 title: Vue 集成 -description: 您可以在文档中了解 DHTMLX JavaScript Spreadsheet 库的 Vue 集成。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载免费的 30 天评估版 DHTMLX Spreadsheet。 +description: "在 Vue 应用中使用 DHTMLX Spreadsheet。创建项目,将 Spreadsheet 添加为 Vue 组件,加载数据并处理事件。" --- # 与 Vue 集成 {#integration-with-vue} @@ -260,6 +260,10 @@ export default { //... ~~~ +:::info +`destructor()` 方法会移除通过 `spreadsheet.events.on()` 附加的事件处理器。创建新的 Spreadsheet 实例时(例如再次创建组件时),请将处理器附加到新实例上。 +::: + 完成后,您可以启动应用,查看加载了数据的 Spreadsheet 页面。 ![DHTMLX Spreadsheet initialized with sample data in a Vue 3 application](/img/integrations/trial_spreadsheet.png) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md index 9cf644bc..288a7c24 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md @@ -8,6 +8,58 @@ description: 您可以在文档中了解 DHTMLX JavaScript Spreadsheet 库的最 如果您正在从旧版本升级 Spreadsheet,请查阅[迁移到新版本](migration.md)了解详细信息。 +## 版本 6.0.4 {#version-604} + +发布于 2026 年 10 月 + +### 新功能 {#new-functionality-604} + +- 无障碍支持,目标为 WCAG 2.2 AA、Section 508 和 EN 301 549:Spreadsheet 的每个部分均可通过键盘操作,支持屏幕阅读器,并且在每个主题中都有可见的焦点。请查阅[无障碍](accessibility.md)指南和[无障碍合规报告](accessibility_conformance_report.md) +- 可关闭和开启单元格选择: + - 新增配置属性:[`selection`](api/spreadsheet_selection_config.md) + - selection 模块的新方法:[`enable()`](api/selection_enable_method.md)、[`disable()`](api/selection_disable_method.md)、[`isDisabled()`](api/selection_isdisabled_method.md) +- [`announce()`](api/spreadsheet_announce_method.md) 方法用于向屏幕阅读器发送状态消息 +- [上下文菜单](customization.md#context-menu)的新命令:[*列宽*、*行高*](work_with_rows_cols.md#setting-column-width-and-row-height)和*打开筛选器*(见[使用键盘打开筛选器](filtering_data.md#opening-a-filter-with-the-keyboard)) + +### 更新 {#updates-604} + +- 键盘导航(请查阅[快捷键列表](hotkeys.md)): + - 焦点保持在活动单元格上,`Tab` 和 `Shift + Tab` 可分别从工作表的最后一个和第一个单元格移出,`Ctrl + F6` 在菜单、工具栏、工作表和工作表标签之间移动焦点 + - 工具栏、菜单栏和工作表标签均为单一 Tab 停靠点,可使用方向键在其中导航 + - 新增快捷键,例如用于上下文菜单的 `Shift + F10`,以及用于显示隐藏行和列的 `Ctrl (Cmd) + Shift + 9` / `Ctrl (Cmd) + Shift + 0` + - 工具栏的颜色和边框弹出窗口在打开时获得焦点,并可通过 `Esc` 和 `Tab` 关闭 +- 方向键在第一个和最后一个可见行和列处停止,而不是跳到对侧边缘;在边缘处按方向键会将选中的区域缩小为活动单元格 +- 使用输入法编辑器(IME)输入的文本会显示在活动单元格中,并通过 [`startEdit()`](api/spreadsheet_startedit_method.md) 方法开始编辑,因此会触发 `beforeEditStart` 和 `afterEditStart` 事件 +- [`setFocusedCell()`](api/selection_setfocusedcell_method.md) 方法将键盘焦点移动到单元格 +- [单元格中的链接](work_with_cells.md#inserting-a-hyperlink-into-a-cell)呈现为在新标签页中打开的真实链接,`Alt (Option) + Enter` 可打开活动单元格的链接 +- [只读模式](api/spreadsheet_readonly_config.md)保留键盘导航、选择、复制和搜索,屏幕阅读器会播报被拒绝的编辑。要关闭选择,请使用 `selection: false` 选项 +- [通过合并单元格删除行或列](merge_cells.md#removing-rows-and-columns-of-merged-cells)时,会删除该合并单元格的所有行或列 +- [`spreadsheet` 语言包](localization.md#default-locale)中新增界面和屏幕阅读器字符串,并支持[内置组件的翻译](localization.md#localizing-built-in-widgets) +- 用于键盘焦点的 [`--dhx-spreadsheet-focus-color`](/themes/#spreadsheet-specific-styles) 变量,以及浅色主题中对比度更高的公式引用颜色 +- React Spreadsheet:[`selection`](react/props.md#runtime-props) 属性、[`ISelection`](react/types.md#re-exported-upstream-types) 类型,以及作为仅初始化属性的 [`readonly`](react/props.md#init-only-props) + +### 修复 {#fixes-604} + +- 删除合并单元格之前的行或列时,合并单元格被丢弃而不是被移动的问题。现在只剩一个单元格的合并单元格会变成普通单元格并保留其值 +- 通过合并单元格删除行或列时只删除合并区域中的一行(列)的问题 +- 删除行和列的上下文菜单标签未显示将被删除的合并单元格的所有行或列的问题 +- 行覆盖整个筛选范围时未被删除的问题 +- 删除冻结的行或列时冻结区域没有缩小的问题 +- 拖动的单元格不包含普通数字时自动填充抛出错误的问题 +- 当第一行或最后一行(列)被隐藏时,按 `Home`、`End`、`Ctrl (Cmd) + Home`、`Ctrl (Cmd) + End` 和 `Ctrl (Cmd) + 方向键` 页面卡死的问题 +- 将单元格复制到 Excel、从 Excel 粘贴或在 Spreadsheet 内部粘贴时字体大小丢失的问题 +- 无效值提示框出现在远离无效单元格的位置或未显示的问题 +- 使用方向键后,列表编辑器中 `Esc` 和 `Tab` 不起作用的问题 +- 搜索先高亮第二个匹配项,且在编辑或切换工作表后未刷新结果的问题 +- 在不支持 WebAssembly 的浏览器中导入或导出时出现脚本错误的问题 +- `destructor()` 之后遗留文档监听器和内部组件的问题 +- 搜索栏关闭后键盘焦点丢失的问题 +- 已关闭的上下文菜单再次打开的问题 +- 键盘导航时活动单元格滚动到距视口边缘差一个单元格的问题 +- React Spreadsheet:因仅初始化属性变化而重新创建 Spreadsheet 后,事件回调和 `onStateChange` 不触发的问题 +- React Spreadsheet:卸载时未移除封装组件的事件处理程序的问题 +- React Spreadsheet:挂载时 `loadUrl` 的数据被加载两次,以及 Spreadsheet 重新创建后再次覆盖保留数据的问题 + ## 版本 6.0.3 {#version-603} 发布于 2026 年 8 月 24 日 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/work_with_cells.md b/i18n/zh/docusaurus-plugin-content-docs/current/work_with_cells.md index 5afec447..49e84f96 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/work_with_cells.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/work_with_cells.md @@ -1,7 +1,7 @@ --- sidebar_label: 编辑单元格 title: 编辑单元格 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解单元格操作相关内容。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载免费的 30 天评估版 DHTMLX Spreadsheet。 +description: 在 DHTMLX Spreadsheet 中编辑单元格。输入内容、插入超链接、使用下拉列表、填充多个单元格、在单元格与 Excel 之间复制,以及锁定单元格。 --- # 编辑单元格 {#editing-cells} @@ -145,14 +145,27 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解单 - 要生成序列 1, 3, 5, 7, 9, ...,在前两个单元格中分别输入 1 和 3。 - 要生成序列 2, 4, 6, 8, 10, ...,在前两个单元格中分别输入 2 和 4。 - 除数字外,您还可以在规律中使用字母,例如,要生成序列 1, a, 2, b, 3, a, 4, b, ...,在前四个单元格中分别输入 1, a, 2, b。 + - 要在文本末尾接续数字,请输入前几个值,例如,要生成序列 item1, item2, item3, ...,在前两个单元格中分别输入 item1 和 item2。 + - 要生成日期序列,请在第一个单元格中输入一个日期:之后每个单元格依次得到下一天的日期。 +- 重复文本 + +例如,要生成序列 North, South, North, South, ...,在前两个单元格中分别输入 North 和 South。*文本*格式单元格中的数字也以同样方式重复。 3\. 拖动**填充手柄** ![DHTMLX Spreadsheet autofill dragging the fill handle to replicate cell data](/img/autofill.gif) +## 单元格与 Excel 之间复制 {#copying-cells-to-and-from-excel} + +您可以使用 **Ctrl (Cmd) + C** 复制单元格,并使用 **Ctrl (Cmd) + V** 粘贴,既可在 Spreadsheet 内部进行,也可在 Spreadsheet 与 Microsoft Excel 之间进行: + +- 在 Spreadsheet 内部,单元格保留其值、公式、样式、数字格式和链接。公式中的单元格引用会随新位置而偏移 +- 粘贴到 Excel 时,单元格得到的是值(公式的计算结果,而不是公式本身)、样式(包括字体大小)、合并单元格和链接。被筛选器隐藏的行会被跳过 +- 从 Excel 复制的单元格粘贴到 Spreadsheet 时,会保留其值、样式(包括字体大小)、数字格式、合并单元格和链接 + ## 锁定单元格 {#locking-cells} -您可以锁定单元格以防止其值被更改。锁定单元格后,右上角会显示灰色"钥匙"图标。锁定的单元格不响应任何编辑尝试。 +您可以锁定单元格以防止其值被更改。锁定单元格后,右上角会显示灰色"钥匙"图标。锁定的单元格不响应任何编辑尝试。屏幕阅读器会播报被拒绝的编辑:对单个单元格播报"The cell is locked",当选中的区域包含锁定单元格时播报"Locked cells were not changed"。 ![DHTMLX Spreadsheet locked cells marked with a gray key icon in the top right corner](/img/lockedcells.png) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/work_with_rows_cols.md b/i18n/zh/docusaurus-plugin-content-docs/current/work_with_rows_cols.md index 014b310a..19b0d755 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/work_with_rows_cols.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/work_with_rows_cols.md @@ -1,7 +1,7 @@ --- sidebar_label: 行与列操作 title: 行与列操作 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解行与列的操作方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载免费的 30 天评估版 DHTMLX Spreadsheet。 +description: 在 DHTMLX Spreadsheet 中操作行和列。添加和删除行列,自动适应并设置列宽和行高,以及冻结、隐藏和显示行列。 --- # 行与列操作 {#work-with-rows-and-columns} @@ -54,6 +54,10 @@ DHTMLX Spreadsheet 支持通过工具栏按钮、菜单选项和单元格上下 要一次删除多行:选择这些行,右键单击调出上下文菜单,然后选择 *行 -> 删除行 [ids]*。 ::: +:::info +如果选中的单元格位于合并单元格内,则会删除该合并单元格的所有行。详细信息请查阅[合并单元格](merge_cells.md#removing-rows-and-columns-of-merged-cells)一文。 +::: + ### 添加列 {#adding-columns} 要添加新列,请按以下步骤操作: @@ -98,6 +102,10 @@ DHTMLX Spreadsheet 支持通过工具栏按钮、菜单选项和单元格上下 要一次删除多列:选择这些列,右键单击调出上下文菜单,然后选择 *列 -> 删除列 [ids]*。 ::: +:::info +如果选中的单元格位于合并单元格内,则会删除该合并单元格的所有列。详细信息请查阅[合并单元格](merge_cells.md#removing-rows-and-columns-of-merged-cells)一文。 +::: + ## 列宽自动适应 {#autofit-column-width} 要更改列宽,使其自动适应列中最长的内容,您可以: @@ -116,6 +124,50 @@ DHTMLX Spreadsheet 支持通过工具栏按钮、菜单选项和单元格上下 ![DHTMLX Spreadsheet Columns submenu with the Fit to data option for autofit column width](/img/column_autofit.png) +## 设置列宽和行高 {#setting-column-width-and-row-height} + +### 设置列宽 {#setting-column-width} + +要设置列的精确宽度,请按以下步骤操作: + +1\. 选择一列或该列中的某个单元格。若要更改多列,请选择跨越这些列的单元格区域。 + +2\. 右键单击选区,或按 `Shift + F10` 或 Menu 键,然后选择 *列 -> 列宽*。该命令也可在列的三点图标菜单中找到。 + +![DHTMLX Spreadsheet context menu with the Columns submenu showing Column width](/img/column_width_context_menu.png) + +3\. 在*列宽*对话框中输入以像素为单位的宽度,然后单击**应用**或按 `Enter`。 + +![DHTMLX Spreadsheet Column width dialog with the width in pixels and the Cancel and Apply buttons](/img/column_width_dialog.png) + +### 设置行高 {#setting-row-height} + +要设置行的精确高度,请按以下步骤操作: + +1\. 选择一行或该行中的某个单元格。若要更改多行,请选择跨越这些行的单元格区域。 + +2\. 右键单击选区,或按 `Shift + F10` 或 Menu 键,然后选择 *行 -> 行高*。 + +![DHTMLX Spreadsheet context menu with the Rows submenu showing Row height](/img/row_height_context_menu.png) + +3\. 在*行高*对话框中输入以像素为单位的高度,然后单击**应用**或按 `Enter`。 + +![DHTMLX Spreadsheet Row height dialog with the height in pixels and the Cancel and Apply buttons](/img/row_height_dialog.png) + +### 新尺寸的应用方式 {#how-the-new-size-is-applied} + +对话框显示所选区域中第一列或第一行的当前尺寸,并将新尺寸应用于该区域内的每一列或每一行。如果选择了多个区域,则使用最后选择的区域。 + +尺寸会四舍五入为整数像素。列的最小宽度为 20 px,行的最小高度为 10 px:小于最小值的正数会被替换为最小值。当输入框为空或输入的值不是正数时,**应用**按钮不可用。 + +**取消**按钮或 `Esc` 会关闭对话框且不做任何更改。屏幕阅读器会播报新的尺寸,例如"Column width set to 120 pixels"。 + +### 撤销更改 {#undoing-the-change} + +可以使用 `Ctrl (Cmd) + Z` 撤销新的尺寸。 + +要在代码中处理该更改,请使用 `resizeCol` 和 `resizeRow` [actions](api/overview/actions_overview.md#list-of-actions)。 + ## 冻结/解冻行和列 {#freezingunfreezing-rows-and-columns} ### 冻结行 {#freezing-rows} @@ -212,6 +264,10 @@ DHTMLX Spreadsheet 支持通过工具栏按钮、菜单选项和单元格上下 ![DHTMLX Spreadsheet context menu with the Rows submenu showing Hide rows](/img/hide_row_context_menu.png) +:::info +如果活动单元格所在的行被隐藏,活动单元格会移动到其下方第一个可见行,选区缩小为该单元格。如果下方没有可见行,则移动到上方最后一个可见行。 +::: + ### 显示行 {#showing-rows} 要显示已隐藏的行,请选择以下任一操作: @@ -228,6 +284,8 @@ DHTMLX Spreadsheet 支持通过工具栏按钮、菜单选项和单元格上下 ![DHTMLX Spreadsheet context menu with the Rows submenu showing Show rows](/img/show_rows_context_menu.png) +- 或选择行或多个单元格,使隐藏的行包含在选区中,然后按 `Ctrl (Cmd) + Shift + 9`。例如,选择第 2-4 行即可显示隐藏的第 3 行。如果选区中没有隐藏的行,屏幕阅读器会播报"No hidden rows in the selection" + ### 隐藏列 {#hiding-columns} 要隐藏列,请按以下步骤操作: @@ -244,6 +302,10 @@ DHTMLX Spreadsheet 支持通过工具栏按钮、菜单选项和单元格上下 ![DHTMLX Spreadsheet context menu with the Columns submenu showing Hide columns](/img/hide_columns_context_menu.png) +:::info +如果活动单元格所在的列被隐藏,活动单元格会移动到其右侧第一个可见列,选区缩小为该单元格。如果右侧没有可见列,则移动到左侧最后一个可见列。 +::: + ### 显示列 {#showing-columns} 要显示已隐藏的列,请选择以下任一操作: @@ -259,3 +321,5 @@ DHTMLX Spreadsheet 支持通过工具栏按钮、菜单选项和单元格上下 (*下图中 C 列已隐藏*) ![DHTMLX Spreadsheet context menu with the Columns submenu showing Show columns](/img/show_columns_context_menu.png) + +- 或选择列或多个单元格,使隐藏的列包含在选区中,然后按 `Ctrl (Cmd) + Shift + 0`。如果选区中没有隐藏的列,屏幕阅读器会播报"No hidden columns in the selection" From 76774e7078f7579ecec50a492c9e7b90b2b21662 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Thu, 29 Oct 2026 10:55:51 +0300 Subject: [PATCH 25/32] [update] unify spreadsheet container id in code examples - set "spreadsheet_container" as the container id in all Spreadsheet code examples (en, de, ru, ko, zh) - update the container id mentioned in the initialization guide - themes guide: use the same id in the setTheme() examples, rename the HTMLElement variable to "element" --- docs/api/eventsbus_detach_method.md | 2 +- docs/api/eventsbus_fire_method.md | 2 +- docs/api/eventsbus_on_method.md | 2 +- docs/api/export_json_method.md | 2 +- docs/api/export_xlsx_method.md | 2 +- docs/api/selection_disable_method.md | 2 +- docs/api/selection_enable_method.md | 2 +- docs/api/selection_getfocusedcell_method.md | 2 +- docs/api/selection_getselectedcell_method.md | 2 +- docs/api/selection_isdisabled_method.md | 2 +- .../api/selection_removeselectedcell_method.md | 2 +- docs/api/selection_setfocusedcell_method.md | 2 +- docs/api/selection_setselectedcell_method.md | 2 +- docs/api/spreadsheet_addcolumn_method.md | 2 +- docs/api/spreadsheet_addrow_method.md | 2 +- docs/api/spreadsheet_afteraction_event.md | 2 +- docs/api/spreadsheet_afterclear_event.md | 2 +- docs/api/spreadsheet_aftereditend_event.md | 2 +- docs/api/spreadsheet_aftereditstart_event.md | 2 +- docs/api/spreadsheet_afterfocusset_event.md | 2 +- .../api/spreadsheet_afterselectionset_event.md | 2 +- docs/api/spreadsheet_aftersheetchange_event.md | 2 +- docs/api/spreadsheet_announce_method.md | 2 +- docs/api/spreadsheet_beforeaction_event.md | 2 +- docs/api/spreadsheet_beforeclear_event.md | 2 +- docs/api/spreadsheet_beforeeditend_event.md | 2 +- docs/api/spreadsheet_beforeeditstart_event.md | 2 +- docs/api/spreadsheet_beforefocusset_event.md | 2 +- .../spreadsheet_beforeselectionset_event.md | 2 +- .../api/spreadsheet_beforesheetchange_event.md | 2 +- docs/api/spreadsheet_clear_method.md | 2 +- docs/api/spreadsheet_colscount_config.md | 2 +- docs/api/spreadsheet_deletecolumn_method.md | 2 +- docs/api/spreadsheet_deleterow_method.md | 2 +- docs/api/spreadsheet_eachcell_method.md | 2 +- docs/api/spreadsheet_editline_config.md | 2 +- docs/api/spreadsheet_endedit_method.md | 2 +- .../api/spreadsheet_exportmodulepath_config.md | 2 +- docs/api/spreadsheet_fitcolumn_method.md | 2 +- docs/api/spreadsheet_formats_config.md | 2 +- docs/api/spreadsheet_getfilter_method.md | 2 +- docs/api/spreadsheet_getformat_method.md | 2 +- docs/api/spreadsheet_getformula_method.md | 2 +- docs/api/spreadsheet_getstyle_method.md | 2 +- docs/api/spreadsheet_getvalue_method.md | 2 +- docs/api/spreadsheet_groupfill_event.md | 2 +- docs/api/spreadsheet_hidesearch_method.md | 2 +- .../api/spreadsheet_importmodulepath_config.md | 2 +- docs/api/spreadsheet_insertlink_method.md | 2 +- docs/api/spreadsheet_islocked_method.md | 2 +- docs/api/spreadsheet_load_method.md | 4 ++-- docs/api/spreadsheet_localization_config.md | 2 +- docs/api/spreadsheet_lock_method.md | 2 +- docs/api/spreadsheet_menu_config.md | 2 +- docs/api/spreadsheet_mergecells_method.md | 2 +- docs/api/spreadsheet_multisheets_config.md | 2 +- docs/api/spreadsheet_parse_method.md | 4 ++-- docs/api/spreadsheet_readonly_config.md | 4 ++-- docs/api/spreadsheet_redo_method.md | 2 +- docs/api/spreadsheet_rowscount_config.md | 2 +- docs/api/spreadsheet_search_method.md | 2 +- docs/api/spreadsheet_selection_config.md | 4 ++-- docs/api/spreadsheet_serialize_method.md | 2 +- docs/api/spreadsheet_setfilter_method.md | 2 +- docs/api/spreadsheet_setformat_method.md | 2 +- docs/api/spreadsheet_setstyle_method.md | 2 +- docs/api/spreadsheet_setvalidation_method.md | 2 +- docs/api/spreadsheet_setvalue_method.md | 2 +- docs/api/spreadsheet_sortcells_method.md | 2 +- docs/api/spreadsheet_startedit_method.md | 2 +- docs/api/spreadsheet_undo_method.md | 2 +- docs/api/spreadsheet_unlock_method.md | 2 +- docs/configuration.md | 6 +++--- docs/how_to_start.md | 6 +++--- docs/initialization.md | 6 +++--- docs/loading_data.md | 6 +++--- docs/number_formatting.md | 2 +- docs/themes/base_themes_configuration.md | 2 +- docs/themes/custom_theme.md | 2 +- docs/themes/themes.md | 18 +++++++++--------- docs/working_with_ssheet.md | 2 +- .../current/api/eventsbus_detach_method.md | 2 +- .../current/api/eventsbus_fire_method.md | 2 +- .../current/api/eventsbus_on_method.md | 2 +- .../current/api/export_json_method.md | 2 +- .../current/api/export_xlsx_method.md | 2 +- .../current/api/selection_disable_method.md | 2 +- .../current/api/selection_enable_method.md | 2 +- .../api/selection_getfocusedcell_method.md | 2 +- .../api/selection_getselectedcell_method.md | 2 +- .../current/api/selection_isdisabled_method.md | 2 +- .../api/selection_removeselectedcell_method.md | 2 +- .../api/selection_setfocusedcell_method.md | 2 +- .../api/selection_setselectedcell_method.md | 2 +- .../api/spreadsheet_addcolumn_method.md | 2 +- .../current/api/spreadsheet_addrow_method.md | 2 +- .../api/spreadsheet_afteraction_event.md | 2 +- .../api/spreadsheet_afterclear_event.md | 2 +- .../api/spreadsheet_aftereditend_event.md | 2 +- .../api/spreadsheet_aftereditstart_event.md | 2 +- .../api/spreadsheet_afterfocusset_event.md | 2 +- .../api/spreadsheet_afterselectionset_event.md | 2 +- .../api/spreadsheet_aftersheetchange_event.md | 2 +- .../current/api/spreadsheet_announce_method.md | 2 +- .../api/spreadsheet_beforeaction_event.md | 2 +- .../api/spreadsheet_beforeclear_event.md | 2 +- .../api/spreadsheet_beforeeditend_event.md | 2 +- .../api/spreadsheet_beforeeditstart_event.md | 2 +- .../api/spreadsheet_beforefocusset_event.md | 2 +- .../spreadsheet_beforeselectionset_event.md | 2 +- .../api/spreadsheet_beforesheetchange_event.md | 2 +- .../current/api/spreadsheet_clear_method.md | 2 +- .../api/spreadsheet_colscount_config.md | 2 +- .../api/spreadsheet_deletecolumn_method.md | 2 +- .../api/spreadsheet_deleterow_method.md | 2 +- .../current/api/spreadsheet_eachcell_method.md | 2 +- .../current/api/spreadsheet_editline_config.md | 2 +- .../current/api/spreadsheet_endedit_method.md | 2 +- .../api/spreadsheet_exportmodulepath_config.md | 2 +- .../api/spreadsheet_fitcolumn_method.md | 2 +- .../current/api/spreadsheet_formats_config.md | 2 +- .../api/spreadsheet_getfilter_method.md | 2 +- .../api/spreadsheet_getformat_method.md | 2 +- .../api/spreadsheet_getformula_method.md | 2 +- .../current/api/spreadsheet_getstyle_method.md | 2 +- .../current/api/spreadsheet_getvalue_method.md | 2 +- .../current/api/spreadsheet_groupfill_event.md | 2 +- .../api/spreadsheet_hidesearch_method.md | 2 +- .../api/spreadsheet_importmodulepath_config.md | 2 +- .../api/spreadsheet_insertlink_method.md | 2 +- .../current/api/spreadsheet_islocked_method.md | 2 +- .../current/api/spreadsheet_load_method.md | 4 ++-- .../api/spreadsheet_localization_config.md | 2 +- .../current/api/spreadsheet_lock_method.md | 2 +- .../current/api/spreadsheet_menu_config.md | 2 +- .../api/spreadsheet_mergecells_method.md | 2 +- .../api/spreadsheet_multisheets_config.md | 2 +- .../current/api/spreadsheet_parse_method.md | 4 ++-- .../current/api/spreadsheet_readonly_config.md | 4 ++-- .../current/api/spreadsheet_redo_method.md | 2 +- .../api/spreadsheet_rowscount_config.md | 2 +- .../current/api/spreadsheet_search_method.md | 2 +- .../api/spreadsheet_selection_config.md | 4 ++-- .../api/spreadsheet_serialize_method.md | 2 +- .../api/spreadsheet_setfilter_method.md | 2 +- .../api/spreadsheet_setformat_method.md | 2 +- .../current/api/spreadsheet_setstyle_method.md | 2 +- .../api/spreadsheet_setvalidation_method.md | 2 +- .../current/api/spreadsheet_setvalue_method.md | 2 +- .../api/spreadsheet_sortcells_method.md | 2 +- .../api/spreadsheet_startedit_method.md | 2 +- .../current/api/spreadsheet_undo_method.md | 2 +- .../current/api/spreadsheet_unlock_method.md | 2 +- .../current/configuration.md | 6 +++--- .../current/how_to_start.md | 6 +++--- .../current/initialization.md | 6 +++--- .../current/loading_data.md | 6 +++--- .../current/number_formatting.md | 2 +- .../themes/base_themes_configuration.md | 2 +- .../current/themes/custom_theme.md | 2 +- .../current/themes/themes.md | 18 +++++++++--------- .../current/working_with_ssheet.md | 2 +- .../current/api/eventsbus_detach_method.md | 2 +- .../current/api/eventsbus_fire_method.md | 2 +- .../current/api/eventsbus_on_method.md | 2 +- .../current/api/export_json_method.md | 2 +- .../current/api/export_xlsx_method.md | 2 +- .../current/api/selection_disable_method.md | 2 +- .../current/api/selection_enable_method.md | 2 +- .../api/selection_getfocusedcell_method.md | 2 +- .../api/selection_getselectedcell_method.md | 2 +- .../current/api/selection_isdisabled_method.md | 2 +- .../api/selection_removeselectedcell_method.md | 2 +- .../api/selection_setfocusedcell_method.md | 2 +- .../api/selection_setselectedcell_method.md | 2 +- .../api/spreadsheet_addcolumn_method.md | 2 +- .../current/api/spreadsheet_addrow_method.md | 2 +- .../api/spreadsheet_afteraction_event.md | 2 +- .../api/spreadsheet_afterclear_event.md | 2 +- .../api/spreadsheet_aftereditend_event.md | 2 +- .../api/spreadsheet_aftereditstart_event.md | 2 +- .../api/spreadsheet_afterfocusset_event.md | 2 +- .../api/spreadsheet_afterselectionset_event.md | 2 +- .../api/spreadsheet_aftersheetchange_event.md | 2 +- .../current/api/spreadsheet_announce_method.md | 2 +- .../api/spreadsheet_beforeaction_event.md | 2 +- .../api/spreadsheet_beforeclear_event.md | 2 +- .../api/spreadsheet_beforeeditend_event.md | 2 +- .../api/spreadsheet_beforeeditstart_event.md | 2 +- .../api/spreadsheet_beforefocusset_event.md | 2 +- .../spreadsheet_beforeselectionset_event.md | 2 +- .../api/spreadsheet_beforesheetchange_event.md | 2 +- .../current/api/spreadsheet_clear_method.md | 2 +- .../api/spreadsheet_colscount_config.md | 2 +- .../api/spreadsheet_deletecolumn_method.md | 2 +- .../api/spreadsheet_deleterow_method.md | 2 +- .../current/api/spreadsheet_eachcell_method.md | 2 +- .../current/api/spreadsheet_editline_config.md | 2 +- .../current/api/spreadsheet_endedit_method.md | 2 +- .../api/spreadsheet_exportmodulepath_config.md | 2 +- .../api/spreadsheet_fitcolumn_method.md | 2 +- .../current/api/spreadsheet_formats_config.md | 2 +- .../api/spreadsheet_getfilter_method.md | 2 +- .../api/spreadsheet_getformat_method.md | 2 +- .../api/spreadsheet_getformula_method.md | 2 +- .../current/api/spreadsheet_getstyle_method.md | 2 +- .../current/api/spreadsheet_getvalue_method.md | 2 +- .../current/api/spreadsheet_groupfill_event.md | 2 +- .../api/spreadsheet_hidesearch_method.md | 2 +- .../api/spreadsheet_importmodulepath_config.md | 2 +- .../api/spreadsheet_insertlink_method.md | 2 +- .../current/api/spreadsheet_islocked_method.md | 2 +- .../current/api/spreadsheet_load_method.md | 4 ++-- .../api/spreadsheet_localization_config.md | 2 +- .../current/api/spreadsheet_lock_method.md | 2 +- .../current/api/spreadsheet_menu_config.md | 2 +- .../api/spreadsheet_mergecells_method.md | 2 +- .../api/spreadsheet_multisheets_config.md | 2 +- .../current/api/spreadsheet_parse_method.md | 4 ++-- .../current/api/spreadsheet_readonly_config.md | 4 ++-- .../current/api/spreadsheet_redo_method.md | 2 +- .../api/spreadsheet_rowscount_config.md | 2 +- .../current/api/spreadsheet_search_method.md | 2 +- .../api/spreadsheet_selection_config.md | 4 ++-- .../api/spreadsheet_serialize_method.md | 2 +- .../api/spreadsheet_setfilter_method.md | 2 +- .../api/spreadsheet_setformat_method.md | 2 +- .../current/api/spreadsheet_setstyle_method.md | 2 +- .../api/spreadsheet_setvalidation_method.md | 2 +- .../current/api/spreadsheet_setvalue_method.md | 2 +- .../api/spreadsheet_sortcells_method.md | 2 +- .../api/spreadsheet_startedit_method.md | 2 +- .../current/api/spreadsheet_undo_method.md | 2 +- .../current/api/spreadsheet_unlock_method.md | 2 +- .../current/configuration.md | 6 +++--- .../current/how_to_start.md | 6 +++--- .../current/initialization.md | 6 +++--- .../current/loading_data.md | 6 +++--- .../current/number_formatting.md | 2 +- .../themes/base_themes_configuration.md | 2 +- .../current/themes/custom_theme.md | 2 +- .../current/themes/themes.md | 18 +++++++++--------- .../current/working_with_ssheet.md | 2 +- .../current/api/eventsbus_detach_method.md | 2 +- .../current/api/eventsbus_fire_method.md | 2 +- .../current/api/eventsbus_on_method.md | 2 +- .../current/api/export_json_method.md | 2 +- .../current/api/export_xlsx_method.md | 2 +- .../current/api/selection_disable_method.md | 2 +- .../current/api/selection_enable_method.md | 2 +- .../api/selection_getfocusedcell_method.md | 2 +- .../api/selection_getselectedcell_method.md | 2 +- .../current/api/selection_isdisabled_method.md | 2 +- .../api/selection_removeselectedcell_method.md | 2 +- .../api/selection_setfocusedcell_method.md | 2 +- .../api/selection_setselectedcell_method.md | 2 +- .../api/spreadsheet_addcolumn_method.md | 2 +- .../current/api/spreadsheet_addrow_method.md | 2 +- .../api/spreadsheet_afteraction_event.md | 2 +- .../api/spreadsheet_afterclear_event.md | 2 +- .../api/spreadsheet_aftereditend_event.md | 2 +- .../api/spreadsheet_aftereditstart_event.md | 2 +- .../api/spreadsheet_afterfocusset_event.md | 2 +- .../api/spreadsheet_afterselectionset_event.md | 2 +- .../api/spreadsheet_aftersheetchange_event.md | 2 +- .../current/api/spreadsheet_announce_method.md | 2 +- .../api/spreadsheet_beforeaction_event.md | 2 +- .../api/spreadsheet_beforeclear_event.md | 2 +- .../api/spreadsheet_beforeeditend_event.md | 2 +- .../api/spreadsheet_beforeeditstart_event.md | 2 +- .../api/spreadsheet_beforefocusset_event.md | 2 +- .../spreadsheet_beforeselectionset_event.md | 2 +- .../api/spreadsheet_beforesheetchange_event.md | 2 +- .../current/api/spreadsheet_clear_method.md | 2 +- .../api/spreadsheet_colscount_config.md | 2 +- .../api/spreadsheet_deletecolumn_method.md | 2 +- .../api/spreadsheet_deleterow_method.md | 2 +- .../current/api/spreadsheet_eachcell_method.md | 2 +- .../current/api/spreadsheet_editline_config.md | 2 +- .../current/api/spreadsheet_endedit_method.md | 2 +- .../api/spreadsheet_exportmodulepath_config.md | 2 +- .../api/spreadsheet_fitcolumn_method.md | 2 +- .../current/api/spreadsheet_formats_config.md | 2 +- .../api/spreadsheet_getfilter_method.md | 2 +- .../api/spreadsheet_getformat_method.md | 2 +- .../api/spreadsheet_getformula_method.md | 2 +- .../current/api/spreadsheet_getstyle_method.md | 2 +- .../current/api/spreadsheet_getvalue_method.md | 2 +- .../current/api/spreadsheet_groupfill_event.md | 2 +- .../api/spreadsheet_hidesearch_method.md | 2 +- .../api/spreadsheet_importmodulepath_config.md | 2 +- .../api/spreadsheet_insertlink_method.md | 2 +- .../current/api/spreadsheet_islocked_method.md | 2 +- .../current/api/spreadsheet_load_method.md | 4 ++-- .../api/spreadsheet_localization_config.md | 2 +- .../current/api/spreadsheet_lock_method.md | 2 +- .../current/api/spreadsheet_menu_config.md | 2 +- .../api/spreadsheet_mergecells_method.md | 2 +- .../api/spreadsheet_multisheets_config.md | 2 +- .../current/api/spreadsheet_parse_method.md | 4 ++-- .../current/api/spreadsheet_readonly_config.md | 4 ++-- .../current/api/spreadsheet_redo_method.md | 2 +- .../api/spreadsheet_rowscount_config.md | 2 +- .../current/api/spreadsheet_search_method.md | 2 +- .../api/spreadsheet_selection_config.md | 4 ++-- .../api/spreadsheet_serialize_method.md | 2 +- .../api/spreadsheet_setfilter_method.md | 2 +- .../api/spreadsheet_setformat_method.md | 2 +- .../current/api/spreadsheet_setstyle_method.md | 2 +- .../api/spreadsheet_setvalidation_method.md | 2 +- .../current/api/spreadsheet_setvalue_method.md | 2 +- .../api/spreadsheet_sortcells_method.md | 2 +- .../api/spreadsheet_startedit_method.md | 2 +- .../current/api/spreadsheet_undo_method.md | 2 +- .../current/api/spreadsheet_unlock_method.md | 2 +- .../current/configuration.md | 6 +++--- .../current/how_to_start.md | 6 +++--- .../current/initialization.md | 6 +++--- .../current/loading_data.md | 6 +++--- .../current/number_formatting.md | 2 +- .../themes/base_themes_configuration.md | 2 +- .../current/themes/custom_theme.md | 2 +- .../current/themes/themes.md | 18 +++++++++--------- .../current/working_with_ssheet.md | 2 +- .../current/api/eventsbus_detach_method.md | 2 +- .../current/api/eventsbus_fire_method.md | 2 +- .../current/api/eventsbus_on_method.md | 2 +- .../current/api/export_json_method.md | 2 +- .../current/api/export_xlsx_method.md | 2 +- .../current/api/selection_disable_method.md | 2 +- .../current/api/selection_enable_method.md | 2 +- .../api/selection_getfocusedcell_method.md | 2 +- .../api/selection_getselectedcell_method.md | 2 +- .../current/api/selection_isdisabled_method.md | 2 +- .../api/selection_removeselectedcell_method.md | 2 +- .../api/selection_setfocusedcell_method.md | 2 +- .../api/selection_setselectedcell_method.md | 2 +- .../api/spreadsheet_addcolumn_method.md | 2 +- .../current/api/spreadsheet_addrow_method.md | 2 +- .../api/spreadsheet_afteraction_event.md | 2 +- .../api/spreadsheet_afterclear_event.md | 2 +- .../api/spreadsheet_aftereditend_event.md | 2 +- .../api/spreadsheet_aftereditstart_event.md | 2 +- .../api/spreadsheet_afterfocusset_event.md | 2 +- .../api/spreadsheet_afterselectionset_event.md | 2 +- .../api/spreadsheet_aftersheetchange_event.md | 2 +- .../current/api/spreadsheet_announce_method.md | 2 +- .../api/spreadsheet_beforeaction_event.md | 2 +- .../api/spreadsheet_beforeclear_event.md | 2 +- .../api/spreadsheet_beforeeditend_event.md | 2 +- .../api/spreadsheet_beforeeditstart_event.md | 2 +- .../api/spreadsheet_beforefocusset_event.md | 2 +- .../spreadsheet_beforeselectionset_event.md | 2 +- .../api/spreadsheet_beforesheetchange_event.md | 2 +- .../current/api/spreadsheet_clear_method.md | 2 +- .../api/spreadsheet_colscount_config.md | 2 +- .../api/spreadsheet_deletecolumn_method.md | 2 +- .../api/spreadsheet_deleterow_method.md | 2 +- .../current/api/spreadsheet_eachcell_method.md | 2 +- .../current/api/spreadsheet_editline_config.md | 2 +- .../current/api/spreadsheet_endedit_method.md | 2 +- .../api/spreadsheet_exportmodulepath_config.md | 2 +- .../api/spreadsheet_fitcolumn_method.md | 2 +- .../current/api/spreadsheet_formats_config.md | 2 +- .../api/spreadsheet_getfilter_method.md | 2 +- .../api/spreadsheet_getformat_method.md | 2 +- .../api/spreadsheet_getformula_method.md | 2 +- .../current/api/spreadsheet_getstyle_method.md | 2 +- .../current/api/spreadsheet_getvalue_method.md | 2 +- .../current/api/spreadsheet_groupfill_event.md | 2 +- .../api/spreadsheet_hidesearch_method.md | 2 +- .../api/spreadsheet_importmodulepath_config.md | 2 +- .../api/spreadsheet_insertlink_method.md | 2 +- .../current/api/spreadsheet_islocked_method.md | 2 +- .../current/api/spreadsheet_load_method.md | 4 ++-- .../api/spreadsheet_localization_config.md | 2 +- .../current/api/spreadsheet_lock_method.md | 2 +- .../current/api/spreadsheet_menu_config.md | 2 +- .../api/spreadsheet_mergecells_method.md | 2 +- .../api/spreadsheet_multisheets_config.md | 2 +- .../current/api/spreadsheet_parse_method.md | 4 ++-- .../current/api/spreadsheet_readonly_config.md | 4 ++-- .../current/api/spreadsheet_redo_method.md | 2 +- .../api/spreadsheet_rowscount_config.md | 2 +- .../current/api/spreadsheet_search_method.md | 2 +- .../api/spreadsheet_selection_config.md | 4 ++-- .../api/spreadsheet_serialize_method.md | 2 +- .../api/spreadsheet_setfilter_method.md | 2 +- .../api/spreadsheet_setformat_method.md | 2 +- .../current/api/spreadsheet_setstyle_method.md | 2 +- .../api/spreadsheet_setvalidation_method.md | 2 +- .../current/api/spreadsheet_setvalue_method.md | 2 +- .../api/spreadsheet_sortcells_method.md | 2 +- .../api/spreadsheet_startedit_method.md | 2 +- .../current/api/spreadsheet_undo_method.md | 2 +- .../current/api/spreadsheet_unlock_method.md | 2 +- .../current/configuration.md | 6 +++--- .../current/how_to_start.md | 6 +++--- .../current/initialization.md | 6 +++--- .../current/loading_data.md | 6 +++--- .../current/number_formatting.md | 2 +- .../themes/base_themes_configuration.md | 2 +- .../current/themes/custom_theme.md | 2 +- .../current/themes/themes.md | 18 +++++++++--------- .../current/working_with_ssheet.md | 2 +- 405 files changed, 505 insertions(+), 505 deletions(-) diff --git a/docs/api/eventsbus_detach_method.md b/docs/api/eventsbus_detach_method.md index 02607b5c..d210f1db 100644 --- a/docs/api/eventsbus_detach_method.md +++ b/docs/api/eventsbus_detach_method.md @@ -23,7 +23,7 @@ detach(name: string): void; ### Example ~~~jsx {10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/docs/api/eventsbus_fire_method.md b/docs/api/eventsbus_fire_method.md index 69a340bc..675e5a41 100644 --- a/docs/api/eventsbus_fire_method.md +++ b/docs/api/eventsbus_fire_method.md @@ -32,7 +32,7 @@ The method returns `false` if some of the event handlers return `false`. Otherwi ### Example ~~~jsx {10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/docs/api/eventsbus_on_method.md b/docs/api/eventsbus_on_method.md index e7ac68a5..227b7459 100644 --- a/docs/api/eventsbus_on_method.md +++ b/docs/api/eventsbus_on_method.md @@ -24,7 +24,7 @@ on(name: string, callback: function): void; ### Example ~~~jsx {6-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/docs/api/export_json_method.md b/docs/api/export_json_method.md index 32eb28ae..79986c56 100644 --- a/docs/api/export_json_method.md +++ b/docs/api/export_json_method.md @@ -19,7 +19,7 @@ json(): void; ### Example ~~~jsx {7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/docs/api/export_xlsx_method.md b/docs/api/export_xlsx_method.md index b6dfc849..bed48981 100644 --- a/docs/api/export_xlsx_method.md +++ b/docs/api/export_xlsx_method.md @@ -23,7 +23,7 @@ xlsx(name:string): void; ### Example ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/docs/api/selection_disable_method.md b/docs/api/selection_disable_method.md index 8c6b6370..d2c4a337 100644 --- a/docs/api/selection_disable_method.md +++ b/docs/api/selection_disable_method.md @@ -19,7 +19,7 @@ disable(): void; ### Example ~~~jsx {6} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/docs/api/selection_enable_method.md b/docs/api/selection_enable_method.md index f8dcb156..74d383e2 100644 --- a/docs/api/selection_enable_method.md +++ b/docs/api/selection_enable_method.md @@ -19,7 +19,7 @@ enable(): void; ### Example ~~~jsx {7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, // other config parameters }); diff --git a/docs/api/selection_getfocusedcell_method.md b/docs/api/selection_getfocusedcell_method.md index 1142c280..ed768d4f 100644 --- a/docs/api/selection_getfocusedcell_method.md +++ b/docs/api/selection_getfocusedcell_method.md @@ -23,7 +23,7 @@ The method returns the id of the focused cell ### Example ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/docs/api/selection_getselectedcell_method.md b/docs/api/selection_getselectedcell_method.md index 7aa6e703..683148e0 100644 --- a/docs/api/selection_getselectedcell_method.md +++ b/docs/api/selection_getselectedcell_method.md @@ -23,7 +23,7 @@ The method returns the id(s) or a range of selected cell(s) ### Example ~~~jsx {8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/docs/api/selection_isdisabled_method.md b/docs/api/selection_isdisabled_method.md index 654dca2a..53ebb926 100644 --- a/docs/api/selection_isdisabled_method.md +++ b/docs/api/selection_isdisabled_method.md @@ -23,7 +23,7 @@ The method returns `true` if the selection is turned off; otherwise, `false` ### Example ~~~jsx {7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, // other config parameters }); diff --git a/docs/api/selection_removeselectedcell_method.md b/docs/api/selection_removeselectedcell_method.md index 39ad2ff8..d786d173 100644 --- a/docs/api/selection_removeselectedcell_method.md +++ b/docs/api/selection_removeselectedcell_method.md @@ -23,7 +23,7 @@ removeSelectedCell(cell: string): void; ### Example ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/docs/api/selection_setfocusedcell_method.md b/docs/api/selection_setfocusedcell_method.md index 04d486b3..fe312b28 100644 --- a/docs/api/selection_setfocusedcell_method.md +++ b/docs/api/selection_setfocusedcell_method.md @@ -24,7 +24,7 @@ setFocusedCell(cell: string, scroll?: boolean): void; ### Example ~~~jsx {6} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/docs/api/selection_setselectedcell_method.md b/docs/api/selection_setselectedcell_method.md index b0783797..fd1d31c0 100644 --- a/docs/api/selection_setselectedcell_method.md +++ b/docs/api/selection_setselectedcell_method.md @@ -24,7 +24,7 @@ setSelectedCell(cell: string, scroll?: boolean): void; ### Example ~~~jsx {7,10,13} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/docs/api/spreadsheet_addcolumn_method.md b/docs/api/spreadsheet_addcolumn_method.md index a05703ea..c6fe09ec 100644 --- a/docs/api/spreadsheet_addcolumn_method.md +++ b/docs/api/spreadsheet_addcolumn_method.md @@ -27,7 +27,7 @@ addColumn(cell: string): void; ### Example ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // adds an empty "G" column diff --git a/docs/api/spreadsheet_addrow_method.md b/docs/api/spreadsheet_addrow_method.md index 948a80a7..5cf9d726 100644 --- a/docs/api/spreadsheet_addrow_method.md +++ b/docs/api/spreadsheet_addrow_method.md @@ -27,7 +27,7 @@ addRow(cell: string): void; ### Example ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // adds an empty second row diff --git a/docs/api/spreadsheet_afteraction_event.md b/docs/api/spreadsheet_afteraction_event.md index 9914ea42..ab16157c 100644 --- a/docs/api/spreadsheet_afteraction_event.md +++ b/docs/api/spreadsheet_afteraction_event.md @@ -51,7 +51,7 @@ The callback of the event takes the following parameters: ### Example ~~~jsx {6-11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(dataset); diff --git a/docs/api/spreadsheet_afterclear_event.md b/docs/api/spreadsheet_afterclear_event.md index bf75b6b8..8f5f9761 100644 --- a/docs/api/spreadsheet_afterclear_event.md +++ b/docs/api/spreadsheet_afterclear_event.md @@ -33,7 +33,7 @@ afterClear: () => void; ### Example ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "afterClear" event diff --git a/docs/api/spreadsheet_aftereditend_event.md b/docs/api/spreadsheet_aftereditend_event.md index a88495b7..22a9a7bb 100644 --- a/docs/api/spreadsheet_aftereditend_event.md +++ b/docs/api/spreadsheet_aftereditend_event.md @@ -26,7 +26,7 @@ The callback of the event takes the following parameters: ### Example ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "afterEditEnd" event diff --git a/docs/api/spreadsheet_aftereditstart_event.md b/docs/api/spreadsheet_aftereditstart_event.md index 4349bcc8..0a2c56ed 100644 --- a/docs/api/spreadsheet_aftereditstart_event.md +++ b/docs/api/spreadsheet_aftereditstart_event.md @@ -26,7 +26,7 @@ The callback of the event takes the following parameters: ### Example ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "afterEditStart" event diff --git a/docs/api/spreadsheet_afterfocusset_event.md b/docs/api/spreadsheet_afterfocusset_event.md index e1601369..e9cc3a8c 100644 --- a/docs/api/spreadsheet_afterfocusset_event.md +++ b/docs/api/spreadsheet_afterfocusset_event.md @@ -25,7 +25,7 @@ The callback of the event takes the following parameters: ### Example ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "afterFocusSet" event diff --git a/docs/api/spreadsheet_afterselectionset_event.md b/docs/api/spreadsheet_afterselectionset_event.md index 55eaa0f7..3d1b5eed 100644 --- a/docs/api/spreadsheet_afterselectionset_event.md +++ b/docs/api/spreadsheet_afterselectionset_event.md @@ -25,7 +25,7 @@ The callback of the event takes the following parameters: ### Example ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "afterSelectionSet" event diff --git a/docs/api/spreadsheet_aftersheetchange_event.md b/docs/api/spreadsheet_aftersheetchange_event.md index 452a4538..1029008c 100644 --- a/docs/api/spreadsheet_aftersheetchange_event.md +++ b/docs/api/spreadsheet_aftersheetchange_event.md @@ -25,7 +25,7 @@ The callback of the event takes the following parameters: ### Example ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "afterSheetChange" event diff --git a/docs/api/spreadsheet_announce_method.md b/docs/api/spreadsheet_announce_method.md index 04127f90..cc947850 100644 --- a/docs/api/spreadsheet_announce_method.md +++ b/docs/api/spreadsheet_announce_method.md @@ -25,7 +25,7 @@ announce(message: string): void; In the example below, a custom menu command counts the empty cells in the selected range and announces the result: ~~~jsx {18} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { menu: true, // other config parameters }); diff --git a/docs/api/spreadsheet_beforeaction_event.md b/docs/api/spreadsheet_beforeaction_event.md index bd601d81..d5b70e4d 100644 --- a/docs/api/spreadsheet_beforeaction_event.md +++ b/docs/api/spreadsheet_beforeaction_event.md @@ -55,7 +55,7 @@ Return `false` to prevent an action from being executed; otherwise, return `true ### Example ~~~jsx {6-11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(dataset); diff --git a/docs/api/spreadsheet_beforeclear_event.md b/docs/api/spreadsheet_beforeclear_event.md index 19f84c14..303b7e24 100644 --- a/docs/api/spreadsheet_beforeclear_event.md +++ b/docs/api/spreadsheet_beforeclear_event.md @@ -38,7 +38,7 @@ Return `false` to prevent clearing a spreadsheet; otherwise, `true`. ### Example ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "beforeClear" event diff --git a/docs/api/spreadsheet_beforeeditend_event.md b/docs/api/spreadsheet_beforeeditend_event.md index c0e1cad2..efb84156 100644 --- a/docs/api/spreadsheet_beforeeditend_event.md +++ b/docs/api/spreadsheet_beforeeditend_event.md @@ -30,7 +30,7 @@ Return `true` to finish editing a cell, `false` to prevent closing of an editor ### Example ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "beforeEditEnd" event diff --git a/docs/api/spreadsheet_beforeeditstart_event.md b/docs/api/spreadsheet_beforeeditstart_event.md index 72baf292..0ef89172 100644 --- a/docs/api/spreadsheet_beforeeditstart_event.md +++ b/docs/api/spreadsheet_beforeeditstart_event.md @@ -30,7 +30,7 @@ Return `true` to edit a cell, `false` to prevent editing ### Example ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "beforeEditStart" event diff --git a/docs/api/spreadsheet_beforefocusset_event.md b/docs/api/spreadsheet_beforefocusset_event.md index 7506453a..873a6445 100644 --- a/docs/api/spreadsheet_beforefocusset_event.md +++ b/docs/api/spreadsheet_beforefocusset_event.md @@ -29,7 +29,7 @@ Return `true` to set focus on a cell, `false` to prevent setting focus ### Example ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "beforeFocusSet" event diff --git a/docs/api/spreadsheet_beforeselectionset_event.md b/docs/api/spreadsheet_beforeselectionset_event.md index 9bceb6c5..dcc1b1be 100644 --- a/docs/api/spreadsheet_beforeselectionset_event.md +++ b/docs/api/spreadsheet_beforeselectionset_event.md @@ -29,7 +29,7 @@ Return `true` to select cells, `false` to prevent selection of cells ### Example ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "beforeSelectionSet" event diff --git a/docs/api/spreadsheet_beforesheetchange_event.md b/docs/api/spreadsheet_beforesheetchange_event.md index dcc4cdc9..160a630d 100644 --- a/docs/api/spreadsheet_beforesheetchange_event.md +++ b/docs/api/spreadsheet_beforesheetchange_event.md @@ -29,7 +29,7 @@ Return `true` to change the active sheet, `false` to prevent the active sheet fr ### Example ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "beforeSheetChange" event diff --git a/docs/api/spreadsheet_clear_method.md b/docs/api/spreadsheet_clear_method.md index 7b5a0d65..349c43b4 100644 --- a/docs/api/spreadsheet_clear_method.md +++ b/docs/api/spreadsheet_clear_method.md @@ -19,7 +19,7 @@ clear(): void; ### Example ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // clears a spreadsheet diff --git a/docs/api/spreadsheet_colscount_config.md b/docs/api/spreadsheet_colscount_config.md index af414287..ffdc6430 100644 --- a/docs/api/spreadsheet_colscount_config.md +++ b/docs/api/spreadsheet_colscount_config.md @@ -19,7 +19,7 @@ colsCount?: number; ### Example ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { colsCount: 10, // other config parameters }); diff --git a/docs/api/spreadsheet_deletecolumn_method.md b/docs/api/spreadsheet_deletecolumn_method.md index 2c9fee5a..3b6172b7 100644 --- a/docs/api/spreadsheet_deletecolumn_method.md +++ b/docs/api/spreadsheet_deletecolumn_method.md @@ -29,7 +29,7 @@ deleteColumn(cell: string): void; ### Example ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // removes the "G" column diff --git a/docs/api/spreadsheet_deleterow_method.md b/docs/api/spreadsheet_deleterow_method.md index 5ea9e4ed..0a2ff701 100644 --- a/docs/api/spreadsheet_deleterow_method.md +++ b/docs/api/spreadsheet_deleterow_method.md @@ -29,7 +29,7 @@ deleteRow(cell: string): void; ### Example ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // removes the second row diff --git a/docs/api/spreadsheet_eachcell_method.md b/docs/api/spreadsheet_eachcell_method.md index d0f1f328..74fc4171 100644 --- a/docs/api/spreadsheet_eachcell_method.md +++ b/docs/api/spreadsheet_eachcell_method.md @@ -31,7 +31,7 @@ eachCell( ### Example ~~~jsx {21-27} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); diff --git a/docs/api/spreadsheet_editline_config.md b/docs/api/spreadsheet_editline_config.md index 76109e7a..20a1ff9a 100644 --- a/docs/api/spreadsheet_editline_config.md +++ b/docs/api/spreadsheet_editline_config.md @@ -25,7 +25,7 @@ editLine: true ### Example ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { editLine: true, // other config parameters }); diff --git a/docs/api/spreadsheet_endedit_method.md b/docs/api/spreadsheet_endedit_method.md index b4a202db..87609708 100644 --- a/docs/api/spreadsheet_endedit_method.md +++ b/docs/api/spreadsheet_endedit_method.md @@ -19,7 +19,7 @@ endEdit(): void; ### Example ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // finishes editing in the selected cell diff --git a/docs/api/spreadsheet_exportmodulepath_config.md b/docs/api/spreadsheet_exportmodulepath_config.md index fb967aca..2b631914 100644 --- a/docs/api/spreadsheet_exportmodulepath_config.md +++ b/docs/api/spreadsheet_exportmodulepath_config.md @@ -19,7 +19,7 @@ exportModulePath?: string; ### Example ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { exportModulePath: "../libs/json2excel/x.x/worker.js?vx", // a local path to the `worker.js` file of the export module // other config parameters }); diff --git a/docs/api/spreadsheet_fitcolumn_method.md b/docs/api/spreadsheet_fitcolumn_method.md index 56d3cfa4..96966f07 100644 --- a/docs/api/spreadsheet_fitcolumn_method.md +++ b/docs/api/spreadsheet_fitcolumn_method.md @@ -24,7 +24,7 @@ fitColumn(cell: string): void; ### Example ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // adjusts the width of the "G" column diff --git a/docs/api/spreadsheet_formats_config.md b/docs/api/spreadsheet_formats_config.md index e1420a4c..475c9013 100644 --- a/docs/api/spreadsheet_formats_config.md +++ b/docs/api/spreadsheet_formats_config.md @@ -50,7 +50,7 @@ defaultFormats = [ ### Example ~~~jsx {2-19} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { formats: [ { name: "U.S. Dollar", diff --git a/docs/api/spreadsheet_getfilter_method.md b/docs/api/spreadsheet_getfilter_method.md index a9889b93..73663e16 100644 --- a/docs/api/spreadsheet_getfilter_method.md +++ b/docs/api/spreadsheet_getfilter_method.md @@ -30,7 +30,7 @@ The method returns an object with filtering criteria. The object includes two at ### Example ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // gets criteria of filtering for the current sheet diff --git a/docs/api/spreadsheet_getformat_method.md b/docs/api/spreadsheet_getformat_method.md index 044022bb..90aabb54 100644 --- a/docs/api/spreadsheet_getformat_method.md +++ b/docs/api/spreadsheet_getformat_method.md @@ -27,7 +27,7 @@ The method returns the format(s) applied to the value of the cell(s) ### Example ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // returns "currency" diff --git a/docs/api/spreadsheet_getformula_method.md b/docs/api/spreadsheet_getformula_method.md index 560eca9a..841b2bc3 100644 --- a/docs/api/spreadsheet_getformula_method.md +++ b/docs/api/spreadsheet_getformula_method.md @@ -27,7 +27,7 @@ The method returns the formula of the cell ### Example ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // returns "ABS(C2)" diff --git a/docs/api/spreadsheet_getstyle_method.md b/docs/api/spreadsheet_getstyle_method.md index 37c5fd9a..2c58756d 100644 --- a/docs/api/spreadsheet_getstyle_method.md +++ b/docs/api/spreadsheet_getstyle_method.md @@ -27,7 +27,7 @@ The method returns the styles set for the cells ### Example ~~~jsx {5,9,12} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // getting style of one cell diff --git a/docs/api/spreadsheet_getvalue_method.md b/docs/api/spreadsheet_getvalue_method.md index 4ffa8863..de62fed4 100644 --- a/docs/api/spreadsheet_getvalue_method.md +++ b/docs/api/spreadsheet_getvalue_method.md @@ -27,7 +27,7 @@ The method returns the values of the cells ### Example ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // returning the value of one cell diff --git a/docs/api/spreadsheet_groupfill_event.md b/docs/api/spreadsheet_groupfill_event.md index 06291fad..5f9b5eaa 100644 --- a/docs/api/spreadsheet_groupfill_event.md +++ b/docs/api/spreadsheet_groupfill_event.md @@ -26,7 +26,7 @@ The callback of the event takes the following parameters: ### Example ~~~jsx {5-7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "groupFill" event diff --git a/docs/api/spreadsheet_hidesearch_method.md b/docs/api/spreadsheet_hidesearch_method.md index de4bc8b7..e285fcd7 100644 --- a/docs/api/spreadsheet_hidesearch_method.md +++ b/docs/api/spreadsheet_hidesearch_method.md @@ -19,7 +19,7 @@ hideSearch(): void; ### Example ~~~jsx {5,8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // opens a search bar and highlights the found cells diff --git a/docs/api/spreadsheet_importmodulepath_config.md b/docs/api/spreadsheet_importmodulepath_config.md index 53b40c24..845da407 100644 --- a/docs/api/spreadsheet_importmodulepath_config.md +++ b/docs/api/spreadsheet_importmodulepath_config.md @@ -19,7 +19,7 @@ importModulePath?: string; ### Example ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { importModulePath: "../libs/excel2json/1.0/worker.js", // other config parameters }); diff --git a/docs/api/spreadsheet_insertlink_method.md b/docs/api/spreadsheet_insertlink_method.md index 33f05e4e..9b3df0fc 100644 --- a/docs/api/spreadsheet_insertlink_method.md +++ b/docs/api/spreadsheet_insertlink_method.md @@ -36,7 +36,7 @@ To remove a hyperlink but keep the text, call the method without the `link` para ### Example ~~~jsx {5-7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // insert a link in "A2" cell diff --git a/docs/api/spreadsheet_islocked_method.md b/docs/api/spreadsheet_islocked_method.md index 7348ae94..600a1c50 100644 --- a/docs/api/spreadsheet_islocked_method.md +++ b/docs/api/spreadsheet_islocked_method.md @@ -27,7 +27,7 @@ The method returns `true` if the cell is locked and `false` if it's unlocked ### Example ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // checks whether a cell is locked diff --git a/docs/api/spreadsheet_load_method.md b/docs/api/spreadsheet_load_method.md index a78b460e..7ecd23fa 100644 --- a/docs/api/spreadsheet_load_method.md +++ b/docs/api/spreadsheet_load_method.md @@ -28,7 +28,7 @@ The method returns a promise of data loading ### Example ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // load data in the JSON format (default) @@ -84,7 +84,7 @@ You can let users load a JSON file into the spreadsheet through the File Explore - Call the `load()` method with two parameters: an empty string as a URL and the type of data to load ("json"): ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { menu: true, }); diff --git a/docs/api/spreadsheet_localization_config.md b/docs/api/spreadsheet_localization_config.md index 7b43b1f2..68811bd1 100644 --- a/docs/api/spreadsheet_localization_config.md +++ b/docs/api/spreadsheet_localization_config.md @@ -41,7 +41,7 @@ const defaultLocales = { ### Example ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { localization: { decimal: ",", thousands: " ", diff --git a/docs/api/spreadsheet_lock_method.md b/docs/api/spreadsheet_lock_method.md index d364565b..e1b09020 100644 --- a/docs/api/spreadsheet_lock_method.md +++ b/docs/api/spreadsheet_lock_method.md @@ -23,7 +23,7 @@ lock(cell: string): void; ### Example ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // locks a cell diff --git a/docs/api/spreadsheet_menu_config.md b/docs/api/spreadsheet_menu_config.md index 9fe6b00b..bed5ce0e 100644 --- a/docs/api/spreadsheet_menu_config.md +++ b/docs/api/spreadsheet_menu_config.md @@ -25,7 +25,7 @@ menu: true ### Example ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { menu: false, // other config parameters }); diff --git a/docs/api/spreadsheet_mergecells_method.md b/docs/api/spreadsheet_mergecells_method.md index f41e5f62..95a52605 100644 --- a/docs/api/spreadsheet_mergecells_method.md +++ b/docs/api/spreadsheet_mergecells_method.md @@ -29,7 +29,7 @@ mergeCells( ### Example ~~~jsx {5,8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // merge cells A3, A4, and A5 diff --git a/docs/api/spreadsheet_multisheets_config.md b/docs/api/spreadsheet_multisheets_config.md index 3fad9e53..ad31fd19 100644 --- a/docs/api/spreadsheet_multisheets_config.md +++ b/docs/api/spreadsheet_multisheets_config.md @@ -25,7 +25,7 @@ multiSheets: true ### Example ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { multiSheets: false, // other config parameters }); diff --git a/docs/api/spreadsheet_parse_method.md b/docs/api/spreadsheet_parse_method.md index 8ea7e1d2..e97a7072 100644 --- a/docs/api/spreadsheet_parse_method.md +++ b/docs/api/spreadsheet_parse_method.md @@ -167,7 +167,7 @@ const data = [ // more data ]; -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); ~~~ @@ -246,7 +246,7 @@ const styledData = { ], }; -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(styledData); ~~~ diff --git a/docs/api/spreadsheet_readonly_config.md b/docs/api/spreadsheet_readonly_config.md index c6f428f8..3d285774 100644 --- a/docs/api/spreadsheet_readonly_config.md +++ b/docs/api/spreadsheet_readonly_config.md @@ -25,7 +25,7 @@ readonly: false ### Example ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, // other config parameters }); @@ -53,7 +53,7 @@ Changes of the data are refused: To turn off the keyboard navigation and the selection as well, set the [`selection`](api/spreadsheet_selection_config.md) option to `false`. In this case, the Spreadsheet has no active cell, and the cells can't be selected by the mouse, the keyboard or the API: ~~~jsx {3} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, selection: false, // other config parameters diff --git a/docs/api/spreadsheet_redo_method.md b/docs/api/spreadsheet_redo_method.md index 736a409c..bb75bb42 100644 --- a/docs/api/spreadsheet_redo_method.md +++ b/docs/api/spreadsheet_redo_method.md @@ -19,7 +19,7 @@ redo(): void; ### Example ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // applies the reverted action once again diff --git a/docs/api/spreadsheet_rowscount_config.md b/docs/api/spreadsheet_rowscount_config.md index 618714bf..31630bdd 100644 --- a/docs/api/spreadsheet_rowscount_config.md +++ b/docs/api/spreadsheet_rowscount_config.md @@ -19,7 +19,7 @@ rowsCount?: number; ### Example ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { rowsCount: 10, // other config parameters }); diff --git a/docs/api/spreadsheet_search_method.md b/docs/api/spreadsheet_search_method.md index 96003a21..645d11d5 100644 --- a/docs/api/spreadsheet_search_method.md +++ b/docs/api/spreadsheet_search_method.md @@ -35,7 +35,7 @@ The method returns an array with IDs of the found cells ### Example ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // returns IDs of cells with the matched result, opens a search bar and highlights the found cells diff --git a/docs/api/spreadsheet_selection_config.md b/docs/api/spreadsheet_selection_config.md index 5e2e54e2..17c4d96e 100644 --- a/docs/api/spreadsheet_selection_config.md +++ b/docs/api/spreadsheet_selection_config.md @@ -25,7 +25,7 @@ selection: true ### Example ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, // other config parameters }); @@ -46,7 +46,7 @@ The columns and rows can still be resized by dragging their borders, and the dat Combined with the [`readonly`](api/spreadsheet_readonly_config.md) property, the option turns off the keyboard navigation and the selection that are available in the read-only mode: ~~~jsx {3} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, selection: false, // other config parameters diff --git a/docs/api/spreadsheet_serialize_method.md b/docs/api/spreadsheet_serialize_method.md index a2fb0977..3a37f176 100644 --- a/docs/api/spreadsheet_serialize_method.md +++ b/docs/api/spreadsheet_serialize_method.md @@ -94,7 +94,7 @@ Note that: ### Example ~~~jsx {4} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); const state = spreadsheet.serialize(); diff --git a/docs/api/spreadsheet_setfilter_method.md b/docs/api/spreadsheet_setfilter_method.md index d701c06c..57c6beba 100644 --- a/docs/api/spreadsheet_setfilter_method.md +++ b/docs/api/spreadsheet_setfilter_method.md @@ -44,7 +44,7 @@ To reset filtering, call the method without parameters or pass only the `cell` p ### Example ~~~jsx {5,8,11,14} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // filter data by condition specified for column A diff --git a/docs/api/spreadsheet_setformat_method.md b/docs/api/spreadsheet_setformat_method.md index 6e9e344c..d3f7a115 100644 --- a/docs/api/spreadsheet_setformat_method.md +++ b/docs/api/spreadsheet_setformat_method.md @@ -24,7 +24,7 @@ setFormat(cell: string, format: string | array): void; ### Example ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // applies the currency format to the cell A1 diff --git a/docs/api/spreadsheet_setstyle_method.md b/docs/api/spreadsheet_setstyle_method.md index deca0e98..e723de0c 100644 --- a/docs/api/spreadsheet_setstyle_method.md +++ b/docs/api/spreadsheet_setstyle_method.md @@ -28,7 +28,7 @@ setStyle(cell: string, styles: array | object): void; ### Example ~~~jsx {5,8,11,14} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // setting style for one cell diff --git a/docs/api/spreadsheet_setvalidation_method.md b/docs/api/spreadsheet_setvalidation_method.md index a9b6401d..f0dfc0eb 100644 --- a/docs/api/spreadsheet_setvalidation_method.md +++ b/docs/api/spreadsheet_setvalidation_method.md @@ -29,7 +29,7 @@ setValidation( ### Example ~~~jsx {8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); diff --git a/docs/api/spreadsheet_setvalue_method.md b/docs/api/spreadsheet_setvalue_method.md index 7bbdec95..ad847d32 100644 --- a/docs/api/spreadsheet_setvalue_method.md +++ b/docs/api/spreadsheet_setvalue_method.md @@ -28,7 +28,7 @@ setValue(cell: string, value: string | number | array): void; ### Example ~~~jsx {5,8,11,14} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // setting value for one cell diff --git a/docs/api/spreadsheet_sortcells_method.md b/docs/api/spreadsheet_sortcells_method.md index 0fd1db6a..cfc8b79d 100644 --- a/docs/api/spreadsheet_sortcells_method.md +++ b/docs/api/spreadsheet_sortcells_method.md @@ -26,7 +26,7 @@ sortCells(cell: string, dir: number): void; ### Example ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // configuration parameters }); spreadsheet.parse(data); diff --git a/docs/api/spreadsheet_startedit_method.md b/docs/api/spreadsheet_startedit_method.md index d80f3a9a..73a9136f 100644 --- a/docs/api/spreadsheet_startedit_method.md +++ b/docs/api/spreadsheet_startedit_method.md @@ -28,7 +28,7 @@ startEdit(cell?: string, initialValue?: string): void; ### Example ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // starts editing the currently selected cell diff --git a/docs/api/spreadsheet_undo_method.md b/docs/api/spreadsheet_undo_method.md index be96925c..3ea35891 100644 --- a/docs/api/spreadsheet_undo_method.md +++ b/docs/api/spreadsheet_undo_method.md @@ -19,7 +19,7 @@ undo(): void; ### Example ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // performs one step back diff --git a/docs/api/spreadsheet_unlock_method.md b/docs/api/spreadsheet_unlock_method.md index 606d7979..034ab0d4 100644 --- a/docs/api/spreadsheet_unlock_method.md +++ b/docs/api/spreadsheet_unlock_method.md @@ -23,7 +23,7 @@ unlock(cell: string): void; ### Example ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // unlocks a cell diff --git a/docs/configuration.md b/docs/configuration.md index cfe31a3a..3d370a4f 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -50,7 +50,7 @@ The menu of the Spreadsheet is hidden by default. You can switch it on/off via t You can also enable read-only mode to prevent editing of Spreadsheet cells via the [`readonly`](api/spreadsheet_readonly_config.md) configuration option. ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, }); ~~~ @@ -60,7 +60,7 @@ In the read-only mode, the toolbar, the menu and the formula bar are hidden. Use To turn off the keyboard navigation and the selection in the read-only mode, set the [`selection`](api/spreadsheet_selection_config.md) option to `false`: ~~~jsx {3} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, selection: false, }); @@ -75,7 +75,7 @@ You can also [customize the read-only behavior of Spreadsheet](customization.md# By default, users can select cells with the mouse and the keyboard, and the Spreadsheet has an active cell. To turn the selection off, set the [`selection`](api/spreadsheet_selection_config.md) configuration option to `false`: ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, }); ~~~ diff --git a/docs/how_to_start.md b/docs/how_to_start.md index 232ccc70..7d422c5b 100644 --- a/docs/how_to_start.md +++ b/docs/how_to_start.md @@ -79,7 +79,7 @@ As parameters, the constructor function takes the HTML container to place Spread
@@ -94,7 +94,7 @@ Next you can specify additional configuration options you want the Spreadsheet c You can adjust the look and feel of Spreadsheet with several options, for example: `toolbarBlocks`, `rowsCount`, and `colsCount`. [Check the details](configuration.md). ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { toolbarBlocks: ["columns", "rows", "clear"], rowsCount: 10, colsCount: 10 @@ -129,7 +129,7 @@ const data = [ ] // initializing spreadsheet -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { //config }); // loading data into spreadsheet diff --git a/docs/initialization.md b/docs/initialization.md index 1490adc7..4c0cc0be 100644 --- a/docs/initialization.md +++ b/docs/initialization.md @@ -39,10 +39,10 @@ The structure of the Spreadsheet pack is the following: ## Creating container -Add a container for Spreadsheet and give it an id, for example "spreadsheet": +Add a container for Spreadsheet and give it an id, for example "spreadsheet_container": ~~~html title="index.html" -
+
~~~ ## Initializing DHTMLX Spreadsheet @@ -54,7 +54,7 @@ Initialize DHTMLX Spreadsheet with the `dhx.Spreadsheet` object constructor. The ~~~jsx title="index.js" // creating DHTMLX Spreadsheet -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config options }); ~~~ diff --git a/docs/loading_data.md b/docs/loading_data.md index 0dcc8ebf..823be712 100644 --- a/docs/loading_data.md +++ b/docs/loading_data.md @@ -179,7 +179,7 @@ Note that you should not use the `value` property of the `cell` object and the ` By default, Spreadsheet expects data in JSON format. To load data from an external source, use the [](api/spreadsheet_load_method.md) method. It takes the URL of the file with data as a parameter: ~~~jsx -var spreadsheet = new dhx.Spreadsheet("spreadsheet"); +var spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); spreadsheet.load("../common/data.json"); ~~~ @@ -195,7 +195,7 @@ If you need to let users import a JSON file into the spreadsheet through the Fil You can also load data in CSV format. For this, you need to call the [](api/spreadsheet_load_method.md) method and pass the name of the format ("csv") as the second parameter: ~~~jsx -var spreadsheet = new dhx.Spreadsheet("spreadsheet"); +var spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); spreadsheet.load("../common/data.csv", "csv"); ~~~ @@ -262,7 +262,7 @@ spreadsheet.load("/some/data").then(function(){ To load data from a local source, make use of the [](api/spreadsheet_parse_method.md) method. Pass a [predefined data set](#preparing-data) as a parameter of this method: ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet"); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); spreadsheet.parse(data); ~~~ diff --git a/docs/number_formatting.md b/docs/number_formatting.md index c3802073..a727a870 100644 --- a/docs/number_formatting.md +++ b/docs/number_formatting.md @@ -107,7 +107,7 @@ With Spreadsheet configuration options, you can localize time and date, specify For example, you can change the default localization settings as shown below: ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { localization: { decimal: ",", thousands: " ", diff --git a/docs/themes/base_themes_configuration.md b/docs/themes/base_themes_configuration.md index e5b8751a..cc7d9eab 100644 --- a/docs/themes/base_themes_configuration.md +++ b/docs/themes/base_themes_configuration.md @@ -94,7 +94,7 @@ If you want to override some color values for a separate [Spreadsheet theme](/th diff --git a/docs/themes/custom_theme.md b/docs/themes/custom_theme.md index d53659d2..b9c06c3b 100644 --- a/docs/themes/custom_theme.md +++ b/docs/themes/custom_theme.md @@ -88,7 +88,7 @@ To make your own custom theme, override the values of the internal CSS variables diff --git a/docs/themes/themes.md b/docs/themes/themes.md index 08b88d16..0ee3db77 100644 --- a/docs/themes/themes.md +++ b/docs/themes/themes.md @@ -438,7 +438,7 @@ You can choose from the following variants: ~~~html title="index.html" -
+
~~~ - set the `data-dhx-theme` attribute for an HTML element, for example, for `documentElement`: @@ -465,31 +465,31 @@ The examples below show how to use the `dhx.setTheme()` method: - setting a theme either to the body or to the container ~~~html -
+
Other content
~~~ - setting a theme to the container specified via an HTMLElement ~~~html -
+
Other content
~~~ diff --git a/docs/working_with_ssheet.md b/docs/working_with_ssheet.md index 008830a6..980b88d0 100644 --- a/docs/working_with_ssheet.md +++ b/docs/working_with_ssheet.md @@ -282,7 +282,7 @@ From v4.3, you can sort data in the spreadsheet with the [`sortCells()`](api/spr - `dir` - the sorting direction: 1 - ascending sort order, -1 - descending sort order ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md index aba4f4ff..d5725013 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md @@ -23,7 +23,7 @@ detach(name: string): void; ### Beispiel {#example} ~~~jsx {10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md index 6e1c5e89..d106f349 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md @@ -32,7 +32,7 @@ Die Methode gibt `false` zurück, wenn einer der Event-Handler `false` zurückgi ### Beispiel {#example} ~~~jsx {10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md index 88bfb325..335cc672 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md @@ -24,7 +24,7 @@ on(name: string, callback: function): void; ### Beispiel {#example} ~~~jsx {6-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/export_json_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/export_json_method.md index 3bf94d41..3c6b1371 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/export_json_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/export_json_method.md @@ -19,7 +19,7 @@ json(): void; ### Beispiel {#example} ~~~jsx {7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md index f546c0e9..43bf2289 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md @@ -23,7 +23,7 @@ xlsx(name:string): void; ### Beispiel {#example} ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_disable_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_disable_method.md index b31fd52d..571f973c 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_disable_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_disable_method.md @@ -19,7 +19,7 @@ disable(): void; ### Beispiel {#example} ~~~jsx {6} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_enable_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_enable_method.md index ec1d4692..c3711d2d 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_enable_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_enable_method.md @@ -19,7 +19,7 @@ enable(): void; ### Beispiel {#example} ~~~jsx {7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, // other config parameters }); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md index 96452ed3..413ec086 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md @@ -23,7 +23,7 @@ Die Methode gibt die ID der fokussierten Zelle zurück ### Beispiel {#example} ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // Konfigurationsparameter }); spreadsheet.parse(data); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md index 64c5391a..2517e6a8 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md @@ -23,7 +23,7 @@ Die Methode gibt die ID(s) oder einen Bereich der ausgewählten Zelle(n) zurück ### Beispiel {#example} ~~~jsx {8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // Konfigurationsparameter }); spreadsheet.parse(data); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md index dbf27134..7c34f5bb 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md @@ -23,7 +23,7 @@ Die Methode gibt `true` zurück, wenn die Auswahl ausgeschaltet ist, andernfalls ### Beispiel {#example} ~~~jsx {7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, // other config parameters }); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md index ca4a3a3d..2913b353 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md @@ -23,7 +23,7 @@ removeSelectedCell(cell: string): void; ### Beispiel {#example} ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // Konfigurationsparameter }); spreadsheet.parse(data); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md index 9d8370fa..b8922c84 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md @@ -24,7 +24,7 @@ setFocusedCell(cell: string, scroll?: boolean): void; ### Beispiel {#example} ~~~jsx {6} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // Konfigurationsparameter }); spreadsheet.parse(data); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md index 92f9d52e..dfc03e02 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md @@ -24,7 +24,7 @@ setSelectedCell(cell: string, scroll?: boolean): void; ### Beispiel {#example} ~~~jsx {7,10,13} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // Konfigurationsparameter }); spreadsheet.parse(data); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md index 7559a786..677f6dff 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md @@ -27,7 +27,7 @@ addColumn(cell: string): void; ### Beispiel {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // fügt eine leere Spalte "G" hinzu diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md index 338c555f..3a3e994b 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md @@ -27,7 +27,7 @@ addRow(cell: string): void; ### Beispiel {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // fügt eine leere zweite Zeile hinzu diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md index 95d6785e..244698b6 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md @@ -51,7 +51,7 @@ Der Callback des Events akzeptiert folgende Parameter: ### Beispiel {#example} ~~~jsx {6-11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // Konfigurationsparameter }); spreadsheet.parse(dataset); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md index e46f9c8e..e75c4b92 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md @@ -33,7 +33,7 @@ afterClear: () => void; ### Beispiel {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "afterClear" event diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md index bc4e0723..447f263b 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md @@ -26,7 +26,7 @@ Der Callback des Events nimmt folgende Parameter entgegen: ### Beispiel {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "afterEditEnd" event diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md index 62c84c47..e66b0f47 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md @@ -26,7 +26,7 @@ Der Callback des Events nimmt folgende Parameter entgegen: ### Beispiel {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "afterEditStart" event diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md index 3f0831e8..1fc923ad 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md @@ -25,7 +25,7 @@ Der Callback des Events nimmt folgende Parameter entgegen: ### Beispiel {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "afterFocusSet" event diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md index 0f7219a8..e9b8ecdc 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md @@ -25,7 +25,7 @@ Der Callback des Events nimmt folgende Parameter entgegen: ### Beispiel {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "afterSelectionSet" event diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md index be886f07..5b800265 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md @@ -25,7 +25,7 @@ Der Callback des Events nimmt folgende Parameter entgegen: ### Beispiel {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "afterSheetChange" event diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md index 5cbcf9b3..83dbcb28 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md @@ -25,7 +25,7 @@ announce(message: string): void; Im folgenden Beispiel zählt ein benutzerdefinierter Menübefehl die leeren Zellen im ausgewählten Bereich und gibt das Ergebnis aus: ~~~jsx {18} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { menu: true, // other config parameters }); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md index c766c509..154b61aa 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md @@ -55,7 +55,7 @@ Geben Sie `false` zurück, um die Ausführung einer Aktion zu verhindern; andern ### Beispiel {#example} ~~~jsx {6-11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(dataset); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md index 0fb013c5..8e38ee11 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md @@ -38,7 +38,7 @@ Geben Sie `false` zurück, um das Leeren einer Tabellenkalkulation zu verhindern ### Beispiel {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "beforeClear" event diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md index 93d441f9..295dc35e 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md @@ -30,7 +30,7 @@ Geben Sie `true` zurück, um die Bearbeitung einer Zelle abzuschließen, `false` ### Beispiel {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // subscribe on the "beforeEditEnd" event diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md index bcec12a8..40c9c261 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md @@ -30,7 +30,7 @@ Geben Sie `true` zurück, um eine Zelle zu bearbeiten, oder `false`, um die Bear ### Beispiel {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // Event "beforeEditStart" abonnieren diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md index 28d7603d..7c4c9bdc 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md @@ -29,7 +29,7 @@ Geben Sie `true` zurück, um den Fokus auf eine Zelle zu setzen, oder `false`, u ### Beispiel {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // Event "beforeFocusSet" abonnieren diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md index 68e32abf..3cfa36c2 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md @@ -29,7 +29,7 @@ Geben Sie `true` zurück, um Zellen auszuwählen, oder `false`, um die Auswahl v ### Beispiel {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // Event "beforeSelectionSet" abonnieren diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md index 3ea81c2a..1b35bc81 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md @@ -29,7 +29,7 @@ Geben Sie `true` zurück, um das aktive Tabellenblatt zu wechseln, oder `false`, ### Beispiel {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // Event "beforeSheetChange" abonnieren diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md index 7a5d98d5..f1796a2c 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md @@ -19,7 +19,7 @@ clear(): void; ### Beispiel {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // leert eine Tabellenkalkulation diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md index 253d7632..8a964f7f 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md @@ -19,7 +19,7 @@ colsCount?: number; ### Beispiel {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { colsCount: 10, // andere Konfigurationsparameter }); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md index c6ac0f16..1fba1ecd 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md @@ -29,7 +29,7 @@ deleteColumn(cell: string): void; ### Beispiel {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // entfernt die Spalte "G" diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md index ca14c5cd..357b305a 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md @@ -29,7 +29,7 @@ deleteRow(cell: string): void; ### Beispiel {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // entfernt die zweite Zeile diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md index 1f3ec2de..cfb2d94b 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md @@ -31,7 +31,7 @@ eachCell( ### Beispiel {#example} ~~~jsx {21-27} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // Konfigurationsparameter }); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md index 5bd02c3d..dea79378 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md @@ -25,7 +25,7 @@ editLine: true ### Beispiel {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { editLine: true, // andere Konfigurationsparameter }); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md index 3d482602..a7b6f27c 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md @@ -19,7 +19,7 @@ endEdit(): void; ### Beispiel {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // beendet die Bearbeitung in der ausgewählten Zelle diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md index 843dac66..89cef1a7 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md @@ -19,7 +19,7 @@ exportModulePath?: string; ### Beispiel {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { exportModulePath: "../libs/json2excel/x.x/worker.js?vx", // ein lokaler Pfad zur `worker.js`-Datei des Export-Moduls // weitere Konfigurationsparameter }); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md index 96180a38..da22fbf6 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md @@ -24,7 +24,7 @@ fitColumn(cell: string): void; ### Beispiel {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // passt die Breite der Spalte "G" an diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md index 15520688..2dccaca1 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md @@ -50,7 +50,7 @@ defaultFormats = [ ### Beispiel {#example} ~~~jsx {2-19} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { formats: [ { name: "U.S. Dollar", diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md index 5b35c388..bb1fad1d 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md @@ -30,7 +30,7 @@ Die Methode gibt ein Objekt mit Filterkriterien zurück. Das Objekt enthält zwe ### Beispiel {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // gibt die Filterkriterien für das aktuelle Tabellenblatt zurück diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md index 66979e44..ff911283 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md @@ -27,7 +27,7 @@ Die Methode gibt das bzw. die Format(e) zurück, das bzw. die auf den Wert der Z ### Beispiel {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // gibt "currency" zurück diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md index adfbced2..5c3988ec 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md @@ -27,7 +27,7 @@ Die Methode gibt die Formel der Zelle zurück ### Beispiel {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // gibt "ABS(C2)" zurück diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md index ddb1bbb2..4f6f0b7d 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md @@ -27,7 +27,7 @@ Die Methode gibt die für die Zellen festgelegten Stile zurück ### Beispiel {#example} ~~~jsx {5,9,12} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // Stil einer einzelnen Zelle abrufen diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md index 7250480f..cd5c3f53 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md @@ -27,7 +27,7 @@ Die Methode gibt die Werte der Zellen zurück ### Beispiel {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // Wert einer einzelnen Zelle zurückgeben diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md index da32c43d..404047ec 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md @@ -26,7 +26,7 @@ Der Callback des Events nimmt folgende Parameter entgegen: ### Beispiel {#example} ~~~jsx {5-7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // Das "groupFill"-Event abonnieren diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md index b5acbd54..5a650072 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md @@ -19,7 +19,7 @@ hideSearch(): void; ### Beispiel {#example} ~~~jsx {5,8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // Öffnet eine Suchleiste und hebt die gefundenen Zellen hervor diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md index 8fe4a494..db397dc1 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md @@ -19,7 +19,7 @@ importModulePath?: string; ### Beispiel {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { importModulePath: "../libs/excel2json/1.0/worker.js", // weitere Konfigurationsparameter }); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md index 502a639a..d035a297 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md @@ -36,7 +36,7 @@ Um einen Hyperlink zu entfernen, aber den Text beizubehalten, rufen Sie die Meth ### Beispiel {#example} ~~~jsx {5-7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // Einen Link in Zelle "A2" einfügen diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md index 4bcf97b3..b0648992 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md @@ -27,7 +27,7 @@ Die Methode gibt `true` zurück, wenn die Zelle gesperrt ist, und `false`, wenn ### Beispiel {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // Prüft, ob eine Zelle gesperrt ist diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md index f89e66f4..04e08c1a 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md @@ -28,7 +28,7 @@ Die Methode gibt ein Promise des Datenladevorgangs zurück ### Beispiel {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // Daten im JSON-Format laden (Standard) @@ -84,7 +84,7 @@ Sie können Benutzern ermöglichen, eine JSON-Datei über den Datei-Explorer in - Rufen Sie die Methode `load()` mit zwei Parametern auf: einem leeren String als URL und dem Typ der zu ladenden Daten ("json"): ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { menu: true, }); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md index 6fa21c39..17cdeeb1 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md @@ -41,7 +41,7 @@ const defaultLocales = { ### Beispiel {#example} ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { localization: { decimal: ",", thousands: " ", diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md index e2abaaa9..16fd93e9 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md @@ -23,7 +23,7 @@ lock(cell: string): void; ### Beispiel {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // sperrt eine Zelle diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md index d551152d..5ee85027 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md @@ -25,7 +25,7 @@ menu: true ### Beispiel {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { menu: false, // other config parameters }); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md index 6804a2dd..d8064f61 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md @@ -29,7 +29,7 @@ mergeCells( ### Beispiel {#example} ~~~jsx {5,8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // Zellen A3, A4 und A5 zusammenführen diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md index 12b5fa45..cdefa531 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md @@ -25,7 +25,7 @@ multiSheets: true ### Beispiel {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { multiSheets: false, // other config parameters }); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md index 64499ab6..78b14210 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md @@ -167,7 +167,7 @@ const data = [ // weitere Daten ]; -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); ~~~ @@ -246,7 +246,7 @@ const styledData = { ], }; -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(styledData); ~~~ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md index 4394ab56..e101c93b 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md @@ -25,7 +25,7 @@ readonly: false ### Beispiel {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, // other config parameters }); @@ -53,7 +53,7 @@ Benutzer können die Daten weiterhin lesen und kopieren: Um auch die Tastaturnavigation und die Auswahl zu deaktivieren, setzen Sie die Option [`selection`](api/spreadsheet_selection_config.md) auf `false`. In diesem Fall hat die Tabellenkalkulation keine aktive Zelle, und die Zellen können weder per Maus, Tastatur noch API ausgewählt werden: ~~~jsx {3} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, selection: false, // other config parameters diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md index 01ecddd6..dd67da0e 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md @@ -19,7 +19,7 @@ redo(): void; ### Beispiel {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // wendet die rückgängig gemachte Aktion erneut an diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md index 48311a17..e807d854 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md @@ -19,7 +19,7 @@ rowsCount?: number; ### Beispiel {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { rowsCount: 10, // other config parameters }); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md index 350ae828..a4cb0521 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md @@ -35,7 +35,7 @@ Die Methode gibt ein Array mit den IDs der gefundenen Zellen zurück ### Beispiel {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // gibt IDs der Zellen mit übereinstimmendem Ergebnis zurück, öffnet die Suchleiste und hebt die gefundenen Zellen hervor diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md index 09d0b008..c7875c53 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md @@ -25,7 +25,7 @@ selection: true ### Beispiel {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, // other config parameters }); @@ -46,7 +46,7 @@ Die Spalten und Zeilen lassen sich weiterhin durch Ziehen ihrer Ränder in der G In Kombination mit der Eigenschaft [`readonly`](api/spreadsheet_readonly_config.md) schaltet die Option die Tastaturnavigation und die Auswahl aus, die im schreibgeschützten Modus verfügbar sind: ~~~jsx {3} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, selection: false, // other config parameters diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md index 858c017f..2a058635 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md @@ -94,7 +94,7 @@ Beachten Sie: ### Beispiel {#example} ~~~jsx {4} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); const state = spreadsheet.serialize(); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md index 9047accd..fd120bc7 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md @@ -44,7 +44,7 @@ Um die Filterung zurückzusetzen, rufen Sie die Methode ohne Parameter auf oder ### Beispiel {#example} ~~~jsx {5,8,11,14} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // Daten nach einer für Spalte A angegebenen Bedingung filtern diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md index 08eee0da..f922276e 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md @@ -24,7 +24,7 @@ setFormat(cell: string, format: string | array): void; ### Beispiel {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // wendet das Währungsformat auf die Zelle A1 an diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md index 5f277a4b..7aa0b1a9 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md @@ -28,7 +28,7 @@ setStyle(cell: string, styles: array | object): void; ### Beispiel {#example} ~~~jsx {5,8,11,14} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // Stil für eine einzelne Zelle setzen diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md index a082ea66..79cdcb7a 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md @@ -29,7 +29,7 @@ setValidation( ### Beispiel {#example} ~~~jsx {8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // Konfigurationsparameter }); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md index e318414d..555c802f 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md @@ -28,7 +28,7 @@ setValue(cell: string, value: string | number | array): void; ### Beispiel {#example} ~~~jsx {5,8,11,14} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // Wert für eine einzelne Zelle setzen diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md index c1f077b3..416acf23 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md @@ -26,7 +26,7 @@ sortCells(cell: string, dir: number): void; ### Beispiel {#example} ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // Konfigurationsparameter }); spreadsheet.parse(data); diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md index dae19d2b..3ef43d28 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md @@ -28,7 +28,7 @@ startEdit(cell?: string, initialValue?: string): void; ### Beispiel {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // startet die Bearbeitung der aktuell ausgewählten Zelle diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md index 3d37b6ec..7ffd07c8 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md @@ -19,7 +19,7 @@ undo(): void; ### Beispiel {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // führt einen Schritt zurück aus diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md index ae8b52d9..0accce0c 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md @@ -23,7 +23,7 @@ unlock(cell: string): void; ### Beispiel {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // entsperrt eine Zelle diff --git a/i18n/de/docusaurus-plugin-content-docs/current/configuration.md b/i18n/de/docusaurus-plugin-content-docs/current/configuration.md index 3cc98a99..d3a0b8b1 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/configuration.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/configuration.md @@ -49,7 +49,7 @@ Das Menü des Spreadsheets ist standardmäßig ausgeblendet. Sie können es übe Sie können auch den schreibgeschützten Modus aktivieren, um die Bearbeitung von Spreadsheet-Zellen über die Konfigurationsoption [`readonly`](api/spreadsheet_readonly_config.md) zu verhindern. ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, }); ~~~ @@ -59,7 +59,7 @@ Im schreibgeschützten Modus sind die Symbolleiste, das Menü und die Formelleis Um die Tastaturnavigation und die Auswahl im schreibgeschützten Modus auszuschalten, setzen Sie die Option [`selection`](api/spreadsheet_selection_config.md) auf `false`: ~~~jsx {3} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, selection: false, }); @@ -74,7 +74,7 @@ Sie können auch das [schreibgeschützte Verhalten des Spreadsheets anpassen](cu Standardmäßig können Nutzer Zellen mit der Maus und der Tastatur auswählen, und das Spreadsheet hat eine aktive Zelle. Um die Auswahl auszuschalten, setzen Sie die Konfigurationsoption [`selection`](api/spreadsheet_selection_config.md) auf `false`: ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, }); ~~~ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/how_to_start.md b/i18n/de/docusaurus-plugin-content-docs/current/how_to_start.md index bd8a784b..c7cf8c99 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/how_to_start.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/how_to_start.md @@ -79,7 +79,7 @@ Als Parameter nimmt die Konstruktorfunktion den HTML-Container, in den Spreadshe
@@ -94,7 +94,7 @@ Als Nächstes können Sie zusätzliche Konfigurationsoptionen festlegen, die die Sie können das Erscheinungsbild von Spreadsheet mit mehreren Optionen anpassen, zum Beispiel: `toolbarBlocks`, `rowsCount` und `colsCount`. [Weitere Details finden Sie hier](configuration.md). ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { toolbarBlocks: ["columns", "rows", "clear"], rowsCount: 10, colsCount: 10 @@ -129,7 +129,7 @@ const data = [ ] // Spreadsheet initialisieren -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { //config }); // Daten in Spreadsheet laden diff --git a/i18n/de/docusaurus-plugin-content-docs/current/initialization.md b/i18n/de/docusaurus-plugin-content-docs/current/initialization.md index 6234b261..8a689ded 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/initialization.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/initialization.md @@ -39,10 +39,10 @@ Die Struktur des Spreadsheet-Pakets ist wie folgt: ## Container erstellen {#creating-container} -Fügen Sie einen Container für Spreadsheet hinzu und geben Sie ihm eine ID, zum Beispiel "spreadsheet": +Fügen Sie einen Container für Spreadsheet hinzu und geben Sie ihm eine ID, zum Beispiel "spreadsheet_container": ~~~html title="index.html" -
+
~~~ ## DHTMLX Spreadsheet initialisieren {#initializing-dhtmlx-spreadsheet} @@ -54,7 +54,7 @@ Initialisieren Sie DHTMLX Spreadsheet mit dem `dhx.Spreadsheet`-Objekt-Konstrukt ~~~jsx title="index.js" // DHTMLX Spreadsheet erstellen -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // Konfigurationsoptionen }); ~~~ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/loading_data.md b/i18n/de/docusaurus-plugin-content-docs/current/loading_data.md index 61905041..1cc4c3b5 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/loading_data.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/loading_data.md @@ -179,7 +179,7 @@ Beachten Sie, dass Sie die `value`-Eigenschaft des `cell`-Objekts und die `text` Standardmäßig erwartet Spreadsheet Daten im JSON-Format. Um Daten aus einer externen Quelle zu laden, verwenden Sie die Methode [](api/spreadsheet_load_method.md). Sie nimmt die URL der Datei mit den Daten als Parameter entgegen: ~~~jsx -var spreadsheet = new dhx.Spreadsheet("spreadsheet"); +var spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); spreadsheet.load("../common/data.json"); ~~~ @@ -195,7 +195,7 @@ Wenn Sie es Benutzern ermöglichen möchten, eine JSON-Datei über den Datei-Exp Sie können auch Daten im CSV-Format laden. Dazu müssen Sie die Methode [](api/spreadsheet_load_method.md) aufrufen und den Namen des Formats ("csv") als zweiten Parameter übergeben: ~~~jsx -var spreadsheet = new dhx.Spreadsheet("spreadsheet"); +var spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); spreadsheet.load("../common/data.csv", "csv"); ~~~ @@ -262,7 +262,7 @@ spreadsheet.load("/some/data").then(function(){ Um Daten aus einer lokalen Quelle zu laden, verwenden Sie die Methode [](api/spreadsheet_parse_method.md). Übergeben Sie einen [vorbereiteten Datensatz](#preparing-data) als Parameter dieser Methode: ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet"); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); spreadsheet.parse(data); ~~~ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/number_formatting.md b/i18n/de/docusaurus-plugin-content-docs/current/number_formatting.md index 445f5a6a..f129d187 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/number_formatting.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/number_formatting.md @@ -107,7 +107,7 @@ Mit den Konfigurationsoptionen von Spreadsheet können Sie Uhrzeit und Datum lok Sie können beispielsweise die Standard-Lokalisierungseinstellungen wie folgt ändern: ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { localization: { decimal: ",", thousands: " ", diff --git a/i18n/de/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md b/i18n/de/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md index 718ca04f..6c795ef2 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md @@ -94,7 +94,7 @@ Wenn Sie einige Farbwerte fur ein einzelnes [Spreadsheet-Theme](/themes/) ubersc diff --git a/i18n/de/docusaurus-plugin-content-docs/current/themes/custom_theme.md b/i18n/de/docusaurus-plugin-content-docs/current/themes/custom_theme.md index 8045446a..9ac6ef33 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/themes/custom_theme.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/themes/custom_theme.md @@ -88,7 +88,7 @@ Um ein eigenes benutzerdefiniertes Theme zu erstellen, uberschreiben Sie die Wer diff --git a/i18n/de/docusaurus-plugin-content-docs/current/themes/themes.md b/i18n/de/docusaurus-plugin-content-docs/current/themes/themes.md index 488fb06a..c3065abf 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/themes/themes.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/themes/themes.md @@ -438,7 +438,7 @@ Sie konnen zwischen den folgenden Varianten wahlen: ~~~html title="index.html" -
+
~~~ - Das Attribut `data-dhx-theme` fur ein HTML-Element setzen, z. B. fur `documentElement`: @@ -465,31 +465,31 @@ Die folgenden Beispiele zeigen, wie die Methode `dhx.setTheme()` verwendet wird: - Theme auf den Body oder den Container setzen ~~~html -
+
Other content
~~~ - Theme auf den via HTMLElement angegebenen Container setzen ~~~html -
+
Other content
~~~ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/working_with_ssheet.md b/i18n/de/docusaurus-plugin-content-docs/current/working_with_ssheet.md index dcc430d9..482bdd52 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/working_with_ssheet.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/working_with_ssheet.md @@ -282,7 +282,7 @@ Ab v4.3 können Sie Daten in der Tabellenkalkulation mit der Methode [`sortCells - `dir` - die Sortierrichtung: 1 - aufsteigende Sortierreihenfolge, -1 - absteigende Sortierreihenfolge ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // Konfigurationsparameter }); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md index 886909a2..13746908 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md @@ -23,7 +23,7 @@ detach(name: string): void; ### 예제 {#example} ~~~jsx {10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md index 3d3d782b..365fbcf9 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md @@ -32,7 +32,7 @@ fire(name: string, arguments: array): boolean; ### 예제 {#example} ~~~jsx {10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md index e19f7c2d..43803102 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md @@ -24,7 +24,7 @@ on(name: string, callback: function): void; ### 예제 {#example} ~~~jsx {6-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/export_json_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/export_json_method.md index 223c927f..b564dae5 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/export_json_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/export_json_method.md @@ -19,7 +19,7 @@ json(): void; ### 예제 {#example} ~~~jsx {7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md index ce29cf0e..c4efc5da 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md @@ -23,7 +23,7 @@ xlsx(name:string): void; ### 예제 {#example} ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_disable_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_disable_method.md index 0fb88a50..ea197944 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_disable_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_disable_method.md @@ -19,7 +19,7 @@ disable(): void; ### 예제 {#example} ~~~jsx {6} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_enable_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_enable_method.md index df76be54..856df74d 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_enable_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_enable_method.md @@ -19,7 +19,7 @@ enable(): void; ### 예제 {#example} ~~~jsx {7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, // other config parameters }); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md index 3b95bf5d..07599cc4 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md @@ -23,7 +23,7 @@ getFocusedCell(): string; ### 예제 {#example} ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md index 256f7160..0678cb27 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md @@ -23,7 +23,7 @@ getSelectedCell(): string; ### 예제 {#example} ~~~jsx {8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md index 23fc8482..5c4d0628 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md @@ -23,7 +23,7 @@ isDisabled(): boolean; ### 예제 {#example} ~~~jsx {7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, // other config parameters }); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md index 61c1cfd2..d3cfd66b 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md @@ -23,7 +23,7 @@ removeSelectedCell(cell: string): void; ### 예제 {#example} ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md index a6880adc..cbeefd5c 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md @@ -24,7 +24,7 @@ setFocusedCell(cell: string, scroll?: boolean): void; ### 예제 {#example} ~~~jsx {6} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md index e53e22a2..d8209069 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md @@ -24,7 +24,7 @@ setSelectedCell(cell: string, scroll?: boolean): void; ### 예제 {#example} ~~~jsx {7,10,13} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md index 26a30316..f6c10145 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md @@ -27,7 +27,7 @@ addColumn(cell: string): void; ### 예제 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 빈 "G" 열 추가 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md index c88dda92..e98592fb 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md @@ -27,7 +27,7 @@ addRow(cell: string): void; ### 예제 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 빈 두 번째 행 추가 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md index ebf8190b..4e8ad390 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md @@ -51,7 +51,7 @@ afterAction: ( ### 예제 {#example} ~~~jsx {6-11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config 매개변수 }); spreadsheet.parse(dataset); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md index 796f06b4..530d52fd 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md @@ -33,7 +33,7 @@ afterClear: () => void; ### 예제 {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "afterClear" 이벤트 구독 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md index 5ef6dbfc..64bb7cd3 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md @@ -26,7 +26,7 @@ afterEditEnd: (cell: string, value: string) => void; ### 예제 {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "afterEditEnd" 이벤트 구독 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md index 7a6bdbab..5e98c041 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md @@ -26,7 +26,7 @@ afterEditStart: (cell: string, value: string) => void; ### 예제 {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "afterEditStart" 이벤트 구독 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md index 481788b7..fcae8060 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md @@ -25,7 +25,7 @@ afterFocusSet: (cell: string) => void; ### 예제 {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "afterFocusSet" 이벤트 구독 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md index cbafd895..a713573e 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md @@ -25,7 +25,7 @@ afterSelectionSet: (cell: string) => void; ### 예제 {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "afterSelectionSet" 이벤트 구독 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md index ee3671e9..1a60b9e3 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md @@ -25,7 +25,7 @@ afterSheetChange: (sheet: object) => void; ### 예제 {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "afterSheetChange" 이벤트 구독 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md index 9d56a324..468e9ee4 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md @@ -25,7 +25,7 @@ announce(message: string): void; 아래 예제에서는 사용자 정의 메뉴 명령이 선택한 범위의 빈 셀 개수를 세고 그 결과를 알립니다. ~~~jsx {18} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { menu: true, // other config parameters }); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md index e09f1311..70e83970 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md @@ -55,7 +55,7 @@ beforeAction: ( ### 예제 {#example} ~~~jsx {6-11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(dataset); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md index 04d82e19..ef63a3e8 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md @@ -38,7 +38,7 @@ beforeClear: () => void | boolean; ### 예제 {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "beforeClear" 이벤트 구독 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md index 63797752..dcbfc713 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md @@ -30,7 +30,7 @@ beforeEditEnd: (cell: string, value: string) => void | boolean; ### 예제 {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "beforeEditEnd" 이벤트 구독 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md index fccd078c..af002965 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md @@ -30,7 +30,7 @@ beforeEditStart: (cell: string, value: string) => void | boolean; ### 예제 {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "beforeEditStart" 이벤트를 구독합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md index 6638c68d..503bf92b 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md @@ -29,7 +29,7 @@ beforeFocusSet: (cell: string) => void | boolean; ### 예제 {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "beforeFocusSet" 이벤트를 구독합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md index e2700205..b11e5e09 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md @@ -29,7 +29,7 @@ beforeSelectionSet: (cell: string) => void | boolean; ### 예제 {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "beforeSelectionSet" 이벤트를 구독합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md index 20f210be..c658aed0 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md @@ -29,7 +29,7 @@ beforeSheetChange: (sheet: object) => void | boolean; ### 예제 {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "beforeSheetChange" 이벤트를 구독합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md index 136963ee..b01367ae 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md @@ -19,7 +19,7 @@ clear(): void; ### 예제 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 스프레드시트를 초기화합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md index c55fe77e..88502d0a 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md @@ -19,7 +19,7 @@ colsCount?: number; ### 예제 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { colsCount: 10, // 기타 설정 매개변수 }); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md index 447d67c1..b1003c0b 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md @@ -29,7 +29,7 @@ deleteColumn(cell: string): void; ### 예제 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "G" 열을 제거합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md index c083b33b..1aabe167 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md @@ -29,7 +29,7 @@ deleteRow(cell: string): void; ### 예제 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 두 번째 행을 제거합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md index 54fb931b..af3b09da 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md @@ -31,7 +31,7 @@ eachCell( ### 예제 {#example} ~~~jsx {21-27} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // 설정 매개변수 }); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md index 912b725c..34d7fbb8 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md @@ -25,7 +25,7 @@ editLine: true ### 예제 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { editLine: true, // 기타 설정 매개변수 }); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md index 9fd037af..45eed149 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md @@ -19,7 +19,7 @@ endEdit(): void; ### 예제 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 선택된 셀의 편집을 종료합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md index d9358dda..1f09ef44 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md @@ -19,7 +19,7 @@ exportModulePath?: string; ### 예제 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { exportModulePath: "../libs/json2excel/x.x/worker.js?vx", // 내보내기 모듈의 `worker.js` 파일에 대한 로컬 경로 // other config parameters }); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md index 391c2b0e..a5edc354 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md @@ -24,7 +24,7 @@ fitColumn(cell: string): void; ### 예제 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "G" 열의 너비를 조정합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md index ae61e4a8..f1b3e613 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md @@ -50,7 +50,7 @@ defaultFormats = [ ### 예제 {#example} ~~~jsx {2-19} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { formats: [ { name: "U.S. Dollar", diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md index 00c6b19a..8de76295 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md @@ -30,7 +30,7 @@ getFilter(id?: string): {cell, rules}; ### 예제 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 현재 시트의 필터링 기준을 가져옵니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md index 874c4ad2..38ce390c 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md @@ -27,7 +27,7 @@ getFormat(cell: string): string | array; ### 예제 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "currency"를 반환합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md index acf1dc82..de78e7f0 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md @@ -27,7 +27,7 @@ getFormula(cell: string): string | array; ### 예제 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "ABS(C2)"를 반환합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md index f5140ff2..cbedbc9f 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md @@ -27,7 +27,7 @@ getStyle(cell: string): any; ### 예제 {#example} ~~~jsx {5,9,12} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 단일 셀의 스타일 가져오기 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md index 7d541a85..5c91c6ff 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md @@ -27,7 +27,7 @@ getValue(cell: string): any | array; ### 예제 {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 단일 셀의 값 반환 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md index 60784395..d3b45e90 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md @@ -26,7 +26,7 @@ groupFill: (focusedCell: string, selectedCell: string) => void; ### 예제 {#example} ~~~jsx {5-7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "groupFill" 이벤트 구독 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md index e6743b68..beb1365d 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md @@ -19,7 +19,7 @@ hideSearch(): void; ### 예제 {#example} ~~~jsx {5,8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 검색 바를 열고 발견된 셀을 강조 표시합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md index eb518b0f..8949d1d5 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md @@ -19,7 +19,7 @@ importModulePath?: string; ### 예제 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { importModulePath: "../libs/excel2json/1.0/worker.js", // 기타 설정 매개변수 }); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md index dbf66aec..1275a122 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md @@ -36,7 +36,7 @@ insertLink( ### 예제 {#example} ~~~jsx {5-7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // "A2" 셀에 링크 삽입 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md index cde964a7..d7d74c1d 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md @@ -27,7 +27,7 @@ isLocked(cell: string): boolean; ### 예제 {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 셀이 잠겨 있는지 확인 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md index 5bf887b9..685d8454 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md @@ -28,7 +28,7 @@ load(url: string, type?: string): promise; ### 예제 {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // JSON 형식으로 데이터 로드 (기본값) @@ -84,7 +84,7 @@ DHTMLX Spreadsheet는 WebAssembly 기반 라이브러리 [Excel2Json](https://gi - `load()` 메서드를 두 개의 매개변수와 함께 호출합니다: URL로 빈 문자열, 로드할 데이터 타입("json"): ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { menu: true, }); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md index c6620c39..5550ec99 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md @@ -41,7 +41,7 @@ const defaultLocales = { ### 예제 {#example} ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { localization: { decimal: ",", thousands: " ", diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md index 2f63b7c6..267f26dd 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md @@ -23,7 +23,7 @@ lock(cell: string): void; ### 예제 {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 셀 하나를 잠급니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md index 53780d5a..fbbad9d2 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md @@ -25,7 +25,7 @@ menu: true ### 예제 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { menu: false, // 다른 설정 매개변수 }); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md index beb8c97b..e5daeae8 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md @@ -29,7 +29,7 @@ mergeCells( ### 예제 {#example} ~~~jsx {5,8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // A3, A4, A5 셀을 병합합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md index 3ed59c54..adfbf403 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md @@ -25,7 +25,7 @@ multiSheets: true ### 예제 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { multiSheets: false, // 다른 설정 매개변수 }); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md index bfa81d51..5fce0f88 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md @@ -167,7 +167,7 @@ const data = [ // 추가 데이터 ]; -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); ~~~ @@ -246,7 +246,7 @@ const styledData = { ], }; -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(styledData); ~~~ diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md index a40c9fc2..86fe9bd4 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md @@ -25,7 +25,7 @@ readonly: false ### 예제 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, // 다른 설정 매개변수 }); @@ -53,7 +53,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { 키보드 탐색과 선택도 끄려면 [`selection`](api/spreadsheet_selection_config.md) 옵션을 `false`로 설정하세요. 이 경우 Spreadsheet에는 활성 셀이 없으며, 마우스, 키보드 또는 API로 셀을 선택할 수 없습니다: ~~~jsx {3} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, selection: false, // other config parameters diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md index 1a69d8a8..b01ec62c 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md @@ -19,7 +19,7 @@ redo(): void; ### 예제 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 취소된 작업을 다시 적용합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md index cc32b39d..e477f898 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md @@ -19,7 +19,7 @@ rowsCount?: number; ### 예제 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { rowsCount: 10, // 다른 설정 매개변수 }); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md index 97a7969a..3aff37ad 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md @@ -35,7 +35,7 @@ search( ### 예제 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 일치하는 셀의 ID를 반환하고, 검색 바를 열며 검색된 셀을 강조 표시합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md index 5f00bc4f..c3475d23 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md @@ -25,7 +25,7 @@ selection: true ### 예제 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, // other config parameters }); @@ -46,7 +46,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { [`readonly`](api/spreadsheet_readonly_config.md) 속성과 함께 사용하면, 읽기 전용 모드에서 제공되는 키보드 탐색과 선택 기능까지 끌 수 있습니다. ~~~jsx {3} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, selection: false, // other config parameters diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md index a4a16ad6..330a1779 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md @@ -94,7 +94,7 @@ serialize(): { ### 예제 {#example} ~~~jsx {4} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); const state = spreadsheet.serialize(); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md index 18bef9b8..37616d7c 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md @@ -44,7 +44,7 @@ setFilter( ### 예제 {#example} ~~~jsx {5,8,11,14} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // A열에 지정된 조건으로 데이터 필터링 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md index 74c7c5d8..1bc98e10 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md @@ -24,7 +24,7 @@ setFormat(cell: string, format: string | array): void; ### 예제 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // A1 셀에 통화 형식 적용 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md index 9b0eb534..d5b17f2b 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md @@ -28,7 +28,7 @@ setStyle(cell: string, styles: array | object): void; ### 예제 {#example} ~~~jsx {5,8,11,14} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 하나의 셀에 스타일 설정 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md index 0ef3f6e6..f966379f 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md @@ -29,7 +29,7 @@ setValidation( ### 예제 {#example} ~~~jsx {8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md index c4074eec..5b7ce624 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md @@ -28,7 +28,7 @@ setValue(cell: string, value: string | number | array): void; ### 예제 {#example} ~~~jsx {5,8,11,14} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 하나의 셀에 값 설정 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md index 12210ee7..1362e072 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md @@ -26,7 +26,7 @@ sortCells(cell: string, dir: number): void; ### 예제 {#example} ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // configuration parameters }); spreadsheet.parse(data); diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md index fcfc119f..a378dfbe 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md @@ -28,7 +28,7 @@ startEdit(cell?: string, initialValue?: string): void; ### 예제 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 현재 선택된 셀에서 편집 시작 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md index 641a5f46..80fd5eca 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md @@ -19,7 +19,7 @@ undo(): void; ### 예제 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 한 단계 뒤로 되돌립니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md index d2164075..25c32c7b 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md @@ -23,7 +23,7 @@ unlock(cell: string): void; ### 예제 {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 셀 잠금을 해제합니다 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md b/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md index 6607d84f..65b80ca9 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md @@ -49,7 +49,7 @@ Spreadsheet의 메뉴는 기본적으로 숨겨져 있습니다. 해당 구성 [`readonly`](api/spreadsheet_readonly_config.md) 구성 옵션을 통해 Spreadsheet 셀 편집을 방지하는 읽기 전용 모드를 활성화할 수도 있습니다. ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, }); ~~~ @@ -59,7 +59,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { 읽기 전용 모드에서 키보드 탐색과 선택을 끄려면 [`selection`](api/spreadsheet_selection_config.md) 옵션을 `false`로 설정합니다: ~~~jsx {3} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, selection: false, }); @@ -74,7 +74,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { 기본적으로 사용자는 마우스와 키보드로 셀을 선택할 수 있으며, Spreadsheet에는 활성 셀이 있습니다. 선택을 끄려면 [`selection`](api/spreadsheet_selection_config.md) 구성 옵션을 `false`로 설정합니다: ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, }); ~~~ diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/how_to_start.md b/i18n/ko/docusaurus-plugin-content-docs/current/how_to_start.md index f4d99d4f..67489c66 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/how_to_start.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/how_to_start.md @@ -79,7 +79,7 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 시작
@@ -94,7 +94,7 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 시작 예를 들어 `toolbarBlocks`, `rowsCount`, `colsCount` 등 여러 옵션으로 Spreadsheet의 외관을 조정할 수 있습니다. [자세한 내용 확인하기](configuration.md). ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { toolbarBlocks: ["columns", "rows", "clear"], rowsCount: 10, colsCount: 10 @@ -129,7 +129,7 @@ const data = [ ] // initializing spreadsheet -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { //config }); // loading data into spreadsheet diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/initialization.md b/i18n/ko/docusaurus-plugin-content-docs/current/initialization.md index 6bcc2df3..8c9cdd4c 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/initialization.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/initialization.md @@ -39,10 +39,10 @@ Spreadsheet 패키지의 구조는 다음과 같습니다. ## 컨테이너 만들기 {#creating-container} -Spreadsheet용 컨테이너를 추가하고 예를 들어 "spreadsheet"와 같은 id를 지정하십시오. +Spreadsheet용 컨테이너를 추가하고 예를 들어 "spreadsheet_container"와 같은 id를 지정하십시오. ~~~html title="index.html" -
+
~~~ ## DHTMLX Spreadsheet 초기화하기 {#initializing-dhtmlx-spreadsheet} @@ -54,7 +54,7 @@ Spreadsheet용 컨테이너를 추가하고 예를 들어 "spreadsheet"와 같 ~~~jsx title="index.js" // creating DHTMLX Spreadsheet -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config options }); ~~~ diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/loading_data.md b/i18n/ko/docusaurus-plugin-content-docs/current/loading_data.md index e0fbf8bf..06d7699a 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/loading_data.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/loading_data.md @@ -179,7 +179,7 @@ const dataset = [ 기본적으로 Spreadsheet는 JSON 형식의 데이터를 받습니다. 외부 소스에서 데이터를 로드하려면 [](api/spreadsheet_load_method.md) 메서드를 사용하십시오. 이 메서드는 데이터 파일의 URL을 매개변수로 받습니다. ~~~jsx -var spreadsheet = new dhx.Spreadsheet("spreadsheet"); +var spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); spreadsheet.load("../common/data.json"); ~~~ @@ -195,7 +195,7 @@ spreadsheet.load("../common/data.json"); CSV 형식의 데이터도 로드할 수 있습니다. 이를 위해 [](api/spreadsheet_load_method.md) 메서드를 호출하고 두 번째 매개변수로 형식 이름("csv")을 전달하십시오. ~~~jsx -var spreadsheet = new dhx.Spreadsheet("spreadsheet"); +var spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); spreadsheet.load("../common/data.csv", "csv"); ~~~ @@ -262,7 +262,7 @@ spreadsheet.load("/some/data").then(function(){ 로컬 소스에서 데이터를 로드하려면 [](api/spreadsheet_parse_method.md) 메서드를 사용하십시오. 이 메서드의 매개변수로 [미리 정의된 데이터 세트](#preparing-data)를 전달하십시오. ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet"); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); spreadsheet.parse(data); ~~~ diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/number_formatting.md b/i18n/ko/docusaurus-plugin-content-docs/current/number_formatting.md index 0c921faa..20a0d953 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/number_formatting.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/number_formatting.md @@ -107,7 +107,7 @@ Spreadsheet 구성 옵션을 사용하면 시간과 날짜를 현지화하고, 예를 들어, 아래와 같이 기본 로컬라이제이션 설정을 변경할 수 있습니다: ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { localization: { decimal: ",", thousands: " ", diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md b/i18n/ko/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md index 6cd152ad..acecc5ee 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md @@ -94,7 +94,7 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 테마 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/themes/custom_theme.md b/i18n/ko/docusaurus-plugin-content-docs/current/themes/custom_theme.md index 4325e769..f45157f6 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/themes/custom_theme.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/themes/custom_theme.md @@ -88,7 +88,7 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 커스 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/themes/themes.md b/i18n/ko/docusaurus-plugin-content-docs/current/themes/themes.md index fb1e33be..0aab9af5 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/themes/themes.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/themes/themes.md @@ -438,7 +438,7 @@ Spreadsheet 컴포넌트에 특화된 변수 목록은 다음과 같습니다. ~~~html title="index.html" -
+
~~~ - HTML 요소(예: `documentElement`)에 `data-dhx-theme` 속성 설정: @@ -465,31 +465,31 @@ document.documentElement.setAttribute("data-dhx-theme", "dark"); - body 또는 컨테이너에 테마 설정 ~~~html -
+
Other content
~~~ - HTMLElement로 지정된 컨테이너에 테마 설정 ~~~html -
+
Other content
~~~ diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/working_with_ssheet.md b/i18n/ko/docusaurus-plugin-content-docs/current/working_with_ssheet.md index 29d030e7..cadbebcf 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/working_with_ssheet.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/working_with_ssheet.md @@ -282,7 +282,7 @@ v4.3부터 [`sortCells()`](api/spreadsheet_sortcells_method.md) 메서드를 사 - `dir` - 정렬 방향: 1 - 오름차순, -1 - 내림차순 ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // 구성 파라미터 }); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md index d188039b..41f6eb97 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md @@ -23,7 +23,7 @@ detach(name: string): void; ### Пример {#example} ~~~jsx {10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md index 17b4a165..7ac17fbe 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md @@ -32,7 +32,7 @@ fire(name: string, arguments: array): boolean; ### Пример {#example} ~~~jsx {10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md index 67495bf2..4c123581 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md @@ -24,7 +24,7 @@ on(name: string, callback: function): void; ### Пример {#example} ~~~jsx {6-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/export_json_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/export_json_method.md index 2433dbc1..c0bdc3f0 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/export_json_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/export_json_method.md @@ -19,7 +19,7 @@ json(): void; ### Пример {#example} ~~~jsx {7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md index f48da645..a211de42 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md @@ -23,7 +23,7 @@ xlsx(name:string): void; ### Пример {#example} ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_disable_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_disable_method.md index 54321209..08b59d01 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_disable_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_disable_method.md @@ -19,7 +19,7 @@ disable(): void; ### Пример {#example} ~~~jsx {6} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_enable_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_enable_method.md index 9bb349d1..0a15de33 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_enable_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_enable_method.md @@ -19,7 +19,7 @@ enable(): void; ### Пример {#example} ~~~jsx {7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, // other config parameters }); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md index 678f2778..650bb8a8 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md @@ -23,7 +23,7 @@ getFocusedCell(): string; ### Пример {#example} ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // параметры конфигурации }); spreadsheet.parse(data); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md index d929801d..8fc37997 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md @@ -23,7 +23,7 @@ getSelectedCell(): string; ### Пример {#example} ~~~jsx {8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // параметры конфигурации }); spreadsheet.parse(data); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md index 1afb8274..6876584a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md @@ -23,7 +23,7 @@ isDisabled(): boolean; ### Пример {#example} ~~~jsx {7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, // other config parameters }); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md index 203877e0..224b9f6a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md @@ -23,7 +23,7 @@ removeSelectedCell(cell: string): void; ### Пример {#example} ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // параметры конфигурации }); spreadsheet.parse(data); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md index df82332f..09ec68bd 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md @@ -24,7 +24,7 @@ setFocusedCell(cell: string, scroll?: boolean): void; ### Пример {#example} ~~~jsx {6} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // параметры конфигурации }); spreadsheet.parse(data); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md index f7b608a8..eadc2244 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md @@ -24,7 +24,7 @@ setSelectedCell(cell: string, scroll?: boolean): void; ### Пример {#example} ~~~jsx {7,10,13} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // параметры конфигурации }); spreadsheet.parse(data); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md index 5b541d72..3644bcfa 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md @@ -27,7 +27,7 @@ addColumn(cell: string): void; ### Пример {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // добавляет пустой столбец "G" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md index c09c6d34..1c86f550 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md @@ -27,7 +27,7 @@ addRow(cell: string): void; ### Пример {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // добавляет пустую вторую строку diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md index 14267f80..a162a43e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md @@ -51,7 +51,7 @@ afterAction: ( ### Пример {#example} ~~~jsx {6-11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // параметры конфигурации }); spreadsheet.parse(dataset); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md index 6a71e926..85fe9f03 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md @@ -33,7 +33,7 @@ afterClear: () => void; ### Пример {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // подписка на событие "afterClear" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md index a20c9cb9..d2e5d2aa 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md @@ -26,7 +26,7 @@ afterEditEnd: (cell: string, value: string) => void; ### Пример {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // подписка на событие "afterEditEnd" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md index 61998c24..d21d10eb 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md @@ -26,7 +26,7 @@ afterEditStart: (cell: string, value: string) => void; ### Пример {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // подписка на событие "afterEditStart" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md index a3565b46..147c8940 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md @@ -25,7 +25,7 @@ afterFocusSet: (cell: string) => void; ### Пример {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // подписка на событие "afterFocusSet" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md index 5cc46575..ab3fb9b5 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md @@ -25,7 +25,7 @@ afterSelectionSet: (cell: string) => void; ### Пример {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // подписка на событие "afterSelectionSet" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md index 7f6eacb9..d8621a3f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md @@ -25,7 +25,7 @@ afterSheetChange: (sheet: object) => void; ### Пример {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // подписка на событие "afterSheetChange" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md index f9138814..5ecf53b3 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md @@ -25,7 +25,7 @@ announce(message: string): void; В примере ниже пользовательская команда меню подсчитывает пустые ячейки в выделенном диапазоне и озвучивает результат: ~~~jsx {18} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { menu: true, // other config parameters }); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md index f1da7390..0320aa2b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md @@ -55,7 +55,7 @@ beforeAction: ( ### Пример {#example} ~~~jsx {6-11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // параметры конфигурации }); spreadsheet.parse(dataset); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md index 80d3c28b..2287e965 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md @@ -38,7 +38,7 @@ beforeClear: () => void | boolean; ### Пример {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // подписка на событие "beforeClear" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md index 95e33315..486c1aab 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md @@ -30,7 +30,7 @@ beforeEditEnd: (cell: string, value: string) => void | boolean; ### Пример {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // подписка на событие "beforeEditEnd" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md index d08fb05a..f3929612 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md @@ -30,7 +30,7 @@ beforeEditStart: (cell: string, value: string) => void | boolean; ### Пример {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // подписываемся на событие "beforeEditStart" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md index ce9a6f51..4ee93a6b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md @@ -29,7 +29,7 @@ beforeFocusSet: (cell: string) => void | boolean; ### Пример {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // подписываемся на событие "beforeFocusSet" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md index 7c348779..bdb5ffa3 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md @@ -29,7 +29,7 @@ beforeSelectionSet: (cell: string) => void | boolean; ### Пример {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // подписываемся на событие "beforeSelectionSet" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md index d7f41e14..bd9d84eb 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md @@ -29,7 +29,7 @@ beforeSheetChange: (sheet: object) => void | boolean; ### Пример {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // подписываемся на событие "beforeSheetChange" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md index 34566548..a1bdfc3f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md @@ -19,7 +19,7 @@ clear(): void; ### Пример {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // очищает таблицу diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md index 1bf95dbd..e9cfc553 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md @@ -19,7 +19,7 @@ colsCount?: number; ### Пример {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { colsCount: 10, // другие параметры конфигурации }); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md index 4c148f78..d83b9a2b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md @@ -29,7 +29,7 @@ deleteColumn(cell: string): void; ### Пример {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // удаляет столбец "G" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md index ca481000..10ad2a1c 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md @@ -29,7 +29,7 @@ deleteRow(cell: string): void; ### Пример {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // удаляет вторую строку diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md index a775a7a5..68e9255e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md @@ -31,7 +31,7 @@ eachCell( ### Пример {#example} ~~~jsx {21-27} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // параметры конфигурации }); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md index c93ac18b..dc2a3a1b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md @@ -25,7 +25,7 @@ editLine: true ### Пример {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { editLine: true, // другие параметры конфигурации }); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md index 274247a4..57e6c230 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md @@ -19,7 +19,7 @@ endEdit(): void; ### Пример {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // завершает редактирование в выбранной ячейке diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md index b98da78b..53183a3d 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md @@ -19,7 +19,7 @@ exportModulePath?: string; ### Пример {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { exportModulePath: "../libs/json2excel/x.x/worker.js?vx", // локальный путь к файлу `worker.js` модуля экспорта // другие параметры конфигурации }); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md index fbc9bb90..4f7fba3f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md @@ -24,7 +24,7 @@ fitColumn(cell: string): void; ### Пример {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // подстраивает ширину столбца "G" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md index 27be3a05..69377d79 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md @@ -50,7 +50,7 @@ defaultFormats = [ ### Пример {#example} ~~~jsx {2-19} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { formats: [ { name: "U.S. Dollar", diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md index 89d3d57a..22d4b08f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md @@ -30,7 +30,7 @@ getFilter(id?: string): {cell, rules}; ### Пример {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // получает критерии фильтрации для текущего листа diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md index ecfa74d4..da4066a0 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md @@ -27,7 +27,7 @@ getFormat(cell: string): string | array; ### Пример {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // возвращает "currency" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md index fda36243..45c9031a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md @@ -27,7 +27,7 @@ getFormula(cell: string): string | array; ### Пример {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // возвращает "ABS(C2)" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md index 2fc11a5d..59287e9f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md @@ -27,7 +27,7 @@ getStyle(cell: string): any; ### Пример {#example} ~~~jsx {5,9,12} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // получение стиля одной ячейки diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md index 51c913b2..f556f716 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md @@ -27,7 +27,7 @@ getValue(cell: string): any | array; ### Пример {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // возвращает значение одной ячейки diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md index facd7116..25398b58 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md @@ -26,7 +26,7 @@ groupFill: (focusedCell: string, selectedCell: string) => void; ### Пример {#example} ~~~jsx {5-7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // подписка на событие "groupFill" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md index 90d9f7ec..817bd6d0 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md @@ -19,7 +19,7 @@ hideSearch(): void; ### Пример {#example} ~~~jsx {5,8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // открывает панель поиска и подсвечивает найденные ячейки diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md index 895e7fc3..fb0ef14b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md @@ -19,7 +19,7 @@ importModulePath?: string; ### Пример {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { importModulePath: "../libs/excel2json/1.0/worker.js", // другие параметры конфигурации }); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md index 9f84338f..4904720e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md @@ -36,7 +36,7 @@ insertLink( ### Пример {#example} ~~~jsx {5-7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // вставить ссылку в ячейку "A2" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md index 0ca36952..459e9bb5 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md @@ -27,7 +27,7 @@ isLocked(cell: string): boolean; ### Пример {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // проверяет, заблокирована ли ячейка diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md index 3b599db2..7c6ae9b0 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md @@ -28,7 +28,7 @@ load(url: string, type?: string): promise; ### Пример {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // загрузка данных в формате JSON (по умолчанию) @@ -84,7 +84,7 @@ DHTMLX Spreadsheet использует библиотеку [Excel2Json](https: - Вызовите метод `load()` с двумя параметрами: пустой строкой в качестве URL и типом загружаемых данных ("json"): ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { menu: true, }); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md index 83f1d87a..54d27caa 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md @@ -41,7 +41,7 @@ const defaultLocales = { ### Пример {#example} ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { localization: { decimal: ",", thousands: " ", diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md index 21a1d3c4..b59cc5d6 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md @@ -23,7 +23,7 @@ lock(cell: string): void; ### Пример {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // блокирует ячейку diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md index e97ae55b..cb78a8bf 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md @@ -25,7 +25,7 @@ menu: true ### Пример {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { menu: false, // other config parameters }); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md index 57573fdd..6785fdc1 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md @@ -29,7 +29,7 @@ mergeCells( ### Пример {#example} ~~~jsx {5,8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // объединяет ячейки A3, A4 и A5 diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md index ac791c26..9484235e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md @@ -25,7 +25,7 @@ multiSheets: true ### Пример {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { multiSheets: false, // other config parameters }); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md index 371ad927..4ccc6b82 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md @@ -167,7 +167,7 @@ const data = [ // больше данных ]; -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); ~~~ @@ -246,7 +246,7 @@ const styledData = { ], }; -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(styledData); ~~~ diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md index 877dba97..7467620f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md @@ -25,7 +25,7 @@ readonly: false ### Пример {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, // other config parameters }); @@ -53,7 +53,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { Чтобы отключить также навигацию с помощью клавиатуры и выделение, установите для параметра [`selection`](api/spreadsheet_selection_config.md) значение `false`. В этом случае в Spreadsheet нет активной ячейки, а ячейки нельзя выделить мышью, с помощью клавиатуры или API: ~~~jsx {3} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, selection: false, // other config parameters diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md index 90e1874b..2014e504 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md @@ -19,7 +19,7 @@ redo(): void; ### Пример {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // повторно применяет отменённое действие diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md index 35c96ede..731c04e1 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md @@ -19,7 +19,7 @@ rowsCount?: number; ### Пример {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { rowsCount: 10, // other config parameters }); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md index c4cac41b..a9fdd8ba 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md @@ -35,7 +35,7 @@ search( ### Пример {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // возвращает идентификаторы ячеек с найденными совпадениями, открывает строку поиска и выделяет найденные ячейки diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md index f317db83..9a04c2b1 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md @@ -25,7 +25,7 @@ selection: true ### Пример {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, // other config parameters }); @@ -46,7 +46,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { В сочетании со свойством [`readonly`](api/spreadsheet_readonly_config.md) параметр отключает клавиатурную навигацию и выделение, которые доступны в режиме только для чтения: ~~~jsx {3} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, selection: false, // other config parameters diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md index ae9a937f..a157cdcd 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md @@ -94,7 +94,7 @@ serialize(): { ### Пример {#example} ~~~jsx {4} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); const state = spreadsheet.serialize(); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md index 09252627..917c39f6 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md @@ -44,7 +44,7 @@ setFilter( ### Пример {#example} ~~~jsx {5,8,11,14} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // filter data by condition specified for column A diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md index f0c8a1a6..3dc88e7a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md @@ -24,7 +24,7 @@ setFormat(cell: string, format: string | array): void; ### Пример {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // applies the currency format to the cell A1 diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md index c3696f63..daa7abf4 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md @@ -28,7 +28,7 @@ setStyle(cell: string, styles: array | object): void; ### Пример {#example} ~~~jsx {5,8,11,14} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // setting style for one cell diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md index c87c3439..77ead5dc 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md @@ -29,7 +29,7 @@ setValidation( ### Пример {#example} ~~~jsx {8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md index d61eb9fb..b5a6202a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md @@ -28,7 +28,7 @@ setValue(cell: string, value: string | number | array): void; ### Пример {#example} ~~~jsx {5,8,11,14} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // setting value for one cell diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md index 64ce063f..47053c9f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md @@ -26,7 +26,7 @@ sortCells(cell: string, dir: number): void; ### Пример {#example} ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // configuration parameters }); spreadsheet.parse(data); diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md index 86db9bac..94116623 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md @@ -28,7 +28,7 @@ startEdit(cell?: string, initialValue?: string): void; ### Пример {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // starts editing the currently selected cell diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md index 566d8688..8e1d0161 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md @@ -19,7 +19,7 @@ undo(): void; ### Пример {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // выполняет один шаг назад diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md index 35eb6ffe..15374f45 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md @@ -23,7 +23,7 @@ unlock(cell: string): void; ### Пример {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // снимает блокировку с ячейки diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/configuration.md b/i18n/ru/docusaurus-plugin-content-docs/current/configuration.md index db06da64..228d8ac3 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/configuration.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/configuration.md @@ -51,7 +51,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { Вы также можете [настроить поведение Spreadsheet в режиме только для чтения](customization.md#custom-read-only-mode). ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, }); ~~~ @@ -61,7 +61,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { Чтобы отключить навигацию с клавиатуры и выделение в режиме только для чтения, установите для параметра [`selection`](api/spreadsheet_selection_config.md) значение `false`: ~~~jsx {3} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, selection: false, }); @@ -74,7 +74,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { По умолчанию пользователи могут выделять ячейки мышью и с клавиатуры, а в Spreadsheet есть активная ячейка. Чтобы отключить выделение, установите для параметра конфигурации [`selection`](api/spreadsheet_selection_config.md) значение `false`: ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, }); ~~~ diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/how_to_start.md b/i18n/ru/docusaurus-plugin-content-docs/current/how_to_start.md index 98ebe797..b1413a33 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/how_to_start.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/how_to_start.md @@ -79,7 +79,7 @@ description: Вы можете узнать, как начать работу с
@@ -94,7 +94,7 @@ description: Вы можете узнать, как начать работу с Вы можете настроить внешний вид Spreadsheet с помощью нескольких параметров, например: `toolbarBlocks`, `rowsCount` и `colsCount`. [Подробности](configuration.md). ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { toolbarBlocks: ["columns", "rows", "clear"], rowsCount: 10, colsCount: 10 @@ -129,7 +129,7 @@ const data = [ ] // initializing spreadsheet -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { //config }); // loading data into spreadsheet diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/initialization.md b/i18n/ru/docusaurus-plugin-content-docs/current/initialization.md index 00ef25f1..0d69c371 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/initialization.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/initialization.md @@ -39,10 +39,10 @@ description: Вы можете узнать об инициализации би ## Создание контейнера {#creating-container} -Добавьте контейнер для Spreadsheet и задайте ему идентификатор, например "spreadsheet": +Добавьте контейнер для Spreadsheet и задайте ему идентификатор, например "spreadsheet_container": ~~~html title="index.html" -
+
~~~ ## Инициализация DHTMLX Spreadsheet {#initializing-dhtmlx-spreadsheet} @@ -54,7 +54,7 @@ description: Вы можете узнать об инициализации би ~~~jsx title="index.js" // creating DHTMLX Spreadsheet -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config options }); ~~~ diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/loading_data.md b/i18n/ru/docusaurus-plugin-content-docs/current/loading_data.md index 600281a8..782d98ab 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/loading_data.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/loading_data.md @@ -179,7 +179,7 @@ const dataset = [ По умолчанию Spreadsheet ожидает данные в формате JSON. Чтобы загрузить данные из внешнего источника, используйте метод [](api/spreadsheet_load_method.md). Он принимает URL-адрес файла с данными в качестве параметра: ~~~jsx -var spreadsheet = new dhx.Spreadsheet("spreadsheet"); +var spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); spreadsheet.load("../common/data.json"); ~~~ @@ -195,7 +195,7 @@ spreadsheet.load("../common/data.json"); Вы также можете загружать данные в формате CSV. Для этого нужно вызвать метод [](api/spreadsheet_load_method.md) и передать название формата ("csv") вторым параметром: ~~~jsx -var spreadsheet = new dhx.Spreadsheet("spreadsheet"); +var spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); spreadsheet.load("../common/data.csv", "csv"); ~~~ @@ -262,7 +262,7 @@ spreadsheet.load("/some/data").then(function(){ Чтобы загрузить данные из локального источника, используйте метод [](api/spreadsheet_parse_method.md). Передайте [подготовленный набор данных](#preparing-data) в качестве параметра этого метода: ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet"); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); spreadsheet.parse(data); ~~~ diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/number_formatting.md b/i18n/ru/docusaurus-plugin-content-docs/current/number_formatting.md index 683a3bf5..999912f2 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/number_formatting.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/number_formatting.md @@ -107,7 +107,7 @@ spreadsheet.parse({ Например, настройки локализации по умолчанию можно изменить следующим образом: ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { localization: { decimal: ",", thousands: " ", diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md b/i18n/ru/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md index 2c683fe7..bb612fa8 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md @@ -94,7 +94,7 @@ CSS-переменные темы [по умолчанию](/themes/#light-theme diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/themes/custom_theme.md b/i18n/ru/docusaurus-plugin-content-docs/current/themes/custom_theme.md index 0196273c..ac688e4a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/themes/custom_theme.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/themes/custom_theme.md @@ -88,7 +88,7 @@ description: Вы можете узнать, как создать пользо diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/themes/themes.md b/i18n/ru/docusaurus-plugin-content-docs/current/themes/themes.md index 6c44c029..1c956ff4 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/themes/themes.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/themes/themes.md @@ -438,7 +438,7 @@ description: "Встроенные темы DHTMLX Spreadsheet: светлая ~~~html title="index.html" -
+
~~~ - установить атрибут `data-dhx-theme` для HTML-элемента, например для `documentElement`: @@ -465,31 +465,31 @@ document.documentElement.setAttribute("data-dhx-theme", "dark"); - установка темы для body или контейнера ~~~html -
+
Other content
~~~ - установка темы для контейнера, указанного через HTMLElement ~~~html -
+
Other content
~~~ diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/working_with_ssheet.md b/i18n/ru/docusaurus-plugin-content-docs/current/working_with_ssheet.md index 4e26147f..bec6cf04 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/working_with_ssheet.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/working_with_ssheet.md @@ -282,7 +282,7 @@ spreadsheet.hideSearch(); - `dir` - направление сортировки: 1 - по возрастанию, -1 - по убыванию ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // параметры конфигурации }); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md index 1d54c5bb..c3f17c89 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md @@ -23,7 +23,7 @@ detach(name: string): void; ### 示例 {#example} ~~~jsx {10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md index 3623e214..c888333f 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md @@ -32,7 +32,7 @@ fire(name: string, arguments: array): boolean; ### 示例 {#example} ~~~jsx {10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md index 7def4054..22afa899 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md @@ -24,7 +24,7 @@ on(name: string, callback: function): void; ### 示例 {#example} ~~~jsx {6-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/export_json_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/export_json_method.md index 91b46ad7..c87cbf48 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/export_json_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/export_json_method.md @@ -19,7 +19,7 @@ json(): void; ### 示例 {#example} ~~~jsx {7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md index d99ff760..6d6dd3f0 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md @@ -23,7 +23,7 @@ xlsx(name:string): void; ### 示例 {#example} ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); spreadsheet.parse(data); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_disable_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_disable_method.md index 6c10a701..43f1a995 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_disable_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_disable_method.md @@ -19,7 +19,7 @@ disable(): void; ### 示例 {#example} ~~~jsx {6} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // 配置参数 }); spreadsheet.parse(data); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_enable_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_enable_method.md index 878e2972..41adb28d 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_enable_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_enable_method.md @@ -19,7 +19,7 @@ enable(): void; ### 示例 {#example} ~~~jsx {7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, // 其他配置参数 }); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md index 57d280fc..2ad6d992 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md @@ -23,7 +23,7 @@ getFocusedCell(): string; ### 示例 {#example} ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // 配置参数 }); spreadsheet.parse(data); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md index f7fb4217..1dd05f82 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md @@ -23,7 +23,7 @@ getSelectedCell(): string; ### 示例 {#example} ~~~jsx {8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // 配置参数 }); spreadsheet.parse(data); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md index aa24216b..a9efab2e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md @@ -23,7 +23,7 @@ isDisabled(): boolean; ### 示例 {#example} ~~~jsx {7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, // 其他配置参数 }); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md index 11883a6f..1e1e412e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md @@ -23,7 +23,7 @@ removeSelectedCell(cell: string): void; ### 示例 {#example} ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // 配置参数 }); spreadsheet.parse(data); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md index e8cb55ef..a8da51da 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setfocusedcell_method.md @@ -24,7 +24,7 @@ setFocusedCell(cell: string, scroll?: boolean): void; ### 示例 {#example} ~~~jsx {6} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // 配置参数 }); spreadsheet.parse(data); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md index c81ed84f..74773e52 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md @@ -24,7 +24,7 @@ setSelectedCell(cell: string, scroll?: boolean): void; ### 示例 {#example} ~~~jsx {7,10,13} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // 配置参数 }); spreadsheet.parse(data); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md index ae9b6ea5..cef040f7 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md @@ -27,7 +27,7 @@ addColumn(cell: string): void; ### 示例 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 添加空的 "G" 列 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md index 0949bd9d..4e7329de 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md @@ -27,7 +27,7 @@ addRow(cell: string): void; ### 示例 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 添加空的第二行 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md index 81e2619d..d45a1fc7 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md @@ -51,7 +51,7 @@ afterAction: ( ### 示例 {#example} ~~~jsx {6-11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // 配置参数 }); spreadsheet.parse(dataset); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md index 21a2c9d8..9e4e59fb 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md @@ -33,7 +33,7 @@ afterClear: () => void; ### 示例 {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 订阅 "afterClear" 事件 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md index 8b86bafa..67503977 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md @@ -26,7 +26,7 @@ afterEditEnd: (cell: string, value: string) => void; ### 示例 {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 订阅 "afterEditEnd" 事件 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md index e649bd09..60ce3805 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md @@ -26,7 +26,7 @@ afterEditStart: (cell: string, value: string) => void; ### 示例 {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 订阅 "afterEditStart" 事件 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md index 831a3925..ba99b891 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md @@ -25,7 +25,7 @@ afterFocusSet: (cell: string) => void; ### 示例 {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 订阅 "afterFocusSet" 事件 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md index dfe4d3df..9b118484 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md @@ -25,7 +25,7 @@ afterSelectionSet: (cell: string) => void; ### 示例 {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 订阅 "afterSelectionSet" 事件 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md index 8d041b46..276f2572 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md @@ -25,7 +25,7 @@ afterSheetChange: (sheet: object) => void; ### 示例 {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 订阅 "afterSheetChange" 事件 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md index 56dafb46..7c0bb8f3 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md @@ -25,7 +25,7 @@ announce(message: string): void; 在下面的示例中,自定义菜单命令会统计所选范围内的空单元格数量,并播报统计结果: ~~~jsx {18} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { menu: true, // other config parameters }); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md index 3c968fae..e4cfd009 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md @@ -55,7 +55,7 @@ beforeAction: ( ### 示例 {#example} ~~~jsx {6-11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // 配置参数 }); spreadsheet.parse(dataset); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md index 86150fe9..071dee44 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md @@ -38,7 +38,7 @@ beforeClear: () => void | boolean; ### 示例 {#example} ~~~jsx {5-8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 订阅 "beforeClear" 事件 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md index cc0496ee..aec10596 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md @@ -30,7 +30,7 @@ beforeEditEnd: (cell: string, value: string) => void | boolean; ### 示例 {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 订阅 "beforeEditEnd" 事件 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md index 658b0114..fad98bc3 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md @@ -30,7 +30,7 @@ beforeEditStart: (cell: string, value: string) => void | boolean; ### 示例 {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 订阅 "beforeEditStart" 事件 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md index 9899f0f5..680d1e21 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md @@ -29,7 +29,7 @@ beforeFocusSet: (cell: string) => void | boolean; ### 示例 {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 订阅 "beforeFocusSet" 事件 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md index ed8f27ac..2de51725 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md @@ -29,7 +29,7 @@ beforeSelectionSet: (cell: string) => void | boolean; ### 示例 {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 订阅 "beforeSelectionSet" 事件 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md index 16893775..225314d1 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md @@ -29,7 +29,7 @@ beforeSheetChange: (sheet: object) => void | boolean; ### 示例 {#example} ~~~jsx {5-9} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 订阅 "beforeSheetChange" 事件 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md index 9f23a8e1..d55619f6 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md @@ -19,7 +19,7 @@ clear(): void; ### 示例 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 清空电子表格 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md index 9fb573aa..78bed543 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md @@ -19,7 +19,7 @@ colsCount?: number; ### 示例 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { colsCount: 10, // 其他配置参数 }); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md index daccfec1..303dcab8 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_deletecolumn_method.md @@ -29,7 +29,7 @@ deleteColumn(cell: string): void; ### 示例 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 删除 "G" 列 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md index 32a45a02..2f9c1525 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_deleterow_method.md @@ -29,7 +29,7 @@ deleteRow(cell: string): void; ### 示例 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 删除第二行 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md index 4fe9f504..3175eae1 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md @@ -31,7 +31,7 @@ eachCell( ### 示例 {#example} ~~~jsx {21-27} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // 配置参数 }); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md index e7453781..93f51c55 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md @@ -25,7 +25,7 @@ editLine: true ### 示例 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { editLine: true, // 其他配置参数 }); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md index 8a82801b..dbc2851e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md @@ -19,7 +19,7 @@ endEdit(): void; ### 示例 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 结束对选定单元格的编辑 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md index 142c24a6..2cb1513a 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md @@ -19,7 +19,7 @@ exportModulePath?: string; ### 示例 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { exportModulePath: "../libs/json2excel/x.x/worker.js?vx", // 导出模块 `worker.js` 文件的本地路径 // 其他配置参数 }); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md index 9461662d..5b9e41d7 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md @@ -24,7 +24,7 @@ fitColumn(cell: string): void; ### 示例 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 调整 "G" 列的宽度 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md index 904f349f..a0df3b34 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md @@ -50,7 +50,7 @@ defaultFormats = [ ### 示例 {#example} ~~~jsx {2-19} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { formats: [ { name: "U.S. Dollar", diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md index a2e40cb2..99d71e01 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md @@ -30,7 +30,7 @@ getFilter(id?: string): {cell, rules}; ### 示例 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 获取当前工作表的筛选条件 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md index b5f0f7fa..a3072e59 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md @@ -27,7 +27,7 @@ getFormat(cell: string): string | array; ### 示例 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 返回 "currency" diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md index e71cc8b0..cfcea2fe 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md @@ -27,7 +27,7 @@ getFormula(cell: string): string | array; ### 示例 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 返回 "ABS(C2)" diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md index 6f7bb9eb..a9b07bd1 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md @@ -27,7 +27,7 @@ getStyle(cell: string): any; ### 示例 {#example} ~~~jsx {5,9,12} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 获取单个单元格的样式 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md index eaed5549..0981f9a9 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md @@ -27,7 +27,7 @@ getValue(cell: string): any | array; ### 示例 {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 返回单个单元格的值 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md index 0de8577e..b71476e6 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md @@ -26,7 +26,7 @@ groupFill: (focusedCell: string, selectedCell: string) => void; ### 示例 {#example} ~~~jsx {5-7} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 订阅 "groupFill" 事件 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md index aac3184f..a9190699 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md @@ -19,7 +19,7 @@ hideSearch(): void; ### 示例 {#example} ~~~jsx {5,8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 打开搜索栏并高亮显示找到的单元格 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md index b6961db7..f287e793 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md @@ -19,7 +19,7 @@ importModulePath?: string; ### 示例 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { importModulePath: "../libs/excel2json/1.0/worker.js", // 其他配置参数 }); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md index df3eca25..7f5e2734 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md @@ -36,7 +36,7 @@ insertLink( ### 示例 {#example} ~~~jsx {5-7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 在 "A2" 单元格中插入链接 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md index ac43397a..1a39154b 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md @@ -27,7 +27,7 @@ isLocked(cell: string): boolean; ### 示例 {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 检查单个单元格是否被锁定 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md index 8be65033..abd59533 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md @@ -28,7 +28,7 @@ load(url: string, type?: string): promise; ### 示例 {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 以 JSON 格式加载数据(默认) @@ -84,7 +84,7 @@ DHTMLX Spreadsheet 使用基于 WebAssembly 的库 [Excel2Json](https://github.c - 以两个参数调用 `load()` 方法:空字符串作为 URL,以及要加载的数据类型("json"): ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { menu: true, }); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md index 58b4f2ca..a36be8c1 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md @@ -41,7 +41,7 @@ const defaultLocales = { ### 示例 {#example} ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { localization: { decimal: ",", thousands: " ", diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md index 19c413b0..02ee115a 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md @@ -23,7 +23,7 @@ lock(cell: string): void; ### 示例 {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 锁定单个单元格 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md index b61ed08f..705d5999 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md @@ -25,7 +25,7 @@ menu: true ### 示例 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { menu: false, // 其他配置参数 }); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md index e630419f..0edb90ac 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md @@ -29,7 +29,7 @@ mergeCells( ### 示例 {#example} ~~~jsx {5,8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 合并单元格 A3、A4 和 A5 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md index c82ea468..3f95b203 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md @@ -25,7 +25,7 @@ multiSheets: true ### 示例 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { multiSheets: false, // 其他配置参数 }); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md index d026fb38..6a164df6 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md @@ -167,7 +167,7 @@ const data = [ // 更多数据 ]; -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); ~~~ @@ -246,7 +246,7 @@ const styledData = { ], }; -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(styledData); ~~~ diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md index 00546e85..71c7d118 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_readonly_config.md @@ -25,7 +25,7 @@ readonly: false ### 示例 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, // 其他配置参数 }); @@ -53,7 +53,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { 若要同时关闭键盘导航和选择功能,请将 [`selection`](api/spreadsheet_selection_config.md) 选项设置为 `false`。此时 Spreadsheet 没有活动单元格,也无法通过鼠标、键盘或 API 选择单元格: ~~~jsx {3} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, selection: false, // other config parameters diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md index 8043d2f7..e06427e3 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md @@ -19,7 +19,7 @@ redo(): void; ### 示例 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 重新执行已撤销的操作 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md index c81c2d19..f320d2eb 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md @@ -19,7 +19,7 @@ rowsCount?: number; ### 示例 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { rowsCount: 10, // 其他配置参数 }); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md index 77617dd0..e00cdfa4 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md @@ -35,7 +35,7 @@ search( ### 示例 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 返回匹配结果的单元格 ID,打开搜索栏并高亮显示找到的单元格 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md index 20b0f109..feba0f17 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md @@ -25,7 +25,7 @@ selection: true ### 示例 {#example} ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, // other config parameters }); @@ -46,7 +46,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { 与 [`readonly`](api/spreadsheet_readonly_config.md) 属性结合使用时,该选项会关闭只读模式下可用的键盘导航和选择功能: ~~~jsx {3} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, selection: false, // other config parameters diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md index f1fd1ded..d071d08e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md @@ -94,7 +94,7 @@ serialize(): { ### 示例 {#example} ~~~jsx {4} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); const state = spreadsheet.serialize(); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md index e2789f0e..d8a8c28e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md @@ -44,7 +44,7 @@ setFilter( ### 示例 {#example} ~~~jsx {5,8,11,14} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 按为列 A 指定的条件筛选数据 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md index 4134b5f4..fcd14e71 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md @@ -24,7 +24,7 @@ setFormat(cell: string, format: string | array): void; ### 示例 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 将货币格式应用于单元格 A1 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md index a8c95e06..38a9a26f 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md @@ -28,7 +28,7 @@ setStyle(cell: string, styles: array | object): void; ### 示例 {#example} ~~~jsx {5,8,11,14} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 为单个单元格设置样式 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md index 9c018f6b..b54a0282 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md @@ -29,7 +29,7 @@ setValidation( ### 示例 {#example} ~~~jsx {8} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // 配置参数 }); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md index 1b8afc51..88bf3b50 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md @@ -28,7 +28,7 @@ setValue(cell: string, value: string | number | array): void; ### 示例 {#example} ~~~jsx {5,8,11,14} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 为单个单元格设置值 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md index a04521cd..760e3e39 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md @@ -26,7 +26,7 @@ sortCells(cell: string, dir: number): void; ### 示例 {#example} ~~~jsx {7,10} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // 配置参数 }); spreadsheet.parse(data); diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md index d9719341..b9246e12 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md @@ -28,7 +28,7 @@ startEdit(cell?: string, initialValue?: string): void; ### 示例 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 开始编辑当前选中的单元格 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md index 5e3962a0..9c8668f8 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md @@ -19,7 +19,7 @@ undo(): void; ### 示例 {#example} ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 执行一步撤销操作 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md index 0f9da68c..4ac49dc5 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md @@ -23,7 +23,7 @@ unlock(cell: string): void; ### 示例 {#example} ~~~jsx {5,8,11} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", {}); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", {}); spreadsheet.parse(data); // 解锁单个单元格 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/configuration.md b/i18n/zh/docusaurus-plugin-content-docs/current/configuration.md index 90121ec5..3662b65e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/configuration.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/configuration.md @@ -49,7 +49,7 @@ Spreadsheet 的菜单默认隐藏。您可以通过相应的配置选项 [`menu` 您还可以通过 [`readonly`](api/spreadsheet_readonly_config.md) 配置选项启用只读模式,以防止对 Spreadsheet 单元格进行编辑。 ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, }); ~~~ @@ -59,7 +59,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { 要在只读模式下关闭键盘导航和选择,请将 [`selection`](api/spreadsheet_selection_config.md) 选项设置为 `false`: ~~~jsx {3} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { readonly: true, selection: false, }); @@ -74,7 +74,7 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet", { 默认情况下,用户可以使用鼠标和键盘选择单元格,并且 Spreadsheet 具有活动单元格。要关闭选择,请将 [`selection`](api/spreadsheet_selection_config.md) 配置选项设置为 `false`: ~~~jsx {2} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { selection: false, }); ~~~ diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/how_to_start.md b/i18n/zh/docusaurus-plugin-content-docs/current/how_to_start.md index 614c6f7c..04745b99 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/how_to_start.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/how_to_start.md @@ -79,7 +79,7 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解如
@@ -94,7 +94,7 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解如 您可以使用多个选项来调整 Spreadsheet 的外观与行为,例如:`toolbarBlocks`、`rowsCount` 和 `colsCount`。[查看详情](configuration.md)。 ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { toolbarBlocks: ["columns", "rows", "clear"], rowsCount: 10, colsCount: 10 @@ -129,7 +129,7 @@ const data = [ ] // initializing spreadsheet -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { //config }); // loading data into spreadsheet diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/initialization.md b/i18n/zh/docusaurus-plugin-content-docs/current/initialization.md index dcde3c93..5e7aa19b 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/initialization.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/initialization.md @@ -39,10 +39,10 @@ Spreadsheet 安装包的结构如下: ## 创建容器 {#creating-container} -为 Spreadsheet 添加一个容器并为其设置 id,例如 "spreadsheet": +为 Spreadsheet 添加一个容器并为其设置 id,例如 "spreadsheet_container": ~~~html title="index.html" -
+
~~~ ## 初始化 DHTMLX Spreadsheet {#initializing-dhtmlx-spreadsheet} @@ -54,7 +54,7 @@ Spreadsheet 安装包的结构如下: ~~~jsx title="index.js" // creating DHTMLX Spreadsheet -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config options }); ~~~ diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/loading_data.md b/i18n/zh/docusaurus-plugin-content-docs/current/loading_data.md index 8ac62ceb..d73a48a1 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/loading_data.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/loading_data.md @@ -179,7 +179,7 @@ const dataset = [ 默认情况下,Spreadsheet 接受 JSON 格式的数据。要从外部数据源加载数据,请使用 [](api/spreadsheet_load_method.md) 方法。该方法接受数据文件的 URL 作为参数: ~~~jsx -var spreadsheet = new dhx.Spreadsheet("spreadsheet"); +var spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); spreadsheet.load("../common/data.json"); ~~~ @@ -195,7 +195,7 @@ spreadsheet.load("../common/data.json"); 您也可以加载 CSV 格式的数据。为此,需要调用 [](api/spreadsheet_load_method.md) 方法,并将格式名称("csv")作为第二个参数传入: ~~~jsx -var spreadsheet = new dhx.Spreadsheet("spreadsheet"); +var spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); spreadsheet.load("../common/data.csv", "csv"); ~~~ @@ -262,7 +262,7 @@ spreadsheet.load("/some/data").then(function(){ 要从本地数据源加载数据,请使用 [](api/spreadsheet_parse_method.md) 方法。将[预先定义的数据集](#preparing-data)作为该方法的参数传入: ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet"); +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); spreadsheet.parse(data); ~~~ diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/number_formatting.md b/i18n/zh/docusaurus-plugin-content-docs/current/number_formatting.md index 86402be3..c3bec62f 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/number_formatting.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/number_formatting.md @@ -107,7 +107,7 @@ spreadsheet.parse({ 例如,您可以按如下方式更改默认本地化设置: ~~~jsx -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { localization: { decimal: ",", thousands: " ", diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md b/i18n/zh/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md index 984d8005..0f54fd20 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md @@ -94,7 +94,7 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解如 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/themes/custom_theme.md b/i18n/zh/docusaurus-plugin-content-docs/current/themes/custom_theme.md index 4555ff78..8389fb46 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/themes/custom_theme.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/themes/custom_theme.md @@ -88,7 +88,7 @@ description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解如 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/themes/themes.md b/i18n/zh/docusaurus-plugin-content-docs/current/themes/themes.md index d02602b1..94b4b4a6 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/themes/themes.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/themes/themes.md @@ -438,7 +438,7 @@ Spreadsheet 组件专用变量列表如下: ~~~html title="index.html" -
+
~~~ - 为某个 HTML 元素设置 `data-dhx-theme` 属性,例如为 `documentElement` 设置: @@ -465,31 +465,31 @@ document.documentElement.setAttribute("data-dhx-theme", "dark"); - 为 body 或容器设置主题 ~~~html -
+
Other content
~~~ - 通过 HTMLElement 为指定容器设置主题 ~~~html -
+
Other content
~~~ diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/working_with_ssheet.md b/i18n/zh/docusaurus-plugin-content-docs/current/working_with_ssheet.md index 002c9033..533ded5f 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/working_with_ssheet.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/working_with_ssheet.md @@ -282,7 +282,7 @@ spreadsheet.hideSearch(); - `dir` - 排序方向:1 - 升序,-1 - 降序 ~~~jsx {5} -const spreadsheet = new dhx.Spreadsheet("spreadsheet", { +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { // config parameters }); From e8f9fefd1e445e5b34bdf287456c827621453281 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Thu, 29 Oct 2026 16:46:40 +0300 Subject: [PATCH 26/32] [update] rewrite page descriptions for SEO - replace the boilerplate frontmatter descriptions on the remaining 107 pages (API and guides) with page-specific ones, in the style of the v6.0.4 pages - translate the new descriptions into de, ko, ru and zh - keep version numbers out of the what's new and migration descriptions --- docs/api/eventsbus_detach_method.md | 2 +- docs/api/eventsbus_fire_method.md | 2 +- docs/api/eventsbus_on_method.md | 2 +- docs/api/export_json_method.md | 2 +- docs/api/export_xlsx_method.md | 2 +- docs/api/overview/actions_overview.md | 2 +- docs/api/overview/eventbus_overview.md | 2 +- docs/api/overview/events_overview.md | 2 +- docs/api/overview/export_overview.md | 2 +- docs/api/overview/sheetmanager_overview.md | 2 +- docs/api/selection_getfocusedcell_method.md | 2 +- docs/api/selection_getselectedcell_method.md | 2 +- docs/api/selection_removeselectedcell_method.md | 2 +- docs/api/selection_setselectedcell_method.md | 2 +- docs/api/sheetmanager_add_method.md | 2 +- docs/api/sheetmanager_clear_method.md | 2 +- docs/api/sheetmanager_get_method.md | 2 +- docs/api/sheetmanager_getactive_method.md | 2 +- docs/api/sheetmanager_getall_method.md | 2 +- docs/api/sheetmanager_remove_method.md | 2 +- docs/api/sheetmanager_setactive_method.md | 2 +- docs/api/spreadsheet_addcolumn_method.md | 2 +- docs/api/spreadsheet_addformula_method.md | 2 +- docs/api/spreadsheet_addrow_method.md | 2 +- docs/api/spreadsheet_afteraction_event.md | 2 +- docs/api/spreadsheet_afterclear_event.md | 2 +- docs/api/spreadsheet_afterdataloaded_event.md | 2 +- docs/api/spreadsheet_aftereditend_event.md | 2 +- docs/api/spreadsheet_aftereditstart_event.md | 2 +- docs/api/spreadsheet_afterfocusset_event.md | 2 +- docs/api/spreadsheet_afterselectionset_event.md | 2 +- docs/api/spreadsheet_aftersheetchange_event.md | 2 +- docs/api/spreadsheet_beforeaction_event.md | 2 +- docs/api/spreadsheet_beforeclear_event.md | 2 +- docs/api/spreadsheet_beforeeditend_event.md | 2 +- docs/api/spreadsheet_beforeeditstart_event.md | 2 +- docs/api/spreadsheet_beforefocusset_event.md | 2 +- docs/api/spreadsheet_beforeselectionset_event.md | 2 +- docs/api/spreadsheet_beforesheetchange_event.md | 2 +- docs/api/spreadsheet_clear_method.md | 2 +- docs/api/spreadsheet_colscount_config.md | 2 +- docs/api/spreadsheet_eachcell_method.md | 2 +- docs/api/spreadsheet_editline_config.md | 2 +- docs/api/spreadsheet_endedit_method.md | 2 +- docs/api/spreadsheet_exportmodulepath_config.md | 2 +- docs/api/spreadsheet_fitcolumn_method.md | 2 +- docs/api/spreadsheet_formats_config.md | 2 +- docs/api/spreadsheet_freezecols_method.md | 2 +- docs/api/spreadsheet_freezerows_method.md | 2 +- docs/api/spreadsheet_getfilter_method.md | 2 +- docs/api/spreadsheet_getformat_method.md | 2 +- docs/api/spreadsheet_getformula_method.md | 2 +- docs/api/spreadsheet_getstyle_method.md | 2 +- docs/api/spreadsheet_getvalue_method.md | 2 +- docs/api/spreadsheet_groupfill_event.md | 2 +- docs/api/spreadsheet_hidecols_method.md | 2 +- docs/api/spreadsheet_hiderows_method.md | 2 +- docs/api/spreadsheet_hidesearch_method.md | 2 +- docs/api/spreadsheet_importmodulepath_config.md | 2 +- docs/api/spreadsheet_insertlink_method.md | 2 +- docs/api/spreadsheet_islocked_method.md | 2 +- docs/api/spreadsheet_load_method.md | 2 +- docs/api/spreadsheet_localization_config.md | 2 +- docs/api/spreadsheet_lock_method.md | 2 +- docs/api/spreadsheet_menu_config.md | 2 +- docs/api/spreadsheet_mergecells_method.md | 2 +- docs/api/spreadsheet_multisheets_config.md | 2 +- docs/api/spreadsheet_parse_method.md | 2 +- docs/api/spreadsheet_redo_method.md | 2 +- docs/api/spreadsheet_rowscount_config.md | 2 +- docs/api/spreadsheet_search_method.md | 2 +- docs/api/spreadsheet_serialize_method.md | 2 +- docs/api/spreadsheet_setfilter_method.md | 2 +- docs/api/spreadsheet_setformat_method.md | 2 +- docs/api/spreadsheet_setstyle_method.md | 2 +- docs/api/spreadsheet_setvalidation_method.md | 2 +- docs/api/spreadsheet_setvalue_method.md | 2 +- docs/api/spreadsheet_showcols_method.md | 2 +- docs/api/spreadsheet_showrows_method.md | 2 +- docs/api/spreadsheet_sortcells_method.md | 2 +- docs/api/spreadsheet_startedit_method.md | 2 +- docs/api/spreadsheet_toolbarblocks_config.md | 2 +- docs/api/spreadsheet_undo_method.md | 2 +- docs/api/spreadsheet_unfreezecols_method.md | 2 +- docs/api/spreadsheet_unfreezerows_method.md | 2 +- docs/api/spreadsheet_unlock_method.md | 2 +- docs/awaitredraw.md | 2 +- docs/data_formatting.md | 2 +- docs/functions.md | 2 +- docs/handling_events.md | 2 +- docs/how_to_start.md | 2 +- docs/index.md | 2 +- docs/initialization.md | 2 +- docs/loading_data.md | 2 +- docs/migration.md | 2 +- docs/number_formatting.md | 2 +- docs/number_formatting_guide.md | 2 +- docs/sorting_data.md | 2 +- docs/svelte_integration.md | 2 +- docs/themes/base_themes_configuration.md | 2 +- docs/themes/custom_theme.md | 2 +- docs/using_typescript.md | 2 +- docs/whats_new.md | 2 +- docs/work_with_sheets.md | 2 +- docs/working_with_cells.md | 2 +- docs/working_with_sheets.md | 2 +- docs/working_with_ssheet.md | 2 +- .../current/api/eventsbus_detach_method.md | 2 +- .../current/api/eventsbus_fire_method.md | 2 +- .../current/api/eventsbus_on_method.md | 2 +- .../current/api/export_json_method.md | 2 +- .../current/api/export_xlsx_method.md | 2 +- .../current/api/overview/actions_overview.md | 2 +- .../current/api/overview/eventbus_overview.md | 2 +- .../current/api/overview/events_overview.md | 2 +- .../current/api/overview/export_overview.md | 2 +- .../current/api/overview/sheetmanager_overview.md | 2 +- .../current/api/selection_getfocusedcell_method.md | 2 +- .../current/api/selection_getselectedcell_method.md | 2 +- .../current/api/selection_removeselectedcell_method.md | 2 +- .../current/api/selection_setselectedcell_method.md | 2 +- .../current/api/sheetmanager_add_method.md | 2 +- .../current/api/sheetmanager_clear_method.md | 2 +- .../current/api/sheetmanager_get_method.md | 2 +- .../current/api/sheetmanager_getactive_method.md | 2 +- .../current/api/sheetmanager_getall_method.md | 2 +- .../current/api/sheetmanager_remove_method.md | 2 +- .../current/api/sheetmanager_setactive_method.md | 2 +- .../current/api/spreadsheet_addcolumn_method.md | 2 +- .../current/api/spreadsheet_addformula_method.md | 2 +- .../current/api/spreadsheet_addrow_method.md | 2 +- .../current/api/spreadsheet_afteraction_event.md | 2 +- .../current/api/spreadsheet_afterclear_event.md | 2 +- .../current/api/spreadsheet_afterdataloaded_event.md | 2 +- .../current/api/spreadsheet_aftereditend_event.md | 2 +- .../current/api/spreadsheet_aftereditstart_event.md | 2 +- .../current/api/spreadsheet_afterfocusset_event.md | 2 +- .../current/api/spreadsheet_afterselectionset_event.md | 2 +- .../current/api/spreadsheet_aftersheetchange_event.md | 2 +- .../current/api/spreadsheet_beforeaction_event.md | 2 +- .../current/api/spreadsheet_beforeclear_event.md | 2 +- .../current/api/spreadsheet_beforeeditend_event.md | 2 +- .../current/api/spreadsheet_beforeeditstart_event.md | 2 +- .../current/api/spreadsheet_beforefocusset_event.md | 2 +- .../current/api/spreadsheet_beforeselectionset_event.md | 2 +- .../current/api/spreadsheet_beforesheetchange_event.md | 2 +- .../current/api/spreadsheet_clear_method.md | 2 +- .../current/api/spreadsheet_colscount_config.md | 2 +- .../current/api/spreadsheet_eachcell_method.md | 2 +- .../current/api/spreadsheet_editline_config.md | 2 +- .../current/api/spreadsheet_endedit_method.md | 2 +- .../current/api/spreadsheet_exportmodulepath_config.md | 2 +- .../current/api/spreadsheet_fitcolumn_method.md | 2 +- .../current/api/spreadsheet_formats_config.md | 2 +- .../current/api/spreadsheet_freezecols_method.md | 2 +- .../current/api/spreadsheet_freezerows_method.md | 2 +- .../current/api/spreadsheet_getfilter_method.md | 2 +- .../current/api/spreadsheet_getformat_method.md | 2 +- .../current/api/spreadsheet_getformula_method.md | 2 +- .../current/api/spreadsheet_getstyle_method.md | 2 +- .../current/api/spreadsheet_getvalue_method.md | 2 +- .../current/api/spreadsheet_groupfill_event.md | 2 +- .../current/api/spreadsheet_hidecols_method.md | 2 +- .../current/api/spreadsheet_hiderows_method.md | 2 +- .../current/api/spreadsheet_hidesearch_method.md | 2 +- .../current/api/spreadsheet_importmodulepath_config.md | 2 +- .../current/api/spreadsheet_insertlink_method.md | 2 +- .../current/api/spreadsheet_islocked_method.md | 2 +- .../current/api/spreadsheet_load_method.md | 2 +- .../current/api/spreadsheet_localization_config.md | 2 +- .../current/api/spreadsheet_lock_method.md | 2 +- .../current/api/spreadsheet_menu_config.md | 2 +- .../current/api/spreadsheet_mergecells_method.md | 2 +- .../current/api/spreadsheet_multisheets_config.md | 2 +- .../current/api/spreadsheet_parse_method.md | 2 +- .../current/api/spreadsheet_redo_method.md | 2 +- .../current/api/spreadsheet_rowscount_config.md | 2 +- .../current/api/spreadsheet_search_method.md | 2 +- .../current/api/spreadsheet_serialize_method.md | 2 +- .../current/api/spreadsheet_setfilter_method.md | 2 +- .../current/api/spreadsheet_setformat_method.md | 2 +- .../current/api/spreadsheet_setstyle_method.md | 2 +- .../current/api/spreadsheet_setvalidation_method.md | 2 +- .../current/api/spreadsheet_setvalue_method.md | 2 +- .../current/api/spreadsheet_showcols_method.md | 2 +- .../current/api/spreadsheet_showrows_method.md | 2 +- .../current/api/spreadsheet_sortcells_method.md | 2 +- .../current/api/spreadsheet_startedit_method.md | 2 +- .../current/api/spreadsheet_toolbarblocks_config.md | 2 +- .../current/api/spreadsheet_undo_method.md | 2 +- .../current/api/spreadsheet_unfreezecols_method.md | 2 +- .../current/api/spreadsheet_unfreezerows_method.md | 2 +- .../current/api/spreadsheet_unlock_method.md | 2 +- i18n/de/docusaurus-plugin-content-docs/current/awaitredraw.md | 2 +- .../docusaurus-plugin-content-docs/current/data_formatting.md | 2 +- i18n/de/docusaurus-plugin-content-docs/current/functions.md | 2 +- .../docusaurus-plugin-content-docs/current/handling_events.md | 2 +- i18n/de/docusaurus-plugin-content-docs/current/how_to_start.md | 2 +- i18n/de/docusaurus-plugin-content-docs/current/index.md | 2 +- .../de/docusaurus-plugin-content-docs/current/initialization.md | 2 +- i18n/de/docusaurus-plugin-content-docs/current/loading_data.md | 2 +- i18n/de/docusaurus-plugin-content-docs/current/migration.md | 2 +- .../docusaurus-plugin-content-docs/current/number_formatting.md | 2 +- .../current/number_formatting_guide.md | 2 +- i18n/de/docusaurus-plugin-content-docs/current/sorting_data.md | 2 +- .../current/svelte_integration.md | 2 +- .../current/themes/base_themes_configuration.md | 2 +- .../current/themes/custom_theme.md | 2 +- .../docusaurus-plugin-content-docs/current/using_typescript.md | 2 +- i18n/de/docusaurus-plugin-content-docs/current/whats_new.md | 2 +- .../docusaurus-plugin-content-docs/current/work_with_sheets.md | 2 +- .../current/working_with_cells.md | 2 +- .../current/working_with_sheets.md | 2 +- .../current/working_with_ssheet.md | 2 +- .../current/api/eventsbus_detach_method.md | 2 +- .../current/api/eventsbus_fire_method.md | 2 +- .../current/api/eventsbus_on_method.md | 2 +- .../current/api/export_json_method.md | 2 +- .../current/api/export_xlsx_method.md | 2 +- .../current/api/overview/actions_overview.md | 2 +- .../current/api/overview/eventbus_overview.md | 2 +- .../current/api/overview/events_overview.md | 2 +- .../current/api/overview/export_overview.md | 2 +- .../current/api/overview/sheetmanager_overview.md | 2 +- .../current/api/selection_getfocusedcell_method.md | 2 +- .../current/api/selection_getselectedcell_method.md | 2 +- .../current/api/selection_removeselectedcell_method.md | 2 +- .../current/api/selection_setselectedcell_method.md | 2 +- .../current/api/sheetmanager_add_method.md | 2 +- .../current/api/sheetmanager_clear_method.md | 2 +- .../current/api/sheetmanager_get_method.md | 2 +- .../current/api/sheetmanager_getactive_method.md | 2 +- .../current/api/sheetmanager_getall_method.md | 2 +- .../current/api/sheetmanager_remove_method.md | 2 +- .../current/api/sheetmanager_setactive_method.md | 2 +- .../current/api/spreadsheet_addcolumn_method.md | 2 +- .../current/api/spreadsheet_addformula_method.md | 2 +- .../current/api/spreadsheet_addrow_method.md | 2 +- .../current/api/spreadsheet_afteraction_event.md | 2 +- .../current/api/spreadsheet_afterclear_event.md | 2 +- .../current/api/spreadsheet_afterdataloaded_event.md | 2 +- .../current/api/spreadsheet_aftereditend_event.md | 2 +- .../current/api/spreadsheet_aftereditstart_event.md | 2 +- .../current/api/spreadsheet_afterfocusset_event.md | 2 +- .../current/api/spreadsheet_afterselectionset_event.md | 2 +- .../current/api/spreadsheet_aftersheetchange_event.md | 2 +- .../current/api/spreadsheet_beforeaction_event.md | 2 +- .../current/api/spreadsheet_beforeclear_event.md | 2 +- .../current/api/spreadsheet_beforeeditend_event.md | 2 +- .../current/api/spreadsheet_beforeeditstart_event.md | 2 +- .../current/api/spreadsheet_beforefocusset_event.md | 2 +- .../current/api/spreadsheet_beforeselectionset_event.md | 2 +- .../current/api/spreadsheet_beforesheetchange_event.md | 2 +- .../current/api/spreadsheet_clear_method.md | 2 +- .../current/api/spreadsheet_colscount_config.md | 2 +- .../current/api/spreadsheet_eachcell_method.md | 2 +- .../current/api/spreadsheet_editline_config.md | 2 +- .../current/api/spreadsheet_endedit_method.md | 2 +- .../current/api/spreadsheet_exportmodulepath_config.md | 2 +- .../current/api/spreadsheet_fitcolumn_method.md | 2 +- .../current/api/spreadsheet_formats_config.md | 2 +- .../current/api/spreadsheet_freezecols_method.md | 2 +- .../current/api/spreadsheet_freezerows_method.md | 2 +- .../current/api/spreadsheet_getfilter_method.md | 2 +- .../current/api/spreadsheet_getformat_method.md | 2 +- .../current/api/spreadsheet_getformula_method.md | 2 +- .../current/api/spreadsheet_getstyle_method.md | 2 +- .../current/api/spreadsheet_getvalue_method.md | 2 +- .../current/api/spreadsheet_groupfill_event.md | 2 +- .../current/api/spreadsheet_hidecols_method.md | 2 +- .../current/api/spreadsheet_hiderows_method.md | 2 +- .../current/api/spreadsheet_hidesearch_method.md | 2 +- .../current/api/spreadsheet_importmodulepath_config.md | 2 +- .../current/api/spreadsheet_insertlink_method.md | 2 +- .../current/api/spreadsheet_islocked_method.md | 2 +- .../current/api/spreadsheet_load_method.md | 2 +- .../current/api/spreadsheet_localization_config.md | 2 +- .../current/api/spreadsheet_lock_method.md | 2 +- .../current/api/spreadsheet_menu_config.md | 2 +- .../current/api/spreadsheet_mergecells_method.md | 2 +- .../current/api/spreadsheet_multisheets_config.md | 2 +- .../current/api/spreadsheet_parse_method.md | 2 +- .../current/api/spreadsheet_redo_method.md | 2 +- .../current/api/spreadsheet_rowscount_config.md | 2 +- .../current/api/spreadsheet_search_method.md | 2 +- .../current/api/spreadsheet_serialize_method.md | 2 +- .../current/api/spreadsheet_setfilter_method.md | 2 +- .../current/api/spreadsheet_setformat_method.md | 2 +- .../current/api/spreadsheet_setstyle_method.md | 2 +- .../current/api/spreadsheet_setvalidation_method.md | 2 +- .../current/api/spreadsheet_setvalue_method.md | 2 +- .../current/api/spreadsheet_showcols_method.md | 2 +- .../current/api/spreadsheet_showrows_method.md | 2 +- .../current/api/spreadsheet_sortcells_method.md | 2 +- .../current/api/spreadsheet_startedit_method.md | 2 +- .../current/api/spreadsheet_toolbarblocks_config.md | 2 +- .../current/api/spreadsheet_undo_method.md | 2 +- .../current/api/spreadsheet_unfreezecols_method.md | 2 +- .../current/api/spreadsheet_unfreezerows_method.md | 2 +- .../current/api/spreadsheet_unlock_method.md | 2 +- i18n/ko/docusaurus-plugin-content-docs/current/awaitredraw.md | 2 +- .../docusaurus-plugin-content-docs/current/data_formatting.md | 2 +- i18n/ko/docusaurus-plugin-content-docs/current/functions.md | 2 +- .../docusaurus-plugin-content-docs/current/handling_events.md | 2 +- i18n/ko/docusaurus-plugin-content-docs/current/how_to_start.md | 2 +- i18n/ko/docusaurus-plugin-content-docs/current/index.md | 2 +- .../ko/docusaurus-plugin-content-docs/current/initialization.md | 2 +- i18n/ko/docusaurus-plugin-content-docs/current/loading_data.md | 2 +- i18n/ko/docusaurus-plugin-content-docs/current/migration.md | 2 +- .../docusaurus-plugin-content-docs/current/number_formatting.md | 2 +- .../current/number_formatting_guide.md | 2 +- i18n/ko/docusaurus-plugin-content-docs/current/sorting_data.md | 2 +- .../current/svelte_integration.md | 2 +- .../current/themes/base_themes_configuration.md | 2 +- .../current/themes/custom_theme.md | 2 +- .../docusaurus-plugin-content-docs/current/using_typescript.md | 2 +- i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md | 2 +- .../docusaurus-plugin-content-docs/current/work_with_sheets.md | 2 +- .../current/working_with_cells.md | 2 +- .../current/working_with_sheets.md | 2 +- .../current/working_with_ssheet.md | 2 +- .../current/api/eventsbus_detach_method.md | 2 +- .../current/api/eventsbus_fire_method.md | 2 +- .../current/api/eventsbus_on_method.md | 2 +- .../current/api/export_json_method.md | 2 +- .../current/api/export_xlsx_method.md | 2 +- .../current/api/overview/actions_overview.md | 2 +- .../current/api/overview/eventbus_overview.md | 2 +- .../current/api/overview/events_overview.md | 2 +- .../current/api/overview/export_overview.md | 2 +- .../current/api/overview/sheetmanager_overview.md | 2 +- .../current/api/selection_getfocusedcell_method.md | 2 +- .../current/api/selection_getselectedcell_method.md | 2 +- .../current/api/selection_removeselectedcell_method.md | 2 +- .../current/api/selection_setselectedcell_method.md | 2 +- .../current/api/sheetmanager_add_method.md | 2 +- .../current/api/sheetmanager_clear_method.md | 2 +- .../current/api/sheetmanager_get_method.md | 2 +- .../current/api/sheetmanager_getactive_method.md | 2 +- .../current/api/sheetmanager_getall_method.md | 2 +- .../current/api/sheetmanager_remove_method.md | 2 +- .../current/api/sheetmanager_setactive_method.md | 2 +- .../current/api/spreadsheet_addcolumn_method.md | 2 +- .../current/api/spreadsheet_addformula_method.md | 2 +- .../current/api/spreadsheet_addrow_method.md | 2 +- .../current/api/spreadsheet_afteraction_event.md | 2 +- .../current/api/spreadsheet_afterclear_event.md | 2 +- .../current/api/spreadsheet_afterdataloaded_event.md | 2 +- .../current/api/spreadsheet_aftereditend_event.md | 2 +- .../current/api/spreadsheet_aftereditstart_event.md | 2 +- .../current/api/spreadsheet_afterfocusset_event.md | 2 +- .../current/api/spreadsheet_afterselectionset_event.md | 2 +- .../current/api/spreadsheet_aftersheetchange_event.md | 2 +- .../current/api/spreadsheet_beforeaction_event.md | 2 +- .../current/api/spreadsheet_beforeclear_event.md | 2 +- .../current/api/spreadsheet_beforeeditend_event.md | 2 +- .../current/api/spreadsheet_beforeeditstart_event.md | 2 +- .../current/api/spreadsheet_beforefocusset_event.md | 2 +- .../current/api/spreadsheet_beforeselectionset_event.md | 2 +- .../current/api/spreadsheet_beforesheetchange_event.md | 2 +- .../current/api/spreadsheet_clear_method.md | 2 +- .../current/api/spreadsheet_colscount_config.md | 2 +- .../current/api/spreadsheet_eachcell_method.md | 2 +- .../current/api/spreadsheet_editline_config.md | 2 +- .../current/api/spreadsheet_endedit_method.md | 2 +- .../current/api/spreadsheet_exportmodulepath_config.md | 2 +- .../current/api/spreadsheet_fitcolumn_method.md | 2 +- .../current/api/spreadsheet_formats_config.md | 2 +- .../current/api/spreadsheet_freezecols_method.md | 2 +- .../current/api/spreadsheet_freezerows_method.md | 2 +- .../current/api/spreadsheet_getfilter_method.md | 2 +- .../current/api/spreadsheet_getformat_method.md | 2 +- .../current/api/spreadsheet_getformula_method.md | 2 +- .../current/api/spreadsheet_getstyle_method.md | 2 +- .../current/api/spreadsheet_getvalue_method.md | 2 +- .../current/api/spreadsheet_groupfill_event.md | 2 +- .../current/api/spreadsheet_hidecols_method.md | 2 +- .../current/api/spreadsheet_hiderows_method.md | 2 +- .../current/api/spreadsheet_hidesearch_method.md | 2 +- .../current/api/spreadsheet_importmodulepath_config.md | 2 +- .../current/api/spreadsheet_insertlink_method.md | 2 +- .../current/api/spreadsheet_islocked_method.md | 2 +- .../current/api/spreadsheet_load_method.md | 2 +- .../current/api/spreadsheet_localization_config.md | 2 +- .../current/api/spreadsheet_lock_method.md | 2 +- .../current/api/spreadsheet_menu_config.md | 2 +- .../current/api/spreadsheet_mergecells_method.md | 2 +- .../current/api/spreadsheet_multisheets_config.md | 2 +- .../current/api/spreadsheet_parse_method.md | 2 +- .../current/api/spreadsheet_redo_method.md | 2 +- .../current/api/spreadsheet_rowscount_config.md | 2 +- .../current/api/spreadsheet_search_method.md | 2 +- .../current/api/spreadsheet_serialize_method.md | 2 +- .../current/api/spreadsheet_setfilter_method.md | 2 +- .../current/api/spreadsheet_setformat_method.md | 2 +- .../current/api/spreadsheet_setstyle_method.md | 2 +- .../current/api/spreadsheet_setvalidation_method.md | 2 +- .../current/api/spreadsheet_setvalue_method.md | 2 +- .../current/api/spreadsheet_showcols_method.md | 2 +- .../current/api/spreadsheet_showrows_method.md | 2 +- .../current/api/spreadsheet_sortcells_method.md | 2 +- .../current/api/spreadsheet_startedit_method.md | 2 +- .../current/api/spreadsheet_toolbarblocks_config.md | 2 +- .../current/api/spreadsheet_undo_method.md | 2 +- .../current/api/spreadsheet_unfreezecols_method.md | 2 +- .../current/api/spreadsheet_unfreezerows_method.md | 2 +- .../current/api/spreadsheet_unlock_method.md | 2 +- i18n/ru/docusaurus-plugin-content-docs/current/awaitredraw.md | 2 +- .../docusaurus-plugin-content-docs/current/data_formatting.md | 2 +- i18n/ru/docusaurus-plugin-content-docs/current/functions.md | 2 +- .../docusaurus-plugin-content-docs/current/handling_events.md | 2 +- i18n/ru/docusaurus-plugin-content-docs/current/how_to_start.md | 2 +- i18n/ru/docusaurus-plugin-content-docs/current/index.md | 2 +- .../ru/docusaurus-plugin-content-docs/current/initialization.md | 2 +- i18n/ru/docusaurus-plugin-content-docs/current/loading_data.md | 2 +- i18n/ru/docusaurus-plugin-content-docs/current/migration.md | 2 +- .../docusaurus-plugin-content-docs/current/number_formatting.md | 2 +- .../current/number_formatting_guide.md | 2 +- i18n/ru/docusaurus-plugin-content-docs/current/sorting_data.md | 2 +- .../current/svelte_integration.md | 2 +- .../current/themes/base_themes_configuration.md | 2 +- .../current/themes/custom_theme.md | 2 +- .../docusaurus-plugin-content-docs/current/using_typescript.md | 2 +- i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md | 2 +- .../docusaurus-plugin-content-docs/current/work_with_sheets.md | 2 +- .../current/working_with_cells.md | 2 +- .../current/working_with_sheets.md | 2 +- .../current/working_with_ssheet.md | 2 +- .../current/api/eventsbus_detach_method.md | 2 +- .../current/api/eventsbus_fire_method.md | 2 +- .../current/api/eventsbus_on_method.md | 2 +- .../current/api/export_json_method.md | 2 +- .../current/api/export_xlsx_method.md | 2 +- .../current/api/overview/actions_overview.md | 2 +- .../current/api/overview/eventbus_overview.md | 2 +- .../current/api/overview/events_overview.md | 2 +- .../current/api/overview/export_overview.md | 2 +- .../current/api/overview/sheetmanager_overview.md | 2 +- .../current/api/selection_getfocusedcell_method.md | 2 +- .../current/api/selection_getselectedcell_method.md | 2 +- .../current/api/selection_removeselectedcell_method.md | 2 +- .../current/api/selection_setselectedcell_method.md | 2 +- .../current/api/sheetmanager_add_method.md | 2 +- .../current/api/sheetmanager_clear_method.md | 2 +- .../current/api/sheetmanager_get_method.md | 2 +- .../current/api/sheetmanager_getactive_method.md | 2 +- .../current/api/sheetmanager_getall_method.md | 2 +- .../current/api/sheetmanager_remove_method.md | 2 +- .../current/api/sheetmanager_setactive_method.md | 2 +- .../current/api/spreadsheet_addcolumn_method.md | 2 +- .../current/api/spreadsheet_addformula_method.md | 2 +- .../current/api/spreadsheet_addrow_method.md | 2 +- .../current/api/spreadsheet_afteraction_event.md | 2 +- .../current/api/spreadsheet_afterclear_event.md | 2 +- .../current/api/spreadsheet_afterdataloaded_event.md | 2 +- .../current/api/spreadsheet_aftereditend_event.md | 2 +- .../current/api/spreadsheet_aftereditstart_event.md | 2 +- .../current/api/spreadsheet_afterfocusset_event.md | 2 +- .../current/api/spreadsheet_afterselectionset_event.md | 2 +- .../current/api/spreadsheet_aftersheetchange_event.md | 2 +- .../current/api/spreadsheet_beforeaction_event.md | 2 +- .../current/api/spreadsheet_beforeclear_event.md | 2 +- .../current/api/spreadsheet_beforeeditend_event.md | 2 +- .../current/api/spreadsheet_beforeeditstart_event.md | 2 +- .../current/api/spreadsheet_beforefocusset_event.md | 2 +- .../current/api/spreadsheet_beforeselectionset_event.md | 2 +- .../current/api/spreadsheet_beforesheetchange_event.md | 2 +- .../current/api/spreadsheet_clear_method.md | 2 +- .../current/api/spreadsheet_colscount_config.md | 2 +- .../current/api/spreadsheet_eachcell_method.md | 2 +- .../current/api/spreadsheet_editline_config.md | 2 +- .../current/api/spreadsheet_endedit_method.md | 2 +- .../current/api/spreadsheet_exportmodulepath_config.md | 2 +- .../current/api/spreadsheet_fitcolumn_method.md | 2 +- .../current/api/spreadsheet_formats_config.md | 2 +- .../current/api/spreadsheet_freezecols_method.md | 2 +- .../current/api/spreadsheet_freezerows_method.md | 2 +- .../current/api/spreadsheet_getfilter_method.md | 2 +- .../current/api/spreadsheet_getformat_method.md | 2 +- .../current/api/spreadsheet_getformula_method.md | 2 +- .../current/api/spreadsheet_getstyle_method.md | 2 +- .../current/api/spreadsheet_getvalue_method.md | 2 +- .../current/api/spreadsheet_groupfill_event.md | 2 +- .../current/api/spreadsheet_hidecols_method.md | 2 +- .../current/api/spreadsheet_hiderows_method.md | 2 +- .../current/api/spreadsheet_hidesearch_method.md | 2 +- .../current/api/spreadsheet_importmodulepath_config.md | 2 +- .../current/api/spreadsheet_insertlink_method.md | 2 +- .../current/api/spreadsheet_islocked_method.md | 2 +- .../current/api/spreadsheet_load_method.md | 2 +- .../current/api/spreadsheet_localization_config.md | 2 +- .../current/api/spreadsheet_lock_method.md | 2 +- .../current/api/spreadsheet_menu_config.md | 2 +- .../current/api/spreadsheet_mergecells_method.md | 2 +- .../current/api/spreadsheet_multisheets_config.md | 2 +- .../current/api/spreadsheet_parse_method.md | 2 +- .../current/api/spreadsheet_redo_method.md | 2 +- .../current/api/spreadsheet_rowscount_config.md | 2 +- .../current/api/spreadsheet_search_method.md | 2 +- .../current/api/spreadsheet_serialize_method.md | 2 +- .../current/api/spreadsheet_setfilter_method.md | 2 +- .../current/api/spreadsheet_setformat_method.md | 2 +- .../current/api/spreadsheet_setstyle_method.md | 2 +- .../current/api/spreadsheet_setvalidation_method.md | 2 +- .../current/api/spreadsheet_setvalue_method.md | 2 +- .../current/api/spreadsheet_showcols_method.md | 2 +- .../current/api/spreadsheet_showrows_method.md | 2 +- .../current/api/spreadsheet_sortcells_method.md | 2 +- .../current/api/spreadsheet_startedit_method.md | 2 +- .../current/api/spreadsheet_toolbarblocks_config.md | 2 +- .../current/api/spreadsheet_undo_method.md | 2 +- .../current/api/spreadsheet_unfreezecols_method.md | 2 +- .../current/api/spreadsheet_unfreezerows_method.md | 2 +- .../current/api/spreadsheet_unlock_method.md | 2 +- i18n/zh/docusaurus-plugin-content-docs/current/awaitredraw.md | 2 +- .../docusaurus-plugin-content-docs/current/data_formatting.md | 2 +- i18n/zh/docusaurus-plugin-content-docs/current/functions.md | 2 +- .../docusaurus-plugin-content-docs/current/handling_events.md | 2 +- i18n/zh/docusaurus-plugin-content-docs/current/how_to_start.md | 2 +- i18n/zh/docusaurus-plugin-content-docs/current/index.md | 2 +- .../zh/docusaurus-plugin-content-docs/current/initialization.md | 2 +- i18n/zh/docusaurus-plugin-content-docs/current/loading_data.md | 2 +- i18n/zh/docusaurus-plugin-content-docs/current/migration.md | 2 +- .../docusaurus-plugin-content-docs/current/number_formatting.md | 2 +- .../current/number_formatting_guide.md | 2 +- i18n/zh/docusaurus-plugin-content-docs/current/sorting_data.md | 2 +- .../current/svelte_integration.md | 2 +- .../current/themes/base_themes_configuration.md | 2 +- .../current/themes/custom_theme.md | 2 +- .../docusaurus-plugin-content-docs/current/using_typescript.md | 2 +- i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md | 2 +- .../docusaurus-plugin-content-docs/current/work_with_sheets.md | 2 +- .../current/working_with_cells.md | 2 +- .../current/working_with_sheets.md | 2 +- .../current/working_with_ssheet.md | 2 +- 535 files changed, 535 insertions(+), 535 deletions(-) diff --git a/docs/api/eventsbus_detach_method.md b/docs/api/eventsbus_detach_method.md index d210f1db..7e31ecad 100644 --- a/docs/api/eventsbus_detach_method.md +++ b/docs/api/eventsbus_detach_method.md @@ -1,7 +1,7 @@ --- sidebar_label: detach() title: detach events bus method -description: You can learn about the detach events bus method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Detach an event handler attached with the on() method from DHTMLX Spreadsheet with the events.detach() method, by the name of the event. --- # detach() diff --git a/docs/api/eventsbus_fire_method.md b/docs/api/eventsbus_fire_method.md index 675e5a41..b1c7055c 100644 --- a/docs/api/eventsbus_fire_method.md +++ b/docs/api/eventsbus_fire_method.md @@ -1,7 +1,7 @@ --- sidebar_label: fire() title: fire events bus method -description: You can learn about the fire events bus method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Trigger an inner event of DHTMLX Spreadsheet with the events.fire() method, passing the name of the event and an array of the event data. --- # fire() diff --git a/docs/api/eventsbus_on_method.md b/docs/api/eventsbus_on_method.md index 227b7459..9a428b9b 100644 --- a/docs/api/eventsbus_on_method.md +++ b/docs/api/eventsbus_on_method.md @@ -1,7 +1,7 @@ --- sidebar_label: on() title: on events bus method -description: You can learn about the on events bus method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Attach a handler to an inner event of DHTMLX Spreadsheet with the events.on() method, for example, to react to a change of the cell style. --- # on() diff --git a/docs/api/export_json_method.md b/docs/api/export_json_method.md index 79986c56..127c027a 100644 --- a/docs/api/export_json_method.md +++ b/docs/api/export_json_method.md @@ -1,7 +1,7 @@ --- sidebar_label: json() title: json export method -description: You can learn about the json export method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Export the data of DHTMLX Spreadsheet into a JSON file with the export.json() method. --- # json() diff --git a/docs/api/export_xlsx_method.md b/docs/api/export_xlsx_method.md index bed48981..b553febe 100644 --- a/docs/api/export_xlsx_method.md +++ b/docs/api/export_xlsx_method.md @@ -1,7 +1,7 @@ --- sidebar_label: xlsx() title: xlsx export method -description: You can learn about the xlsx export method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Export the data of DHTMLX Spreadsheet into an Excel (.xlsx) file with the export.xlsx() method, optionally with a custom file name. --- # xlsx() diff --git a/docs/api/overview/actions_overview.md b/docs/api/overview/actions_overview.md index 0f811e10..a2d683a6 100644 --- a/docs/api/overview/actions_overview.md +++ b/docs/api/overview/actions_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Spreadsheet actions title: Actions Overview -description: You can check an Actions overview of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Overview of the DHTMLX Spreadsheet actions and the full list of the actions that you can handle in the beforeAction and afterAction events. --- # Actions overview diff --git a/docs/api/overview/eventbus_overview.md b/docs/api/overview/eventbus_overview.md index 5cfb089e..f0e5943f 100644 --- a/docs/api/overview/eventbus_overview.md +++ b/docs/api/overview/eventbus_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Event Bus methods overview title: Event Bus Methods Overview -description: You can check an Event Bus methods overview of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: List of the DHTMLX Spreadsheet event bus methods that attach, detach and trigger events. --- # Event Bus methods overview diff --git a/docs/api/overview/events_overview.md b/docs/api/overview/events_overview.md index 85cc579b..8ad04f9d 100644 --- a/docs/api/overview/events_overview.md +++ b/docs/api/overview/events_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Events overview title: Events Overview -description: You can have an Events overview of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: List of the DHTMLX Spreadsheet events that fire on actions, data loading, cell editing, selection, focus and sheet changes. --- # Events overview diff --git a/docs/api/overview/export_overview.md b/docs/api/overview/export_overview.md index 2b72faa1..3f61473e 100644 --- a/docs/api/overview/export_overview.md +++ b/docs/api/overview/export_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Export methods overview title: Export Methods Overview -description: You can check an Export methods overview of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: List of the DHTMLX Spreadsheet export module methods that save the data to a JSON or an Excel (.xlsx) file. --- # Export methods overview diff --git a/docs/api/overview/sheetmanager_overview.md b/docs/api/overview/sheetmanager_overview.md index 11498829..fe461189 100644 --- a/docs/api/overview/sheetmanager_overview.md +++ b/docs/api/overview/sheetmanager_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Sheet Manager API overview title: Sheet Manager API Overview -description: You can check a Sheet Manager API overview of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: List of the DHTMLX Spreadsheet sheet manager methods that add, remove, clear, get and switch sheets. --- # Sheet Manager API overview diff --git a/docs/api/selection_getfocusedcell_method.md b/docs/api/selection_getfocusedcell_method.md index ed768d4f..99d26b2c 100644 --- a/docs/api/selection_getfocusedcell_method.md +++ b/docs/api/selection_getfocusedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFocusedCell() title: getFocusedCell selection method -description: You can learn about the getFocusedCell selection method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Get the id of the focused (active) cell in DHTMLX Spreadsheet with the selection.getFocusedCell() method. --- # getFocusedCell() diff --git a/docs/api/selection_getselectedcell_method.md b/docs/api/selection_getselectedcell_method.md index 683148e0..21dc6080 100644 --- a/docs/api/selection_getselectedcell_method.md +++ b/docs/api/selection_getselectedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getSelectedCell() title: getSelectedCell selection method -description: You can learn about the getSelectedCell selection method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Get the ids or ranges of the selected cells in DHTMLX Spreadsheet with the selection.getSelectedCell() method. --- # getSelectedCell() diff --git a/docs/api/selection_removeselectedcell_method.md b/docs/api/selection_removeselectedcell_method.md index d786d173..0f7efe09 100644 --- a/docs/api/selection_removeselectedcell_method.md +++ b/docs/api/selection_removeselectedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: removeSelectedCell() title: removeSelectedCell selection method -description: You can learn about the removeSelectedCell method of Selection in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Remove the selection from the specified cells or ranges of cells in DHTMLX Spreadsheet with the selection.removeSelectedCell() method. --- # removeSelectedCell() diff --git a/docs/api/selection_setselectedcell_method.md b/docs/api/selection_setselectedcell_method.md index fd1d31c0..ac32f108 100644 --- a/docs/api/selection_setselectedcell_method.md +++ b/docs/api/selection_setselectedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setSelectedCell() title: setSelectedCell selection method -description: You can learn about the setSelectedCell selection method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Select a cell, several cells or a range of cells in DHTMLX Spreadsheet with the selection.setSelectedCell() method, optionally scrolling to them. --- # setSelectedCell() diff --git a/docs/api/sheetmanager_add_method.md b/docs/api/sheetmanager_add_method.md index e41615c8..c39248e7 100644 --- a/docs/api/sheetmanager_add_method.md +++ b/docs/api/sheetmanager_add_method.md @@ -1,7 +1,7 @@ --- sidebar_label: add() title: add method -description: You can learn about the add method of the Sheet Manager in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Add a new empty sheet to DHTMLX Spreadsheet with the sheets.add() method, which returns the id of the new sheet (requires the multiSheets option). --- # add() diff --git a/docs/api/sheetmanager_clear_method.md b/docs/api/sheetmanager_clear_method.md index a89819ae..a4e59aee 100644 --- a/docs/api/sheetmanager_clear_method.md +++ b/docs/api/sheetmanager_clear_method.md @@ -1,7 +1,7 @@ --- sidebar_label: clear() title: clear method -description: You can learn about the clear method of the Sheet Manager in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Clear the values, styles and formatting of a sheet in DHTMLX Spreadsheet with the sheets.clear() method, without deleting the sheet itself. --- # clear() diff --git a/docs/api/sheetmanager_get_method.md b/docs/api/sheetmanager_get_method.md index a773cf8f..a5d85d47 100644 --- a/docs/api/sheetmanager_get_method.md +++ b/docs/api/sheetmanager_get_method.md @@ -1,7 +1,7 @@ --- sidebar_label: get() title: get method -description: You can learn about the get method of the Sheet Manager in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Get a sheet object by its id in DHTMLX Spreadsheet with the sheets.get() method. --- # get() diff --git a/docs/api/sheetmanager_getactive_method.md b/docs/api/sheetmanager_getactive_method.md index 48632989..9294e57c 100644 --- a/docs/api/sheetmanager_getactive_method.md +++ b/docs/api/sheetmanager_getactive_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getActive() title: getActive method -description: You can learn about the getActive method of the Sheet Manager in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Get the active (visible) sheet of DHTMLX Spreadsheet with the sheets.getActive() method, which returns the id and the name of the sheet. --- # getActive() diff --git a/docs/api/sheetmanager_getall_method.md b/docs/api/sheetmanager_getall_method.md index ce20df82..4410505d 100644 --- a/docs/api/sheetmanager_getall_method.md +++ b/docs/api/sheetmanager_getall_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getAll() title: getAll method -description: You can learn about the getAll method of the Sheet Manager in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Get all the sheets of DHTMLX Spreadsheet with the sheets.getAll() method, which returns an array of objects with the ids and the names of the sheets. --- # getAll() diff --git a/docs/api/sheetmanager_remove_method.md b/docs/api/sheetmanager_remove_method.md index 49260aa0..f2c1fe05 100644 --- a/docs/api/sheetmanager_remove_method.md +++ b/docs/api/sheetmanager_remove_method.md @@ -1,7 +1,7 @@ --- sidebar_label: remove() title: remove method -description: You can learn about the remove method of the Sheet Manager in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Remove a sheet by its id from DHTMLX Spreadsheet with the sheets.remove() method, which keeps at least one sheet and switches to another sheet if the active one is removed. --- # remove() diff --git a/docs/api/sheetmanager_setactive_method.md b/docs/api/sheetmanager_setactive_method.md index 3e4cab4f..962f5f6d 100644 --- a/docs/api/sheetmanager_setactive_method.md +++ b/docs/api/sheetmanager_setactive_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setActive() title: setActive method -description: You can learn about the setActive method of the Sheet Manager in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Switch the active (visible) sheet of DHTMLX Spreadsheet to the sheet with the specified id with the sheets.setActive() method. --- # setActive() diff --git a/docs/api/spreadsheet_addcolumn_method.md b/docs/api/spreadsheet_addcolumn_method.md index c6fe09ec..4e06617f 100644 --- a/docs/api/spreadsheet_addcolumn_method.md +++ b/docs/api/spreadsheet_addcolumn_method.md @@ -1,7 +1,7 @@ --- sidebar_label: addColumn() title: addColumn method -description: You can learn about the addColumn method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Add an empty column to DHTMLX Spreadsheet with the addColumn() method, which inserts it at the column of the specified cell and shifts the existing columns to the right. --- # addColumn() diff --git a/docs/api/spreadsheet_addformula_method.md b/docs/api/spreadsheet_addformula_method.md index 9c4375ef..57813df3 100644 --- a/docs/api/spreadsheet_addformula_method.md +++ b/docs/api/spreadsheet_addformula_method.md @@ -1,7 +1,7 @@ --- sidebar_label: addFormula() title: addFormula method -description: You can learn about the addFormula method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Register a custom formula function in DHTMLX Spreadsheet with the addFormula() method to use it in cell formulas by its uppercase name. --- # addFormula() diff --git a/docs/api/spreadsheet_addrow_method.md b/docs/api/spreadsheet_addrow_method.md index 5cf9d726..ac19eb9f 100644 --- a/docs/api/spreadsheet_addrow_method.md +++ b/docs/api/spreadsheet_addrow_method.md @@ -1,7 +1,7 @@ --- sidebar_label: addRow() title: addRow method -description: You can learn about the addRow method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Add an empty row to DHTMLX Spreadsheet with the addRow() method, which inserts it at the row of the specified cell and shifts the existing rows down. --- # addRow() diff --git a/docs/api/spreadsheet_afteraction_event.md b/docs/api/spreadsheet_afteraction_event.md index ab16157c..fca50ee3 100644 --- a/docs/api/spreadsheet_afteraction_event.md +++ b/docs/api/spreadsheet_afteraction_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterAction title: afterAction event -description: You can learn about the afterAction event in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Handle the afterAction event of DHTMLX Spreadsheet, which fires after an action is executed and receives the name of the action and its parameters, such as the cell and the new and previous values. --- # afterAction diff --git a/docs/api/spreadsheet_afterclear_event.md b/docs/api/spreadsheet_afterclear_event.md index 8f5f9761..029a9fb0 100644 --- a/docs/api/spreadsheet_afterclear_event.md +++ b/docs/api/spreadsheet_afterclear_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterClear title: afterClear event -description: You can learn about the afterClear event in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Handle the afterClear event that fires after DHTMLX Spreadsheet is cleared (deprecated since v4.3, use the afterAction event instead). --- # afterClear diff --git a/docs/api/spreadsheet_afterdataloaded_event.md b/docs/api/spreadsheet_afterdataloaded_event.md index f8138797..b097699f 100644 --- a/docs/api/spreadsheet_afterdataloaded_event.md +++ b/docs/api/spreadsheet_afterdataloaded_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterDataLoaded title: afterDataLoaded event -description: You can learn about the afterDataLoaded event in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Run code after data is loaded into DHTMLX Spreadsheet with the afterDataLoaded event, for example, to show a message when the loading is complete. --- # afterDataLoaded diff --git a/docs/api/spreadsheet_aftereditend_event.md b/docs/api/spreadsheet_aftereditend_event.md index 22a9a7bb..e54f7f8c 100644 --- a/docs/api/spreadsheet_aftereditend_event.md +++ b/docs/api/spreadsheet_aftereditend_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterEditEnd title: afterEditEnd event -description: You can learn about the afterEditEnd event in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Handle the end of cell editing in DHTMLX Spreadsheet with the afterEditEnd event, which receives the id of the cell and its new value. --- # afterEditEnd diff --git a/docs/api/spreadsheet_aftereditstart_event.md b/docs/api/spreadsheet_aftereditstart_event.md index 0a2c56ed..f56406c0 100644 --- a/docs/api/spreadsheet_aftereditstart_event.md +++ b/docs/api/spreadsheet_aftereditstart_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterEditStart title: afterEditStart event -description: You can learn about the afterEditStart event in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Handle the start of cell editing in DHTMLX Spreadsheet with the afterEditStart event, which receives the id of the cell and its value. --- # afterEditStart diff --git a/docs/api/spreadsheet_afterfocusset_event.md b/docs/api/spreadsheet_afterfocusset_event.md index e9cc3a8c..f805fa19 100644 --- a/docs/api/spreadsheet_afterfocusset_event.md +++ b/docs/api/spreadsheet_afterfocusset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterFocusSet title: afterFocusSet event -description: You can learn about the afterFocusSet event in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Track the focused cell in DHTMLX Spreadsheet with the afterFocusSet event, which fires after the focus is set on a cell and receives the cell id. --- # afterFocusSet diff --git a/docs/api/spreadsheet_afterselectionset_event.md b/docs/api/spreadsheet_afterselectionset_event.md index 3d1b5eed..d07a5e8d 100644 --- a/docs/api/spreadsheet_afterselectionset_event.md +++ b/docs/api/spreadsheet_afterselectionset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterSelectionSet title: afterSelectionSet event -description: You can learn about the afterSelectionSet event in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: React to the selection of cells in DHTMLX Spreadsheet with the afterSelectionSet event, which fires after cells are selected and receives their ids. --- # afterSelectionSet diff --git a/docs/api/spreadsheet_aftersheetchange_event.md b/docs/api/spreadsheet_aftersheetchange_event.md index 1029008c..bee0a532 100644 --- a/docs/api/spreadsheet_aftersheetchange_event.md +++ b/docs/api/spreadsheet_aftersheetchange_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterSheetChange title: afterSheetChange event -description: You can learn about the afterSheetChange event in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Track the switching of sheets in DHTMLX Spreadsheet with the afterSheetChange event, which receives the name and id of the newly active sheet. --- # afterSheetChange diff --git a/docs/api/spreadsheet_beforeaction_event.md b/docs/api/spreadsheet_beforeaction_event.md index d5b70e4d..9084c8d0 100644 --- a/docs/api/spreadsheet_beforeaction_event.md +++ b/docs/api/spreadsheet_beforeaction_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeAction title: beforeAction event -description: You can learn about the beforeAction event in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Intercept actions in DHTMLX Spreadsheet with the beforeAction event, which receives the name and parameters of an action and cancels it when the handler returns false. --- # beforeAction diff --git a/docs/api/spreadsheet_beforeclear_event.md b/docs/api/spreadsheet_beforeclear_event.md index 303b7e24..2a8acf00 100644 --- a/docs/api/spreadsheet_beforeclear_event.md +++ b/docs/api/spreadsheet_beforeclear_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeClear title: beforeClear event -description: You can learn about the beforeClear event in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Prevent the clearing of DHTMLX Spreadsheet with the deprecated beforeClear event, or with the beforeAction event and the clear action that replace it. --- # beforeClear diff --git a/docs/api/spreadsheet_beforeeditend_event.md b/docs/api/spreadsheet_beforeeditend_event.md index efb84156..f94a2fcb 100644 --- a/docs/api/spreadsheet_beforeeditend_event.md +++ b/docs/api/spreadsheet_beforeeditend_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeEditEnd title: beforeEditEnd event -description: You can learn about the beforeEditEnd event in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Check a cell value before editing ends in DHTMLX Spreadsheet with the beforeEditEnd event, and return false to keep the editor open. --- # beforeEditEnd diff --git a/docs/api/spreadsheet_beforeeditstart_event.md b/docs/api/spreadsheet_beforeeditstart_event.md index 0ef89172..2f5f8aeb 100644 --- a/docs/api/spreadsheet_beforeeditstart_event.md +++ b/docs/api/spreadsheet_beforeeditstart_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeEditStart title: beforeEditStart event -description: You can learn about the beforeEditStart event in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Control which cells can be edited in DHTMLX Spreadsheet with the beforeEditStart event, and return false to prevent the editor from opening. --- # beforeEditStart diff --git a/docs/api/spreadsheet_beforefocusset_event.md b/docs/api/spreadsheet_beforefocusset_event.md index 873a6445..2bab2117 100644 --- a/docs/api/spreadsheet_beforefocusset_event.md +++ b/docs/api/spreadsheet_beforefocusset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeFocusSet title: beforeFocusSet event -description: You can learn about the beforeFocusSet event in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Control the focus in DHTMLX Spreadsheet with the beforeFocusSet event, which fires before a cell gets the focus and prevents it when the handler returns false. --- # beforeFocusSet diff --git a/docs/api/spreadsheet_beforeselectionset_event.md b/docs/api/spreadsheet_beforeselectionset_event.md index dcc1b1be..28d5f102 100644 --- a/docs/api/spreadsheet_beforeselectionset_event.md +++ b/docs/api/spreadsheet_beforeselectionset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeSelectionSet title: beforeSelectionSet event -description: You can learn about the beforeSelectionSet event in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Control the selection of cells in DHTMLX Spreadsheet with the beforeSelectionSet event, which fires before cells are selected and prevents it when the handler returns false. --- # beforeSelectionSet diff --git a/docs/api/spreadsheet_beforesheetchange_event.md b/docs/api/spreadsheet_beforesheetchange_event.md index 160a630d..bd435116 100644 --- a/docs/api/spreadsheet_beforesheetchange_event.md +++ b/docs/api/spreadsheet_beforesheetchange_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeSheetChange title: beforeSheetChange event -description: You can learn about the beforeSheetChange event in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Control the switching of sheets in DHTMLX Spreadsheet with the beforeSheetChange event, and return false to keep the current sheet active. --- # beforeSheetChange diff --git a/docs/api/spreadsheet_clear_method.md b/docs/api/spreadsheet_clear_method.md index 349c43b4..b0a97165 100644 --- a/docs/api/spreadsheet_clear_method.md +++ b/docs/api/spreadsheet_clear_method.md @@ -1,7 +1,7 @@ --- sidebar_label: clear() title: clear method -description: You can learn about the clear method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Remove all the data from DHTMLX Spreadsheet with the clear() method. --- # clear() diff --git a/docs/api/spreadsheet_colscount_config.md b/docs/api/spreadsheet_colscount_config.md index ffdc6430..d148316a 100644 --- a/docs/api/spreadsheet_colscount_config.md +++ b/docs/api/spreadsheet_colscount_config.md @@ -1,7 +1,7 @@ --- sidebar_label: colsCount title: colsCount config -description: You can learn about the colsCount config in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Set the number of columns that DHTMLX Spreadsheet shows on initialization with the colsCount property. --- # colsCount diff --git a/docs/api/spreadsheet_eachcell_method.md b/docs/api/spreadsheet_eachcell_method.md index 74fc4171..121f5f15 100644 --- a/docs/api/spreadsheet_eachcell_method.md +++ b/docs/api/spreadsheet_eachcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: eachCell() title: eachCell method -description: You can learn about the eachcell method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Iterate over a range of cells or the selected cells in DHTMLX Spreadsheet with the eachCell() method, which calls a function with the name and value of each cell. --- # eachCell() diff --git a/docs/api/spreadsheet_editline_config.md b/docs/api/spreadsheet_editline_config.md index 20a1ff9a..8ed0ac71 100644 --- a/docs/api/spreadsheet_editline_config.md +++ b/docs/api/spreadsheet_editline_config.md @@ -1,7 +1,7 @@ --- sidebar_label: editLine title: editLine config -description: You can learn about the editLine config in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Show or hide the editing bar of DHTMLX Spreadsheet with the editLine property, which is turned on by default. --- # editLine diff --git a/docs/api/spreadsheet_endedit_method.md b/docs/api/spreadsheet_endedit_method.md index 87609708..3f5576e9 100644 --- a/docs/api/spreadsheet_endedit_method.md +++ b/docs/api/spreadsheet_endedit_method.md @@ -1,7 +1,7 @@ --- sidebar_label: endEdit() title: endEdit method -description: You can learn about the endEdit method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Finish editing the selected cell in DHTMLX Spreadsheet with the endEdit() method, which closes the editor and saves the entered value. --- # endEdit() diff --git a/docs/api/spreadsheet_exportmodulepath_config.md b/docs/api/spreadsheet_exportmodulepath_config.md index 2b631914..31f33d4b 100644 --- a/docs/api/spreadsheet_exportmodulepath_config.md +++ b/docs/api/spreadsheet_exportmodulepath_config.md @@ -1,7 +1,7 @@ --- sidebar_label: exportModulePath title: exportModulePath config -description: You can learn about the exportModulePath config in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Set the path to the worker.js file of the JSON2Excel export module in DHTMLX Spreadsheet with the exportModulePath property, for example, to export to Excel on your own server. --- # exportModulePath diff --git a/docs/api/spreadsheet_fitcolumn_method.md b/docs/api/spreadsheet_fitcolumn_method.md index 96966f07..267724b1 100644 --- a/docs/api/spreadsheet_fitcolumn_method.md +++ b/docs/api/spreadsheet_fitcolumn_method.md @@ -1,7 +1,7 @@ --- sidebar_label: fitColumn() title: fitColumn method -description: You can learn about the fitColumn method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Adjust the width of a column to its longest value in DHTMLX Spreadsheet with the fitColumn() method. --- # fitColumn() diff --git a/docs/api/spreadsheet_formats_config.md b/docs/api/spreadsheet_formats_config.md index 475c9013..dabe1943 100644 --- a/docs/api/spreadsheet_formats_config.md +++ b/docs/api/spreadsheet_formats_config.md @@ -1,7 +1,7 @@ --- sidebar_label: formats title: formats config -description: You can learn about the formats config in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Define the number formats available in DHTMLX Spreadsheet with the formats property, an array of objects with the id, mask, name and example of each format. --- # formats diff --git a/docs/api/spreadsheet_freezecols_method.md b/docs/api/spreadsheet_freezecols_method.md index 2dc58aca..f208362e 100644 --- a/docs/api/spreadsheet_freezecols_method.md +++ b/docs/api/spreadsheet_freezecols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: freezeCols() title: freezeCols method -description: You can learn about the freezeCols method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Freeze columns in DHTMLX Spreadsheet with the freezeCols() method, which fixes the columns up to the specified or the selected cell, on the current or another sheet. --- # freezeCols() diff --git a/docs/api/spreadsheet_freezerows_method.md b/docs/api/spreadsheet_freezerows_method.md index 8da1f2a0..5c6ee580 100644 --- a/docs/api/spreadsheet_freezerows_method.md +++ b/docs/api/spreadsheet_freezerows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: freezeRows() title: freezeRows method -description: You can learn about the freezeRows method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Freeze rows in DHTMLX Spreadsheet with the freezeRows() method, which fixes the rows up to the specified or the selected cell, on the current or another sheet. --- # freezeRows() diff --git a/docs/api/spreadsheet_getfilter_method.md b/docs/api/spreadsheet_getfilter_method.md index 73663e16..65431254 100644 --- a/docs/api/spreadsheet_getfilter_method.md +++ b/docs/api/spreadsheet_getfilter_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFilter() title: getFilter method -description: You can learn about the getFilter method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Get the filtering criteria of a sheet in DHTMLX Spreadsheet with the getFilter() method, which returns the filtered range of cells and the filter rules. --- # getFilter() diff --git a/docs/api/spreadsheet_getformat_method.md b/docs/api/spreadsheet_getformat_method.md index 90aabb54..84e0de8d 100644 --- a/docs/api/spreadsheet_getformat_method.md +++ b/docs/api/spreadsheet_getformat_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFormat() title: getFormat method -description: You can learn about the getFormat method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Get the number format applied to the value of a cell or a range of cells in DHTMLX Spreadsheet with the getFormat() method. --- # getFormat() diff --git a/docs/api/spreadsheet_getformula_method.md b/docs/api/spreadsheet_getformula_method.md index 841b2bc3..0cdf8f2f 100644 --- a/docs/api/spreadsheet_getformula_method.md +++ b/docs/api/spreadsheet_getformula_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFormula() title: getFormula method -description: You can learn about the getFormula method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Get the formula of a cell in DHTMLX Spreadsheet with the getFormula() method, including a cell on another sheet. --- # getFormula() diff --git a/docs/api/spreadsheet_getstyle_method.md b/docs/api/spreadsheet_getstyle_method.md index 2c58756d..5cff7c96 100644 --- a/docs/api/spreadsheet_getstyle_method.md +++ b/docs/api/spreadsheet_getstyle_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getStyle() title: getStyle method -description: You can learn about the getStyle method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Get the styles applied to a cell or a range of cells in DHTMLX Spreadsheet with the getStyle() method. --- # getStyle() diff --git a/docs/api/spreadsheet_getvalue_method.md b/docs/api/spreadsheet_getvalue_method.md index de62fed4..af5192dd 100644 --- a/docs/api/spreadsheet_getvalue_method.md +++ b/docs/api/spreadsheet_getvalue_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getValue() title: getValue method -description: You can learn about the getValue method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Get the value of a cell or the values of a range of cells in DHTMLX Spreadsheet with the getValue() method. --- # getValue() diff --git a/docs/api/spreadsheet_groupfill_event.md b/docs/api/spreadsheet_groupfill_event.md index 5f9b5eaa..00d5f65a 100644 --- a/docs/api/spreadsheet_groupfill_event.md +++ b/docs/api/spreadsheet_groupfill_event.md @@ -1,7 +1,7 @@ --- sidebar_label: groupFill title: groupFill event -description: You can learn about the groupFill event in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Handle the auto filling of cells in DHTMLX Spreadsheet with the groupFill event, which passes the focused cell and the selected cells to the callback. --- # groupFill diff --git a/docs/api/spreadsheet_hidecols_method.md b/docs/api/spreadsheet_hidecols_method.md index 00e54243..90756202 100644 --- a/docs/api/spreadsheet_hidecols_method.md +++ b/docs/api/spreadsheet_hidecols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: hideCols() title: hideCols method -description: You can learn about the hideCols method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Hide one or several columns in DHTMLX Spreadsheet with the hideCols() method, by the id of a cell, a range of cells or the selected cell. --- # hideCols() diff --git a/docs/api/spreadsheet_hiderows_method.md b/docs/api/spreadsheet_hiderows_method.md index c5b8db5b..749dcbe9 100644 --- a/docs/api/spreadsheet_hiderows_method.md +++ b/docs/api/spreadsheet_hiderows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: hideRows() title: hideRows method -description: You can learn about the hideRows method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Hide one or several rows in DHTMLX Spreadsheet with the hideRows() method, by the id of a cell, a range of cells or the selected cell. --- # hideRows() diff --git a/docs/api/spreadsheet_hidesearch_method.md b/docs/api/spreadsheet_hidesearch_method.md index e285fcd7..33570c42 100644 --- a/docs/api/spreadsheet_hidesearch_method.md +++ b/docs/api/spreadsheet_hidesearch_method.md @@ -1,7 +1,7 @@ --- sidebar_label: hideSearch() title: hideSearch method -description: You can learn about the hideSearch method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Hide the search bar of DHTMLX Spreadsheet with the hideSearch() method, for example, after a search opened with the search() method. --- # hideSearch() diff --git a/docs/api/spreadsheet_importmodulepath_config.md b/docs/api/spreadsheet_importmodulepath_config.md index 845da407..21f55077 100644 --- a/docs/api/spreadsheet_importmodulepath_config.md +++ b/docs/api/spreadsheet_importmodulepath_config.md @@ -1,7 +1,7 @@ --- sidebar_label: importModulePath title: importModulePath config -description: You can learn about the importModulePath config in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Set the path to the worker.js file of the Excel2json library, which DHTMLX Spreadsheet uses to import Excel files, with the importModulePath property. --- # importModulePath diff --git a/docs/api/spreadsheet_insertlink_method.md b/docs/api/spreadsheet_insertlink_method.md index 9b3df0fc..e6913521 100644 --- a/docs/api/spreadsheet_insertlink_method.md +++ b/docs/api/spreadsheet_insertlink_method.md @@ -1,7 +1,7 @@ --- sidebar_label: insertLink() title: insertLink method -description: You can learn about the insertLink method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Insert a hyperlink into a cell of DHTMLX Spreadsheet with the insertLink() method, or remove the hyperlink and keep the text of the cell. --- # insertLink() diff --git a/docs/api/spreadsheet_islocked_method.md b/docs/api/spreadsheet_islocked_method.md index 600a1c50..fae8e800 100644 --- a/docs/api/spreadsheet_islocked_method.md +++ b/docs/api/spreadsheet_islocked_method.md @@ -1,7 +1,7 @@ --- sidebar_label: isLocked() title: isLocked method -description: You can learn about the isLocked method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Check whether a cell or any cell of a range is locked in DHTMLX Spreadsheet with the isLocked() method. --- # isLocked() diff --git a/docs/api/spreadsheet_load_method.md b/docs/api/spreadsheet_load_method.md index 7ecd23fa..e4529db9 100644 --- a/docs/api/spreadsheet_load_method.md +++ b/docs/api/spreadsheet_load_method.md @@ -1,7 +1,7 @@ --- sidebar_label: load() title: load method -description: You can learn about the load method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Load data into DHTMLX Spreadsheet from an external JSON, CSV or XLSX file with the load() method, which returns a promise. --- # load() diff --git a/docs/api/spreadsheet_localization_config.md b/docs/api/spreadsheet_localization_config.md index 68811bd1..5b56ead8 100644 --- a/docs/api/spreadsheet_localization_config.md +++ b/docs/api/spreadsheet_localization_config.md @@ -1,7 +1,7 @@ --- sidebar_label: localization title: localization config -description: You can learn about the localization config in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Set the decimal and thousands separators, the currency sign and the date and time formats of DHTMLX Spreadsheet with the localization property. --- # localization diff --git a/docs/api/spreadsheet_lock_method.md b/docs/api/spreadsheet_lock_method.md index e1b09020..32c0eeba 100644 --- a/docs/api/spreadsheet_lock_method.md +++ b/docs/api/spreadsheet_lock_method.md @@ -1,7 +1,7 @@ --- sidebar_label: lock() title: lock method -description: You can learn about the lock method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Lock a cell, a range of cells or several cells in DHTMLX Spreadsheet with the lock() method, so that users can't edit them. --- # lock() diff --git a/docs/api/spreadsheet_menu_config.md b/docs/api/spreadsheet_menu_config.md index bed5ce0e..e72454f3 100644 --- a/docs/api/spreadsheet_menu_config.md +++ b/docs/api/spreadsheet_menu_config.md @@ -1,7 +1,7 @@ --- sidebar_label: menu title: menu config -description: You can learn about the menu config in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Show or hide the menu of DHTMLX Spreadsheet with the menu property. --- # menu diff --git a/docs/api/spreadsheet_mergecells_method.md b/docs/api/spreadsheet_mergecells_method.md index 95a52605..89cbbcb5 100644 --- a/docs/api/spreadsheet_mergecells_method.md +++ b/docs/api/spreadsheet_mergecells_method.md @@ -1,7 +1,7 @@ --- sidebar_label: mergeCells() title: mergeCells method -description: You can learn about the mergeCells method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Merge a range of cells into one cell or split merged cells in DHTMLX Spreadsheet with the mergeCells() method. --- # mergeCells() diff --git a/docs/api/spreadsheet_multisheets_config.md b/docs/api/spreadsheet_multisheets_config.md index ad31fd19..4c00c074 100644 --- a/docs/api/spreadsheet_multisheets_config.md +++ b/docs/api/spreadsheet_multisheets_config.md @@ -1,7 +1,7 @@ --- sidebar_label: multiSheets title: multiSheets config -description: You can learn about the multiSheets config in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Turn the work with multiple sheets on or off in DHTMLX Spreadsheet with the multiSheets property, which shows or hides the bottom tabbar with sheet tabs. --- # multiSheets diff --git a/docs/api/spreadsheet_parse_method.md b/docs/api/spreadsheet_parse_method.md index e97a7072..c06b19b1 100644 --- a/docs/api/spreadsheet_parse_method.md +++ b/docs/api/spreadsheet_parse_method.md @@ -1,7 +1,7 @@ --- sidebar_label: parse() title: parse method -description: You can learn about the parse method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Load data into DHTMLX Spreadsheet from a local data source with the parse() method, including cell values, styles, formats, editors, links and several sheets. --- # parse() diff --git a/docs/api/spreadsheet_redo_method.md b/docs/api/spreadsheet_redo_method.md index bb75bb42..3e3da042 100644 --- a/docs/api/spreadsheet_redo_method.md +++ b/docs/api/spreadsheet_redo_method.md @@ -1,7 +1,7 @@ --- sidebar_label: redo() title: redo method -description: You can learn about the redo method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Apply an undone action once again in DHTMLX Spreadsheet with the redo() method. --- # redo() diff --git a/docs/api/spreadsheet_rowscount_config.md b/docs/api/spreadsheet_rowscount_config.md index 31630bdd..f6618da3 100644 --- a/docs/api/spreadsheet_rowscount_config.md +++ b/docs/api/spreadsheet_rowscount_config.md @@ -1,7 +1,7 @@ --- sidebar_label: rowsCount title: rowsCount config -description: You can learn about the rowsCount config in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Set the number of rows that DHTMLX Spreadsheet shows on initialization with the rowsCount property. --- # rowsCount diff --git a/docs/api/spreadsheet_search_method.md b/docs/api/spreadsheet_search_method.md index 645d11d5..c1a1a362 100644 --- a/docs/api/spreadsheet_search_method.md +++ b/docs/api/spreadsheet_search_method.md @@ -1,7 +1,7 @@ --- sidebar_label: search() title: search method -description: You can learn about the search method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Search for cells by a value in DHTMLX Spreadsheet with the search() method, which returns the ids of the found cells and can open the search bar with the matches highlighted. --- # search() diff --git a/docs/api/spreadsheet_serialize_method.md b/docs/api/spreadsheet_serialize_method.md index 3a37f176..08e4d5c6 100644 --- a/docs/api/spreadsheet_serialize_method.md +++ b/docs/api/spreadsheet_serialize_method.md @@ -1,7 +1,7 @@ --- sidebar_label: serialize() title: serialize method -description: You can learn about the serialize method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Save the data of DHTMLX Spreadsheet to a JSON object with the serialize() method, which includes the sheets, the cell values, the styles and the number formats. --- # serialize() diff --git a/docs/api/spreadsheet_setfilter_method.md b/docs/api/spreadsheet_setfilter_method.md index 57c6beba..2a77b627 100644 --- a/docs/api/spreadsheet_setfilter_method.md +++ b/docs/api/spreadsheet_setfilter_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setFilter() title: setFilter method -description: You can learn about the setFilter method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Filter the data of a column in DHTMLX Spreadsheet by conditions or by excluded values with the setFilter() method, or reset the filtering. --- # setFilter() diff --git a/docs/api/spreadsheet_setformat_method.md b/docs/api/spreadsheet_setformat_method.md index d3f7a115..33d21825 100644 --- a/docs/api/spreadsheet_setformat_method.md +++ b/docs/api/spreadsheet_setformat_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setFormat() title: setFormat method -description: You can learn about the setformat method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Apply a number format to the value of a cell or a range of cells in DHTMLX Spreadsheet with the setFormat() method. --- # setFormat() diff --git a/docs/api/spreadsheet_setstyle_method.md b/docs/api/spreadsheet_setstyle_method.md index e723de0c..8de29cb5 100644 --- a/docs/api/spreadsheet_setstyle_method.md +++ b/docs/api/spreadsheet_setstyle_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setStyle() title: setStyle method -description: You can learn about the setStyle method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Apply the same style to a cell, several cells or a range of cells in DHTMLX Spreadsheet with the setStyle() method, passing the styles as an object or an array. --- # setStyle() diff --git a/docs/api/spreadsheet_setvalidation_method.md b/docs/api/spreadsheet_setvalidation_method.md index f0dfc0eb..a474ad7c 100644 --- a/docs/api/spreadsheet_setvalidation_method.md +++ b/docs/api/spreadsheet_setvalidation_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setValidation() title: setValidation method -description: You can learn about the setValidation method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Add a drop-down list of values to cells in DHTMLX Spreadsheet with the setValidation() method, taking the options from a range of cells or an array, or remove the validation. --- # setValidation() diff --git a/docs/api/spreadsheet_setvalue_method.md b/docs/api/spreadsheet_setvalue_method.md index ad847d32..8897b350 100644 --- a/docs/api/spreadsheet_setvalue_method.md +++ b/docs/api/spreadsheet_setvalue_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setValue() title: setValue method -description: You can learn about the setValue method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Set a value for a cell, several cells or a range of cells in DHTMLX Spreadsheet with the setValue() method, passing a single value or an array of values repeated across the cells. --- # setValue() diff --git a/docs/api/spreadsheet_showcols_method.md b/docs/api/spreadsheet_showcols_method.md index 110f5e11..53f1a56a 100644 --- a/docs/api/spreadsheet_showcols_method.md +++ b/docs/api/spreadsheet_showcols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: showCols() title: showCols method -description: You can learn about the showCols method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Show hidden columns in DHTMLX Spreadsheet with the showCols() method, using the column of the passed cell or of the selected cell. --- # showCols() diff --git a/docs/api/spreadsheet_showrows_method.md b/docs/api/spreadsheet_showrows_method.md index 1f5f62fd..762265ac 100644 --- a/docs/api/spreadsheet_showrows_method.md +++ b/docs/api/spreadsheet_showrows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: showRows() title: showRows method -description: You can learn about the showRows method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Show hidden rows in DHTMLX Spreadsheet with the showRows() method, using the row of the passed cell or of the selected cell. --- # showRows() diff --git a/docs/api/spreadsheet_sortcells_method.md b/docs/api/spreadsheet_sortcells_method.md index cfc8b79d..740c2f79 100644 --- a/docs/api/spreadsheet_sortcells_method.md +++ b/docs/api/spreadsheet_sortcells_method.md @@ -1,7 +1,7 @@ --- sidebar_label: sortCells() title: sortCells method -description: You can learn about the sortCells method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Sort the data of DHTMLX Spreadsheet in ascending or descending order by a column or a range of cells with the sortCells() method. --- # sortCells() diff --git a/docs/api/spreadsheet_startedit_method.md b/docs/api/spreadsheet_startedit_method.md index 73a9136f..c266cfa0 100644 --- a/docs/api/spreadsheet_startedit_method.md +++ b/docs/api/spreadsheet_startedit_method.md @@ -1,7 +1,7 @@ --- sidebar_label: startEdit() title: startEdit method -description: You can learn about the startEdit method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Start editing the passed or the selected cell of DHTMLX Spreadsheet with the startEdit() method, optionally with an initial value. --- # startEdit() diff --git a/docs/api/spreadsheet_toolbarblocks_config.md b/docs/api/spreadsheet_toolbarblocks_config.md index 313eba1e..dfffb3b1 100644 --- a/docs/api/spreadsheet_toolbarblocks_config.md +++ b/docs/api/spreadsheet_toolbarblocks_config.md @@ -1,7 +1,7 @@ --- sidebar_label: toolbarBlocks title: toolbarBlocks config -description: You can learn about the toolbarBlocks config in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Choose which blocks of buttons the DHTMLX Spreadsheet toolbar shows, such as undo, colors, font, align and format, with the toolbarBlocks property. --- # toolbarBlocks diff --git a/docs/api/spreadsheet_undo_method.md b/docs/api/spreadsheet_undo_method.md index 3ea35891..5bd8d843 100644 --- a/docs/api/spreadsheet_undo_method.md +++ b/docs/api/spreadsheet_undo_method.md @@ -1,7 +1,7 @@ --- sidebar_label: undo() title: undo method -description: You can learn about the undo method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Revert the latest action in DHTMLX Spreadsheet with the undo() method, and reapply it with the redo() method. --- # undo() diff --git a/docs/api/spreadsheet_unfreezecols_method.md b/docs/api/spreadsheet_unfreezecols_method.md index f9fca1fe..677fac92 100644 --- a/docs/api/spreadsheet_unfreezecols_method.md +++ b/docs/api/spreadsheet_unfreezecols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: unfreezeCols() title: unfreezeCols method -description: You can learn about the unfreezeCols method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Unfreeze the frozen columns in DHTMLX Spreadsheet with the unfreezeCols() method, so that they scroll together with the rest of the grid. --- # unfreezeCols() diff --git a/docs/api/spreadsheet_unfreezerows_method.md b/docs/api/spreadsheet_unfreezerows_method.md index 130b083c..30a79947 100644 --- a/docs/api/spreadsheet_unfreezerows_method.md +++ b/docs/api/spreadsheet_unfreezerows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: unfreezeRows() title: unfreezeRows method -description: You can learn about the unfreezeRows method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Unfreeze the frozen rows in DHTMLX Spreadsheet with the unfreezeRows() method, so that they scroll together with the rest of the grid. --- # unfreezeRows() diff --git a/docs/api/spreadsheet_unlock_method.md b/docs/api/spreadsheet_unlock_method.md index 034ab0d4..68eebc75 100644 --- a/docs/api/spreadsheet_unlock_method.md +++ b/docs/api/spreadsheet_unlock_method.md @@ -1,7 +1,7 @@ --- sidebar_label: unlock() title: unlock method -description: You can learn about the unlock method in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Unlock a locked cell, several cells or a range of cells in DHTMLX Spreadsheet with the unlock() method, so that users can edit them again. --- # unlock() diff --git a/docs/awaitredraw.md b/docs/awaitredraw.md index 383ee873..f37a29a5 100644 --- a/docs/awaitredraw.md +++ b/docs/awaitredraw.md @@ -1,7 +1,7 @@ --- sidebar_label: AwaitRedraw helper title: AwaitRedraw helper -description: You can explore the AwaitRedraw helper in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Run code after DHTMLX Spreadsheet finishes rendering with the dhx.awaitRedraw helper, for API methods that take effect only once the component is on the page. --- # AwaitRedraw helper diff --git a/docs/data_formatting.md b/docs/data_formatting.md index 607b5dbf..9a7d0e0b 100644 --- a/docs/data_formatting.md +++ b/docs/data_formatting.md @@ -1,7 +1,7 @@ --- sidebar_label: Data formatting title: Data Formatting -description: You can learn about data formatting in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Style cell data in DHTMLX Spreadsheet from the toolbar, including text and background colors, bold and italic, alignment, text wrapping and cell borders, and clear styles and values. --- # Data formatting diff --git a/docs/functions.md b/docs/functions.md index 749c9ab4..1a6070e8 100644 --- a/docs/functions.md +++ b/docs/functions.md @@ -1,7 +1,7 @@ --- sidebar_label: Formulas and functions title: Formulas and functions -description: You can learn about the formulas and functions of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Use the Excel and Google Sheets compatible formulas in DHTMLX Spreadsheet, including math, date, lookup, string and financial functions, add custom formulas and get the formula of a cell. --- # Formulas and functions diff --git a/docs/handling_events.md b/docs/handling_events.md index a8c2b8d0..6c03c93f 100644 --- a/docs/handling_events.md +++ b/docs/handling_events.md @@ -1,7 +1,7 @@ --- sidebar_label: Event handling title: Event handling -description: You can learn about event handling in the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Attach and detach event listeners and call events in DHTMLX Spreadsheet with the events.on(), events.detach() and events.fire() methods. --- # Event handling diff --git a/docs/how_to_start.md b/docs/how_to_start.md index 7d422c5b..85fdbc88 100644 --- a/docs/how_to_start.md +++ b/docs/how_to_start.md @@ -1,7 +1,7 @@ --- sidebar_label: How to start title: How to start with DHTMLX Spreadsheet -description: You can learn how to start with the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Get DHTMLX Spreadsheet running on a page in four steps, from including the source files or installing the npm package to configuring the component and loading data. --- # How to start diff --git a/docs/index.md b/docs/index.md index ed5ddf83..9b62cbc8 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,7 +2,7 @@ sidebar_label: Spreadsheet overview title: DHTMLX Spreadsheet Overview slug: / -description: You can have an overview of the JavaScript Spreadsheet library in the DHTMLX documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Overview of DHTMLX Spreadsheet, a JavaScript component for editing and formatting spreadsheet data, with its toolbar, editing line, grid, menu and context menu. --- # DHTMLX Spreadsheet overview diff --git a/docs/initialization.md b/docs/initialization.md index 4c0cc0be..95664216 100644 --- a/docs/initialization.md +++ b/docs/initialization.md @@ -1,7 +1,7 @@ --- sidebar_label: Initialization title: Initialization -description: You can learn about the initialization of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Initialize DHTMLX Spreadsheet on a page by including the source files, adding a container and calling the dhx.Spreadsheet constructor with a configuration object. --- # Initialization diff --git a/docs/loading_data.md b/docs/loading_data.md index 823be712..2656ea8e 100644 --- a/docs/loading_data.md +++ b/docs/loading_data.md @@ -1,7 +1,7 @@ --- sidebar_label: Data loading and export title: Loading data -description: You can learn about loading data in the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Load JSON, CSV or Excel data with styles, locked cells and links into DHTMLX Spreadsheet from a file or a local source, save and restore the state, and export data to Excel or JSON. --- # Data loading and export diff --git a/docs/migration.md b/docs/migration.md index 27c718b3..3859f734 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -1,7 +1,7 @@ --- sidebar_label: Migration to newer versions title: Migration -description: You can learn about migration in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Migrate to a newer version of DHTMLX Spreadsheet with the list of deprecated, changed and removed properties, methods and events of each version and their replacements. --- # Migration to newer versions diff --git a/docs/number_formatting.md b/docs/number_formatting.md index a727a870..375c7a49 100644 --- a/docs/number_formatting.md +++ b/docs/number_formatting.md @@ -1,7 +1,7 @@ --- sidebar_label: Number formatting title: Number Formatting -description: You can study the developer guide about number formatting in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Apply number, currency, percent, date, time and scientific formats to cell values in DHTMLX Spreadsheet, localize them, define custom format masks and set or get the format of a cell. --- # Number formatting diff --git a/docs/number_formatting_guide.md b/docs/number_formatting_guide.md index ce1fbbdf..8bed0f01 100644 --- a/docs/number_formatting_guide.md +++ b/docs/number_formatting_guide.md @@ -1,7 +1,7 @@ --- sidebar_label: Number formatting title: Number Formatting Guide -description: You can study the user guide about number formatting in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Choose a number format for cell values in DHTMLX Spreadsheet from the toolbar, such as number, currency, percent, date, time or text. --- # Number formatting diff --git a/docs/sorting_data.md b/docs/sorting_data.md index 2979d4f8..632458db 100644 --- a/docs/sorting_data.md +++ b/docs/sorting_data.md @@ -1,7 +1,7 @@ --- sidebar_label: Sorting data title: Sorting data -description: You can learn about sorting data in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Sort data in DHTMLX Spreadsheet from A to Z or from Z to A by a column or by a selected range of cells with the Sort command of the context menu. --- # Sorting data diff --git a/docs/svelte_integration.md b/docs/svelte_integration.md index 90b54872..829a833f 100644 --- a/docs/svelte_integration.md +++ b/docs/svelte_integration.md @@ -1,7 +1,7 @@ --- sidebar_label: Integration with Svelte title: Svelte Integration -description: You can learn about the Svelte integration of the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Use DHTMLX Spreadsheet in a Svelte application. Create a project, add Spreadsheet as a Svelte component, load data and handle events. --- # Integration with Svelte diff --git a/docs/themes/base_themes_configuration.md b/docs/themes/base_themes_configuration.md index cc7d9eab..d7cceff9 100644 --- a/docs/themes/base_themes_configuration.md +++ b/docs/themes/base_themes_configuration.md @@ -1,7 +1,7 @@ --- sidebar_label: Configuring built-in themes title: Configuring Built-in Themes -description: You can explore how to configure themes in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Change the colors of the built-in DHTMLX Spreadsheet themes by overriding their CSS variables, for all themes at once or for a separate theme. --- # Configuring built-in themes diff --git a/docs/themes/custom_theme.md b/docs/themes/custom_theme.md index b9c06c3b..8a1c5ab6 100644 --- a/docs/themes/custom_theme.md +++ b/docs/themes/custom_theme.md @@ -1,7 +1,7 @@ --- sidebar_label: Custom theme title: Custom Theme -description: You can learn how to create a custom theme in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Create a custom color theme for DHTMLX Spreadsheet with CSS variables and apply it with the dhx.setTheme() method. --- # Custom theme diff --git a/docs/using_typescript.md b/docs/using_typescript.md index a665d927..5dd594f9 100644 --- a/docs/using_typescript.md +++ b/docs/using_typescript.md @@ -1,7 +1,7 @@ --- sidebar_label: TypeScript support title: TypeScript support -description: You can learn about using typescript with the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Use the built-in TypeScript definitions of DHTMLX Spreadsheet for type checking, autocompletion and JSDoc hints in your IDE. --- # TypeScript support diff --git a/docs/whats_new.md b/docs/whats_new.md index 98134da9..aab3c96b 100644 --- a/docs/whats_new.md +++ b/docs/whats_new.md @@ -1,7 +1,7 @@ --- sidebar_label: What's new title: What's new in DHTMLX Spreadsheet -description: You can learn what's new in the DHTMLX JavaScript Spreadsheet library in the documentation. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Release notes of DHTMLX Spreadsheet with the new functionality, updates, fixes and breaking changes of each version. --- # What's new diff --git a/docs/work_with_sheets.md b/docs/work_with_sheets.md index d864f25d..90410bc8 100644 --- a/docs/work_with_sheets.md +++ b/docs/work_with_sheets.md @@ -1,7 +1,7 @@ --- sidebar_label: Work with sheets title: Work with Sheets -description: You can learn about the work with sheets in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Add, remove, rename and switch sheets in DHTMLX Spreadsheet with the bottom toolbar and the sheet tabs, and refer to cells of other sheets in formulas. --- # Work with sheets diff --git a/docs/working_with_cells.md b/docs/working_with_cells.md index b92c6f2f..595cc394 100644 --- a/docs/working_with_cells.md +++ b/docs/working_with_cells.md @@ -1,7 +1,7 @@ --- sidebar_label: Work with cells title: Work with cells -description: You can learn about working with cells in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Set and get cell values and styles, validate cells, insert links, and edit, lock, merge and select cells in DHTMLX Spreadsheet with the API. --- # Work with cells diff --git a/docs/working_with_sheets.md b/docs/working_with_sheets.md index 05897d9c..316e9544 100644 --- a/docs/working_with_sheets.md +++ b/docs/working_with_sheets.md @@ -1,7 +1,7 @@ --- sidebar_label: Work with sheets title: Working with Sheets -description: You can learn about working with sheets in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Load multiple sheets into DHTMLX Spreadsheet, and add, remove, get, clear and switch sheets with the API methods. --- # Work with sheets diff --git a/docs/working_with_ssheet.md b/docs/working_with_ssheet.md index 980b88d0..83b7d7f8 100644 --- a/docs/working_with_ssheet.md +++ b/docs/working_with_ssheet.md @@ -1,7 +1,7 @@ --- sidebar_label: Work with Spreadsheet title: Working with Spreadsheet -description: You can learn about working with spreadsheet in the documentation of the DHTMLX JavaScript Spreadsheet library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Spreadsheet. +description: Undo and redo actions, add, remove, freeze and hide rows and columns, autofit column width, filter, search and sort data, and clear DHTMLX Spreadsheet with the API. --- # Work with Spreadsheet diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md index d5725013..e53e4139 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md @@ -1,7 +1,7 @@ --- sidebar_label: detach() title: detach Events Bus-Methode -description: Sie können sich über die detach Events Bus-Methode in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek informieren. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Entfernen Sie mit der Methode events.detach() einen mit der Methode on() angehängten Event-Handler aus DHTMLX Spreadsheet anhand des Event-Namens. --- # detach() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md index d106f349..af798a9f 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md @@ -1,7 +1,7 @@ --- sidebar_label: fire() title: fire Events Bus-Methode -description: Sie können sich über die fire Events Bus-Methode in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek informieren. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Lösen Sie mit der Methode events.fire() ein internes Event von DHTMLX Spreadsheet aus und übergeben Sie den Event-Namen und ein Array mit den Event-Daten. --- # fire() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md index 335cc672..e80adb2e 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md @@ -1,7 +1,7 @@ --- sidebar_label: on() title: on Events Bus-Methode -description: Sie können sich über die on Events Bus-Methode in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek informieren. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Hängen Sie mit der Methode events.on() einen Handler an ein internes Event von DHTMLX Spreadsheet an, zum Beispiel, um auf eine Änderung des Zellstils zu reagieren. --- # on() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/export_json_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/export_json_method.md index 3c6b1371..ab5a9c6c 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/export_json_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/export_json_method.md @@ -1,7 +1,7 @@ --- sidebar_label: json() title: json Export-Methode -description: Sie können sich über die json Export-Methode in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek informieren. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Exportieren Sie mit der Methode export.json() die Daten von DHTMLX Spreadsheet in eine JSON-Datei. --- # json() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md index 43bf2289..3010e949 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md @@ -1,7 +1,7 @@ --- sidebar_label: xlsx() title: xlsx Export-Methode -description: Sie können sich über die xlsx Export-Methode in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek informieren. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Exportieren Sie mit der Methode export.xlsx() die Daten von DHTMLX Spreadsheet in eine Excel-Datei (.xlsx), optional mit einem eigenen Dateinamen. --- # xlsx() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md index fe3e615b..dfc4d3dd 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Spreadsheet-Aktionen title: Aktionen-Übersicht -description: Sie können eine Aktionen-Übersicht der DHTMLX JavaScript Spreadsheet-Bibliothek in der Dokumentation einsehen. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Überblick über die Aktionen von DHTMLX Spreadsheet und vollständige Liste der Aktionen, die Sie in den Events beforeAction und afterAction behandeln können. --- # Aktionen-Übersicht {#actions-overview} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/eventbus_overview.md b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/eventbus_overview.md index 32d10aa8..30304ef7 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/eventbus_overview.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/eventbus_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Übersicht der Event Bus-Methoden title: Übersicht der Event Bus-Methoden -description: Sie können eine Übersicht der Event Bus-Methoden der DHTMLX JavaScript Spreadsheet-Bibliothek in der Dokumentation einsehen. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Liste der Event-Bus-Methoden von DHTMLX Spreadsheet zum Anhängen, Entfernen und Auslösen von Events. --- # Übersicht der Event Bus-Methoden {#event-bus-methods-overview} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/events_overview.md b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/events_overview.md index 7b224cbd..95ff8cd9 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/events_overview.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/events_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Events-Übersicht title: Events-Übersicht -description: Sie können eine Events-Übersicht der DHTMLX JavaScript Spreadsheet-Bibliothek in der Dokumentation einsehen. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Liste der Events von DHTMLX Spreadsheet, die bei Aktionen, beim Laden von Daten, beim Bearbeiten von Zellen, bei Auswahl, Fokus und Tabellenblattwechsel ausgelöst werden. --- # Events-Übersicht {#events-overview} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/export_overview.md b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/export_overview.md index df1ce0ad..1a6dcd3e 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/export_overview.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/export_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Übersicht der Export-Methoden title: Übersicht der Export-Methoden -description: Sie können eine Übersicht der Export-Methoden der DHTMLX JavaScript Spreadsheet-Bibliothek in der Dokumentation einsehen. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Liste der Methoden des Export-Moduls von DHTMLX Spreadsheet, die die Daten in eine JSON- oder Excel-Datei (.xlsx) speichern. --- # Übersicht der Export-Methoden {#export-methods-overview} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/sheetmanager_overview.md b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/sheetmanager_overview.md index 6653a9ac..4e25be03 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/overview/sheetmanager_overview.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/overview/sheetmanager_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Sheet Manager API-Übersicht title: Sheet Manager API-Übersicht -description: Sie können die Sheet Manager API-Übersicht der DHTMLX JavaScript Spreadsheet-Bibliothek in der Dokumentation einsehen. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Liste der Methoden des Sheet-Managers von DHTMLX Spreadsheet zum Hinzufügen, Entfernen, Leeren, Abrufen und Wechseln von Tabellenblättern. --- # Sheet Manager API-Übersicht {#sheet-manager-api-overview} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md index 413ec086..f75cde7a 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFocusedCell() title: getFocusedCell Selection-Methode -description: Sie können die getFocusedCell Selection-Methode in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek kennenlernen. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Ermitteln Sie mit der Methode selection.getFocusedCell() die ID der fokussierten (aktiven) Zelle in DHTMLX Spreadsheet. --- # getFocusedCell() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md index 2517e6a8..5c4f9893 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getSelectedCell() title: getSelectedCell Selection-Methode -description: Sie können die getSelectedCell Selection-Methode in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek kennenlernen. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Ermitteln Sie mit der Methode selection.getSelectedCell() die IDs oder Bereiche der ausgewählten Zellen in DHTMLX Spreadsheet. --- # getSelectedCell() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md index 2913b353..b8a66b35 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: removeSelectedCell() title: removeSelectedCell Selection-Methode -description: Sie können die removeSelectedCell Selection-Methode in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek kennenlernen. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Heben Sie mit der Methode selection.removeSelectedCell() die Auswahl der angegebenen Zellen oder Zellbereiche in DHTMLX Spreadsheet auf. --- # removeSelectedCell() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md index dfc03e02..dc42735b 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setSelectedCell() title: setSelectedCell Selection-Methode -description: Sie können die setSelectedCell Selection-Methode in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek kennenlernen. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Wählen Sie mit der Methode selection.setSelectedCell() eine Zelle, mehrere Zellen oder einen Zellbereich in DHTMLX Spreadsheet aus und scrollen Sie optional dorthin. --- # setSelectedCell() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_add_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_add_method.md index 15fb9d48..d0734285 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_add_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_add_method.md @@ -1,7 +1,7 @@ --- sidebar_label: add() title: add Methode -description: Sie können die add Methode des Sheet Managers in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek kennenlernen. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Fügen Sie mit der Methode sheets.add() ein neues leeres Tabellenblatt zu DHTMLX Spreadsheet hinzu. Die Methode gibt die ID des neuen Tabellenblatts zurück (erfordert die Option multiSheets). --- # add() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_clear_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_clear_method.md index 6e9e50f3..335734a9 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_clear_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_clear_method.md @@ -1,7 +1,7 @@ --- sidebar_label: clear() title: clear-Methode -description: Sie können mehr über die clear-Methode des Sheet Managers in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren. Lesen Sie Entwicklerleitfäden und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Löschen Sie mit der Methode sheets.clear() die Werte, Stile und Formatierungen eines Tabellenblatts in DHTMLX Spreadsheet, ohne das Tabellenblatt selbst zu entfernen. --- # clear() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_get_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_get_method.md index ca2d0ee4..ec1011d1 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_get_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_get_method.md @@ -1,7 +1,7 @@ --- sidebar_label: get() title: get-Methode -description: Sie können mehr über die get-Methode des Sheet Managers in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren. Lesen Sie Entwicklerleitfäden und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Ermitteln Sie mit der Methode sheets.get() ein Tabellenblatt-Objekt anhand seiner ID in DHTMLX Spreadsheet. --- # get() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_getactive_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_getactive_method.md index 2a938176..af0a11ed 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_getactive_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_getactive_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getActive() title: getActive-Methode -description: Sie können mehr über die getActive-Methode des Sheet Managers in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren. Lesen Sie Entwicklerleitfäden und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Ermitteln Sie mit der Methode sheets.getActive() das aktive (sichtbare) Tabellenblatt von DHTMLX Spreadsheet. Die Methode gibt die ID und den Namen des Tabellenblatts zurück. --- # getActive() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_getall_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_getall_method.md index 821a6673..8f80a822 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_getall_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_getall_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getAll() title: getAll-Methode -description: Sie können mehr über die getAll-Methode des Sheet Managers in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren. Lesen Sie Entwicklerleitfäden und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Ermitteln Sie mit der Methode sheets.getAll() alle Tabellenblätter von DHTMLX Spreadsheet. Die Methode gibt ein Array von Objekten mit den IDs und Namen der Tabellenblätter zurück. --- # getAll() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_remove_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_remove_method.md index 6dc38be9..6efc6e0d 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_remove_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_remove_method.md @@ -1,7 +1,7 @@ --- sidebar_label: remove() title: remove-Methode -description: Sie können mehr über die remove-Methode des Sheet Managers in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren. Lesen Sie Entwicklerleitfäden und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Entfernen Sie mit der Methode sheets.remove() ein Tabellenblatt anhand seiner ID aus DHTMLX Spreadsheet. Mindestens ein Tabellenblatt bleibt erhalten, und beim Entfernen des aktiven Tabellenblatts wird zu einem anderen gewechselt. --- # remove() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_setactive_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_setactive_method.md index c324124d..cf991f66 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_setactive_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/sheetmanager_setactive_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setActive() title: setActive-Methode -description: Sie können mehr über die setActive-Methode des Sheet Managers in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren. Lesen Sie Entwicklerleitfäden und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Wechseln Sie mit der Methode sheets.setActive() das aktive (sichtbare) Tabellenblatt von DHTMLX Spreadsheet zum Tabellenblatt mit der angegebenen ID. --- # setActive() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md index 677f6dff..8e34366b 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md @@ -1,7 +1,7 @@ --- sidebar_label: addColumn() title: addColumn-Methode -description: Sie können mehr über die addColumn-Methode in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren. Lesen Sie Entwicklerleitfäden und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Fügen Sie mit der Methode addColumn() eine leere Spalte in DHTMLX Spreadsheet ein. Sie wird an der Spalte der angegebenen Zelle eingefügt, und die vorhandenen Spalten werden nach rechts verschoben. --- # addColumn() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addformula_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addformula_method.md index f016ed88..970a615b 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addformula_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addformula_method.md @@ -1,7 +1,7 @@ --- sidebar_label: addFormula() title: addFormula-Methode -description: Sie können mehr über die addFormula-Methode in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren. Lesen Sie Entwicklerleitfäden und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Registrieren Sie mit der Methode addFormula() eine benutzerdefinierte Formelfunktion in DHTMLX Spreadsheet, um sie in Zellformeln über ihren Namen in Großbuchstaben zu verwenden. --- # addFormula() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md index 3a3e994b..0437da07 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md @@ -1,7 +1,7 @@ --- sidebar_label: addRow() title: addRow-Methode -description: Sie können mehr über die addRow-Methode in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren. Lesen Sie Entwicklerleitfäden und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Fügen Sie mit der Methode addRow() eine leere Zeile in DHTMLX Spreadsheet ein. Sie wird an der Zeile der angegebenen Zelle eingefügt, und die vorhandenen Zeilen werden nach unten verschoben. --- # addRow() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md index 244698b6..deaee07e 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterAction title: afterAction-Event -description: Sie können mehr über das afterAction-Event in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren. Lesen Sie Entwicklerleitfäden und API-Referenz, testen Sie Code-Beispiele und Live-Demos und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Behandeln Sie das Event afterAction von DHTMLX Spreadsheet, das nach der Ausführung einer Aktion ausgelöst wird und den Namen der Aktion sowie ihre Parameter erhält, etwa die Zelle sowie den neuen und den vorherigen Wert. --- # afterAction diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md index e75c4b92..9a7b991d 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterClear title: afterClear event -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über das afterClear-Event. Durchsuchen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Behandeln Sie das Event afterClear, das ausgelöst wird, nachdem DHTMLX Spreadsheet geleert wurde (seit v4.3 veraltet, verwenden Sie stattdessen das Event afterAction). --- # afterClear diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterdataloaded_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterdataloaded_event.md index 8c5e9abe..db91b5c6 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterdataloaded_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterdataloaded_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterDataLoaded title: afterDataLoaded event -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über das afterDataLoaded-Event. Durchsuchen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Führen Sie mit dem Event afterDataLoaded Code aus, nachdem Daten in DHTMLX Spreadsheet geladen wurden, zum Beispiel, um nach dem Laden eine Meldung anzuzeigen. --- # afterDataLoaded diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md index 447f263b..99e79c12 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterEditEnd title: afterEditEnd event -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über das afterEditEnd-Event. Durchsuchen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Reagieren Sie mit dem Event afterEditEnd auf das Ende der Zellbearbeitung in DHTMLX Spreadsheet. Das Event erhält die ID der Zelle und ihren neuen Wert. --- # afterEditEnd diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md index e66b0f47..2a39a506 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterEditStart title: afterEditStart event -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über das afterEditStart-Event. Durchsuchen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Reagieren Sie mit dem Event afterEditStart auf den Beginn der Zellbearbeitung in DHTMLX Spreadsheet. Das Event erhält die ID der Zelle und ihren Wert. --- # afterEditStart diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md index 1fc923ad..a0996dd9 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterFocusSet title: afterFocusSet event -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über das afterFocusSet-Event. Durchsuchen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Verfolgen Sie die fokussierte Zelle in DHTMLX Spreadsheet mit dem Event afterFocusSet. Es wird ausgelöst, nachdem der Fokus auf eine Zelle gesetzt wurde, und erhält die ID der Zelle. --- # afterFocusSet diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md index e9b8ecdc..0aac6080 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterSelectionSet title: afterSelectionSet event -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über das afterSelectionSet-Event. Durchsuchen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Reagieren Sie mit dem Event afterSelectionSet auf die Auswahl von Zellen in DHTMLX Spreadsheet. Es wird ausgelöst, nachdem Zellen ausgewählt wurden, und erhält deren IDs. --- # afterSelectionSet diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md index 5b800265..498c0281 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterSheetChange title: afterSheetChange event -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über das afterSheetChange-Event. Durchsuchen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Verfolgen Sie den Wechsel von Tabellenblättern in DHTMLX Spreadsheet mit dem Event afterSheetChange. Es erhält den Namen und die ID des neu aktiven Tabellenblatts. --- # afterSheetChange diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md index 154b61aa..4ac353c5 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeAction title: beforeAction event -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über das beforeAction-Event. Durchsuchen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Fangen Sie Aktionen in DHTMLX Spreadsheet mit dem Event beforeAction ab. Es erhält den Namen und die Parameter einer Aktion und bricht sie ab, wenn der Handler false zurückgibt. --- # beforeAction diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md index 8e38ee11..d4020e93 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeClear title: beforeClear event -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über das beforeClear-Event. Durchsuchen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Verhindern Sie das Leeren von DHTMLX Spreadsheet mit dem veralteten Event beforeClear oder mit dem Event beforeAction und der Aktion clear, die es ersetzen. --- # beforeClear diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md index 295dc35e..57b2c376 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeEditEnd title: beforeEditEnd event -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über das beforeEditEnd-Event. Durchsuchen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Prüfen Sie mit dem Event beforeEditEnd den Wert einer Zelle, bevor die Bearbeitung in DHTMLX Spreadsheet endet, und geben Sie false zurück, um den Editor geöffnet zu lassen. --- # beforeEditEnd diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md index 40c9c261..ec96026b 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeEditStart title: beforeEditStart event -description: Sie können im Dokumentationsbereich der DHTMLX JavaScript Spreadsheet-Bibliothek mehr über das beforeEditStart-Event erfahren. Lesen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Steuern Sie mit dem Event beforeEditStart, welche Zellen in DHTMLX Spreadsheet bearbeitet werden können, und geben Sie false zurück, um das Öffnen des Editors zu verhindern. --- # beforeEditStart diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md index 7c4c9bdc..ba1b3d79 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeFocusSet title: beforeFocusSet event -description: Sie können im Dokumentationsbereich der DHTMLX JavaScript Spreadsheet-Bibliothek mehr über das beforeFocusSet-Event erfahren. Lesen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Steuern Sie den Fokus in DHTMLX Spreadsheet mit dem Event beforeFocusSet. Es wird ausgelöst, bevor eine Zelle den Fokus erhält, und verhindert dies, wenn der Handler false zurückgibt. --- # beforeFocusSet diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md index 3cfa36c2..75df7b12 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeSelectionSet title: beforeSelectionSet event -description: Sie können im Dokumentationsbereich der DHTMLX JavaScript Spreadsheet-Bibliothek mehr über das beforeSelectionSet-Event erfahren. Lesen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Steuern Sie die Auswahl von Zellen in DHTMLX Spreadsheet mit dem Event beforeSelectionSet. Es wird ausgelöst, bevor Zellen ausgewählt werden, und verhindert dies, wenn der Handler false zurückgibt. --- # beforeSelectionSet diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md index 1b35bc81..8b21a1bb 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeSheetChange title: beforeSheetChange event -description: Sie können im Dokumentationsbereich der DHTMLX JavaScript Spreadsheet-Bibliothek mehr über das beforeSheetChange-Event erfahren. Lesen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Steuern Sie den Wechsel von Tabellenblättern in DHTMLX Spreadsheet mit dem Event beforeSheetChange und geben Sie false zurück, um das aktuelle Tabellenblatt aktiv zu lassen. --- # beforeSheetChange diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md index f1796a2c..50022a90 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md @@ -1,7 +1,7 @@ --- sidebar_label: clear() title: clear method -description: Sie können im Dokumentationsbereich der DHTMLX JavaScript Spreadsheet-Bibliothek mehr über die clear-Methode erfahren. Lesen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Entfernen Sie mit der Methode clear() alle Daten aus DHTMLX Spreadsheet. --- # clear() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md index 8a964f7f..fdd9f331 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md @@ -1,7 +1,7 @@ --- sidebar_label: colsCount title: colsCount config -description: Sie können im Dokumentationsbereich der DHTMLX JavaScript Spreadsheet-Bibliothek mehr über die colsCount-Konfiguration erfahren. Lesen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Legen Sie mit der Eigenschaft colsCount die Anzahl der Spalten fest, die DHTMLX Spreadsheet bei der Initialisierung anzeigt. --- # colsCount diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md index cfb2d94b..272abe33 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: eachCell() title: eachCell method -description: Sie können im Dokumentationsbereich der DHTMLX JavaScript Spreadsheet-Bibliothek mehr über die eachCell-Methode erfahren. Lesen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Durchlaufen Sie mit der Methode eachCell() einen Zellbereich oder die ausgewählten Zellen in DHTMLX Spreadsheet. Die Methode ruft für jede Zelle eine Funktion mit deren Namen und Wert auf. --- # eachCell() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md index dea79378..d67d2d28 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md @@ -1,7 +1,7 @@ --- sidebar_label: editLine title: editLine config -description: Sie können im Dokumentationsbereich der DHTMLX JavaScript Spreadsheet-Bibliothek mehr über die editLine-Konfiguration erfahren. Lesen Sie Entwicklerhandbücher und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Blenden Sie die Bearbeitungsleiste von DHTMLX Spreadsheet mit der Eigenschaft editLine ein oder aus. Standardmäßig ist sie eingeblendet. --- # editLine diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md index a7b6f27c..1b75a3de 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md @@ -1,7 +1,7 @@ --- sidebar_label: endEdit() title: endEdit-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die endEdit-Methode. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Beenden Sie mit der Methode endEdit() die Bearbeitung der ausgewählten Zelle in DHTMLX Spreadsheet. Die Methode schließt den Editor und speichert den eingegebenen Wert. --- # endEdit() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md index 89cef1a7..1a4065af 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md @@ -1,7 +1,7 @@ --- sidebar_label: exportModulePath title: exportModulePath-Konfiguration -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die exportModulePath-Konfiguration. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Legen Sie mit der Eigenschaft exportModulePath den Pfad zur Datei worker.js des Export-Moduls JSON2Excel in DHTMLX Spreadsheet fest, zum Beispiel, um auf Ihrem eigenen Server nach Excel zu exportieren. --- # exportModulePath diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md index da22fbf6..3c5d06ef 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md @@ -1,7 +1,7 @@ --- sidebar_label: fitColumn() title: fitColumn-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die fitColumn-Methode. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Passen Sie mit der Methode fitColumn() die Breite einer Spalte in DHTMLX Spreadsheet an ihren längsten Wert an. --- # fitColumn() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md index 2dccaca1..08b7a181 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md @@ -1,7 +1,7 @@ --- sidebar_label: formats title: formats-Konfiguration -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die formats-Konfiguration. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Definieren Sie mit der Eigenschaft formats die in DHTMLX Spreadsheet verfügbaren Zahlenformate, ein Array von Objekten mit ID, Maske, Name und Beispiel jedes Formats. --- # formats diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_freezecols_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_freezecols_method.md index 288f16ae..53c1ffbb 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_freezecols_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_freezecols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: freezeCols() title: freezeCols-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die freezeCols-Methode. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Fixieren Sie Spalten in DHTMLX Spreadsheet mit der Methode freezeCols(). Sie fixiert die Spalten bis zur angegebenen oder ausgewählten Zelle, im aktuellen oder einem anderen Tabellenblatt. --- # freezeCols() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_freezerows_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_freezerows_method.md index a47bbb53..ab0a1f8b 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_freezerows_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_freezerows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: freezeRows() title: freezeRows-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die freezeRows-Methode. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Fixieren Sie Zeilen in DHTMLX Spreadsheet mit der Methode freezeRows(). Sie fixiert die Zeilen bis zur angegebenen oder ausgewählten Zelle, im aktuellen oder einem anderen Tabellenblatt. --- # freezeRows() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md index bb1fad1d..77e821d9 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFilter() title: getFilter-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die getFilter-Methode. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Rufen Sie mit der Methode getFilter() die Filterkriterien eines Tabellenblatts in DHTMLX Spreadsheet ab. Sie gibt den gefilterten Zellbereich und die Filterregeln zurück. --- # getFilter() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md index ff911283..4b9043ea 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFormat() title: getFormat-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die getFormat-Methode. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Rufen Sie mit der Methode getFormat() das Zahlenformat ab, das auf den Wert einer Zelle oder eines Zellbereichs in DHTMLX Spreadsheet angewendet ist. --- # getFormat() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md index 5c3988ec..08ce3895 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFormula() title: getFormula-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die getFormula-Methode. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Rufen Sie mit der Methode getFormula() die Formel einer Zelle in DHTMLX Spreadsheet ab, auch einer Zelle auf einem anderen Tabellenblatt. --- # getFormula() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md index 4f6f0b7d..1cc6a45e 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getStyle() title: getStyle-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die getStyle-Methode. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Rufen Sie mit der Methode getStyle() die Stile ab, die auf eine Zelle oder einen Zellbereich in DHTMLX Spreadsheet angewendet sind. --- # getStyle() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md index cd5c3f53..cf64b31b 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getValue() title: getValue method -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die getValue-Methode. Lesen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Rufen Sie mit der Methode getValue() den Wert einer Zelle oder die Werte eines Zellbereichs in DHTMLX Spreadsheet ab. --- # getValue() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md index 404047ec..392750e5 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md @@ -1,7 +1,7 @@ --- sidebar_label: groupFill title: groupFill event -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über das groupFill-Event. Lesen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Verarbeiten Sie das automatische Ausfüllen von Zellen in DHTMLX Spreadsheet mit dem Event groupFill, das die fokussierte Zelle und die ausgewählten Zellen an den Callback übergibt. --- # groupFill diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_hidecols_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_hidecols_method.md index d8dfbfae..27685460 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_hidecols_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_hidecols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: hideCols() title: hideCols method -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die hideCols-Methode. Lesen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Blenden Sie mit der Methode hideCols() eine oder mehrere Spalten in DHTMLX Spreadsheet aus, anhand der ID einer Zelle, eines Zellbereichs oder der ausgewählten Zelle. --- # hideCols() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_hiderows_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_hiderows_method.md index 8dc60853..366a8721 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_hiderows_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_hiderows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: hideRows() title: hideRows method -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die hideRows-Methode. Lesen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Blenden Sie mit der Methode hideRows() eine oder mehrere Zeilen in DHTMLX Spreadsheet aus, anhand der ID einer Zelle, eines Zellbereichs oder der ausgewählten Zelle. --- # hideRows() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md index 5a650072..b7176624 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md @@ -1,7 +1,7 @@ --- sidebar_label: hideSearch() title: hideSearch method -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die hideSearch-Methode. Lesen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Blenden Sie die Suchleiste von DHTMLX Spreadsheet mit der Methode hideSearch() aus, zum Beispiel nach einer mit der Methode search() geöffneten Suche. --- # hideSearch() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md index db397dc1..afdab749 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md @@ -1,7 +1,7 @@ --- sidebar_label: importModulePath title: importModulePath config -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die importModulePath-Konfiguration. Lesen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Legen Sie mit der Eigenschaft importModulePath den Pfad zur Datei worker.js der Bibliothek Excel2json fest, mit der DHTMLX Spreadsheet Excel-Dateien importiert. --- # importModulePath diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md index d035a297..fabc9f95 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md @@ -1,7 +1,7 @@ --- sidebar_label: insertLink() title: insertLink method -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die insertLink-Methode. Lesen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Fügen Sie mit der Methode insertLink() einen Hyperlink in eine Zelle von DHTMLX Spreadsheet ein, oder entfernen Sie den Hyperlink und behalten Sie den Text der Zelle bei. --- # insertLink() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md index b0648992..3a08475c 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md @@ -1,7 +1,7 @@ --- sidebar_label: isLocked() title: isLocked method -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die isLocked-Methode. Lesen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Prüfen Sie mit der Methode isLocked(), ob eine Zelle oder eine beliebige Zelle eines Bereichs in DHTMLX Spreadsheet gesperrt ist. --- # isLocked() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md index 04e08c1a..6d732e0e 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md @@ -1,7 +1,7 @@ --- sidebar_label: load() title: load method -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die load-Methode. Lesen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Laden Sie mit der Methode load() Daten aus einer externen JSON-, CSV- oder XLSX-Datei in DHTMLX Spreadsheet. Die Methode gibt ein Promise zurück. --- # load() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md index 17cdeeb1..dbfe2801 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md @@ -1,7 +1,7 @@ --- sidebar_label: localization title: localization config -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die localization-Konfiguration. Lesen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Legen Sie mit der Eigenschaft localization das Dezimal- und das Tausendertrennzeichen, das Währungszeichen sowie das Datums- und Zeitformat von DHTMLX Spreadsheet fest. --- # localization diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md index 16fd93e9..6ba73b6f 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md @@ -1,7 +1,7 @@ --- sidebar_label: lock() title: lock-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die lock-Methode. Lesen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Sperren Sie mit der Methode lock() eine Zelle, einen Zellbereich oder mehrere Zellen in DHTMLX Spreadsheet, damit Benutzer sie nicht bearbeiten können. --- # lock() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md index 5ee85027..c8d23f64 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md @@ -1,7 +1,7 @@ --- sidebar_label: menu title: menu-Konfiguration -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die menu-Konfiguration. Lesen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Blenden Sie das Menü von DHTMLX Spreadsheet mit der Eigenschaft menu ein oder aus. --- # menu diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md index d8064f61..897a42b5 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md @@ -1,7 +1,7 @@ --- sidebar_label: mergeCells() title: mergeCells-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die mergeCells-Methode. Lesen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Verbinden Sie mit der Methode mergeCells() einen Zellbereich zu einer Zelle oder teilen Sie verbundene Zellen in DHTMLX Spreadsheet. --- # mergeCells() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md index cdefa531..688453be 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md @@ -1,7 +1,7 @@ --- sidebar_label: multiSheets title: multiSheets-Konfiguration -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die multiSheets-Konfiguration. Lesen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Aktivieren oder deaktivieren Sie mit der Eigenschaft multiSheets die Arbeit mit mehreren Tabellenblättern in DHTMLX Spreadsheet. Sie blendet die untere Leiste mit den Tabellenblatt-Tabs ein oder aus. --- # multiSheets diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md index 78b14210..975147b5 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md @@ -1,7 +1,7 @@ --- sidebar_label: parse() title: parse-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die parse-Methode. Lesen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Laden Sie mit der Methode parse() Daten aus einer lokalen Datenquelle in DHTMLX Spreadsheet, einschließlich Zellwerten, Stilen, Formaten, Editoren, Links und mehreren Tabellenblättern. --- # parse() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md index dd67da0e..105f4225 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md @@ -1,7 +1,7 @@ --- sidebar_label: redo() title: redo-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die redo-Methode. Lesen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Wenden Sie mit der Methode redo() eine rückgängig gemachte Aktion in DHTMLX Spreadsheet erneut an. --- # redo() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md index e807d854..6456e7e2 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md @@ -1,7 +1,7 @@ --- sidebar_label: rowsCount title: rowsCount-Konfiguration -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die rowsCount-Konfiguration. Lesen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Legen Sie mit der Eigenschaft rowsCount die Anzahl der Zeilen fest, die DHTMLX Spreadsheet bei der Initialisierung anzeigt. --- # rowsCount diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md index a4cb0521..85269d59 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md @@ -1,7 +1,7 @@ --- sidebar_label: search() title: search-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die search-Methode. Lesen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Suchen Sie mit der Methode search() nach Zellen mit einem Wert in DHTMLX Spreadsheet. Die Methode gibt die IDs der gefundenen Zellen zurück und kann die Suchleiste mit hervorgehobenen Treffern öffnen. --- # search() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md index 2a058635..41753b2f 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md @@ -1,7 +1,7 @@ --- sidebar_label: serialize() title: serialize-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die serialize-Methode. Lesen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Speichern Sie die Daten von DHTMLX Spreadsheet mit der Methode serialize() in einem JSON-Objekt, das die Tabellenblätter, die Zellwerte, die Stile und die Zahlenformate enthält. --- # serialize() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md index fd120bc7..27ea48a4 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setFilter() title: setFilter-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die setFilter-Methode. Entwicklerhandbücher und API-Referenz, Code-Beispiele, Live-Demos und eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet. +description: Filtern Sie mit der Methode setFilter() die Daten einer Spalte in DHTMLX Spreadsheet nach Bedingungen oder ausgeschlossenen Werten, oder setzen Sie die Filterung zurück. --- # setFilter() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md index f922276e..c3147d41 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setFormat() title: setFormat-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die setFormat-Methode. Entwicklerhandbücher und API-Referenz, Code-Beispiele, Live-Demos und eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet. +description: Wenden Sie mit der Methode setFormat() ein Zahlenformat auf den Wert einer Zelle oder eines Zellbereichs in DHTMLX Spreadsheet an. --- # setFormat() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md index 7aa0b1a9..43139858 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setStyle() title: setStyle-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die setStyle-Methode. Entwicklerhandbücher und API-Referenz, Code-Beispiele, Live-Demos und eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet. +description: Wenden Sie mit der Methode setStyle() denselben Stil auf eine Zelle, mehrere Zellen oder einen Zellbereich in DHTMLX Spreadsheet an und übergeben Sie die Stile als Objekt oder Array. --- # setStyle() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md index 79cdcb7a..39053c5f 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setValidation() title: setValidation-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die setValidation-Methode. Entwicklerhandbücher und API-Referenz, Code-Beispiele, Live-Demos und eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet. +description: Fügen Sie Zellen in DHTMLX Spreadsheet mit der Methode setValidation() eine Dropdown-Liste mit Werten aus einem Zellbereich oder einem Array hinzu oder entfernen Sie die Validierung. --- # setValidation() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md index 555c802f..bfdead93 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setValue() title: setValue-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die setValue-Methode. Entwicklerhandbücher und API-Referenz, Code-Beispiele, Live-Demos und eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet. +description: Setzen Sie mit der Methode setValue() einen Wert für eine Zelle, mehrere Zellen oder einen Zellbereich in DHTMLX Spreadsheet und übergeben Sie einen einzelnen Wert oder ein Array von Werten, das über die Zellen wiederholt wird. --- # setValue() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_showcols_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_showcols_method.md index ac1bff25..85005834 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_showcols_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_showcols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: showCols() title: showCols-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die showCols-Methode. Entwicklerhandbücher und API-Referenz, Code-Beispiele, Live-Demos und eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet. +description: Blenden Sie mit der Methode showCols() ausgeblendete Spalten in DHTMLX Spreadsheet wieder ein, bestimmt durch die Spalte der übergebenen oder der ausgewählten Zelle. --- # showCols() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_showrows_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_showrows_method.md index 84d9ce74..19b8b517 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_showrows_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_showrows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: showRows() title: showRows-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die showRows-Methode. Entwicklerhandbücher und API-Referenz, Code-Beispiele, Live-Demos und eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet. +description: Blenden Sie mit der Methode showRows() ausgeblendete Zeilen in DHTMLX Spreadsheet wieder ein, bestimmt durch die Zeile der übergebenen oder der ausgewählten Zelle. --- # showRows() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md index 416acf23..11e180aa 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md @@ -1,7 +1,7 @@ --- sidebar_label: sortCells() title: sortCells-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die sortCells-Methode. Entwicklerhandbücher und API-Referenz, Code-Beispiele, Live-Demos und eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet. +description: Sortieren Sie die Daten in DHTMLX Spreadsheet mit der Methode sortCells() auf- oder absteigend nach einer Spalte oder einem Zellbereich. --- # sortCells() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md index 3ef43d28..cc10c268 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md @@ -1,7 +1,7 @@ --- sidebar_label: startEdit() title: startEdit-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die startEdit-Methode. Entwicklerhandbücher und API-Referenz, Code-Beispiele, Live-Demos und eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet. +description: Starten Sie mit der Methode startEdit() die Bearbeitung der übergebenen oder der ausgewählten Zelle in DHTMLX Spreadsheet, optional mit einem Anfangswert. --- # startEdit() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_toolbarblocks_config.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_toolbarblocks_config.md index b0ae04f4..905df430 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_toolbarblocks_config.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_toolbarblocks_config.md @@ -1,7 +1,7 @@ --- sidebar_label: toolbarBlocks title: toolbarBlocks-Konfiguration -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die toolbarBlocks-Konfiguration. Entwicklerhandbücher und API-Referenz, Code-Beispiele, Live-Demos und eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet. +description: Legen Sie mit der Eigenschaft toolbarBlocks fest, welche Schaltflächenblöcke die Toolbar von DHTMLX Spreadsheet anzeigt, etwa undo, colors, font, align und format. --- # toolbarBlocks diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md index 7ffd07c8..7485394e 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md @@ -1,7 +1,7 @@ --- sidebar_label: undo() title: undo-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die undo-Methode. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Machen Sie mit der Methode undo() die letzte Aktion in DHTMLX Spreadsheet rückgängig und stellen Sie sie mit der Methode redo() wieder her. --- # undo() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezecols_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezecols_method.md index a767073d..306a2c32 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezecols_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezecols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: unfreezeCols() title: unfreezeCols-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die unfreezeCols-Methode. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Geben Sie mit der Methode unfreezeCols() die fixierten Spalten in DHTMLX Spreadsheet frei, sodass sie wieder mit dem restlichen Grid scrollen. --- # unfreezeCols() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezerows_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezerows_method.md index 9cde3318..c4bb21af 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezerows_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezerows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: unfreezeRows() title: unfreezeRows-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die unfreezeRows-Methode. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Geben Sie mit der Methode unfreezeRows() die fixierten Zeilen in DHTMLX Spreadsheet frei, sodass sie wieder mit dem restlichen Grid scrollen. --- # unfreezeRows() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md index 0accce0c..cf081b9e 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md @@ -1,7 +1,7 @@ --- sidebar_label: unlock() title: unlock-Methode -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die unlock-Methode. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Entsperren Sie mit der Methode unlock() eine gesperrte Zelle, mehrere Zellen oder einen Zellbereich in DHTMLX Spreadsheet, damit Benutzer sie wieder bearbeiten können. --- # unlock() diff --git a/i18n/de/docusaurus-plugin-content-docs/current/awaitredraw.md b/i18n/de/docusaurus-plugin-content-docs/current/awaitredraw.md index 616564b7..ed5b5ffa 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/awaitredraw.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/awaitredraw.md @@ -1,7 +1,7 @@ --- sidebar_label: AwaitRedraw-Helfer title: AwaitRedraw-Helfer -description: Sie können den AwaitRedraw-Helfer in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erkunden. Durchsuchen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Führen Sie mit dem Helfer dhx.awaitRedraw Code aus, nachdem DHTMLX Spreadsheet das Rendern abgeschlossen hat, etwa für API-Methoden, die erst wirken, wenn die Komponente auf der Seite ist. --- # AwaitRedraw-Helfer {#awaitredraw-helper} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/data_formatting.md b/i18n/de/docusaurus-plugin-content-docs/current/data_formatting.md index 47a4876e..5893a892 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/data_formatting.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/data_formatting.md @@ -1,7 +1,7 @@ --- sidebar_label: Datenformatierung title: Datenformatierung -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über die Datenformatierung. Durchsuchen Sie Entwicklerhandbücher und die API-Referenz, testen Sie Codebeispiele und Live-Demos, und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Formatieren Sie Zelldaten in DHTMLX Spreadsheet über die Toolbar, einschließlich Text- und Hintergrundfarbe, Fett und Kursiv, Ausrichtung, Textumbruch und Zellrahmen, und entfernen Sie Stile und Werte. --- # Datenformatierung {#data-formatting} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/functions.md b/i18n/de/docusaurus-plugin-content-docs/current/functions.md index 42259011..ef8d79a8 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/functions.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/functions.md @@ -1,7 +1,7 @@ --- sidebar_label: Formeln und Funktionen title: Formeln und Funktionen -description: In der Dokumentation erfahren Sie alles über die Formeln und Funktionen der DHTMLX JavaScript Spreadsheet-Bibliothek. Lesen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Testversion von DHTMLX Spreadsheet herunter. +description: Nutzen Sie in DHTMLX Spreadsheet zu Excel und Google Sheets kompatible Formeln, darunter mathematische, Datums-, Such-, Text- und Finanzfunktionen, fügen Sie eigene Formeln hinzu und lesen Sie die Formel einer Zelle aus. --- # Formeln und Funktionen {#formulas-and-functions} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/handling_events.md b/i18n/de/docusaurus-plugin-content-docs/current/handling_events.md index a2b99c3a..b112918d 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/handling_events.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/handling_events.md @@ -1,7 +1,7 @@ --- sidebar_label: Event-Handling title: Event-Handling -description: In der Dokumentation zur DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie mehr über das Event-Handling. Lesen Sie Entwickleranleitungen und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Fügen Sie in DHTMLX Spreadsheet mit den Methoden events.on(), events.detach() und events.fire() Event-Listener hinzu, entfernen Sie sie und lösen Sie Events aus. --- # Event-Handling {#event-handling} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/how_to_start.md b/i18n/de/docusaurus-plugin-content-docs/current/how_to_start.md index c7cf8c99..518d1e6c 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/how_to_start.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/how_to_start.md @@ -1,7 +1,7 @@ --- sidebar_label: Erste Schritte title: Erste Schritte mit DHTMLX Spreadsheet -description: Sie können in der Dokumentation erfahren, wie Sie mit der DHTMLX JavaScript Spreadsheet-Bibliothek beginnen. Lesen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus, und laden Sie eine kostenlose 30-tägige Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Bringen Sie DHTMLX Spreadsheet in vier Schritten auf eine Seite, vom Einbinden der Quelldateien oder Installieren des npm-Pakets bis zum Konfigurieren der Komponente und Laden der Daten. --- # Erste Schritte {#how-to-start} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/index.md b/i18n/de/docusaurus-plugin-content-docs/current/index.md index fe7f9771..be02ec95 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/index.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/index.md @@ -2,7 +2,7 @@ sidebar_label: Spreadsheet-Übersicht title: DHTMLX Spreadsheet Übersicht slug: / -description: Sie finden eine Übersicht der JavaScript-Spreadsheet-Bibliothek in der DHTMLX-Dokumentation. Durchsuchen Sie Entwickleranleitungen und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus, und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Überblick über DHTMLX Spreadsheet, eine JavaScript-Komponente zum Bearbeiten und Formatieren von Tabellendaten, mit Toolbar, Bearbeitungszeile, Grid, Menü und Kontextmenü. --- # DHTMLX Spreadsheet-Übersicht {#dhtmlx-spreadsheet-overview} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/initialization.md b/i18n/de/docusaurus-plugin-content-docs/current/initialization.md index 8a689ded..f869e4ad 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/initialization.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/initialization.md @@ -1,7 +1,7 @@ --- sidebar_label: Initialisierung title: Initialisierung -description: In der Dokumentation erfahren Sie, wie die DHTMLX JavaScript Spreadsheet-Bibliothek initialisiert wird. Lesen Sie Entwickleranleitungen und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-tägige Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Initialisieren Sie DHTMLX Spreadsheet auf einer Seite, indem Sie die Quelldateien einbinden, einen Container hinzufügen und den Konstruktor dhx.Spreadsheet mit einem Konfigurationsobjekt aufrufen. --- # Initialisierung {#initialization} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/loading_data.md b/i18n/de/docusaurus-plugin-content-docs/current/loading_data.md index 1cc4c3b5..d827e36e 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/loading_data.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/loading_data.md @@ -1,7 +1,7 @@ --- sidebar_label: Datenladen und -export title: Daten laden -description: In dieser Dokumentation erfahren Sie, wie Sie Daten in der DHTMLX JavaScript Spreadsheet-Bibliothek laden. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus, und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Laden Sie JSON-, CSV- oder Excel-Daten mit Stilen, gesperrten Zellen und Links aus einer Datei oder einer lokalen Quelle in DHTMLX Spreadsheet, speichern und stellen Sie den Zustand wieder her und exportieren Sie Daten nach Excel oder JSON. --- # Datenladen und -export {#data-loading-and-export} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/migration.md b/i18n/de/docusaurus-plugin-content-docs/current/migration.md index 923aecb3..a3c18516 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/migration.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/migration.md @@ -1,7 +1,7 @@ --- sidebar_label: Migration zu neueren Versionen title: Migration -description: Sie finden Informationen zur Migration in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Migrieren Sie auf eine neuere Version von DHTMLX Spreadsheet anhand der Liste veralteter, geänderter und entfernter Eigenschaften, Methoden und Events jeder Version und ihrer Ersatzlösungen. --- # Migration zu neueren Versionen {#migration-to-newer-versions} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/number_formatting.md b/i18n/de/docusaurus-plugin-content-docs/current/number_formatting.md index f129d187..1db7ea1e 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/number_formatting.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/number_formatting.md @@ -1,7 +1,7 @@ --- sidebar_label: Zahlenformatierung title: Zahlenformatierung -description: Sie können den Entwicklerleitfaden zur Zahlenformatierung in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek lesen. Durchsuchen Sie Entwicklerleitfäden und API-Referenzen, probieren Sie Code-Beispiele und Live-Demos aus, und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Wenden Sie in DHTMLX Spreadsheet Zahlen-, Währungs-, Prozent-, Datums-, Zeit- und wissenschaftliche Formate auf Zellwerte an, lokalisieren Sie sie, definieren Sie eigene Formatmasken und setzen oder lesen Sie das Format einer Zelle. --- # Zahlenformatierung {#number-formatting} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/number_formatting_guide.md b/i18n/de/docusaurus-plugin-content-docs/current/number_formatting_guide.md index 4b383e07..247c0089 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/number_formatting_guide.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/number_formatting_guide.md @@ -1,7 +1,7 @@ --- sidebar_label: Zahlenformatierung title: Leitfaden zur Zahlenformatierung -description: Sie können den Benutzerhandbuch zur Zahlenformatierung in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek nachlesen. Durchsuchen Sie Entwicklerhandbücher und API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Wählen Sie in DHTMLX Spreadsheet über die Toolbar ein Zahlenformat für Zellwerte aus, etwa Zahl, Währung, Prozent, Datum, Uhrzeit oder Text. --- # Zahlenformatierung {#number-formatting} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/sorting_data.md b/i18n/de/docusaurus-plugin-content-docs/current/sorting_data.md index 9c73d579..a413183b 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/sorting_data.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/sorting_data.md @@ -1,7 +1,7 @@ --- sidebar_label: Daten sortieren title: Daten sortieren -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie, wie Sie Daten sortieren. Durchsuchen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Sortieren Sie Daten in DHTMLX Spreadsheet über den Sortierbefehl des Kontextmenüs von A bis Z oder von Z bis A nach einer Spalte oder einem ausgewählten Zellbereich. --- # Daten sortieren {#sorting-data} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/svelte_integration.md b/i18n/de/docusaurus-plugin-content-docs/current/svelte_integration.md index 17df5b75..6e10a4eb 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/svelte_integration.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/svelte_integration.md @@ -1,7 +1,7 @@ --- sidebar_label: Integration mit Svelte title: Svelte-Integration -description: In der Dokumentation erfahren Sie mehr über die Svelte-Integration der DHTMLX JavaScript Spreadsheet-Bibliothek. Lesen Sie Entwicklerleitfäden und die API-Referenz, probieren Sie Code-Beispiele und Live-Demos aus, und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: DHTMLX Spreadsheet in einer Svelte-Anwendung verwenden. Erstellen Sie ein Projekt, fügen Sie Spreadsheet als Svelte-Komponente hinzu, laden Sie Daten und verarbeiten Sie Events. --- # Integration mit Svelte {#integration-with-svelte} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md b/i18n/de/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md index 6c795ef2..70394f25 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md @@ -1,7 +1,7 @@ --- sidebar_label: Configuring built-in themes title: Integrierte Themes konfigurieren -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie, wie Sie Themes konfigurieren. Durchsuchen Sie Entwickleranleitungen und die API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Ändern Sie die Farben der integrierten Themes von DHTMLX Spreadsheet, indem Sie ihre CSS-Variablen überschreiben, für alle Themes auf einmal oder für ein einzelnes Theme. --- # Integrierte Themes konfigurieren {#configuring-built-in-themes} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/themes/custom_theme.md b/i18n/de/docusaurus-plugin-content-docs/current/themes/custom_theme.md index 9ac6ef33..191ca4d4 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/themes/custom_theme.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/themes/custom_theme.md @@ -1,7 +1,7 @@ --- sidebar_label: Custom theme title: Benutzerdefiniertes Theme -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie, wie Sie ein benutzerdefiniertes Theme erstellen. Durchsuchen Sie Entwickleranleitungen und die API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Erstellen Sie mit CSS-Variablen ein eigenes Farb-Theme für DHTMLX Spreadsheet und wenden Sie es mit der Methode dhx.setTheme() an. --- # Benutzerdefiniertes Theme {#custom-theme} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/using_typescript.md b/i18n/de/docusaurus-plugin-content-docs/current/using_typescript.md index 0a152380..ec2ac500 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/using_typescript.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/using_typescript.md @@ -1,7 +1,7 @@ --- sidebar_label: TypeScript-Unterstützung title: TypeScript-Unterstützung -description: Sie erfahren, wie Sie TypeScript mit der DHTMLX JavaScript Spreadsheet-Bibliothek verwenden. Sehen Sie sich Entwicklerhandbücher und API-Referenzen an, probieren Sie Codebeispiele und Live-Demos aus, und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Nutzen Sie die integrierten TypeScript-Definitionen von DHTMLX Spreadsheet für Typprüfung, Autovervollständigung und JSDoc-Hinweise in Ihrer IDE. --- # TypeScript-Unterstützung {#typescript-support} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md index 6ad0a3c2..ad3269ec 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md @@ -1,7 +1,7 @@ --- sidebar_label: Was ist neu title: Was ist neu in DHTMLX Spreadsheet -description: Sie erfahren in der Dokumentation, was neu in der DHTMLX JavaScript Spreadsheet-Bibliothek ist. Durchsuchen Sie Entwicklerhandbücher und API-Referenzen, testen Sie Code-Beispiele und Live-Demos, und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Versionshinweise zu DHTMLX Spreadsheet mit neuen Funktionen, Aktualisierungen, Fehlerbehebungen und Breaking Changes jeder Version. --- # Was ist neu {#whats-new} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/work_with_sheets.md b/i18n/de/docusaurus-plugin-content-docs/current/work_with_sheets.md index e6dce490..b9d8bcba 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/work_with_sheets.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/work_with_sheets.md @@ -1,7 +1,7 @@ --- sidebar_label: Mit Tabellenblättern arbeiten title: Mit Tabellenblättern arbeiten -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie, wie Sie mit Tabellenblättern arbeiten. Durchsuchen Sie Entwicklerhandbücher und die API-Referenz, probieren Sie Codebeispiele und Live-Demos aus und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Fügen Sie in DHTMLX Spreadsheet über die untere Toolbar und die Blattregister Tabellenblätter hinzu, entfernen, benennen und wechseln Sie sie und verweisen Sie in Formeln auf Zellen anderer Blätter. --- # Mit Tabellenblättern arbeiten {#work-with-sheets} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/working_with_cells.md b/i18n/de/docusaurus-plugin-content-docs/current/working_with_cells.md index 9a6be8f4..24849540 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/working_with_cells.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/working_with_cells.md @@ -1,7 +1,7 @@ --- sidebar_label: Mit Zellen arbeiten title: Mit Zellen arbeiten -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie, wie Sie mit Zellen arbeiten. Entwickleranleitungen und API-Referenz, Code-Beispiele, Live-Demos und eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet stehen zur Verfügung. +description: Setzen und lesen Sie über die API Werte und Stile von Zellen in DHTMLX Spreadsheet, validieren Sie Zellen, fügen Sie Links ein und bearbeiten, sperren, verbinden und markieren Sie Zellen. --- # Mit Zellen arbeiten {#work-with-cells} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/working_with_sheets.md b/i18n/de/docusaurus-plugin-content-docs/current/working_with_sheets.md index 0b5ac0a5..9374487d 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/working_with_sheets.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/working_with_sheets.md @@ -1,7 +1,7 @@ --- sidebar_label: Mit Tabellen arbeiten title: Mit Tabellen arbeiten -description: In der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren Sie, wie Sie mit Tabellen arbeiten. Hier finden Sie Entwickleranleitungen und API-Referenzen, Codebeispiele und Live-Demos sowie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet. +description: Laden Sie mehrere Tabellenblätter in DHTMLX Spreadsheet und fügen Sie Blätter mit API-Methoden hinzu, entfernen, lesen, leeren und wechseln Sie sie. --- # Mit Tabellen arbeiten diff --git a/i18n/de/docusaurus-plugin-content-docs/current/working_with_ssheet.md b/i18n/de/docusaurus-plugin-content-docs/current/working_with_ssheet.md index 482bdd52..59d3d55a 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/working_with_ssheet.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/working_with_ssheet.md @@ -1,7 +1,7 @@ --- sidebar_label: Mit der Tabellenkalkulation arbeiten title: Mit der Tabellenkalkulation arbeiten -description: Sie können in der Dokumentation der DHTMLX JavaScript Spreadsheet-Bibliothek erfahren, wie Sie mit der Tabellenkalkulation arbeiten. Durchsuchen Sie Entwicklerhandbücher und die API-Referenz, testen Sie Codebeispiele und Live-Demos, und laden Sie eine kostenlose 30-Tage-Evaluierungsversion von DHTMLX Spreadsheet herunter. +description: Machen Sie über die API Aktionen in DHTMLX Spreadsheet rückgängig und wiederholen Sie sie, fügen Sie Zeilen und Spalten hinzu, entfernen, fixieren und blenden Sie sie aus, passen Sie die Spaltenbreite an, filtern, durchsuchen und sortieren Sie Daten und leeren Sie die Tabelle. --- # Mit der Tabellenkalkulation arbeiten {#work-with-spreadsheet} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md index 13746908..52e5ba4a 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md @@ -1,7 +1,7 @@ --- sidebar_label: detach() title: detach events bus 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 detach events bus 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet에서 events.detach() 메서드로 on() 메서드를 통해 연결된 이벤트 핸들러를 이벤트 이름으로 분리합니다. --- # detach() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md index 365fbcf9..6d38da53 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md @@ -1,7 +1,7 @@ --- sidebar_label: fire() title: fire events bus 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 fire events bus 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet에서 events.fire() 메서드로 이벤트 이름과 이벤트 데이터 배열을 전달하여 내부 이벤트를 트리거합니다. --- # fire() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md index 43803102..55187a76 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md @@ -1,7 +1,7 @@ --- sidebar_label: on() title: on events bus 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 on events bus 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet에서 events.on() 메서드로 내부 이벤트에 핸들러를 연결합니다. 예를 들어 셀 스타일 변경에 대응할 수 있습니다. --- # on() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/export_json_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/export_json_method.md index b564dae5..21a5f8f9 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/export_json_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/export_json_method.md @@ -1,7 +1,7 @@ --- sidebar_label: json() title: json 내보내기 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 json 내보내기 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet에서 export.json() 메서드로 데이터를 JSON 파일로 내보냅니다. --- # json() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md index c4efc5da..fd95dc86 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md @@ -1,7 +1,7 @@ --- sidebar_label: xlsx() title: xlsx 내보내기 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 xlsx 내보내기 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet에서 export.xlsx() 메서드로 데이터를 Excel(.xlsx) 파일로 내보냅니다. 파일 이름을 지정할 수도 있습니다. --- # xlsx() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md index 6b35b283..64eace21 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Spreadsheet 액션 title: 액션 개요 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 액션 개요를 문서에서 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet 액션 개요와 beforeAction 및 afterAction 이벤트에서 처리할 수 있는 전체 액션 목록입니다. --- # 액션 개요 {#actions-overview} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/eventbus_overview.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/eventbus_overview.md index d00f919c..041a699f 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/eventbus_overview.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/eventbus_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Event Bus 메서드 개요 title: Event Bus 메서드 개요 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 Event Bus 메서드 개요를 문서에서 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드하실 수 있습니다. +description: 이벤트를 연결, 분리 및 트리거하는 DHTMLX Spreadsheet 이벤트 버스 메서드 목록입니다. --- # Event Bus 메서드 개요 {#event-bus-methods-overview} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/events_overview.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/events_overview.md index 4ee933b3..e45a8aff 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/events_overview.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/events_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: 이벤트 개요 title: 이벤트 개요 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 이벤트 개요를 문서에서 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드하실 수 있습니다. +description: 액션, 데이터 로딩, 셀 편집, 선택, 포커스 및 시트 변경 시 발생하는 DHTMLX Spreadsheet 이벤트 목록입니다. --- # 이벤트 개요 {#events-overview} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/export_overview.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/export_overview.md index 49aaf524..7b8b5127 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/export_overview.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/export_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: 내보내기 메서드 개요 title: 내보내기 메서드 개요 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 내보내기 메서드 개요를 문서에서 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드하실 수 있습니다. +description: 데이터를 JSON 또는 Excel(.xlsx) 파일로 저장하는 DHTMLX Spreadsheet export 모듈 메서드 목록입니다. --- # 내보내기 메서드 개요 {#export-methods-overview} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/sheetmanager_overview.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/sheetmanager_overview.md index 19c167e9..52a24ddd 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/sheetmanager_overview.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/overview/sheetmanager_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Sheet Manager API 개요 title: Sheet Manager API 개요 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 Sheet Manager API 개요를 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드할 수 있습니다. +description: 시트를 추가, 제거, 초기화, 조회 및 전환하는 DHTMLX Spreadsheet 시트 관리자 메서드 목록입니다. --- # Sheet Manager API 개요 {#sheet-manager-api-overview} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md index 07599cc4..448040cb 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFocusedCell() title: getFocusedCell selection 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 getFocusedCell selection 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 selection.getFocusedCell() 메서드로 포커스가 있는(활성) 셀의 id를 가져옵니다. --- # getFocusedCell() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md index 0678cb27..7c846385 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getSelectedCell() title: getSelectedCell selection 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 getSelectedCell selection 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 selection.getSelectedCell() 메서드로 선택된 셀의 id 또는 범위를 가져옵니다. --- # getSelectedCell() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md index d3cfd66b..227494ae 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: removeSelectedCell() title: removeSelectedCell selection 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 Selection의 removeSelectedCell 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 selection.removeSelectedCell() 메서드로 지정한 셀 또는 셀 범위의 선택을 해제합니다. --- # removeSelectedCell() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md index d8209069..007789b9 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setSelectedCell() title: setSelectedCell selection 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 setSelectedCell selection 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 selection.setSelectedCell() 메서드로 하나 또는 여러 셀이나 셀 범위를 선택하고, 필요하면 해당 위치로 스크롤합니다. --- # setSelectedCell() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_add_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_add_method.md index 316af70a..acb7195f 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_add_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_add_method.md @@ -1,7 +1,7 @@ --- sidebar_label: add() title: add 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 Sheet Manager의 add 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판도 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 sheets.add() 메서드로 새 빈 시트를 추가하고 새 시트의 id를 반환받습니다(multiSheets 옵션 필요). --- # add() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_clear_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_clear_method.md index 4039ada9..c51c559f 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_clear_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_clear_method.md @@ -1,7 +1,7 @@ --- sidebar_label: clear() title: clear 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 Sheet Manager의 clear 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 sheets.clear() 메서드로 시트 자체는 삭제하지 않고 시트의 값, 스타일 및 서식을 지웁니다. --- # clear() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_get_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_get_method.md index b798b766..b5ba7c4d 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_get_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_get_method.md @@ -1,7 +1,7 @@ --- sidebar_label: get() title: get 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 Sheet Manager의 get 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 sheets.get() 메서드로 id를 기준으로 시트 객체를 가져옵니다. --- # get() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_getactive_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_getactive_method.md index 971afce9..29a3dcc7 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_getactive_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_getactive_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getActive() title: getActive 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 Sheet Manager의 getActive 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 sheets.getActive() 메서드로 활성(표시된) 시트를 가져옵니다. 이 메서드는 시트의 id와 이름을 반환합니다. --- # getActive() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_getall_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_getall_method.md index 440f9080..aa7d26eb 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_getall_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_getall_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getAll() title: getAll 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 Sheet Manager의 getAll 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 sheets.getAll() 메서드로 모든 시트를 가져옵니다. 이 메서드는 시트의 id와 이름이 담긴 객체 배열을 반환합니다. --- # getAll() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_remove_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_remove_method.md index 973ffb57..1c531e93 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_remove_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_remove_method.md @@ -1,7 +1,7 @@ --- sidebar_label: remove() title: remove 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 Sheet Manager의 remove 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 sheets.remove() 메서드로 id를 기준으로 시트를 제거합니다. 최소 하나의 시트는 유지되며, 활성 시트를 제거하면 다른 시트로 전환됩니다. --- # remove() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_setactive_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_setactive_method.md index 30745458..5a3cbff2 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_setactive_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/sheetmanager_setactive_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setActive() title: setActive 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 Sheet Manager의 setActive 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 sheets.setActive() 메서드로 활성(표시된) 시트를 지정한 id의 시트로 전환합니다. --- # setActive() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md index f6c10145..efc13ae0 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md @@ -1,7 +1,7 @@ --- sidebar_label: addColumn() title: addColumn 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 addColumn 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 addColumn() 메서드로 빈 열을 추가합니다. 지정한 셀의 열 위치에 열을 삽입하고 기존 열을 오른쪽으로 이동합니다. --- # addColumn() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addformula_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addformula_method.md index 69797891..e3015564 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addformula_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addformula_method.md @@ -1,7 +1,7 @@ --- sidebar_label: addFormula() title: addFormula 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 addFormula 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 addFormula() 메서드로 사용자 정의 수식 함수를 등록하여 셀 수식에서 대문자 이름으로 사용합니다. --- # addFormula() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md index e98592fb..907ec073 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md @@ -1,7 +1,7 @@ --- sidebar_label: addRow() title: addRow 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 addRow 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 addRow() 메서드로 빈 행을 추가합니다. 지정한 셀의 행 위치에 행을 삽입하고 기존 행을 아래로 이동합니다. --- # addRow() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md index 4e8ad390..bd3c32bd 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterAction title: afterAction 이벤트 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 afterAction 이벤트에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: 작업이 실행된 후 발생하는 DHTMLX Spreadsheet의 afterAction 이벤트를 처리합니다. 이 이벤트는 액션 이름과 셀, 새 값 및 이전 값 등 액션의 매개변수를 전달받습니다. --- # afterAction diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md index 530d52fd..cdd11251 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterClear title: afterClear 이벤트 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 afterClear 이벤트에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet가 초기화된 후 발생하는 afterClear 이벤트를 처리합니다(v4.3부터 더 이상 사용되지 않으므로 afterAction 이벤트를 사용하십시오). --- # afterClear diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterdataloaded_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterdataloaded_event.md index 42591a5e..2b70626a 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterdataloaded_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterdataloaded_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterDataLoaded title: afterDataLoaded 이벤트 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 afterDataLoaded 이벤트에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet에서 afterDataLoaded 이벤트로 데이터가 로드된 후 코드를 실행합니다. 예를 들어, 로딩이 완료되면 메시지를 표시할 수 있습니다. --- # afterDataLoaded diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md index 64bb7cd3..93830c42 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterEditEnd title: afterEditEnd 이벤트 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 afterEditEnd 이벤트에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet에서 afterEditEnd 이벤트로 셀 편집 종료를 처리합니다. 이 이벤트는 셀 id와 새 값을 받습니다. --- # afterEditEnd diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md index 5e98c041..7993db0e 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterEditStart title: afterEditStart 이벤트 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 afterEditStart 이벤트에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet에서 afterEditStart 이벤트로 셀 편집 시작을 처리합니다. 이 이벤트는 셀 id와 값을 받습니다. --- # afterEditStart diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md index fcae8060..eb163b77 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterFocusSet title: afterFocusSet 이벤트 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 afterFocusSet 이벤트에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet에서 afterFocusSet 이벤트로 포커스된 셀을 추적합니다. 이 이벤트는 셀에 포커스가 설정된 후 발생하며 셀 id를 받습니다. --- # afterFocusSet diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md index a713573e..aef2c89a 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterSelectionSet title: afterSelectionSet 이벤트 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 afterSelectionSet 이벤트에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet에서 afterSelectionSet 이벤트로 셀 선택에 대응합니다. 이 이벤트는 셀이 선택된 후 발생하며 셀 id를 받습니다. --- # afterSelectionSet diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md index 1a60b9e3..68cc968a 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterSheetChange title: afterSheetChange 이벤트 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 afterSheetChange 이벤트에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet에서 afterSheetChange 이벤트로 시트 전환을 추적합니다. 이 이벤트는 새로 활성화된 시트의 이름과 id를 받습니다. --- # afterSheetChange diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md index 70e83970..c81ba569 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeAction title: beforeAction 이벤트 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 beforeAction 이벤트에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet에서 beforeAction 이벤트로 액션을 가로챕니다. 이 이벤트는 액션의 이름과 매개변수를 받으며, 핸들러가 false를 반환하면 액션을 취소합니다. --- # beforeAction diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md index ef63a3e8..a9ffc6d4 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeClear title: beforeClear 이벤트 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 beforeClear 이벤트에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet에서 더 이상 사용되지 않는 beforeClear 이벤트로, 또는 이를 대체하는 beforeAction 이벤트와 clear 액션으로 스프레드시트 비우기를 막습니다. --- # beforeClear diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md index dcbfc713..3a71cdc8 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeEditEnd title: beforeEditEnd 이벤트 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 beforeEditEnd 이벤트에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하실 수 있습니다. +description: DHTMLX Spreadsheet에서 beforeEditEnd 이벤트로 편집이 끝나기 전에 셀 값을 확인하고, false를 반환하여 에디터를 열린 상태로 유지합니다. --- # beforeEditEnd diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md index af002965..bc8a30ca 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeEditStart title: beforeEditStart 이벤트 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 문서에서 beforeEditStart 이벤트에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 체험하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 beforeEditStart 이벤트로 편집할 수 있는 셀을 제어하고, false를 반환하여 에디터가 열리지 않게 합니다. --- # beforeEditStart diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md index 503bf92b..b424adf5 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeFocusSet title: beforeFocusSet 이벤트 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 문서에서 beforeFocusSet 이벤트에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 체험하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 beforeFocusSet 이벤트로 포커스를 제어합니다. 이 이벤트는 셀이 포커스를 받기 전에 발생하며, 핸들러가 false를 반환하면 포커스 설정을 막습니다. --- # beforeFocusSet diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md index b11e5e09..028af69a 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeSelectionSet title: beforeSelectionSet 이벤트 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 문서에서 beforeSelectionSet 이벤트에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 체험하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 beforeSelectionSet 이벤트로 셀 선택을 제어합니다. 이 이벤트는 셀이 선택되기 전에 발생하며, 핸들러가 false를 반환하면 선택을 막습니다. --- # beforeSelectionSet diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md index c658aed0..62cbafc8 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeSheetChange title: beforeSheetChange 이벤트 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 문서에서 beforeSheetChange 이벤트에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 체험하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 beforeSheetChange 이벤트로 시트 전환을 제어하고, false를 반환하여 현재 시트를 활성 상태로 유지합니다. --- # beforeSheetChange diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md index b01367ae..505594bb 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md @@ -1,7 +1,7 @@ --- sidebar_label: clear() title: clear 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 문서에서 clear 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 체험하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 clear() 메서드로 모든 데이터를 제거합니다. --- # clear() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md index 88502d0a..419a2668 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md @@ -1,7 +1,7 @@ --- sidebar_label: colsCount title: colsCount 설정 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 문서에서 colsCount 설정에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 체험하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 colsCount 속성으로 초기화 시 표시되는 열 수를 설정합니다. --- # colsCount diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md index af3b09da..28aae89d 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: eachCell() title: eachCell 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 문서에서 eachcell 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 체험하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 eachCell() 메서드로 셀 범위 또는 선택된 셀을 순회합니다. 이 메서드는 각 셀의 이름과 값으로 함수를 호출합니다. --- # eachCell() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md index 34d7fbb8..97a389a3 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md @@ -1,7 +1,7 @@ --- sidebar_label: editLine title: editLine 설정 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 문서에서 editLine 설정에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 체험하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 editLine 속성으로 편집 바를 표시하거나 숨깁니다. 편집 바는 기본적으로 표시됩니다. --- # editLine diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md index 45eed149..2ff7789f 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md @@ -1,7 +1,7 @@ --- sidebar_label: endEdit() title: endEdit 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 endEdit 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 endEdit() 메서드로 선택된 셀의 편집을 종료합니다. 이 메서드는 에디터를 닫고 입력된 값을 저장합니다. --- # endEdit() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md index 1f09ef44..28ca96c4 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md @@ -1,7 +1,7 @@ --- sidebar_label: exportModulePath title: exportModulePath 설정 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 exportModulePath 설정에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 exportModulePath 속성으로 JSON2Excel 내보내기 모듈의 worker.js 파일 경로를 설정합니다. 예를 들어, 자체 서버에서 Excel로 내보낼 때 사용합니다. --- # exportModulePath diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md index a5edc354..faade139 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md @@ -1,7 +1,7 @@ --- sidebar_label: fitColumn() title: fitColumn 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 fitColumn 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 fitColumn() 메서드로 열 너비를 해당 열에서 가장 긴 값에 맞게 조정합니다. --- # fitColumn() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md index f1b3e613..a5f9fbcf 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md @@ -1,7 +1,7 @@ --- sidebar_label: formats title: formats 설정 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 formats 설정에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 formats 속성으로 사용할 수 있는 숫자 형식을 정의합니다. 이 속성은 각 형식의 id, 마스크, 이름 및 예시를 담은 객체 배열입니다. --- # formats diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_freezecols_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_freezecols_method.md index 9e8ed8a6..bb5bed0b 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_freezecols_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_freezecols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: freezeCols() title: freezeCols 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 freezeCols 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 freezeCols() 메서드로 열을 고정합니다. 이 메서드는 현재 시트 또는 다른 시트에서 지정된 셀이나 선택된 셀까지의 열을 고정합니다. --- # freezeCols() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_freezerows_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_freezerows_method.md index 3266795d..7a5b2267 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_freezerows_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_freezerows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: freezeRows() title: freezeRows 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 freezeRows 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 freezeRows() 메서드로 행을 고정합니다. 이 메서드는 현재 시트 또는 다른 시트에서 지정된 셀이나 선택된 셀까지의 행을 고정합니다. --- # freezeRows() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md index 8de76295..f60486b6 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFilter() title: getFilter 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 getFilter 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 getFilter() 메서드로 시트의 필터링 조건을 가져옵니다. 필터링된 셀 범위와 필터 규칙을 반환합니다. --- # getFilter() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md index 38ce390c..ae206239 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFormat() title: getFormat 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 getFormat 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 getFormat() 메서드로 셀 또는 셀 범위의 값에 적용된 숫자 형식을 가져옵니다. --- # getFormat() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md index de78e7f0..6501ca3d 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFormula() title: getFormula 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 getFormula 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 getFormula() 메서드로 셀의 수식을 가져옵니다. 다른 시트에 있는 셀의 수식도 가져올 수 있습니다. --- # getFormula() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md index cbedbc9f..8503d910 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getStyle() title: getStyle 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 getStyle 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 getStyle() 메서드로 셀 또는 셀 범위에 적용된 스타일을 가져옵니다. --- # getStyle() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md index 5c91c6ff..d6bd269d 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getValue() title: getValue 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 getValue 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 시험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수도 있습니다. +description: DHTMLX Spreadsheet에서 getValue() 메서드로 셀의 값 또는 셀 범위의 값을 가져옵니다. --- # getValue() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md index d3b45e90..f7b5e8c2 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md @@ -1,7 +1,7 @@ --- sidebar_label: groupFill title: groupFill 이벤트 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 groupFill 이벤트에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 시험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수도 있습니다. +description: DHTMLX Spreadsheet에서 groupFill 이벤트로 셀 자동 채우기를 처리합니다. 이 이벤트는 포커스된 셀과 선택된 셀을 콜백에 전달합니다. --- # groupFill diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_hidecols_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_hidecols_method.md index 066b525b..a43cd6dd 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_hidecols_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_hidecols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: hideCols() title: hideCols 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 hideCols 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 시험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수도 있습니다. +description: DHTMLX Spreadsheet에서 hideCols() 메서드로 하나 이상의 열을 숨깁니다. 셀 id, 셀 범위 또는 선택된 셀로 열을 지정합니다. --- # hideCols() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_hiderows_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_hiderows_method.md index 06e116d4..0ccbea7d 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_hiderows_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_hiderows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: hideRows() title: hideRows 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 hideRows 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 시험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수도 있습니다. +description: DHTMLX Spreadsheet에서 hideRows() 메서드로 하나 이상의 행을 숨깁니다. 셀 id, 셀 범위 또는 선택된 셀로 행을 지정합니다. --- # hideRows() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md index beb1365d..e8377ce8 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md @@ -1,7 +1,7 @@ --- sidebar_label: hideSearch() title: hideSearch 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 hideSearch 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 시험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수도 있습니다. +description: DHTMLX Spreadsheet에서 hideSearch() 메서드로 검색 바를 숨깁니다. 예를 들어 search() 메서드로 연 검색 바를 닫을 수 있습니다. --- # hideSearch() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md index 8949d1d5..640b218d 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md @@ -1,7 +1,7 @@ --- sidebar_label: importModulePath title: importModulePath 설정 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 importModulePath 설정에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 시험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수도 있습니다. +description: DHTMLX Spreadsheet에서 importModulePath 속성으로 Excel 파일 가져오기에 사용되는 Excel2json 라이브러리의 worker.js 파일 경로를 설정합니다. --- # importModulePath diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md index 1275a122..f238e6c0 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md @@ -1,7 +1,7 @@ --- sidebar_label: insertLink() title: insertLink 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 insertLink 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 시험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수도 있습니다. +description: DHTMLX Spreadsheet에서 insertLink() 메서드로 셀에 하이퍼링크를 삽입하거나, 셀의 텍스트는 유지한 채 하이퍼링크를 제거합니다. --- # insertLink() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md index d7d74c1d..c3c4109c 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md @@ -1,7 +1,7 @@ --- sidebar_label: isLocked() title: isLocked 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 isLocked 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 시험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수도 있습니다. +description: DHTMLX Spreadsheet에서 isLocked() 메서드로 셀 또는 범위 내의 셀 중 하나라도 잠겨 있는지 확인합니다. --- # isLocked() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md index 685d8454..ec91747a 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md @@ -1,7 +1,7 @@ --- sidebar_label: load() title: load 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 load 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 시험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수도 있습니다. +description: DHTMLX Spreadsheet에서 load() 메서드로 외부 JSON, CSV 또는 XLSX 파일의 데이터를 로드합니다. 이 메서드는 promise를 반환합니다. --- # load() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md index 5550ec99..a3fefb2e 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md @@ -1,7 +1,7 @@ --- sidebar_label: localization title: localization 설정 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 localization 설정에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 시험해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수도 있습니다. +description: DHTMLX Spreadsheet에서 localization 속성으로 소수점 및 천 단위 구분 기호, 통화 기호, 날짜 및 시간 형식을 설정합니다. --- # localization diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md index 267f26dd..44fb3f96 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md @@ -1,7 +1,7 @@ --- sidebar_label: lock() title: lock 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 lock 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet 30일 무료 평가판을 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 lock() 메서드로 셀, 셀 범위 또는 여러 셀을 잠가 사용자가 편집할 수 없도록 합니다. --- # lock() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md index fbbad9d2..ef984a55 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md @@ -1,7 +1,7 @@ --- sidebar_label: menu title: menu 설정 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 menu 설정에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet 30일 무료 평가판을 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 menu 속성으로 메뉴를 표시하거나 숨깁니다. --- # menu diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md index e5daeae8..c2218b12 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md @@ -1,7 +1,7 @@ --- sidebar_label: mergeCells() title: mergeCells 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 mergeCells 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet 30일 무료 평가판을 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 mergeCells() 메서드로 셀 범위를 하나의 셀로 병합하거나 병합된 셀을 분할합니다. --- # mergeCells() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md index adfbf403..557a6df8 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md @@ -1,7 +1,7 @@ --- sidebar_label: multiSheets title: multiSheets 설정 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 multiSheets 설정에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet 30일 무료 평가판을 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 multiSheets 속성으로 여러 시트 작업 기능을 켜거나 끕니다. 이 속성은 하단의 시트 탭 바를 표시하거나 숨깁니다. --- # multiSheets diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md index 5fce0f88..eea5ef35 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md @@ -1,7 +1,7 @@ --- sidebar_label: parse() title: parse 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 parse 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet 30일 무료 평가판을 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 parse() 메서드로 로컬 데이터 소스의 데이터를 로드합니다. 셀 값, 스타일, 형식, 에디터, 링크 및 여러 시트를 포함할 수 있습니다. --- # parse() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md index b01ec62c..f72b2ea5 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md @@ -1,7 +1,7 @@ --- sidebar_label: redo() title: redo 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 redo 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet 30일 무료 평가판을 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 redo() 메서드로 취소된 작업을 다시 적용합니다. --- # redo() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md index e477f898..93801724 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md @@ -1,7 +1,7 @@ --- sidebar_label: rowsCount title: rowsCount 설정 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 rowsCount 설정에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet 30일 무료 평가판을 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 rowsCount 속성으로 초기화 시 표시되는 행의 수를 설정합니다. --- # rowsCount diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md index 3aff37ad..fb361ced 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md @@ -1,7 +1,7 @@ --- sidebar_label: search() title: search 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 search 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet 30일 무료 평가판을 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 search() 메서드로 값을 기준으로 셀을 검색합니다. 찾은 셀의 id를 반환하며, 일치 항목을 강조 표시한 검색 바를 열 수 있습니다. --- # search() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md index 330a1779..5c8e39a8 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md @@ -1,7 +1,7 @@ --- sidebar_label: serialize() title: serialize 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 serialize 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet 30일 무료 평가판을 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 serialize() 메서드로 데이터를 JSON 객체로 저장합니다. 이 객체에는 시트, 셀 값, 스타일 및 숫자 형식이 포함됩니다. --- # serialize() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md index 37616d7c..ac55a447 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setFilter() title: setFilter 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 setFilter 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 setFilter() 메서드로 조건 또는 제외할 값을 기준으로 열의 데이터를 필터링하거나 필터링을 초기화합니다. --- # setFilter() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md index 1bc98e10..9d4d90be 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setFormat() title: setFormat 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 setFormat 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 setFormat() 메서드로 셀 또는 셀 범위의 값에 숫자 형식을 적용합니다. --- # setFormat() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md index d5b17f2b..9cc01af2 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setStyle() title: setStyle 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 setStyle 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 setStyle() 메서드로 셀, 여러 셀 또는 셀 범위에 동일한 스타일을 적용합니다. 스타일은 객체나 배열로 전달합니다. --- # setStyle() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md index f966379f..622bc22b 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setValidation() title: setValidation 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 setValidation 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 setValidation() 메서드로 셀 범위나 배열의 값으로 셀에 드롭다운 목록을 추가하거나 데이터 유효성 검사를 제거합니다. --- # setValidation() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md index 5b7ce624..4ef1ac47 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setValue() title: setValue 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 setValue 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 setValue() 메서드로 셀, 여러 셀 또는 셀 범위에 값을 설정합니다. 단일 값이나 셀 전체에 반복되는 값 배열을 전달합니다. --- # setValue() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_showcols_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_showcols_method.md index f90a3092..efb639fb 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_showcols_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_showcols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: showCols() title: showCols 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 showCols 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 showCols() 메서드로 숨겨진 열을 표시합니다. 열은 전달된 셀 또는 선택된 셀로 결정됩니다. --- # showCols() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_showrows_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_showrows_method.md index 2e8ed059..5a79c70e 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_showrows_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_showrows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: showRows() title: showRows 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 showRows 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 showRows() 메서드로 숨겨진 행을 표시합니다. 행은 전달된 셀 또는 선택된 셀로 결정됩니다. --- # showRows() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md index 1362e072..7c6dd913 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md @@ -1,7 +1,7 @@ --- sidebar_label: sortCells() title: sortCells 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 sortCells 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 sortCells() 메서드로 열 또는 셀 범위를 기준으로 데이터를 오름차순 또는 내림차순으로 정렬합니다. --- # sortCells() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md index a378dfbe..e262d656 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md @@ -1,7 +1,7 @@ --- sidebar_label: startEdit() title: startEdit 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 startEdit 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 startEdit() 메서드로 전달된 셀 또는 선택된 셀의 편집을 시작합니다. 초기 값을 지정할 수도 있습니다. --- # startEdit() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_toolbarblocks_config.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_toolbarblocks_config.md index 03e28bd8..cb4f6c63 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_toolbarblocks_config.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_toolbarblocks_config.md @@ -1,7 +1,7 @@ --- sidebar_label: toolbarBlocks title: toolbarBlocks 설정 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 toolbarBlocks 설정에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 확인하며, DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 toolbarBlocks 속성으로 툴바에 표시할 버튼 블록(undo, colors, font, align, format 등)을 선택합니다. --- # toolbarBlocks diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md index 80fd5eca..d0909d92 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md @@ -1,7 +1,7 @@ --- sidebar_label: undo() title: undo 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 undo 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수도 있습니다. +description: DHTMLX Spreadsheet에서 undo() 메서드로 마지막 작업을 되돌리고 redo() 메서드로 다시 적용합니다. --- # undo() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezecols_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezecols_method.md index 04c0450c..a5f8dc4f 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezecols_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezecols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: unfreezeCols() title: unfreezeCols 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 unfreezeCols 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수도 있습니다. +description: DHTMLX Spreadsheet에서 unfreezeCols() 메서드로 고정된 열을 해제하여 나머지 그리드와 함께 스크롤되도록 합니다. --- # unfreezeCols() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezerows_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezerows_method.md index 7f20ec5c..77a17dfb 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezerows_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezerows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: unfreezeRows() title: unfreezeRows 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 unfreezeRows 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수도 있습니다. +description: DHTMLX Spreadsheet에서 unfreezeRows() 메서드로 고정된 행을 해제하여 나머지 그리드와 함께 스크롤되도록 합니다. --- # unfreezeRows() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md index 25c32c7b..420b25a3 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md @@ -1,7 +1,7 @@ --- sidebar_label: unlock() title: unlock 메서드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 unlock 메서드에 대해 알아볼 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보세요. DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수도 있습니다. +description: DHTMLX Spreadsheet에서 unlock() 메서드로 잠긴 셀, 여러 셀 또는 셀 범위의 잠금을 해제하여 사용자가 다시 편집할 수 있게 합니다. --- # unlock() diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/awaitredraw.md b/i18n/ko/docusaurus-plugin-content-docs/current/awaitredraw.md index 9d11cbd4..c74ceff8 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/awaitredraw.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/awaitredraw.md @@ -1,7 +1,7 @@ --- sidebar_label: AwaitRedraw 헬퍼 title: AwaitRedraw 헬퍼 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 AwaitRedraw 헬퍼에 대해 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 직접 실행해 보세요. DHTMLX Spreadsheet의 30일 무료 평가판도 다운로드할 수 있습니다. +description: dhx.awaitRedraw 헬퍼로 DHTMLX Spreadsheet의 렌더링이 끝난 후 코드를 실행합니다. 컴포넌트가 페이지에 표시된 후에만 적용되는 API 메서드에 사용합니다. --- # AwaitRedraw 헬퍼 {#awaitredraw-helper} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/data_formatting.md b/i18n/ko/docusaurus-plugin-content-docs/current/data_formatting.md index f40e0a86..3ef04d04 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/data_formatting.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/data_formatting.md @@ -1,7 +1,7 @@ --- sidebar_label: 데이터 형식 지정 title: 데이터 형식 지정 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 데이터 형식 지정에 대해 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 직접 실행해 보세요. DHTMLX Spreadsheet의 30일 무료 평가판도 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 툴바로 셀 데이터의 텍스트 및 배경 색상, 굵게와 기울임꼴, 정렬, 텍스트 줄 바꿈, 셀 테두리를 지정하고 스타일과 값을 지웁니다. --- # 데이터 형식 지정 {#data-formatting} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/functions.md b/i18n/ko/docusaurus-plugin-content-docs/current/functions.md index 97747d1c..844f6f04 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/functions.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/functions.md @@ -1,7 +1,7 @@ --- sidebar_label: 수식 및 함수 title: 수식 및 함수 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 수식 및 함수에 대해 문서에서 학습할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 직접 확인하며, DHTMLX Spreadsheet의 30일 무료 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 수학, 날짜, 조회, 문자열, 재무 함수 등 Excel 및 Google Sheets와 호환되는 수식을 사용하고, 사용자 지정 수식을 추가하며 셀의 수식을 가져옵니다. --- # 수식 및 함수 {#formulas-and-functions} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/handling_events.md b/i18n/ko/docusaurus-plugin-content-docs/current/handling_events.md index c8124efd..28bff044 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/handling_events.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/handling_events.md @@ -1,7 +1,7 @@ --- sidebar_label: 이벤트 처리 title: 이벤트 처리 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 이벤트 처리에 대해 학습할 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보고, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하십시오. +description: DHTMLX Spreadsheet에서 events.on(), events.detach(), events.fire() 메서드로 이벤트 리스너를 연결 및 해제하고 이벤트를 호출합니다. --- # 이벤트 처리 {#event-handling} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/how_to_start.md b/i18n/ko/docusaurus-plugin-content-docs/current/how_to_start.md index 67489c66..81e0e9dc 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/how_to_start.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/how_to_start.md @@ -1,7 +1,7 @@ --- sidebar_label: 시작하는 방법 title: DHTMLX Spreadsheet 시작하는 방법 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 시작 방법을 학습할 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보고, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하십시오. +description: 소스 파일 포함 또는 npm 패키지 설치부터 컴포넌트 구성과 데이터 로드까지 네 단계로 페이지에서 DHTMLX Spreadsheet를 실행합니다. --- # 시작하는 방법 {#how-to-start} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/index.md b/i18n/ko/docusaurus-plugin-content-docs/current/index.md index 10bd2864..02837582 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/index.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/index.md @@ -2,7 +2,7 @@ sidebar_label: Spreadsheet 개요 title: DHTMLX Spreadsheet 개요 slug: / -description: DHTMLX 문서에서 JavaScript Spreadsheet 라이브러리의 개요를 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보고, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하십시오. +description: 스프레드시트 데이터를 편집하고 서식을 지정하는 JavaScript 컴포넌트인 DHTMLX Spreadsheet와 툴바, 편집 표시줄, 그리드, 메뉴, 컨텍스트 메뉴를 소개합니다. --- # DHTMLX Spreadsheet 개요 {#dhtmlx-spreadsheet-overview} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/initialization.md b/i18n/ko/docusaurus-plugin-content-docs/current/initialization.md index 8c9cdd4c..4ed3b451 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/initialization.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/initialization.md @@ -1,7 +1,7 @@ --- sidebar_label: 초기화 title: 초기화 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 초기화에 대해 문서에서 학습할 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보고, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하십시오. +description: 소스 파일을 포함하고 컨테이너를 추가한 다음 구성 객체와 함께 dhx.Spreadsheet 생성자를 호출하여 페이지에서 DHTMLX Spreadsheet를 초기화합니다. --- # 초기화 {#initialization} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/loading_data.md b/i18n/ko/docusaurus-plugin-content-docs/current/loading_data.md index 06d7699a..854fd5fd 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/loading_data.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/loading_data.md @@ -1,7 +1,7 @@ --- sidebar_label: 데이터 로드 및 내보내기 title: 데이터 로드하기 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 데이터 로드에 대해 학습할 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 사용해 보고, DHTMLX Spreadsheet 무료 30일 평가판을 다운로드하십시오. +description: 파일 또는 로컬 소스에서 스타일, 잠긴 셀, 링크를 포함한 JSON, CSV, Excel 데이터를 DHTMLX Spreadsheet로 로드하고, 상태를 저장 및 복원하며 데이터를 Excel 또는 JSON으로 내보냅니다. --- # 데이터 로드 및 내보내기 {#data-loading-and-export} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/migration.md b/i18n/ko/docusaurus-plugin-content-docs/current/migration.md index 61822885..d47c95ce 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/migration.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/migration.md @@ -1,7 +1,7 @@ --- sidebar_label: 최신 버전으로 마이그레이션 title: 마이그레이션 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 마이그레이션에 대해 알아보세요. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해보며, DHTMLX Spreadsheet의 30일 무료 평가판을 다운로드하세요. +description: 버전별로 더 이상 사용되지 않거나 변경 또는 제거된 속성, 메서드, 이벤트와 그 대체 항목 목록을 참고하여 DHTMLX Spreadsheet의 새 버전으로 마이그레이션합니다. --- # 최신 버전으로 마이그레이션 {#migration-to-newer-versions} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/number_formatting.md b/i18n/ko/docusaurus-plugin-content-docs/current/number_formatting.md index 20a0d953..b0c911fd 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/number_formatting.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/number_formatting.md @@ -1,7 +1,7 @@ --- sidebar_label: 숫자 서식 title: 숫자 서식 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 숫자 서식에 대한 개발자 가이드를 확인하세요. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해보며, DHTMLX Spreadsheet의 30일 무료 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 셀 값에 숫자, 통화, 백분율, 날짜, 시간, 지수 형식을 적용하고 현지화하며, 사용자 지정 형식 마스크를 정의하고 셀 형식을 설정하거나 가져옵니다. --- # 숫자 서식 {#number-formatting} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/number_formatting_guide.md b/i18n/ko/docusaurus-plugin-content-docs/current/number_formatting_guide.md index 3fcafdac..81f67cf9 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/number_formatting_guide.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/number_formatting_guide.md @@ -1,7 +1,7 @@ --- sidebar_label: 숫자 서식 title: 숫자 서식 가이드 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 숫자 서식에 대한 사용자 가이드를 확인하세요. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해보며, DHTMLX Spreadsheet의 30일 무료 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 툴바로 셀 값의 숫자, 통화, 백분율, 날짜, 시간, 텍스트 등 숫자 형식을 선택합니다. --- # 숫자 서식 {#number-formatting} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/sorting_data.md b/i18n/ko/docusaurus-plugin-content-docs/current/sorting_data.md index 94885a03..72b4ce04 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/sorting_data.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/sorting_data.md @@ -1,7 +1,7 @@ --- sidebar_label: 데이터 정렬 title: 데이터 정렬 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 데이터 정렬에 대해 알아보세요. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해보며, DHTMLX Spreadsheet의 30일 무료 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에서 컨텍스트 메뉴의 정렬 명령으로 열 또는 선택한 셀 범위를 기준으로 데이터를 A에서 Z 또는 Z에서 A 순으로 정렬합니다. --- # 데이터 정렬 {#sorting-data} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/svelte_integration.md b/i18n/ko/docusaurus-plugin-content-docs/current/svelte_integration.md index abbee58c..6b5a1df8 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/svelte_integration.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/svelte_integration.md @@ -1,7 +1,7 @@ --- sidebar_label: Svelte와의 통합 title: Svelte 통합 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 Svelte 통합에 대한 문서를 확인하세요. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해보며, DHTMLX Spreadsheet의 30일 무료 평가판을 다운로드하세요. +description: Svelte 애플리케이션에서 DHTMLX Spreadsheet를 사용하는 방법입니다. 프로젝트를 만들고, Spreadsheet를 Svelte 컴포넌트로 추가하고, 데이터를 로드하고, 이벤트를 처리합니다. --- # Svelte와의 통합 {#integration-with-svelte} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md b/i18n/ko/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md index acecc5ee..0350bf66 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md @@ -1,7 +1,7 @@ --- sidebar_label: 내장 테마 구성 title: 내장 테마 구성 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 테마를 구성하는 방법을 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 직접 사용해 보거나, DHTMLX Spreadsheet 30일 무료 평가판을 다운로드하십시오. +description: CSS 변수를 재정의하여 DHTMLX Spreadsheet 기본 제공 테마의 색상을 모든 테마에 한 번에 또는 개별 테마별로 변경합니다. --- # 내장 테마 구성 {#configuring-built-in-themes} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/themes/custom_theme.md b/i18n/ko/docusaurus-plugin-content-docs/current/themes/custom_theme.md index f45157f6..e08059a3 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/themes/custom_theme.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/themes/custom_theme.md @@ -1,7 +1,7 @@ --- sidebar_label: 커스텀 테마 title: 커스텀 테마 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 커스텀 테마를 만드는 방법을 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 탐색하고, 코드 예제와 라이브 데모를 직접 사용해 보거나, DHTMLX Spreadsheet 30일 무료 평가판을 다운로드하십시오. +description: CSS 변수로 DHTMLX Spreadsheet의 사용자 지정 색상 테마를 만들고 dhx.setTheme() 메서드로 적용합니다. --- # 커스텀 테마 {#custom-theme} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/using_typescript.md b/i18n/ko/docusaurus-plugin-content-docs/current/using_typescript.md index 7124293b..3c0e4083 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/using_typescript.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/using_typescript.md @@ -1,7 +1,7 @@ --- sidebar_label: TypeScript 지원 title: TypeScript 지원 -description: DHTMLX JavaScript Spreadsheet 라이브러리와 TypeScript 사용에 대한 문서를 확인하세요. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 사용해보며, DHTMLX Spreadsheet의 30일 무료 평가판을 다운로드하세요. +description: DHTMLX Spreadsheet에 내장된 TypeScript 정의로 IDE에서 타입 검사, 자동 완성, JSDoc 힌트를 사용합니다. --- # TypeScript 지원 {#typescript-support} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md index a772177d..278c73d3 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md @@ -1,7 +1,7 @@ --- sidebar_label: 새로운 기능 title: DHTMLX Spreadsheet의 새로운 기능 -description: DHTMLX JavaScript Spreadsheet 라이브러리의 새로운 기능에 대한 내용을 문서에서 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수 있습니다. +description: 버전별 새 기능, 업데이트, 수정 사항, 호환성이 깨지는 변경 사항을 담은 DHTMLX Spreadsheet 릴리스 노트입니다. --- # 새로운 기능 {#whats-new} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/work_with_sheets.md b/i18n/ko/docusaurus-plugin-content-docs/current/work_with_sheets.md index 1638f507..346db91f 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/work_with_sheets.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/work_with_sheets.md @@ -1,7 +1,7 @@ --- sidebar_label: 시트 작업 title: 시트 작업 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 시트 작업에 대한 내용을 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에서 하단 툴바와 시트 탭으로 시트를 추가, 제거, 이름 변경, 전환하고 수식에서 다른 시트의 셀을 참조합니다. --- # 시트 작업 {#work-with-sheets} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/working_with_cells.md b/i18n/ko/docusaurus-plugin-content-docs/current/working_with_cells.md index 87f16dbb..4392fbe2 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/working_with_cells.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/working_with_cells.md @@ -1,7 +1,7 @@ --- sidebar_label: 셀 작업 title: 셀 작업 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 셀 작업에 대한 내용을 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수 있습니다. +description: API로 DHTMLX Spreadsheet 셀의 값과 스타일을 설정하고 가져오며, 셀 유효성 검사, 링크 삽입, 셀 편집, 잠금, 병합, 선택을 수행합니다. --- # 셀 작업 {#work-with-cells} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/working_with_sheets.md b/i18n/ko/docusaurus-plugin-content-docs/current/working_with_sheets.md index a442b538..2f72868f 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/working_with_sheets.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/working_with_sheets.md @@ -1,7 +1,7 @@ --- sidebar_label: 시트 작업 title: 시트 작업 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 시트 작업에 대한 내용을 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수 있습니다. +description: DHTMLX Spreadsheet에 여러 시트를 로드하고 API 메서드로 시트를 추가, 제거, 가져오기, 지우기, 전환합니다. --- # 시트 작업 {#work-with-sheets} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/working_with_ssheet.md b/i18n/ko/docusaurus-plugin-content-docs/current/working_with_ssheet.md index cadbebcf..1707f27a 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/working_with_ssheet.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/working_with_ssheet.md @@ -1,7 +1,7 @@ --- sidebar_label: Spreadsheet 작업 title: Spreadsheet 작업 -description: DHTMLX JavaScript Spreadsheet 라이브러리 문서에서 스프레드시트 작업에 대한 내용을 확인할 수 있습니다. 개발자 가이드와 API 레퍼런스를 살펴보고, 코드 예제와 라이브 데모를 체험해 보세요. 또한 DHTMLX Spreadsheet의 무료 30일 평가판을 다운로드할 수 있습니다. +description: API로 DHTMLX Spreadsheet에서 작업을 실행 취소 및 다시 실행하고, 행과 열을 추가, 제거, 고정, 숨기고, 열 너비를 자동 맞춤하며, 데이터를 필터링, 검색, 정렬하고 스프레드시트를 지웁니다. --- # Spreadsheet 작업 {#work-with-spreadsheet} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md index 41f6eb97..04a43bc5 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md @@ -1,7 +1,7 @@ --- sidebar_label: detach() title: Метод detach -description: Вы можете узнать о Event Bus методе detach в документации библиотеки DHTMLX JavaScript Spreadsheet. Изучайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Отсоедините обработчик события, подключённый методом on(), от DHTMLX Spreadsheet с помощью метода events.detach() по имени события. --- # detach() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md index 7ac17fbe..020fd96f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md @@ -1,7 +1,7 @@ --- sidebar_label: fire() title: Метод fire -description: Вы можете узнать о Event Bus методе fire в документации библиотеки DHTMLX JavaScript Spreadsheet. Изучайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Вызовите внутреннее событие DHTMLX Spreadsheet с помощью метода events.fire(), передав имя события и массив его данных. --- # fire() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md index 4c123581..619e5be0 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md @@ -1,7 +1,7 @@ --- sidebar_label: on() title: Метод on -description: Вы можете узнать о Event Bus методе on в документации библиотеки DHTMLX JavaScript Spreadsheet. Изучайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Подключите обработчик к внутреннему событию DHTMLX Spreadsheet с помощью метода events.on(), например, чтобы реагировать на изменение стиля ячейки. --- # on() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/export_json_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/export_json_method.md index c0bdc3f0..49b0847a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/export_json_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/export_json_method.md @@ -1,7 +1,7 @@ --- sidebar_label: json() title: Метод экспорта json -description: Вы можете узнать о методе экспорта json в документации библиотеки DHTMLX JavaScript Spreadsheet. Изучайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Экспортируйте данные DHTMLX Spreadsheet в файл JSON с помощью метода export.json(). --- # json() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md index a211de42..821a8cc7 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md @@ -1,7 +1,7 @@ --- sidebar_label: xlsx() title: Метод экспорта xlsx -description: Вы можете узнать о методе экспорта xlsx в документации библиотеки DHTMLX JavaScript Spreadsheet. Изучайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Экспортируйте данные DHTMLX Spreadsheet в файл Excel (.xlsx) с помощью метода export.xlsx(), при необходимости задав имя файла. --- # xlsx() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md index 98ead903..e1b6f90a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Действия Spreadsheet title: Обзор действий -description: Вы можете ознакомиться с обзором действий библиотеки DHTMLX JavaScript Spreadsheet в документации. Изучайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Обзор действий DHTMLX Spreadsheet и полный список действий, которые можно обработать в событиях beforeAction и afterAction. --- # Обзор действий {#actions-overview} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/eventbus_overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/eventbus_overview.md index ef410a2e..7636f498 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/eventbus_overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/eventbus_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Обзор Event Bus методов title: Обзор Event Bus методов -description: Вы можете ознакомиться с обзором Event Bus методов библиотеки DHTMLX JavaScript Spreadsheet в документации. Изучайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Список методов шины событий DHTMLX Spreadsheet, которые подключают, отсоединяют и вызывают события. --- # Обзор Event Bus методов {#event-bus-methods-overview} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/events_overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/events_overview.md index 697b7554..8435c8e3 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/events_overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/events_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Обзор событий title: Обзор событий -description: Вы можете ознакомиться с обзором событий библиотеки DHTMLX JavaScript Spreadsheet в документации. Изучайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Список событий DHTMLX Spreadsheet, которые вызываются при действиях, загрузке данных, редактировании ячеек, выделении, установке фокуса и смене листа. --- # Обзор событий {#events-overview} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/export_overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/export_overview.md index 49f4ed2d..80efa911 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/export_overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/export_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Обзор методов экспорта title: Обзор методов экспорта -description: Вы можете ознакомиться с обзором методов экспорта библиотеки DHTMLX JavaScript Spreadsheet в документации. Изучайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Список методов модуля экспорта DHTMLX Spreadsheet, которые сохраняют данные в файл JSON или Excel (.xlsx). --- # Обзор методов экспорта {#export-methods-overview} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/sheetmanager_overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/sheetmanager_overview.md index 7fccf85d..bc111e9f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/sheetmanager_overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/overview/sheetmanager_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Обзор API Sheet Manager title: Обзор API Sheet Manager -description: Вы можете ознакомиться с обзором API Sheet Manager библиотеки DHTMLX JavaScript Spreadsheet в документации. Изучите руководства разработчика и справочник по API, ознакомьтесь с примерами кода и живыми демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Список методов менеджера листов DHTMLX Spreadsheet, которые добавляют, удаляют, очищают, получают и переключают листы. --- # Обзор API Sheet Manager {#sheet-manager-api-overview} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md index 650bb8a8..7aec37f2 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFocusedCell() title: Метод getFocusedCell объекта selection -description: Вы можете узнать о методе getFocusedCell объекта selection в документации библиотеки DHTMLX JavaScript Spreadsheet. Изучите руководства разработчика и справочник по API, ознакомьтесь с примерами кода и живыми демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Получите идентификатор ячейки в фокусе (активной ячейки) в DHTMLX Spreadsheet с помощью метода selection.getFocusedCell(). --- # getFocusedCell() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md index 8fc37997..ccaf2bde 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getSelectedCell() title: Метод getSelectedCell объекта selection -description: Вы можете узнать о методе getSelectedCell объекта selection в документации библиотеки DHTMLX JavaScript Spreadsheet. Изучите руководства разработчика и справочник по API, ознакомьтесь с примерами кода и живыми демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Получите идентификаторы или диапазоны выделенных ячеек в DHTMLX Spreadsheet с помощью метода selection.getSelectedCell(). --- # getSelectedCell() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md index 224b9f6a..d865e7ad 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: removeSelectedCell() title: Метод removeSelectedCell объекта selection -description: Вы можете узнать о методе removeSelectedCell объекта selection в документации библиотеки DHTMLX JavaScript Spreadsheet. Изучите руководства разработчика и справочник по API, ознакомьтесь с примерами кода и живыми демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Снимите выделение с указанных ячеек или диапазонов ячеек в DHTMLX Spreadsheet с помощью метода selection.removeSelectedCell(). --- # removeSelectedCell() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md index eadc2244..b816591a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setSelectedCell() title: Метод setSelectedCell объекта selection -description: Вы можете узнать о методе setSelectedCell объекта selection в документации библиотеки DHTMLX JavaScript Spreadsheet. Изучите руководства разработчика и справочник по API, ознакомьтесь с примерами кода и живыми демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Выделите ячейку, несколько ячеек или диапазон ячеек в DHTMLX Spreadsheet с помощью метода selection.setSelectedCell(), при необходимости прокрутив к ним таблицу. --- # setSelectedCell() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_add_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_add_method.md index f9ba587e..7cb8ab35 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_add_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_add_method.md @@ -1,7 +1,7 @@ --- sidebar_label: add() title: Метод add -description: Вы можете узнать о методе add объекта Sheet Manager в документации библиотеки DHTMLX JavaScript Spreadsheet. Изучите руководства разработчика и справочник по API, ознакомьтесь с примерами кода и живыми демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Добавьте новый пустой лист в DHTMLX Spreadsheet с помощью метода sheets.add(), который возвращает идентификатор нового листа (требуется опция multiSheets). --- # add() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_clear_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_clear_method.md index c62413b1..f471da8f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_clear_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_clear_method.md @@ -1,7 +1,7 @@ --- sidebar_label: clear() title: метод clear -description: В документации DHTMLX JavaScript Spreadsheet вы можете узнать о методе clear Sheet Manager. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Очистите значения, стили и форматирование листа в DHTMLX Spreadsheet с помощью метода sheets.clear(), не удаляя сам лист. --- # clear() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_get_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_get_method.md index 75729f4b..3826a08c 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_get_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_get_method.md @@ -1,7 +1,7 @@ --- sidebar_label: get() title: метод get -description: В документации DHTMLX JavaScript Spreadsheet вы можете узнать о методе get Sheet Manager. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Получите объект листа по его идентификатору в DHTMLX Spreadsheet с помощью метода sheets.get(). --- # get() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_getactive_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_getactive_method.md index 77ae721e..933407e2 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_getactive_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_getactive_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getActive() title: метод getActive -description: В документации DHTMLX JavaScript Spreadsheet вы можете узнать о методе getActive Sheet Manager. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Получите активный (видимый) лист DHTMLX Spreadsheet с помощью метода sheets.getActive(), который возвращает идентификатор и имя листа. --- # getActive() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_getall_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_getall_method.md index 3ee267de..39f76c8e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_getall_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_getall_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getAll() title: метод getAll -description: В документации DHTMLX JavaScript Spreadsheet вы можете узнать о методе getAll Sheet Manager. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Получите все листы DHTMLX Spreadsheet с помощью метода sheets.getAll(), который возвращает массив объектов с идентификаторами и именами листов. --- # getAll() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_remove_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_remove_method.md index c64cc11c..fc588d54 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_remove_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_remove_method.md @@ -1,7 +1,7 @@ --- sidebar_label: remove() title: метод remove -description: В документации DHTMLX JavaScript Spreadsheet вы можете узнать о методе remove Sheet Manager. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Удалите лист по его идентификатору из DHTMLX Spreadsheet с помощью метода sheets.remove(), который оставляет хотя бы один лист и переключается на другой лист при удалении активного. --- # remove() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_setactive_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_setactive_method.md index 93562e5d..a4298fec 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_setactive_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/sheetmanager_setactive_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setActive() title: метод setActive -description: В документации DHTMLX JavaScript Spreadsheet вы можете узнать о методе setActive Sheet Manager. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Переключите активный (видимый) лист DHTMLX Spreadsheet на лист с указанным идентификатором с помощью метода sheets.setActive(). --- # setActive() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md index 3644bcfa..b78b7e60 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md @@ -1,7 +1,7 @@ --- sidebar_label: addColumn() title: метод addColumn -description: В документации DHTMLX JavaScript Spreadsheet вы можете узнать о методе addColumn. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Добавьте пустой столбец в DHTMLX Spreadsheet с помощью метода addColumn(), который вставляет его на место столбца указанной ячейки и сдвигает существующие столбцы вправо. --- # addColumn() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addformula_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addformula_method.md index 31f57582..47fee087 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addformula_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addformula_method.md @@ -1,7 +1,7 @@ --- sidebar_label: addFormula() title: метод addFormula -description: В документации DHTMLX JavaScript Spreadsheet вы можете узнать о методе addFormula. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Зарегистрируйте пользовательскую функцию формулы в DHTMLX Spreadsheet с помощью метода addFormula(), чтобы использовать её в формулах ячеек по имени в верхнем регистре. --- # addFormula() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md index 1c86f550..2e4a61a9 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md @@ -1,7 +1,7 @@ --- sidebar_label: addRow() title: метод addRow -description: В документации DHTMLX JavaScript Spreadsheet вы можете узнать о методе addRow. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Добавьте пустую строку в DHTMLX Spreadsheet с помощью метода addRow(), который вставляет её на место строки указанной ячейки и сдвигает существующие строки вниз. --- # addRow() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md index a162a43e..0ed3cff3 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterAction title: событие afterAction -description: В документации DHTMLX JavaScript Spreadsheet вы можете узнать о событии afterAction. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Обработайте событие afterAction DHTMLX Spreadsheet, которое вызывается после выполнения действия и получает имя действия и его параметры, например, ячейку, новое и предыдущее значения. --- # afterAction diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md index 85fe9f03..3bbd0516 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterClear title: Событие afterClear -description: Вы можете узнать о событии afterClear в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Обработайте событие afterClear, которое вызывается после очистки DHTMLX Spreadsheet (устарело с версии v4.3, используйте вместо него событие afterAction). --- # afterClear diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterdataloaded_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterdataloaded_event.md index 6c0acce8..cb51f820 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterdataloaded_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterdataloaded_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterDataLoaded title: Событие afterDataLoaded -description: Вы можете узнать о событии afterDataLoaded в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Выполните код после загрузки данных в DHTMLX Spreadsheet с помощью события afterDataLoaded, например, чтобы показать сообщение о завершении загрузки. --- # afterDataLoaded diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md index d2e5d2aa..f1eb8755 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterEditEnd title: Событие afterEditEnd -description: Вы можете узнать о событии afterEditEnd в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Обработайте завершение редактирования ячейки в DHTMLX Spreadsheet с помощью события afterEditEnd, которое получает id ячейки и её новое значение. --- # afterEditEnd diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md index d21d10eb..0cdb1ffa 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterEditStart title: Событие afterEditStart -description: Вы можете узнать о событии afterEditStart в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Обработайте начало редактирования ячейки в DHTMLX Spreadsheet с помощью события afterEditStart, которое получает id ячейки и её значение. --- # afterEditStart diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md index 147c8940..8c2c0667 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterFocusSet title: Событие afterFocusSet -description: Вы можете узнать о событии afterFocusSet в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Отслеживайте ячейку с фокусом в DHTMLX Spreadsheet с помощью события afterFocusSet, которое вызывается после установки фокуса на ячейку и получает её id. --- # afterFocusSet diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md index ab3fb9b5..17b3b34b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterSelectionSet title: Событие afterSelectionSet -description: Вы можете узнать о событии afterSelectionSet в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Обработайте выделение ячеек в DHTMLX Spreadsheet с помощью события afterSelectionSet, которое вызывается после выделения ячеек и получает их id. --- # afterSelectionSet diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md index d8621a3f..ca8f4358 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterSheetChange title: Событие afterSheetChange -description: Вы можете узнать о событии afterSheetChange в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Отслеживайте переключение листов в DHTMLX Spreadsheet с помощью события afterSheetChange, которое получает имя и id нового активного листа. --- # afterSheetChange diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md index 0320aa2b..807db224 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeAction title: Событие beforeAction -description: Вы можете узнать о событии beforeAction в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Перехватывайте действия в DHTMLX Spreadsheet с помощью события beforeAction, которое получает имя и параметры действия и отменяет его, если обработчик возвращает false. --- # beforeAction diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md index 2287e965..7a571f03 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeClear title: Событие beforeClear -description: Вы можете узнать о событии beforeClear в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Запретите очистку DHTMLX Spreadsheet с помощью устаревшего события beforeClear или с помощью заменяющих его события beforeAction и действия clear. --- # beforeClear diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md index 486c1aab..d7ef12aa 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeEditEnd title: Событие beforeEditEnd -description: Вы можете узнать о событии beforeEditEnd в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Проверьте значение ячейки перед завершением редактирования в DHTMLX Spreadsheet с помощью события beforeEditEnd и верните false, чтобы оставить редактор открытым. --- # beforeEditEnd diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md index f3929612..07cf187a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeEditStart title: Событие beforeEditStart -description: Вы можете узнать о событии beforeEditStart в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачивайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Управляйте тем, какие ячейки можно редактировать в DHTMLX Spreadsheet, с помощью события beforeEditStart и верните false, чтобы редактор не открывался. --- # beforeEditStart diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md index 4ee93a6b..c52ca54b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeFocusSet title: Событие beforeFocusSet -description: Вы можете узнать о событии beforeFocusSet в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачивайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Управляйте фокусом в DHTMLX Spreadsheet с помощью события beforeFocusSet, которое вызывается перед установкой фокуса на ячейку и отменяет её, если обработчик возвращает false. --- # beforeFocusSet diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md index bdb5ffa3..add04723 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeSelectionSet title: Событие beforeSelectionSet -description: Вы можете узнать о событии beforeSelectionSet в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачивайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Управляйте выделением ячеек в DHTMLX Spreadsheet с помощью события beforeSelectionSet, которое вызывается перед выделением ячеек и отменяет его, если обработчик возвращает false. --- # beforeSelectionSet diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md index bd9d84eb..ea252f63 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeSheetChange title: Событие beforeSheetChange -description: Вы можете узнать о событии beforeSheetChange в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачивайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Управляйте переключением листов в DHTMLX Spreadsheet с помощью события beforeSheetChange и верните false, чтобы текущий лист остался активным. --- # beforeSheetChange diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md index a1bdfc3f..05692f4d 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md @@ -1,7 +1,7 @@ --- sidebar_label: clear() title: Метод clear -description: Вы можете узнать о методе clear в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачивайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Удалите все данные из DHTMLX Spreadsheet с помощью метода clear(). --- # clear() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md index e9cfc553..2d3d41f6 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md @@ -1,7 +1,7 @@ --- sidebar_label: colsCount title: Конфигурация colsCount -description: Вы можете узнать о конфигурации colsCount в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачивайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Задайте количество столбцов, которое DHTMLX Spreadsheet показывает при инициализации, с помощью свойства colsCount. --- # colsCount diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md index 68e9255e..80719e3a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: eachCell() title: Метод eachCell -description: Вы можете узнать о методе eachcell в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачивайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Переберите диапазон ячеек или выделенные ячейки в DHTMLX Spreadsheet с помощью метода eachCell(), который вызывает функцию с именем и значением каждой ячейки. --- # eachCell() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md index dc2a3a1b..6af202e3 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md @@ -1,7 +1,7 @@ --- sidebar_label: editLine title: Конфигурация editLine -description: Вы можете узнать о конфигурации editLine в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачивайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Покажите или скройте строку редактирования DHTMLX Spreadsheet с помощью свойства editLine, которое включено по умолчанию. --- # editLine diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md index 57e6c230..1419147d 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md @@ -1,7 +1,7 @@ --- sidebar_label: endEdit() title: Метод endEdit -description: Вы можете узнать о методе endEdit в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Завершите редактирование выбранной ячейки в DHTMLX Spreadsheet с помощью метода endEdit(), который закрывает редактор и сохраняет введённое значение. --- # endEdit() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md index 53183a3d..cbea29a8 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md @@ -1,7 +1,7 @@ --- sidebar_label: exportModulePath title: Конфигурация exportModulePath -description: Вы можете узнать о конфигурации exportModulePath в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Задайте путь к файлу worker.js модуля экспорта JSON2Excel в DHTMLX Spreadsheet с помощью свойства exportModulePath, например, для экспорта в Excel на собственном сервере. --- # exportModulePath diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md index 4f7fba3f..86e43244 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md @@ -1,7 +1,7 @@ --- sidebar_label: fitColumn() title: Метод fitColumn -description: Вы можете узнать о методе fitColumn в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Подстройте ширину столбца под его самое длинное значение в DHTMLX Spreadsheet с помощью метода fitColumn(). --- # fitColumn() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md index 69377d79..fede28e1 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md @@ -1,7 +1,7 @@ --- sidebar_label: formats title: Конфигурация formats -description: Вы можете узнать о конфигурации formats в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Определите числовые форматы, доступные в DHTMLX Spreadsheet, с помощью свойства formats, массива объектов с id, маской, названием и примером каждого формата. --- # formats diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_freezecols_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_freezecols_method.md index 28fedc6e..aa8d1a0f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_freezecols_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_freezecols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: freezeCols() title: Метод freezeCols -description: Вы можете узнать о методе freezeCols в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Закрепите столбцы в DHTMLX Spreadsheet с помощью метода freezeCols(), который фиксирует столбцы до указанной или выбранной ячейки на текущем или другом листе. --- # freezeCols() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_freezerows_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_freezerows_method.md index 1055be04..defab9f3 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_freezerows_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_freezerows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: freezeRows() title: Метод freezeRows -description: Вы можете узнать о методе freezeRows в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Закрепите строки в DHTMLX Spreadsheet с помощью метода freezeRows(), который фиксирует строки до указанной или выбранной ячейки на текущем или другом листе. --- # freezeRows() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md index 22d4b08f..e0b279e4 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFilter() title: Метод getFilter -description: Вы можете узнать о методе getFilter в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Получите критерии фильтрации листа в DHTMLX Spreadsheet с помощью метода getFilter(), который возвращает отфильтрованный диапазон ячеек и правила фильтрации. --- # getFilter() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md index da4066a0..e5d77ba8 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFormat() title: Метод getFormat -description: Вы можете узнать о методе getFormat в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Получите числовой формат, применённый к значению ячейки или диапазона ячеек в DHTMLX Spreadsheet, с помощью метода getFormat(). --- # getFormat() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md index 45c9031a..c6d40581 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFormula() title: Метод getFormula -description: Вы можете узнать о методе getFormula в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Получите формулу ячейки в DHTMLX Spreadsheet с помощью метода getFormula(), в том числе ячейки на другом листе. --- # getFormula() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md index 59287e9f..207eaef0 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getStyle() title: Метод getStyle -description: Вы можете узнать о методе getStyle в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Получите стили, применённые к ячейке или диапазону ячеек в DHTMLX Spreadsheet, с помощью метода getStyle(). --- # getStyle() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md index f556f716..07e90c56 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getValue() title: Метод getValue -description: Вы можете узнать о методе getValue в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Получите значение ячейки или значения диапазона ячеек в DHTMLX Spreadsheet с помощью метода getValue(). --- # getValue() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md index 25398b58..7ee35bec 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md @@ -1,7 +1,7 @@ --- sidebar_label: groupFill title: Событие groupFill -description: Вы можете узнать о событии groupFill в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Обработайте автозаполнение ячеек в DHTMLX Spreadsheet с помощью события groupFill, которое передаёт в обработчик ячейку в фокусе и выделенные ячейки. --- # groupFill diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_hidecols_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_hidecols_method.md index 6db7fff4..890b9ee4 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_hidecols_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_hidecols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: hideCols() title: Метод hideCols -description: Вы можете узнать о методе hideCols в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Скройте один или несколько столбцов в DHTMLX Spreadsheet с помощью метода hideCols() по id ячейки, диапазону ячеек или выделенной ячейке. --- # hideCols() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_hiderows_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_hiderows_method.md index 6c45f677..dd4d7d2b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_hiderows_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_hiderows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: hideRows() title: Метод hideRows -description: Вы можете узнать о методе hideRows в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Скройте одну или несколько строк в DHTMLX Spreadsheet с помощью метода hideRows() по id ячейки, диапазону ячеек или выделенной ячейке. --- # hideRows() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md index 817bd6d0..15f0fe17 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md @@ -1,7 +1,7 @@ --- sidebar_label: hideSearch() title: Метод hideSearch -description: Вы можете узнать о методе hideSearch в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Скройте панель поиска DHTMLX Spreadsheet с помощью метода hideSearch(), например после поиска, открытого методом search(). --- # hideSearch() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md index fb0ef14b..154db02d 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md @@ -1,7 +1,7 @@ --- sidebar_label: importModulePath title: Конфигурация importModulePath -description: Вы можете узнать о конфигурации importModulePath в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Задайте путь к файлу worker.js библиотеки Excel2json, с помощью которой DHTMLX Spreadsheet импортирует файлы Excel, через свойство importModulePath. --- # importModulePath diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md index 4904720e..2f775ff4 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md @@ -1,7 +1,7 @@ --- sidebar_label: insertLink() title: Метод insertLink -description: Вы можете узнать о методе insertLink в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Вставьте гиперссылку в ячейку DHTMLX Spreadsheet с помощью метода insertLink() или удалите гиперссылку, сохранив текст ячейки. --- # insertLink() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md index 459e9bb5..6e8bcd9b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md @@ -1,7 +1,7 @@ --- sidebar_label: isLocked() title: Метод isLocked -description: Вы можете узнать о методе isLocked в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Проверьте, заблокирована ли ячейка или хотя бы одна ячейка диапазона в DHTMLX Spreadsheet, с помощью метода isLocked(). --- # isLocked() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md index 7c6ae9b0..67781b0d 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md @@ -1,7 +1,7 @@ --- sidebar_label: load() title: Метод load -description: Вы можете узнать о методе load в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Загрузите данные в DHTMLX Spreadsheet из внешнего файла JSON, CSV или XLSX с помощью метода load(), который возвращает промис. --- # load() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md index 54d27caa..c274b553 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md @@ -1,7 +1,7 @@ --- sidebar_label: localization title: Конфигурация localization -description: Вы можете узнать о конфигурации localization в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Задайте десятичный разделитель и разделитель тысяч, знак валюты, а также форматы даты и времени в DHTMLX Spreadsheet с помощью свойства localization. --- # localization diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md index b59cc5d6..638429f8 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md @@ -1,7 +1,7 @@ --- sidebar_label: lock() title: метод lock -description: Вы можете узнать о методе lock в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Заблокируйте ячейку, диапазон ячеек или несколько ячеек в DHTMLX Spreadsheet с помощью метода lock(), чтобы пользователи не могли их редактировать. --- # lock() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md index cb78a8bf..f77fc342 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md @@ -1,7 +1,7 @@ --- sidebar_label: menu title: конфигурация menu -description: Вы можете узнать о конфигурации menu в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Покажите или скройте меню DHTMLX Spreadsheet с помощью свойства menu. --- # menu diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md index 6785fdc1..d5b2c6e8 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md @@ -1,7 +1,7 @@ --- sidebar_label: mergeCells() title: метод mergeCells -description: Вы можете узнать о методе mergeCells в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Объедините диапазон ячеек в одну ячейку или разделите объединённые ячейки в DHTMLX Spreadsheet с помощью метода mergeCells(). --- # mergeCells() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md index 9484235e..9ce98587 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md @@ -1,7 +1,7 @@ --- sidebar_label: multiSheets title: конфигурация multiSheets -description: Вы можете узнать о конфигурации multiSheets в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Включите или отключите работу с несколькими листами в DHTMLX Spreadsheet с помощью свойства multiSheets, которое показывает или скрывает нижнюю панель с вкладками листов. --- # multiSheets diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md index 4ccc6b82..07e443b3 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md @@ -1,7 +1,7 @@ --- sidebar_label: parse() title: метод parse -description: Вы можете узнать о методе parse в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Загрузите данные в DHTMLX Spreadsheet из локального источника с помощью метода parse(), включая значения ячеек, стили, форматы, редакторы, ссылки и несколько листов. --- # parse() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md index 2014e504..617b5b62 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md @@ -1,7 +1,7 @@ --- sidebar_label: redo() title: метод redo -description: Вы можете узнать о методе redo в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Повторно примените отменённое действие в DHTMLX Spreadsheet с помощью метода redo(). --- # redo() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md index 731c04e1..ccdcab95 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md @@ -1,7 +1,7 @@ --- sidebar_label: rowsCount title: конфигурация rowsCount -description: Вы можете узнать о конфигурации rowsCount в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Задайте количество строк, которое DHTMLX Spreadsheet показывает при инициализации, с помощью свойства rowsCount. --- # rowsCount diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md index a9fdd8ba..d93746d8 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md @@ -1,7 +1,7 @@ --- sidebar_label: search() title: метод search -description: Вы можете узнать о методе search в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Найдите ячейки по значению в DHTMLX Spreadsheet с помощью метода search(), который возвращает id найденных ячеек и может открыть панель поиска с подсвеченными совпадениями. --- # search() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md index a157cdcd..5583f729 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md @@ -1,7 +1,7 @@ --- sidebar_label: serialize() title: метод serialize -description: Вы можете узнать о методе serialize в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Сохраните данные DHTMLX Spreadsheet в объект JSON с помощью метода serialize(), который включает листы, значения ячеек, стили и числовые форматы. --- # serialize() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md index 917c39f6..81f7c358 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setFilter() title: Метод setFilter -description: Вы можете узнать о методе setFilter в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Отфильтруйте данные столбца в DHTMLX Spreadsheet по условиям или исключаемым значениям с помощью метода setFilter() или сбросьте фильтрацию. --- # setFilter() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md index 3dc88e7a..f4b86c52 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setFormat() title: Метод setFormat -description: Вы можете узнать о методе setFormat в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Примените числовой формат к значению ячейки или диапазона ячеек в DHTMLX Spreadsheet с помощью метода setFormat(). --- # setFormat() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md index daa7abf4..67c25917 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setStyle() title: Метод setStyle -description: Вы можете узнать о методе setStyle в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Примените один и тот же стиль к ячейке, нескольким ячейкам или диапазону ячеек в DHTMLX Spreadsheet с помощью метода setStyle(), передав стили объектом или массивом. --- # setStyle() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md index 77ead5dc..df894f20 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setValidation() title: Метод setValidation -description: Вы можете узнать о методе setValidation в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Добавьте в ячейки DHTMLX Spreadsheet выпадающий список значений с помощью метода setValidation(), взяв варианты из диапазона ячеек или массива, или удалите проверку данных. --- # setValidation() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md index b5a6202a..0ad3d381 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setValue() title: Метод setValue -description: Вы можете узнать о методе setValue в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Задайте значение для ячейки, нескольких ячеек или диапазона ячеек в DHTMLX Spreadsheet с помощью метода setValue(), передав одно значение или массив значений, который повторяется по ячейкам. --- # setValue() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_showcols_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_showcols_method.md index 2f869578..139e58a1 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_showcols_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_showcols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: showCols() title: Метод showCols -description: Вы можете узнать о методе showCols в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Покажите скрытые столбцы в DHTMLX Spreadsheet с помощью метода showCols() по столбцу переданной или выбранной ячейки. --- # showCols() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_showrows_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_showrows_method.md index 9151de22..157a9912 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_showrows_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_showrows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: showRows() title: Метод showRows -description: Вы можете узнать о методе showRows в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Покажите скрытые строки в DHTMLX Spreadsheet с помощью метода showRows() по строке переданной или выбранной ячейки. --- # showRows() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md index 47053c9f..d6656e43 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md @@ -1,7 +1,7 @@ --- sidebar_label: sortCells() title: Метод sortCells -description: Вы можете узнать о методе sortCells в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Отсортируйте данные DHTMLX Spreadsheet по возрастанию или убыванию по столбцу или диапазону ячеек с помощью метода sortCells(). --- # sortCells() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md index 94116623..02392d6b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md @@ -1,7 +1,7 @@ --- sidebar_label: startEdit() title: Метод startEdit -description: Вы можете узнать о методе startEdit в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Начните редактирование переданной или выбранной ячейки DHTMLX Spreadsheet с помощью метода startEdit(), при необходимости с начальным значением. --- # startEdit() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_toolbarblocks_config.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_toolbarblocks_config.md index 0589ad0f..55874f6e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_toolbarblocks_config.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_toolbarblocks_config.md @@ -1,7 +1,7 @@ --- sidebar_label: toolbarBlocks title: Конфигурация toolbarBlocks -description: Вы можете узнать о конфигурации toolbarBlocks в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Выберите блоки кнопок, которые показывает панель инструментов DHTMLX Spreadsheet, например undo, colors, font, align и format, с помощью свойства toolbarBlocks. --- # toolbarBlocks diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md index 8e1d0161..f605f6be 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md @@ -1,7 +1,7 @@ --- sidebar_label: undo() title: метод undo -description: Вы можете узнать о методе undo в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Отмените последнее действие в DHTMLX Spreadsheet с помощью метода undo() и верните его методом redo(). --- # undo() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezecols_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezecols_method.md index aa02747a..d38221f0 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezecols_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezecols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: unfreezeCols() title: метод unfreezeCols -description: Вы можете узнать о методе unfreezeCols в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Открепите закреплённые столбцы в DHTMLX Spreadsheet с помощью метода unfreezeCols(), чтобы они прокручивались вместе с остальной сеткой. --- # unfreezeCols() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezerows_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezerows_method.md index 085b7c25..a925b06c 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezerows_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezerows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: unfreezeRows() title: метод unfreezeRows -description: Вы можете узнать о методе unfreezeRows в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Открепите закреплённые строки в DHTMLX Spreadsheet с помощью метода unfreezeRows(), чтобы они прокручивались вместе с остальной сеткой. --- # unfreezeRows() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md index 15374f45..e1408488 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md @@ -1,7 +1,7 @@ --- sidebar_label: unlock() title: метод unlock -description: Вы можете узнать о методе unlock в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, пробуйте примеры кода и живые демо, загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Разблокируйте заблокированную ячейку, несколько ячеек или диапазон ячеек в DHTMLX Spreadsheet с помощью метода unlock(), чтобы пользователи снова могли их редактировать. --- # unlock() diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/awaitredraw.md b/i18n/ru/docusaurus-plugin-content-docs/current/awaitredraw.md index c254e1ea..df209378 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/awaitredraw.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/awaitredraw.md @@ -1,7 +1,7 @@ --- sidebar_label: Хелпер AwaitRedraw title: Хелпер AwaitRedraw -description: Вы можете изучить хелпер AwaitRedraw в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Выполните код после того, как DHTMLX Spreadsheet завершит отрисовку, с помощью хелпера dhx.awaitRedraw, для методов API, которые срабатывают только после отображения компонента на странице. --- # Хелпер AwaitRedraw {#awaitredraw-helper} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/data_formatting.md b/i18n/ru/docusaurus-plugin-content-docs/current/data_formatting.md index a4327475..4e80fb71 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/data_formatting.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/data_formatting.md @@ -1,7 +1,7 @@ --- sidebar_label: Форматирование данных title: Форматирование данных -description: Вы можете узнать о форматировании данных в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Оформите данные ячеек в DHTMLX Spreadsheet с помощью панели инструментов, включая цвет текста и фона, полужирный шрифт и курсив, выравнивание, перенос текста и границы ячеек, а также очистите стили и значения. --- # Форматирование данных {#data-formatting} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/functions.md b/i18n/ru/docusaurus-plugin-content-docs/current/functions.md index 1ec7dd0e..b78315c9 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/functions.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/functions.md @@ -1,7 +1,7 @@ --- sidebar_label: Формулы и функции title: Формулы и функции -description: В документации вы можете узнать о формулах и функциях библиотеки DHTMLX JavaScript Spreadsheet. Изучайте руководства разработчика и справочник API, просматривайте примеры кода и живые демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Используйте в DHTMLX Spreadsheet формулы, совместимые с Excel и Google Sheets, включая математические, финансовые, строковые функции, функции даты и поиска, добавляйте пользовательские формулы и получайте формулу ячейки. --- # Формулы и функции {#formulas-and-functions} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/handling_events.md b/i18n/ru/docusaurus-plugin-content-docs/current/handling_events.md index baba5848..7cfaf25b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/handling_events.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/handling_events.md @@ -1,7 +1,7 @@ --- sidebar_label: Обработка событий title: Обработка событий -description: Вы можете узнать об обработке событий в библиотеке DHTMLX JavaScript Spreadsheet в документации. Просматривайте руководства для разработчиков и справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Подключайте и отключайте обработчики событий и вызывайте события в DHTMLX Spreadsheet с помощью методов events.on(), events.detach() и events.fire(). --- # Обработка событий {#event-handling} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/how_to_start.md b/i18n/ru/docusaurus-plugin-content-docs/current/how_to_start.md index b1413a33..e119da96 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/how_to_start.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/how_to_start.md @@ -1,7 +1,7 @@ --- sidebar_label: Как начать title: Как начать работу с DHTMLX Spreadsheet -description: Вы можете узнать, как начать работу с библиотекой DHTMLX JavaScript Spreadsheet в документации. Просматривайте руководства для разработчиков и справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Запустите DHTMLX Spreadsheet на странице за четыре шага, от подключения исходных файлов или установки npm-пакета до настройки компонента и загрузки данных. --- # Как начать {#how-to-start} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/index.md index a844187e..365859e0 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/index.md @@ -2,7 +2,7 @@ sidebar_label: Обзор Spreadsheet title: Обзор DHTMLX Spreadsheet slug: / -description: Вы можете ознакомиться с обзором библиотеки JavaScript Spreadsheet в документации DHTMLX. Просматривайте руководства для разработчиков и справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Обзор DHTMLX Spreadsheet, JavaScript-компонента для редактирования и форматирования табличных данных, с его панелью инструментов, строкой редактирования, сеткой, меню и контекстным меню. --- # Обзор DHTMLX Spreadsheet {#dhtmlx-spreadsheet-overview} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/initialization.md b/i18n/ru/docusaurus-plugin-content-docs/current/initialization.md index 0d69c371..dd023bec 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/initialization.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/initialization.md @@ -1,7 +1,7 @@ --- sidebar_label: Инициализация title: Инициализация -description: Вы можете узнать об инициализации библиотеки DHTMLX JavaScript Spreadsheet в документации. Просматривайте руководства для разработчиков и справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Инициализируйте DHTMLX Spreadsheet на странице, подключив исходные файлы, добавив контейнер и вызвав конструктор dhx.Spreadsheet с объектом конфигурации. --- # Инициализация {#initialization} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/loading_data.md b/i18n/ru/docusaurus-plugin-content-docs/current/loading_data.md index 782d98ab..699e56b9 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/loading_data.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/loading_data.md @@ -1,7 +1,7 @@ --- sidebar_label: Загрузка и экспорт данных title: Загрузка данных -description: Вы можете узнать о загрузке данных в библиотеке DHTMLX JavaScript Spreadsheet в документации. Просматривайте руководства для разработчиков и справочник API, пробуйте примеры кода и живые демо, а также загружайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Загрузите в DHTMLX Spreadsheet данные JSON, CSV или Excel со стилями, заблокированными ячейками и ссылками из файла или локального источника, сохраните и восстановите состояние и экспортируйте данные в Excel или JSON. --- # Загрузка и экспорт данных {#data-loading-and-export} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/migration.md b/i18n/ru/docusaurus-plugin-content-docs/current/migration.md index c080a07b..0508a8db 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/migration.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/migration.md @@ -1,7 +1,7 @@ --- sidebar_label: Миграция на новые версии title: Миграция -description: Вы можете узнать о миграции в документации библиотеки DHTMLX JavaScript Spreadsheet. Изучите руководства разработчика и справочник API, ознакомьтесь с примерами кода и живыми демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Перейдите на новую версию DHTMLX Spreadsheet, сверившись со списком устаревших, изменённых и удалённых свойств, методов и событий каждой версии и их замен. --- # Миграция на новые версии {#migration-to-newer-versions} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/number_formatting.md b/i18n/ru/docusaurus-plugin-content-docs/current/number_formatting.md index 999912f2..37341bce 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/number_formatting.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/number_formatting.md @@ -1,7 +1,7 @@ --- sidebar_label: Форматирование чисел title: Форматирование чисел -description: Вы можете изучить руководство разработчика по форматированию чисел в документации библиотеки DHTMLX JavaScript Spreadsheet. Изучите руководства разработчика и справочник API, ознакомьтесь с примерами кода и живыми демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Применяйте к значениям ячеек в DHTMLX Spreadsheet числовой, денежный, процентный, экспоненциальный форматы, форматы даты и времени, локализуйте их, создавайте пользовательские маски формата и задавайте или получайте формат ячейки. --- # Форматирование чисел {#number-formatting} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/number_formatting_guide.md b/i18n/ru/docusaurus-plugin-content-docs/current/number_formatting_guide.md index f81917aa..4eede895 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/number_formatting_guide.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/number_formatting_guide.md @@ -1,7 +1,7 @@ --- sidebar_label: Форматирование чисел title: Руководство по форматированию чисел -description: Вы можете изучить руководство пользователя по форматированию чисел в документации библиотеки DHTMLX JavaScript Spreadsheet. Изучите руководства разработчика и справочник API, ознакомьтесь с примерами кода и живыми демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Выберите формат чисел для значений ячеек в DHTMLX Spreadsheet на панели инструментов, например числовой, денежный, процентный, формат даты, времени или текста. --- # Форматирование чисел {#number-formatting} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/sorting_data.md b/i18n/ru/docusaurus-plugin-content-docs/current/sorting_data.md index 48df426e..88736fdb 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/sorting_data.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/sorting_data.md @@ -1,7 +1,7 @@ --- sidebar_label: Сортировка данных title: Сортировка данных -description: Вы можете узнать о сортировке данных в документации библиотеки DHTMLX JavaScript Spreadsheet. Изучите руководства разработчика и справочник API, ознакомьтесь с примерами кода и живыми демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Сортируйте данные в DHTMLX Spreadsheet от A до Z или от Z до A по столбцу или по выделенному диапазону ячеек с помощью команды сортировки контекстного меню. --- # Сортировка данных {#sorting-data} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/svelte_integration.md b/i18n/ru/docusaurus-plugin-content-docs/current/svelte_integration.md index 87747ef8..a05763b1 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/svelte_integration.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/svelte_integration.md @@ -1,7 +1,7 @@ --- sidebar_label: Интеграция со Svelte title: Интеграция со Svelte -description: Вы можете узнать об интеграции DHTMLX JavaScript Spreadsheet со Svelte в документации. Изучите руководства разработчика и справочник API, ознакомьтесь с примерами кода и живыми демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Используйте DHTMLX Spreadsheet в приложении Svelte. Создайте проект, добавьте Spreadsheet как компонент Svelte, загрузите данные и обработайте события. --- # Интеграция со Svelte {#integration-with-svelte} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md b/i18n/ru/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md index bb612fa8..eb8352d1 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md @@ -1,7 +1,7 @@ --- sidebar_label: Настройка встроенных тем title: Настройка встроенных тем -description: Вы можете изучить настройку тем в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Измените цвета встроенных тем DHTMLX Spreadsheet, переопределив их CSS-переменные, для всех тем сразу или для отдельной темы. --- # Настройка встроенных тем {#configuring-built-in-themes} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/themes/custom_theme.md b/i18n/ru/docusaurus-plugin-content-docs/current/themes/custom_theme.md index ac688e4a..7e6fceba 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/themes/custom_theme.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/themes/custom_theme.md @@ -1,7 +1,7 @@ --- sidebar_label: Пользовательская тема title: Пользовательская тема -description: Вы можете узнать, как создать пользовательскую тему, в документации библиотеки DHTMLX JavaScript Spreadsheet. Просматривайте руководства разработчика и справочник API, изучайте примеры кода и живые демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Создайте собственную цветовую тему для DHTMLX Spreadsheet с помощью CSS-переменных и примените её методом dhx.setTheme(). --- # Пользовательская тема {#custom-theme} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/using_typescript.md b/i18n/ru/docusaurus-plugin-content-docs/current/using_typescript.md index 10620877..1850af32 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/using_typescript.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/using_typescript.md @@ -1,7 +1,7 @@ --- sidebar_label: Поддержка TypeScript title: Поддержка TypeScript -description: Вы можете узнать об использовании TypeScript с библиотекой DHTMLX JavaScript Spreadsheet в документации. Изучите руководства разработчика и справочник API, ознакомьтесь с примерами кода и живыми демо, а также скачайте бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Используйте встроенные определения TypeScript в DHTMLX Spreadsheet для проверки типов, автодополнения и подсказок JSDoc в IDE. --- # Поддержка TypeScript {#typescript-support} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md index 9f7ee84e..3ebc6618 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md @@ -1,7 +1,7 @@ --- sidebar_label: Что нового title: Что нового в DHTMLX Spreadsheet -description: В документации вы можете узнать, что нового в библиотеке DHTMLX JavaScript Spreadsheet. Изучите руководства для разработчиков и справочник API, попробуйте примеры кода и живые демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Список изменений DHTMLX Spreadsheet с новыми возможностями, обновлениями, исправлениями и критическими изменениями каждой версии. --- # Что нового {#whats-new} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/work_with_sheets.md b/i18n/ru/docusaurus-plugin-content-docs/current/work_with_sheets.md index 185efe8b..c29c966a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/work_with_sheets.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/work_with_sheets.md @@ -1,7 +1,7 @@ --- sidebar_label: Работа с листами title: Работа с листами -description: В документации вы можете узнать о работе с листами в библиотеке DHTMLX JavaScript Spreadsheet. Изучите руководства для разработчиков и справочник API, попробуйте примеры кода и живые демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Добавляйте, удаляйте, переименовывайте и переключайте листы в DHTMLX Spreadsheet с помощью нижней панели инструментов и вкладок листов, а также ссылайтесь в формулах на ячейки других листов. --- # Работа с листами {#work-with-sheets} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/working_with_cells.md b/i18n/ru/docusaurus-plugin-content-docs/current/working_with_cells.md index 9db67c52..4b5981ca 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/working_with_cells.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/working_with_cells.md @@ -1,7 +1,7 @@ --- sidebar_label: Работа с ячейками title: Работа с ячейками -description: В документации вы можете узнать о работе с ячейками в библиотеке DHTMLX JavaScript Spreadsheet. Изучите руководства для разработчиков и справочник API, попробуйте примеры кода и живые демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Задавайте и получайте значения и стили ячеек, добавляйте проверку данных и ссылки, редактируйте, блокируйте, объединяйте и выделяйте ячейки в DHTMLX Spreadsheet через API. --- # Работа с ячейками {#work-with-cells} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/working_with_sheets.md b/i18n/ru/docusaurus-plugin-content-docs/current/working_with_sheets.md index 2d0c93a8..59df2b74 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/working_with_sheets.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/working_with_sheets.md @@ -1,7 +1,7 @@ --- sidebar_label: Работа с листами title: Работа с листами -description: В документации вы можете узнать о работе с листами в библиотеке DHTMLX JavaScript Spreadsheet. Изучите руководства для разработчиков и справочник API, попробуйте примеры кода и живые демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Загружайте несколько листов в DHTMLX Spreadsheet, добавляйте, удаляйте, получайте, очищайте и переключайте листы с помощью методов API. --- # Работа с листами {#work-with-sheets} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/working_with_ssheet.md b/i18n/ru/docusaurus-plugin-content-docs/current/working_with_ssheet.md index bec6cf04..d70e4f80 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/working_with_ssheet.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/working_with_ssheet.md @@ -1,7 +1,7 @@ --- sidebar_label: Работа с таблицей title: Работа с таблицей -description: В документации вы можете узнать о работе с таблицей в библиотеке DHTMLX JavaScript Spreadsheet. Изучите руководства для разработчиков и справочник API, попробуйте примеры кода и живые демо, а также загрузите бесплатную 30-дневную ознакомительную версию DHTMLX Spreadsheet. +description: Отменяйте и повторяйте действия, добавляйте, удаляйте, закрепляйте и скрывайте строки и столбцы, подгоняйте ширину столбцов, фильтруйте, ищите и сортируйте данные и очищайте DHTMLX Spreadsheet через API. --- # Работа с таблицей {#work-with-spreadsheet} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md index c3f17c89..b42ad3cc 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_detach_method.md @@ -1,7 +1,7 @@ --- sidebar_label: detach() title: detach events bus 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 detach events bus 方法。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载免费 30 天试用版的 DHTMLX Spreadsheet。 +description: 使用 events.detach() 方法按事件名称从 DHTMLX Spreadsheet 中解除通过 on() 方法绑定的事件处理函数。 --- # detach() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md index c888333f..fed2cac8 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_fire_method.md @@ -1,7 +1,7 @@ --- sidebar_label: fire() title: fire events bus 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 fire events bus 方法。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载免费 30 天试用版的 DHTMLX Spreadsheet。 +description: 使用 events.fire() 方法触发 DHTMLX Spreadsheet 的内部事件,并传入事件名称和事件数据数组。 --- # fire() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md index 22afa899..b075f9cb 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/eventsbus_on_method.md @@ -1,7 +1,7 @@ --- sidebar_label: on() title: on events bus 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 on events bus 方法。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载免费 30 天试用版的 DHTMLX Spreadsheet。 +description: 使用 events.on() 方法为 DHTMLX Spreadsheet 的内部事件绑定处理函数,例如在单元格样式更改时作出响应。 --- # on() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/export_json_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/export_json_method.md index c87cbf48..75f849e5 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/export_json_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/export_json_method.md @@ -1,7 +1,7 @@ --- sidebar_label: json() title: json 导出方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 json 导出方法。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载免费 30 天试用版的 DHTMLX Spreadsheet。 +description: 使用 export.json() 方法将 DHTMLX Spreadsheet 的数据导出为 JSON 文件。 --- # json() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md index 6d6dd3f0..bd2cf0d4 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/export_xlsx_method.md @@ -1,7 +1,7 @@ --- sidebar_label: xlsx() title: xlsx 导出方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 xlsx 导出方法。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载免费 30 天试用版的 DHTMLX Spreadsheet。 +description: 使用 export.xlsx() 方法将 DHTMLX Spreadsheet 的数据导出为 Excel (.xlsx) 文件,并可选择指定文件名。 --- # xlsx() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md index 8dcad3d2..e0e96ec7 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/actions_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Spreadsheet 操作 title: 操作概览 -description: 您可以在文档中查看 DHTMLX JavaScript Spreadsheet 库的操作概览。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载免费 30 天试用版的 DHTMLX Spreadsheet。 +description: DHTMLX Spreadsheet 操作(action)概述,以及可在 beforeAction 和 afterAction 事件中处理的完整操作列表。 --- # 操作概览 {#actions-overview} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/eventbus_overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/eventbus_overview.md index d5127e7b..ed43b815 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/eventbus_overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/eventbus_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Event Bus 方法概览 title: Event Bus 方法概览 -description: 您可以在文档中查看 DHTMLX JavaScript Spreadsheet 库的 Event Bus 方法概览。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载免费 30 天试用版的 DHTMLX Spreadsheet。 +description: DHTMLX Spreadsheet 事件总线方法列表,用于绑定、解除和触发事件。 --- # Event Bus 方法概览 {#event-bus-methods-overview} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/events_overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/events_overview.md index f832aaa4..b98991ae 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/events_overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/events_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: 事件概览 title: 事件概览 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中查看事件概览。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载免费 30 天试用版的 DHTMLX Spreadsheet。 +description: DHTMLX Spreadsheet 事件列表,这些事件在执行操作、加载数据、编辑单元格、选择、设置焦点和切换工作表时触发。 --- # 事件概览 {#events-overview} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/export_overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/export_overview.md index 49289747..c2f165fc 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/export_overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/export_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: 导出方法概览 title: 导出方法概览 -description: 您可以在文档中查看 DHTMLX JavaScript Spreadsheet 库的导出方法概览。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载免费 30 天试用版的 DHTMLX Spreadsheet。 +description: DHTMLX Spreadsheet Export 模块方法列表,用于将数据保存为 JSON 或 Excel (.xlsx) 文件。 --- # 导出方法概览 {#export-methods-overview} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/sheetmanager_overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/sheetmanager_overview.md index ff15d4db..c171427e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/sheetmanager_overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/overview/sheetmanager_overview.md @@ -1,7 +1,7 @@ --- sidebar_label: Sheet Manager API 概览 title: Sheet Manager API 概览 -description: 您可以在文档中查看 DHTMLX JavaScript Spreadsheet 库的 Sheet Manager API 概览。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: DHTMLX Spreadsheet 工作表管理器方法列表,用于添加、删除、清空、获取和切换工作表。 --- # Sheet Manager API 概览 {#sheet-manager-api-overview} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md index 2ad6d992..9d3f5fdb 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_getfocusedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFocusedCell() title: getFocusedCell selection 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 getFocusedCell selection 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 selection.getFocusedCell() 方法获取 DHTMLX Spreadsheet 中焦点(活动)单元格的 id。 --- # getFocusedCell() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md index 1dd05f82..5aadddd2 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_getselectedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getSelectedCell() title: getSelectedCell selection 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 getSelectedCell selection 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 selection.getSelectedCell() 方法获取 DHTMLX Spreadsheet 中选中单元格的 id 或区域。 --- # getSelectedCell() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md index 1e1e412e..fc5ac1b4 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_removeselectedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: removeSelectedCell() title: removeSelectedCell selection 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 Selection 的 removeSelectedCell 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 selection.removeSelectedCell() 方法取消 DHTMLX Spreadsheet 中指定单元格或单元格区域的选择。 --- # removeSelectedCell() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md index 74773e52..3cd07057 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/selection_setselectedcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setSelectedCell() title: setSelectedCell selection 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 setSelectedCell selection 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 selection.setSelectedCell() 方法在 DHTMLX Spreadsheet 中选择一个单元格、多个单元格或单元格区域,并可选择滚动到该位置。 --- # setSelectedCell() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_add_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_add_method.md index f0a7243c..7fb794b5 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_add_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_add_method.md @@ -1,7 +1,7 @@ --- sidebar_label: add() title: add 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 Sheet Manager 的 add 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 sheets.add() 方法向 DHTMLX Spreadsheet 添加一个新的空工作表,该方法返回新工作表的 id(需要启用 multiSheets 选项)。 --- # add() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_clear_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_clear_method.md index 00eca4c4..8989b49f 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_clear_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_clear_method.md @@ -1,7 +1,7 @@ --- sidebar_label: clear() title: clear 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 Sheet Manager 的 clear 方法。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费评估版本。 +description: 使用 sheets.clear() 方法清除 DHTMLX Spreadsheet 中工作表的值、样式和格式,而不删除工作表本身。 --- # clear() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_get_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_get_method.md index 3a8bea37..5d342ef6 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_get_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_get_method.md @@ -1,7 +1,7 @@ --- sidebar_label: get() title: get 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 Sheet Manager 的 get 方法。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费评估版本。 +description: 使用 sheets.get() 方法按 id 获取 DHTMLX Spreadsheet 中的工作表对象。 --- # get() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_getactive_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_getactive_method.md index 8885b6e3..fe790ee7 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_getactive_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_getactive_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getActive() title: getActive 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 Sheet Manager 的 getActive 方法。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费评估版本。 +description: 使用 sheets.getActive() 方法获取 DHTMLX Spreadsheet 的活动(可见)工作表,该方法返回工作表的 id 和名称。 --- # getActive() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_getall_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_getall_method.md index 2d1aec0c..f306584e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_getall_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_getall_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getAll() title: getAll 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 Sheet Manager 的 getAll 方法。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费评估版本。 +description: 使用 sheets.getAll() 方法获取 DHTMLX Spreadsheet 的所有工作表,该方法返回包含工作表 id 和名称的对象数组。 --- # getAll() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_remove_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_remove_method.md index 85301adb..d7f38758 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_remove_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_remove_method.md @@ -1,7 +1,7 @@ --- sidebar_label: remove() title: remove 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 Sheet Manager 的 remove 方法。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费评估版本。 +description: 使用 sheets.remove() 方法按 id 从 DHTMLX Spreadsheet 中删除工作表,至少会保留一个工作表;删除活动工作表时会切换到另一个工作表。 --- # remove() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_setactive_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_setactive_method.md index de3f4b6e..131ea9d8 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_setactive_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/sheetmanager_setactive_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setActive() title: setActive 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 Sheet Manager 的 setActive 方法。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费评估版本。 +description: 使用 sheets.setActive() 方法将 DHTMLX Spreadsheet 的活动(可见)工作表切换为指定 id 的工作表。 --- # setActive() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md index cef040f7..346931a4 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addcolumn_method.md @@ -1,7 +1,7 @@ --- sidebar_label: addColumn() title: addColumn 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 addColumn 方法。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费评估版本。 +description: 使用 addColumn() 方法向 DHTMLX Spreadsheet 添加一个空列,该列插入到指定单元格所在列的位置,现有列向右移动。 --- # addColumn() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addformula_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addformula_method.md index 230b8c65..dc1cd8e8 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addformula_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addformula_method.md @@ -1,7 +1,7 @@ --- sidebar_label: addFormula() title: addFormula 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 addFormula 方法。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费评估版本。 +description: 使用 addFormula() 方法在 DHTMLX Spreadsheet 中注册自定义公式函数,以便在单元格公式中通过其大写名称使用。 --- # addFormula() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md index 4e7329de..9da54fea 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_addrow_method.md @@ -1,7 +1,7 @@ --- sidebar_label: addRow() title: addRow 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 addRow 方法。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费评估版本。 +description: 使用 addRow() 方法向 DHTMLX Spreadsheet 添加一个空行,该行插入到指定单元格所在行的位置,现有行向下移动。 --- # addRow() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md index d45a1fc7..3bc0659b 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afteraction_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterAction title: afterAction 事件 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 afterAction 事件。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费评估版本。 +description: 处理 DHTMLX Spreadsheet 的 afterAction 事件,该事件在操作执行后触发,并接收操作名称及其参数,例如单元格、新值和旧值。 --- # afterAction diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md index 9e4e59fb..de617da2 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterclear_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterClear title: afterClear 事件 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 afterClear 事件。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 处理在 DHTMLX Spreadsheet 被清空后触发的 afterClear 事件(自 v4.3 起已弃用,请改用 afterAction 事件)。 --- # afterClear diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterdataloaded_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterdataloaded_event.md index ce287889..f1c151c5 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterdataloaded_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterdataloaded_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterDataLoaded title: afterDataLoaded 事件 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 afterDataLoaded 事件。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 afterDataLoaded 事件在数据加载到 DHTMLX Spreadsheet 之后执行代码,例如在加载完成时显示一条消息。 --- # afterDataLoaded diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md index 67503977..0ffbc0f9 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditend_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterEditEnd title: afterEditEnd 事件 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 afterEditEnd 事件。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 afterEditEnd 事件处理 DHTMLX Spreadsheet 中单元格编辑的结束,该事件接收单元格的 id 及其新值。 --- # afterEditEnd diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md index 60ce3805..bb13cc3d 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftereditstart_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterEditStart title: afterEditStart 事件 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 afterEditStart 事件。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 afterEditStart 事件处理 DHTMLX Spreadsheet 中单元格编辑的开始,该事件接收单元格的 id 及其值。 --- # afterEditStart diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md index ba99b891..73da1bd6 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterfocusset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterFocusSet title: afterFocusSet 事件 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 afterFocusSet 事件。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 afterFocusSet 事件跟踪 DHTMLX Spreadsheet 中获得焦点的单元格,该事件在单元格获得焦点后触发,并接收单元格的 id。 --- # afterFocusSet diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md index 9b118484..3a0c725f 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_afterselectionset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterSelectionSet title: afterSelectionSet 事件 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 afterSelectionSet 事件。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 afterSelectionSet 事件响应 DHTMLX Spreadsheet 中单元格的选择,该事件在单元格被选中后触发,并接收它们的 id。 --- # afterSelectionSet diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md index 276f2572..eb70812a 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_aftersheetchange_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterSheetChange title: afterSheetChange 事件 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 afterSheetChange 事件。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 afterSheetChange 事件跟踪 DHTMLX Spreadsheet 中工作表的切换,该事件接收新活动工作表的名称和 id。 --- # afterSheetChange diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md index e4cfd009..f52e09f7 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeaction_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeAction title: beforeAction 事件 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 beforeAction 事件。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 beforeAction 事件拦截 DHTMLX Spreadsheet 中的操作,该事件接收操作的名称和参数,当处理函数返回 false 时取消该操作。 --- # beforeAction diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md index 071dee44..63225db9 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeclear_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeClear title: beforeClear 事件 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 beforeClear 事件。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用已弃用的 beforeClear 事件,或使用替代它的 beforeAction 事件和 clear 操作,阻止清空 DHTMLX Spreadsheet。 --- # beforeClear diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md index aec10596..880b67c0 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditend_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeEditEnd title: beforeEditEnd 事件 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 beforeEditEnd 事件。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 beforeEditEnd 事件在 DHTMLX Spreadsheet 中结束编辑之前检查单元格的值,返回 false 可使编辑器保持打开。 --- # beforeEditEnd diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md index fad98bc3..d51ab89d 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeeditstart_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeEditStart title: beforeEditStart 事件 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 beforeEditStart 事件。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费试用版本。 +description: 使用 beforeEditStart 事件控制 DHTMLX Spreadsheet 中哪些单元格可以编辑,返回 false 可阻止编辑器打开。 --- # beforeEditStart diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md index 680d1e21..31a5c37b 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforefocusset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeFocusSet title: beforeFocusSet 事件 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 beforeFocusSet 事件。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费试用版本。 +description: 使用 beforeFocusSet 事件控制 DHTMLX Spreadsheet 中的焦点,该事件在单元格获得焦点之前触发,当处理函数返回 false 时阻止设置焦点。 --- # beforeFocusSet diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md index 2de51725..18deae6c 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforeselectionset_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeSelectionSet title: beforeSelectionSet 事件 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 beforeSelectionSet 事件。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费试用版本。 +description: 使用 beforeSelectionSet 事件控制 DHTMLX Spreadsheet 中单元格的选择,该事件在选中单元格之前触发,当处理函数返回 false 时阻止选择。 --- # beforeSelectionSet diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md index 225314d1..6803f291 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_beforesheetchange_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeSheetChange title: beforeSheetChange 事件 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 beforeSheetChange 事件。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费试用版本。 +description: 使用 beforeSheetChange 事件控制 DHTMLX Spreadsheet 中工作表的切换,返回 false 可使当前工作表保持活动状态。 --- # beforeSheetChange diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md index d55619f6..e93714d7 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_clear_method.md @@ -1,7 +1,7 @@ --- sidebar_label: clear() title: clear 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 clear 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费试用版本。 +description: 使用 clear() 方法从 DHTMLX Spreadsheet 中删除所有数据。 --- # clear() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md index 78bed543..82b10f7a 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_colscount_config.md @@ -1,7 +1,7 @@ --- sidebar_label: colsCount title: colsCount 配置项 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 colsCount 配置项。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费试用版本。 +description: 使用 colsCount 属性设置 DHTMLX Spreadsheet 在初始化时显示的列数。 --- # colsCount diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md index 3175eae1..f7eaacb5 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_eachcell_method.md @@ -1,7 +1,7 @@ --- sidebar_label: eachCell() title: eachCell 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 eachCell 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费试用版本。 +description: 使用 eachCell() 方法遍历 DHTMLX Spreadsheet 中的单元格区域或选中的单元格,该方法会以每个单元格的名称和值调用一个函数。 --- # eachCell() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md index 93f51c55..600f346d 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_editline_config.md @@ -1,7 +1,7 @@ --- sidebar_label: editLine title: editLine 配置项 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 editLine 配置项。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费试用版本。 +description: 使用 editLine 属性显示或隐藏 DHTMLX Spreadsheet 的编辑栏,该属性默认开启。 --- # editLine diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md index dbc2851e..7e2323a3 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_endedit_method.md @@ -1,7 +1,7 @@ --- sidebar_label: endEdit() title: endEdit 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 endEdit 方法。浏览开发者指南和 API 参考,试用代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 endEdit() 方法结束 DHTMLX Spreadsheet 中选定单元格的编辑,该方法会关闭编辑器并保存输入的值。 --- # endEdit() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md index 2cb1513a..ebb6c4bb 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_exportmodulepath_config.md @@ -1,7 +1,7 @@ --- sidebar_label: exportModulePath title: exportModulePath 配置 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 exportModulePath 配置。浏览开发者指南和 API 参考,试用代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 exportModulePath 属性设置 DHTMLX Spreadsheet 中 JSON2Excel 导出模块的 worker.js 文件路径,例如在您自己的服务器上导出到 Excel。 --- # exportModulePath diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md index 5b9e41d7..1e4893da 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_fitcolumn_method.md @@ -1,7 +1,7 @@ --- sidebar_label: fitColumn() title: fitColumn 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 fitColumn 方法。浏览开发者指南和 API 参考,试用代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 fitColumn() 方法将 DHTMLX Spreadsheet 中列的宽度调整为与其最长值匹配。 --- # fitColumn() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md index a0df3b34..5cedeb7f 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_formats_config.md @@ -1,7 +1,7 @@ --- sidebar_label: formats title: formats 配置 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 formats 配置。浏览开发者指南和 API 参考,试用代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 formats 属性定义 DHTMLX Spreadsheet 中可用的数字格式,该属性是一个对象数组,包含每种格式的 id、掩码、名称和示例。 --- # formats diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_freezecols_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_freezecols_method.md index 20042b93..918c59b9 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_freezecols_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_freezecols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: freezeCols() title: freezeCols 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 freezeCols 方法。浏览开发者指南和 API 参考,试用代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 freezeCols() 方法冻结 DHTMLX Spreadsheet 中的列,该方法会在当前或其他工作表中固定指定单元格或选中单元格之前的列。 --- # freezeCols() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_freezerows_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_freezerows_method.md index 567bc144..44e26fc9 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_freezerows_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_freezerows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: freezeRows() title: freezeRows 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 freezeRows 方法。浏览开发者指南和 API 参考,试用代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 freezeRows() 方法冻结 DHTMLX Spreadsheet 中的行,该方法会在当前或其他工作表中固定指定单元格或选中单元格之前的行。 --- # freezeRows() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md index 99d71e01..0044ea1c 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getfilter_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFilter() title: getFilter 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 getFilter 方法。浏览开发者指南和 API 参考,试用代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 getFilter() 方法获取 DHTMLX Spreadsheet 中工作表的筛选条件,该方法返回已筛选的单元格区域和筛选规则。 --- # getFilter() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md index a3072e59..ada92520 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getformat_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFormat() title: getFormat 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 getFormat 方法。浏览开发者指南和 API 参考,试用代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 getFormat() 方法获取 DHTMLX Spreadsheet 中单元格或单元格区域的值所应用的数字格式。 --- # getFormat() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md index cfcea2fe..cae9a565 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getformula_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getFormula() title: getFormula 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 getFormula 方法。浏览开发者指南和 API 参考,试用代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 getFormula() 方法获取 DHTMLX Spreadsheet 中单元格的公式,包括其他工作表中的单元格。 --- # getFormula() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md index a9b07bd1..9044774a 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getstyle_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getStyle() title: getStyle 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 getStyle 方法。浏览开发者指南和 API 参考,试用代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 getStyle() 方法获取 DHTMLX Spreadsheet 中单元格或单元格区域所应用的样式。 --- # getStyle() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md index 0981f9a9..d9886cf8 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_getvalue_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getValue() title: getValue 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 getValue 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 getValue() 方法获取 DHTMLX Spreadsheet 中单元格的值或单元格区域的值。 --- # getValue() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md index b71476e6..18b2b834 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_groupfill_event.md @@ -1,7 +1,7 @@ --- sidebar_label: groupFill title: groupFill 事件 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 groupFill 事件。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 groupFill 事件处理 DHTMLX Spreadsheet 中的单元格自动填充,该事件会将获得焦点的单元格和选中的单元格传递给回调函数。 --- # groupFill diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_hidecols_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_hidecols_method.md index 92ddb2fc..c376b3ba 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_hidecols_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_hidecols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: hideCols() title: hideCols 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 hideCols 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 hideCols() 方法隐藏 DHTMLX Spreadsheet 中的一列或多列,可通过单元格 id、单元格区域或选中的单元格指定列。 --- # hideCols() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_hiderows_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_hiderows_method.md index 2814209f..71c90c48 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_hiderows_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_hiderows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: hideRows() title: hideRows 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 hideRows 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 hideRows() 方法隐藏 DHTMLX Spreadsheet 中的一行或多行,可通过单元格 id、单元格区域或选中的单元格指定行。 --- # hideRows() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md index a9190699..d78d99bf 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_hidesearch_method.md @@ -1,7 +1,7 @@ --- sidebar_label: hideSearch() title: hideSearch 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 hideSearch 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 hideSearch() 方法隐藏 DHTMLX Spreadsheet 的搜索栏,例如在通过 search() 方法打开搜索后将其关闭。 --- # hideSearch() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md index f287e793..3d012896 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_importmodulepath_config.md @@ -1,7 +1,7 @@ --- sidebar_label: importModulePath title: importModulePath 配置项 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 importModulePath 配置项。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 importModulePath 属性设置 Excel2json 库的 worker.js 文件路径,DHTMLX Spreadsheet 使用该库导入 Excel 文件。 --- # importModulePath diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md index 7f5e2734..c46e074d 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_insertlink_method.md @@ -1,7 +1,7 @@ --- sidebar_label: insertLink() title: insertLink 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 insertLink 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 insertLink() 方法在 DHTMLX Spreadsheet 的单元格中插入超链接,或移除超链接并保留单元格文本。 --- # insertLink() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md index 1a39154b..8c447a12 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_islocked_method.md @@ -1,7 +1,7 @@ --- sidebar_label: isLocked() title: isLocked 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 isLocked 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 isLocked() 方法检查 DHTMLX Spreadsheet 中的单元格或区域中的任一单元格是否已锁定。 --- # isLocked() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md index abd59533..42d0a848 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_load_method.md @@ -1,7 +1,7 @@ --- sidebar_label: load() title: load 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 load 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 load() 方法将外部 JSON、CSV 或 XLSX 文件中的数据加载到 DHTMLX Spreadsheet,该方法返回一个 promise。 --- # load() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md index a36be8c1..9462ebab 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_localization_config.md @@ -1,7 +1,7 @@ --- sidebar_label: localization title: localization 配置项 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 localization 配置项。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 localization 属性设置 DHTMLX Spreadsheet 的小数分隔符和千位分隔符、货币符号以及日期和时间格式。 --- # localization diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md index 02ee115a..e7d0923a 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_lock_method.md @@ -1,7 +1,7 @@ --- sidebar_label: lock() title: lock 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 lock 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 lock() 方法锁定 DHTMLX Spreadsheet 中的单元格、单元格区域或多个单元格,使用户无法编辑它们。 --- # lock() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md index 705d5999..d69e857c 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_menu_config.md @@ -1,7 +1,7 @@ --- sidebar_label: menu title: menu 配置项 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 menu 配置项。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 menu 属性显示或隐藏 DHTMLX Spreadsheet 的菜单。 --- # menu diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md index 0edb90ac..3aced61a 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_mergecells_method.md @@ -1,7 +1,7 @@ --- sidebar_label: mergeCells() title: mergeCells 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 mergeCells 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 mergeCells() 方法将 DHTMLX Spreadsheet 中的单元格区域合并为一个单元格,或拆分已合并的单元格。 --- # mergeCells() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md index 3f95b203..2ac3acaa 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_multisheets_config.md @@ -1,7 +1,7 @@ --- sidebar_label: multiSheets title: multiSheets 配置项 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 multiSheets 配置项。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 multiSheets 属性开启或关闭 DHTMLX Spreadsheet 中的多工作表功能,该属性会显示或隐藏底部的工作表标签栏。 --- # multiSheets diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md index 6a164df6..1bc47c2e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_parse_method.md @@ -1,7 +1,7 @@ --- sidebar_label: parse() title: parse 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 parse 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 parse() 方法将本地数据源中的数据加载到 DHTMLX Spreadsheet,包括单元格值、样式、格式、编辑器、链接以及多个工作表。 --- # parse() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md index e06427e3..4024698d 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_redo_method.md @@ -1,7 +1,7 @@ --- sidebar_label: redo() title: redo 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 redo 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 redo() 方法在 DHTMLX Spreadsheet 中重新执行已撤销的操作。 --- # redo() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md index f320d2eb..41b58d07 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_rowscount_config.md @@ -1,7 +1,7 @@ --- sidebar_label: rowsCount title: rowsCount 配置项 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 rowsCount 配置项。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 rowsCount 属性设置 DHTMLX Spreadsheet 初始化时显示的行数。 --- # rowsCount diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md index e00cdfa4..d349d71f 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_search_method.md @@ -1,7 +1,7 @@ --- sidebar_label: search() title: search 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 search 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 search() 方法按值搜索 DHTMLX Spreadsheet 中的单元格,该方法返回找到的单元格 id,并可打开搜索栏并高亮显示匹配结果。 --- # search() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md index d071d08e..89f9d707 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_serialize_method.md @@ -1,7 +1,7 @@ --- sidebar_label: serialize() title: serialize 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 serialize 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 serialize() 方法将 DHTMLX Spreadsheet 的数据保存为 JSON 对象,其中包括工作表、单元格值、样式和数字格式。 --- # serialize() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md index d8a8c28e..354bd23e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setfilter_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setFilter() title: setFilter 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 setFilter 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 setFilter() 方法按条件或排除值筛选 DHTMLX Spreadsheet 中某列的数据,或重置筛选。 --- # setFilter() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md index fcd14e71..274eb39f 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setformat_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setFormat() title: setFormat 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 setFormat 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 setFormat() 方法将数字格式应用于 DHTMLX Spreadsheet 中单元格或单元格区域的值。 --- # setFormat() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md index 38a9a26f..a30c6394 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setstyle_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setStyle() title: setStyle 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 setStyle 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 setStyle() 方法为 DHTMLX Spreadsheet 中的一个单元格、多个单元格或单元格区域应用相同的样式,样式以对象或数组形式传入。 --- # setStyle() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md index b54a0282..f2b14c0d 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalidation_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setValidation() title: setValidation 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 setValidation 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 setValidation() 方法为 DHTMLX Spreadsheet 单元格添加下拉列表,选项来自单元格区域或数组,也可以移除数据验证。 --- # setValidation() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md index 88bf3b50..4989ef01 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_setvalue_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setValue() title: setValue 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 setValue 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 setValue() 方法为 DHTMLX Spreadsheet 中的一个单元格、多个单元格或单元格区域设置值,可传入单个值或在单元格间重复的值数组。 --- # setValue() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_showcols_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_showcols_method.md index b7d8c8d6..6fa5afb9 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_showcols_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_showcols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: showCols() title: showCols 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 showCols 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 showCols() 方法显示 DHTMLX Spreadsheet 中隐藏的列,列由传入的单元格或当前选中的单元格确定。 --- # showCols() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_showrows_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_showrows_method.md index f34830fa..c088397c 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_showrows_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_showrows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: showRows() title: showRows 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 showRows 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 showRows() 方法显示 DHTMLX Spreadsheet 中隐藏的行,行由传入的单元格或当前选中的单元格确定。 --- # showRows() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md index 760e3e39..28e3ee11 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_sortcells_method.md @@ -1,7 +1,7 @@ --- sidebar_label: sortCells() title: sortCells 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 sortCells 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 sortCells() 方法按列或单元格区域对 DHTMLX Spreadsheet 中的数据进行升序或降序排序。 --- # sortCells() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md index b9246e12..45b199a1 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_startedit_method.md @@ -1,7 +1,7 @@ --- sidebar_label: startEdit() title: startEdit 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 startEdit 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 startEdit() 方法开始编辑 DHTMLX Spreadsheet 中传入的或选中的单元格,可选择指定初始值。 --- # startEdit() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_toolbarblocks_config.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_toolbarblocks_config.md index 34698626..1bd7fa8e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_toolbarblocks_config.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_toolbarblocks_config.md @@ -1,7 +1,7 @@ --- sidebar_label: toolbarBlocks title: toolbarBlocks 配置项 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 toolbarBlocks 配置项。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 toolbarBlocks 属性选择 DHTMLX Spreadsheet 工具栏中显示的按钮块,例如 undo、colors、font、align 和 format。 --- # toolbarBlocks diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md index 9c8668f8..92444512 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_undo_method.md @@ -1,7 +1,7 @@ --- sidebar_label: undo() title: undo 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 undo 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 undo() 方法撤销 DHTMLX Spreadsheet 中的最近一次操作,并使用 redo() 方法重新应用。 --- # undo() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezecols_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezecols_method.md index 768fb63d..f8a37167 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezecols_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezecols_method.md @@ -1,7 +1,7 @@ --- sidebar_label: unfreezeCols() title: unfreezeCols 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 unfreezeCols 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 unfreezeCols() 方法解冻 DHTMLX Spreadsheet 中冻结的列,使其随表格其余部分一起滚动。 --- # unfreezeCols() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezerows_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezerows_method.md index 2953441f..e8a30c68 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezerows_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_unfreezerows_method.md @@ -1,7 +1,7 @@ --- sidebar_label: unfreezeRows() title: unfreezeRows 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 unfreezeRows 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 unfreezeRows() 方法解冻 DHTMLX Spreadsheet 中冻结的行,使其随表格其余部分一起滚动。 --- # unfreezeRows() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md index 4ac49dc5..229803b3 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_unlock_method.md @@ -1,7 +1,7 @@ --- sidebar_label: unlock() title: unlock 方法 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 unlock 方法。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 unlock() 方法解锁 DHTMLX Spreadsheet 中被锁定的一个单元格、多个单元格或单元格区域,使用户可以再次编辑它们。 --- # unlock() diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/awaitredraw.md b/i18n/zh/docusaurus-plugin-content-docs/current/awaitredraw.md index 0456521f..4f43ddb2 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/awaitredraw.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/awaitredraw.md @@ -1,7 +1,7 @@ --- sidebar_label: AwaitRedraw 辅助函数 title: AwaitRedraw 辅助函数 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解 AwaitRedraw 辅助函数。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 dhx.awaitRedraw 辅助函数在 DHTMLX Spreadsheet 完成渲染后运行代码,适用于仅在组件显示在页面上后才生效的 API 方法。 --- # AwaitRedraw 辅助函数 {#awaitredraw-helper} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/data_formatting.md b/i18n/zh/docusaurus-plugin-content-docs/current/data_formatting.md index f52f8592..dcb025f3 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/data_formatting.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/data_formatting.md @@ -1,7 +1,7 @@ --- sidebar_label: 数据格式化 title: 数据格式化 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解数据格式化的相关内容。浏览开发指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 通过 DHTMLX Spreadsheet 工具栏设置单元格数据的样式,包括文本和背景颜色、粗体和斜体、对齐方式、文本换行和单元格边框,并清除样式和值。 --- # 数据格式化 {#data-formatting} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/functions.md b/i18n/zh/docusaurus-plugin-content-docs/current/functions.md index 536ab206..8c5e28d3 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/functions.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/functions.md @@ -1,7 +1,7 @@ --- sidebar_label: 公式与函数 title: 公式与函数 -description: 您可以在本文档中了解 DHTMLX JavaScript Spreadsheet 库的公式与函数。浏览开发者指南和 API 参考,尝试代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 在 DHTMLX Spreadsheet 中使用与 Excel 和 Google Sheets 兼容的公式,包括数学、日期、查找、字符串和财务函数,添加自定义公式并获取单元格的公式。 --- # 公式与函数 {#formulas-and-functions} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/handling_events.md b/i18n/zh/docusaurus-plugin-content-docs/current/handling_events.md index 8650a386..4e02b900 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/handling_events.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/handling_events.md @@ -1,7 +1,7 @@ --- sidebar_label: 事件处理 title: 事件处理 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解事件处理的相关内容。浏览开发者指南和 API 参考、尝试代码示例和在线演示,并下载免费 30 天试用版 DHTMLX Spreadsheet。 +description: 使用 events.on()、events.detach() 和 events.fire() 方法在 DHTMLX Spreadsheet 中添加和移除事件监听器并调用事件。 --- # 事件处理 {#event-handling} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/how_to_start.md b/i18n/zh/docusaurus-plugin-content-docs/current/how_to_start.md index 04745b99..216652e6 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/how_to_start.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/how_to_start.md @@ -1,7 +1,7 @@ --- sidebar_label: 快速入门 title: DHTMLX Spreadsheet 快速入门 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解如何快速入门。浏览开发者指南和 API 参考、尝试代码示例和在线演示,并下载免费 30 天试用版 DHTMLX Spreadsheet。 +description: 通过四个步骤在页面上运行 DHTMLX Spreadsheet,从引入源文件或安装 npm 包,到配置组件和加载数据。 --- # 快速入门 {#how-to-start} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/index.md index 08d70068..09ce750f 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/index.md @@ -2,7 +2,7 @@ sidebar_label: Spreadsheet 概览 title: DHTMLX Spreadsheet 概览 slug: / -description: 您可以在 DHTMLX 文档中查阅 JavaScript Spreadsheet 库的概览。浏览开发者指南和 API 参考、尝试代码示例和在线演示,并下载免费 30 天试用版 DHTMLX Spreadsheet。 +description: DHTMLX Spreadsheet 概览。这是一个用于编辑和格式化电子表格数据的 JavaScript 组件,包括工具栏、编辑栏、表格、菜单和上下文菜单。 --- # DHTMLX Spreadsheet 概览 {#dhtmlx-spreadsheet-overview} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/initialization.md b/i18n/zh/docusaurus-plugin-content-docs/current/initialization.md index 5e7aa19b..ea1da016 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/initialization.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/initialization.md @@ -1,7 +1,7 @@ --- sidebar_label: 初始化 title: 初始化 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解初始化的相关内容。浏览开发者指南和 API 参考、尝试代码示例和在线演示,并下载免费 30 天试用版 DHTMLX Spreadsheet。 +description: 通过引入源文件、添加容器并使用配置对象调用 dhx.Spreadsheet 构造函数,在页面上初始化 DHTMLX Spreadsheet。 --- # 初始化 {#initialization} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/loading_data.md b/i18n/zh/docusaurus-plugin-content-docs/current/loading_data.md index d73a48a1..b754f1e5 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/loading_data.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/loading_data.md @@ -1,7 +1,7 @@ --- sidebar_label: 数据加载与导出 title: 加载数据 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解数据加载的相关内容。浏览开发者指南和 API 参考、尝试代码示例和在线演示,并下载免费 30 天试用版 DHTMLX Spreadsheet。 +description: 从文件或本地数据源将带有样式、锁定单元格和链接的 JSON、CSV 或 Excel 数据加载到 DHTMLX Spreadsheet,保存和恢复状态,并将数据导出为 Excel 或 JSON。 --- # 数据加载与导出 {#data-loading-and-export} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/migration.md b/i18n/zh/docusaurus-plugin-content-docs/current/migration.md index aacdf815..20d016b9 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/migration.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/migration.md @@ -1,7 +1,7 @@ --- sidebar_label: 迁移到新版本 title: 迁移 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解有关迁移的内容。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 参照各版本中已弃用、已更改和已移除的属性、方法和事件及其替代项列表,迁移到新版本的 DHTMLX Spreadsheet。 --- # 迁移到新版本 {#migration-to-newer-versions} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/number_formatting.md b/i18n/zh/docusaurus-plugin-content-docs/current/number_formatting.md index c3bec62f..73465a20 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/number_formatting.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/number_formatting.md @@ -1,7 +1,7 @@ --- sidebar_label: 数字格式化 title: 数字格式化 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中学习有关数字格式化的开发者指南。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 在 DHTMLX Spreadsheet 中为单元格值应用数字、货币、百分比、日期、时间和科学计数格式,对其进行本地化,定义自定义格式掩码,并设置或获取单元格的格式。 --- # 数字格式化 {#number-formatting} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/number_formatting_guide.md b/i18n/zh/docusaurus-plugin-content-docs/current/number_formatting_guide.md index 0d5cc623..d01bb0f4 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/number_formatting_guide.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/number_formatting_guide.md @@ -1,7 +1,7 @@ --- sidebar_label: 数字格式化 title: 数字格式化指南 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中学习有关数字格式化的用户指南。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 通过 DHTMLX Spreadsheet 工具栏为单元格值选择数字格式,例如数字、货币、百分比、日期、时间或文本。 --- # 数字格式化 {#number-formatting} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/sorting_data.md b/i18n/zh/docusaurus-plugin-content-docs/current/sorting_data.md index b0f119f7..37db8c87 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/sorting_data.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/sorting_data.md @@ -1,7 +1,7 @@ --- sidebar_label: 数据排序 title: 数据排序 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解有关数据排序的内容。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 通过上下文菜单中的排序命令,按列或所选单元格区域对 DHTMLX Spreadsheet 中的数据进行 A 到 Z 或 Z 到 A 排序。 --- # 数据排序 {#sorting-data} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/svelte_integration.md b/i18n/zh/docusaurus-plugin-content-docs/current/svelte_integration.md index 7c53898c..77db6c0d 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/svelte_integration.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/svelte_integration.md @@ -1,7 +1,7 @@ --- sidebar_label: 与 Svelte 集成 title: Svelte 集成 -description: 您可以在文档中了解 DHTMLX JavaScript Spreadsheet 库的 Svelte 集成。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 在 Svelte 应用中使用 DHTMLX Spreadsheet。创建项目,将 Spreadsheet 添加为 Svelte 组件,加载数据并处理事件。 --- # 与 Svelte 集成 {#integration-with-svelte} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md b/i18n/zh/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md index 0f54fd20..db473fe2 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/themes/base_themes_configuration.md @@ -1,7 +1,7 @@ --- sidebar_label: 配置内置主题 title: 配置内置主题 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解如何配置主题。浏览开发者指南和 API 参考,试用代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费评估版本。 +description: 通过覆盖 CSS 变量更改 DHTMLX Spreadsheet 内置主题的颜色,可一次应用于所有主题或单独应用于某个主题。 --- # 配置内置主题 {#configuring-built-in-themes} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/themes/custom_theme.md b/i18n/zh/docusaurus-plugin-content-docs/current/themes/custom_theme.md index 8389fb46..32a05ace 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/themes/custom_theme.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/themes/custom_theme.md @@ -1,7 +1,7 @@ --- sidebar_label: 自定义主题 title: 自定义主题 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解如何创建自定义主题。浏览开发者指南和 API 参考,试用代码示例和在线演示,并下载 DHTMLX Spreadsheet 的 30 天免费评估版本。 +description: 使用 CSS 变量为 DHTMLX Spreadsheet 创建自定义颜色主题,并通过 dhx.setTheme() 方法应用。 --- # 自定义主题 {#custom-theme} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/using_typescript.md b/i18n/zh/docusaurus-plugin-content-docs/current/using_typescript.md index d5d0460a..8f7c3b43 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/using_typescript.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/using_typescript.md @@ -1,7 +1,7 @@ --- sidebar_label: TypeScript 支持 title: TypeScript 支持 -description: 您可以在文档中了解如何在 DHTMLX JavaScript Spreadsheet 库中使用 TypeScript。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载 DHTMLX Spreadsheet 的免费 30 天评估版本。 +description: 使用 DHTMLX Spreadsheet 内置的 TypeScript 定义,在 IDE 中获得类型检查、自动补全和 JSDoc 提示。 --- # TypeScript 支持 {#typescript-support} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md index 288a7c24..9b2add89 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md @@ -1,7 +1,7 @@ --- sidebar_label: 更新日志 title: DHTMLX Spreadsheet 更新日志 -description: 您可以在文档中了解 DHTMLX JavaScript Spreadsheet 库的最新动态。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载免费的 30 天评估版 DHTMLX Spreadsheet。 +description: DHTMLX Spreadsheet 发布说明,介绍各版本的新功能、更新、修复和破坏性变更。 --- # 更新日志 {#whats-new} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/work_with_sheets.md b/i18n/zh/docusaurus-plugin-content-docs/current/work_with_sheets.md index 6ce426de..c6108f98 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/work_with_sheets.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/work_with_sheets.md @@ -1,7 +1,7 @@ --- sidebar_label: 工作表操作 title: 工作表操作 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解工作表操作相关内容。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载免费的 30 天评估版 DHTMLX Spreadsheet。 +description: 通过 DHTMLX Spreadsheet 底部工具栏和工作表标签添加、删除、重命名和切换工作表,并在公式中引用其他工作表的单元格。 --- # 工作表操作 {#work-with-sheets} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/working_with_cells.md b/i18n/zh/docusaurus-plugin-content-docs/current/working_with_cells.md index a9a91940..acfbbcb8 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/working_with_cells.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/working_with_cells.md @@ -1,7 +1,7 @@ --- sidebar_label: 单元格操作 title: 单元格操作 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解单元格操作相关内容。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载免费的 30 天评估版 DHTMLX Spreadsheet。 +description: 通过 API 设置和获取 DHTMLX Spreadsheet 单元格的值和样式,验证单元格、插入链接,以及编辑、锁定、合并和选择单元格。 --- # 单元格操作 {#work-with-cells} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/working_with_sheets.md b/i18n/zh/docusaurus-plugin-content-docs/current/working_with_sheets.md index d6d14cd3..61a263a9 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/working_with_sheets.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/working_with_sheets.md @@ -1,7 +1,7 @@ --- sidebar_label: 工作表操作 title: 工作表操作 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解工作表操作相关内容。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载免费的 30 天评估版 DHTMLX Spreadsheet。 +description: 将多个工作表加载到 DHTMLX Spreadsheet,并使用 API 方法添加、删除、获取、清除和切换工作表。 --- # 工作表操作 {#work-with-sheets} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/working_with_ssheet.md b/i18n/zh/docusaurus-plugin-content-docs/current/working_with_ssheet.md index 533ded5f..fcd7f007 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/working_with_ssheet.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/working_with_ssheet.md @@ -1,7 +1,7 @@ --- sidebar_label: 电子表格操作 title: 电子表格操作 -description: 您可以在 DHTMLX JavaScript Spreadsheet 库的文档中了解电子表格操作相关内容。浏览开发者指南和 API 参考,查看代码示例和在线演示,并下载免费的 30 天评估版 DHTMLX Spreadsheet。 +description: 通过 API 在 DHTMLX Spreadsheet 中撤销和重做操作,添加、删除、冻结和隐藏行与列,自动调整列宽,筛选、搜索和排序数据,以及清空表格。 --- # 电子表格操作 {#work-with-spreadsheet} From 9f219530ec2d5eb86a82b77b5a6e249d9cbe5d52 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Fri, 30 Oct 2026 16:28:45 +0300 Subject: [PATCH 27/32] [update] add muon #REF! fix to v6.0.4 what's new - fix for formulas with invalid references showing a broken or repeated #REF! error - line added to en, de, ko, ru and zh pages --- docs/whats_new.md | 1 + i18n/de/docusaurus-plugin-content-docs/current/whats_new.md | 1 + i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md | 1 + i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md | 1 + i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md | 1 + 5 files changed, 5 insertions(+) diff --git a/docs/whats_new.md b/docs/whats_new.md index 98134da9..5d6511e7 100644 --- a/docs/whats_new.md +++ b/docs/whats_new.md @@ -56,6 +56,7 @@ Released on October , 2026 - The keyboard focus was lost after the search bar closed - A closed context menu reopened - The active cell was scrolled one cell short of the viewport edge during keyboard navigation +- A formula with an invalid reference showed a broken or repeated `#REF!` error instead of a single `#REF!` - React Spreadsheet: the event callbacks and `onStateChange` didn't fire after the Spreadsheet was recreated by an init-only prop change - React Spreadsheet: the event handlers of the wrapper were not removed on unmount - React Spreadsheet: the data from `loadUrl` was loaded twice on mount and again over the kept data after the Spreadsheet was recreated diff --git a/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md index 6ad0a3c2..a0612ee6 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md @@ -56,6 +56,7 @@ Veröffentlicht am Oktober , 2026 - Der Tastaturfokus ging verloren, nachdem die Suchleiste geschlossen wurde - Ein geschlossenes Kontextmenü wurde erneut geöffnet - Die aktive Zelle wurde bei der Tastaturnavigation eine Zelle zu kurz an den Rand des Viewports gescrollt +- Eine Formel mit einem ungültigen Bezug zeigte einen fehlerhaften oder wiederholten `#REF!`-Fehler statt eines einzelnen `#REF!` - React Spreadsheet: die Event-Callbacks und `onStateChange` wurden nicht ausgelöst, nachdem Spreadsheet durch eine Änderung einer Init-only-Prop neu erstellt wurde - React Spreadsheet: die Event-Handler des Wrappers wurden beim Unmount nicht entfernt - React Spreadsheet: die Daten aus `loadUrl` wurden beim Mount zweimal geladen und nach dem Neuerstellen von Spreadsheet erneut über die beibehaltenen Daten diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md index a772177d..09716e08 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md @@ -56,6 +56,7 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리의 새로운 기능 - 검색 바가 닫힌 후 키보드 포커스가 사라지는 문제 - 닫힌 컨텍스트 메뉴가 다시 열리는 문제 - 키보드 탐색 중 활성 셀이 뷰포트 가장자리보다 한 셀 모자라게 스크롤되는 문제 +- 잘못된 참조가 있는 수식에 단일 `#REF!` 대신 깨지거나 반복된 `#REF!` 오류가 표시되는 문제 - React Spreadsheet: init-only prop 변경으로 Spreadsheet가 다시 생성된 후 이벤트 콜백과 `onStateChange`가 발생하지 않는 문제 - React Spreadsheet: 언마운트 시 래퍼의 이벤트 핸들러가 제거되지 않는 문제 - React Spreadsheet: `loadUrl`의 데이터가 마운트 시 두 번 로드되고, Spreadsheet가 다시 생성된 후 유지된 데이터 위에 다시 로드되는 문제 diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md index 9f7ee84e..dc19a194 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md @@ -56,6 +56,7 @@ description: В документации вы можете узнать, что - Фокус клавиатуры терялся после закрытия строки поиска - Закрытое контекстное меню открывалось снова - Активная ячейка прокручивалась на одну ячейку короче до края области просмотра при навигации с клавиатуры +- Формула с недопустимой ссылкой показывала искажённую или повторяющуюся ошибку `#REF!` вместо одной `#REF!` - React Spreadsheet: обратные вызовы событий и `onStateChange` не срабатывали после пересоздания Spreadsheet из-за изменения свойства, задаваемого только при инициализации - React Spreadsheet: обработчики событий обёртки не удалялись при размонтировании - React Spreadsheet: данные из `loadUrl` загружались дважды при монтировании и повторно поверх сохранённых данных после пересоздания Spreadsheet diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md index 288a7c24..db875a22 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md @@ -56,6 +56,7 @@ description: 您可以在文档中了解 DHTMLX JavaScript Spreadsheet 库的最 - 搜索栏关闭后键盘焦点丢失的问题 - 已关闭的上下文菜单再次打开的问题 - 键盘导航时活动单元格滚动到距视口边缘差一个单元格的问题 +- 含无效引用的公式显示残缺或重复的 `#REF!` 错误,而不是单个 `#REF!` 的问题 - React Spreadsheet:因仅初始化属性变化而重新创建 Spreadsheet 后,事件回调和 `onStateChange` 不触发的问题 - React Spreadsheet:卸载时未移除封装组件的事件处理程序的问题 - React Spreadsheet:挂载时 `loadUrl` 的数据被加载两次,以及 Spreadsheet 重新创建后再次覆盖保留数据的问题 From 7c8aabc3772b2021d4e8de2e50d6abf3f7d9ded7 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Fri, 30 Oct 2026 22:00:43 +0300 Subject: [PATCH 28/32] [update] retake rows and columns context menu images - Rows/Columns submenus now show Row height, Column width and the "Remove row N" / "Remove column X" labels of v6.0.4 - add, remove, freeze, unfreeze, hide and show screenshots for rows and columns retaken with the fixed hover highlight - AutoFit steps (three dots icon, Fit to data) retaken on the same dataset as the other images --- static/img/add_column_context_menu.png | Bin 43862 -> 46401 bytes static/img/add_row_context_menu.png | Bin 43450 -> 46090 bytes static/img/column_autofit.png | Bin 47831 -> 45806 bytes static/img/column_context_menu.png | Bin 41729 -> 38810 bytes static/img/freeze_columns_context_menu.png | Bin 44293 -> 44220 bytes static/img/freeze_rows_context_menu.png | Bin 42251 -> 45042 bytes static/img/hide_columns_context_menu.png | Bin 40413 -> 44287 bytes static/img/hide_row_context_menu.png | Bin 44018 -> 45953 bytes static/img/remove_column_context_menu.png | Bin 46813 -> 49677 bytes static/img/remove_row_context_menu.png | Bin 44808 -> 47977 bytes static/img/show_columns_context_menu.png | Bin 39557 -> 41926 bytes static/img/show_rows_context_menu.png | Bin 43990 -> 44751 bytes static/img/unfreeze_columns_context_menu.png | Bin 41222 -> 45162 bytes static/img/unfreeze_rows_context_menu.png | Bin 41762 -> 43998 bytes 14 files changed, 0 insertions(+), 0 deletions(-) diff --git a/static/img/add_column_context_menu.png b/static/img/add_column_context_menu.png index 0c683ddcd8df1ed61247a89bbd48507174983afe..47c80998c3ec852c1e6ea295ae9e0e7645a7408e 100644 GIT binary patch literal 46401 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 diff --git a/static/img/add_row_context_menu.png b/static/img/add_row_context_menu.png index fe8298ea9b6a7f4ce6d2e8604794a050fecd9d68..079f78345ce7784efd1a211b09decccb1386abb5 100644 GIT binary patch literal 46090 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 diff --git a/static/img/column_autofit.png b/static/img/column_autofit.png index e7c5a520f5bea831996cf926b7c909d44f04c534..e2275e6ae7c6d2ce6f85291d22297351f462b0c9 100644 GIT binary patch literal 45806 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°pMO%(K9b_x|N1mZayK6 zE%QROFZG5Crtds`DkO`9M^Na?1z2G>-Wn6eqx_h~ZF%E6zRRDbnS-CyaJG!s5r5c! z4Q7f%^qAai`C%x*A&%l}KOEPvumXOJ6wmczZToIu*uUTg|Zn*>z{D& zZZmafQyy|wI@d>;9UA~c>QnV91fc7Eu+D!HS~%u^FGo&N-RbAR%v31ap40}uaZ-AE zJqB){RE6wjzxTy?W_~e*zS5rq7T+#CSvHd%)qE&_lb0FSiCWwqGd5f-915r@`8AOGL#MEE=EL`^|Fa3#ixhQ$1X z88MX(7NVuR+zM z;ChPO&Gq7{YGj-2p}SCND>jp-?l7GY(oiFekRO#6m4qlHN{>Lxj%{ueQ0_<}Wy@ zbZ?1iGVX1+%2y?C7bC|F(!Y+{rh&8oQB3TCY0V!JTxD`Be&}o{4*wDq8}XSLUuc?A zjZV*vq6WXJgt;l&J&jAORKL%1Jo;~wZstzHYI_aOfaZGJK0KC5IXZ^#kYCq_cVM+{ zfrsjyfR_b^w%{1|y1fo2`SUFOP>7TJ3ajDamr>28DV9o~W@vex)U=J9ke9b9=QpSt zFAEBsf$$!LDCfBc7nzLUTHkw@#iyon`^dh&K4c^-zNw;OfYzBzn|zN7UcCuSf?4y^%!`wi7 zoKV@<@MeGGE%dm*@D?cWQ>_AQ?yA7G#)lKyq&|UQtpCWJWz_Q{mBhd0B8eMSaf0gr zo87nDD2$2%RkoQrO)cPKHB9*J&s#Tn;?S=EtHFC#>^%%~ZwsE6@~V^G2b5b_czCCx z7FP_&{;sX&g~jiP#MjTTmYTh=K>TcBz*0-P5i??KbZQC>y^*%l)w3JFdqgHZj`hs$ zxuHcF-$@hDjJcA>ert*=`UYh{#%2<;9>4stv>T?8kKT_v^QbktQ2CUP<>&F;WBI0i zA;+$cz+(4P1$45x*h!rhcu*2JE1jr9p0+{dmIU z_ogl7cI7|PcTgALT%8FtVu!#FVyS%c90NZfl-Jj-6I<{8Mp`%vEz4m2J%S{C&ru8p z)7~!p4r3U9{=h}hl9;Uj_2MUB!^>RY5%%yEV{f&ICx9^${^#%KcTq@@!#-=vsZDWG zFeC#yX1lvf+BvK+fm`duR0tiU0&LIP;0WUY*g=UmKo9Z(>C;xd9}7l(R?DF$l(?oa z=^q2l94VzDAK}i*d0nSfWY>jE<6&IfnKM9$QI?>?$;&S%4Yc3d*5<@rH{B94QRw-8 z`iB+$o4pdHS`@Deu$TNNSQfT|+?th!-cjbuMdbeGO`(N%L}U;!YMD3?kr)xe!qsjC z?g;iP;$3FbUnMr%+imM7VacmqM{adWAzZdseD@$+W6|(T5CY`3qKgoFsnF7v^LP;M z^>1lh1CT-|@}QwGqiV3=xGB@#Ph;GSj`g8+P0JqNQEb7G(rF1?Q$90S5rsV$6CSeu z=dg@AEEVC5&5L9c$6{6ji0zZ3=UsBjx(CTws z$#3vUk{kd%T{BRD?&6K$t^1Qt&F24*T~oLCE0Juy9NUwa}Qge-QqaDOJ z+OVngS?UDo);KCcl5{l{I?~izwbbQ0%my^H{2R-=yGS`#*p$Bwt?=D? zVSSmE*-I4a9G{U_e~%kr8?YtP0xipxjCU%&gG_qlFSLLN@l;!4HOWUKis>F4J;jYO ztPPaJE<9!3b@W;B7ov;wxQw}=o+yAK-!GKDzZd;aR`GmS7gZUQRyIi&z& zOxwFlEeUr9c&h>(D@!b1?mOfDT3wB)i0%872IOxYHB=#YRqM_}q`cnRt8SjgZoI6j zj)LZeM$(iaE=ctP-2Jpgmvry1q`sZD#4jxb;KxvuGWlqv=?V+6jGFdPC9xGGmRvWzHP&n5)iHM%MV!&f2q8 z2>ATWq1(PAHQvh^wvFM4$=iJfno2^{xZjXj%+3L1O%@lnK-fb!0DO*1H57e#Q~TyQ zbeT0jgI~@>){WjhDAoXXJ@#Ex9v<|X$y>urZq-s)=I^p11*b<_mLBw*P(OK#@!Coz zo_%1^zV3a&xG7YJoL+ytW4USQL*3-=7ul#IJ$&D33*FcYF1uj_^A2jtA7EM-c7q__3hPbn&j4}af#T#BWy{%y;p#^9pwR0pxeOH7(Hn~V36uQ+c+hy+(+gZ*Y8Qd!z7`DhBP*#SQT@>< G=zjrx1kM5g diff --git a/static/img/column_context_menu.png b/static/img/column_context_menu.png index 0cd92396691eecdd8e25009facde008ff3c3a8c5..aea0566f0eba72d989ffd7f5cacce82773156d40 100644 GIT binary patch literal 38810 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 Wi8vHSm6%FFUb^Ht$mQyGVgCcg+dBjR literal 41729 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

+NZt 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 VIx@2s`jf$rn#wKZd_{}r{{cqI3gZ9( literal 44293 zcmbTdQ+!@c+_0NQjcuo~8{0M;+fHM+qP}&mFIoGvwiUGeQ+l$>$fuZ z%zvmK~5YV1_uTN1O#4ELPQA!1T+8ylLByfjl6vYPk1^rV(!x01o#p(0& zW!;p}4Y>K$Nm5qy>k$M393H;L$fP9jG>D{#po&}C>6*8;ipl!p6(SKTmt|CP?7nf7 zl_6p*RZ3QvtrC^oQ(1nKR!VUrtVvaYHO+1bx^ed!XuToLY`S3)ogu%lv`n>iT^}ps zf+Fs0{~!A~MLfL6H%1;f`2ZNWo`*M&F=@^P_ojVqv+<{llP$c))zwwQUr0hw#3JD{ zFq=`_=RckKES;WjEn1w8wvVktA)PKa1zTLsjz6!J6cmU$w@hWmr^Zs_>~37{Pc>F` z(xHhz6WGE*fr9zGs#Ey?bis}RmBHW7*2@SIWzvU?*%@gBGSGmGNjShZKxiEvO+vqe zr66(s?!BvdLbU+o^B2-~!I}V(TNJ}O3>p0hsNdcsTZ0X+AH?SAmj;`)e*an!3=-cPm)SHST-aBbC6qTY^LX{4w?m^h6?^@-dJJK>{saEJ zjo|_oD9SatVuuuX?r7Vja`R_{2=d1x&#z_o;ulE9!OBJ!*ZD)N)EVFX>J9$>EWbki z5mkgmopg#ReHgjF&EEWt{QDzs731MeoCgjZuU2LRxGG2eV^&DMk5*XGu2fF49U_6p zoBRPj2lw`yO{I?C`o@~G3%2HJcOLJjn)~=a6xI@-%@OQ3;0s`yZqU!V1^o zgPkzn_vgm>Z;KDrbiKpLIST!irAc*nr$!NN8HF#QT7e5^tAreJd|DkuCyNr~60Vb4 ziArH8Gz|eIl0gR(2FgwX8u<+htJg4P>PIq&@uke4VeuEZ#9GDxK8XM${CRu3v4O822J;oa!QjB>$c1>mdevU^XE;%7ZoKl9c ze%oP1w&CR)ap1v~z6R5=b#|~Jyd;#8sF~uJthKa|O(?%{a-0Tb?`W%E6?%g!ES0{s zq19Mj-gB^#X0JQ^1W(#C#Mxl`7DW(9^FVfO{6~-9M{a}G&d4Gdh9Ui%<6S3*(@XEF zZ*-|6iLD%BhWk6Cb@2ttgDm~L5G7CMNW-FUP31wYj9cH_6Y5>@q(?B=N#gbKur@*J zOc(R^4cZ4r?xJyt;}!l>h;pi2f4yW zm@mGkk58N)s|NvXVb4DdszNCmA8z;LebdL^9Eh9usJwN_UA8{1?)fnp-*{=@G_78*Qr^c5AifT%A3cCMG`^oA4Py2?vGRbOv7jLai z@`=sPY$BumZ-D^~caG_Ik}Kd%gktvHsGpw$r0RokG>I|L_w?%kt_1ZMW<8jd_nz+O zcq_CThii^=-Zcm@Rpjdo7hiJO|A&AC+S3`Sgg^lZ<#J(9SaWM8kAmjs(>Y;H)dx@w z7lNJlQ6DZ%K(CW}sa%^%74*qx=3Ez0x?k`{0srqs!9vD9$wK?z%O?d48a(LpEu=~L ze{=EQTPt;J|JW-OgO;CvV@?AJzQ|}Gs$x69u74Hk~d%UbmeyAsb(e!Mcl_K5t;ShOB0sN|Nrj=I#%fX$<#?MV-pvR&}vp% z{LIuzA!@6dE+Mr@;E*h_NToPoOh7S#+R9?*hUvY41@1mRv`FPB>3|^^B3X+64pas^ z^u>K-wKv$*vjo$XnY|_@Uu5-A!Z-GyKb%8Y>4mHwPr3}81bt)Q|DrG@8XNs99=7#~ zcv1cyd#*O$RwOy(bsF}2*uRcU(ac!a+vSnpe#eiTjd77IthJKo#YxKf}d+|Y#c!}S*)buhJdqhVsU za=|XB#&nWrPLLNTO}7`Ea|eWQ1)hz5>3Cxd--QU_Xn!OGe^66tHNN1l*w^!=)sP0e zc-h|G_E-r{P1R~ID^z?-`sY%*)0wQr3{7w-f0zFaM^~#33=HZJLVxdYoHjz0Y?;{S zRt2UT!^$a?%g#J4=TSLLsVo?4J#i+Vpf6s+k~*Xmf30pzPun(QxLIki zk(EQ&QoDmI11_gbIEMAjkr;N%P3Gh~qFP&SIP=;F&nPRWHT(WZx+SI|jp~V`5+sH- zD}=e+e&^z{DL=+{+T#|Z;XE-6lO5|Zh7iT%C-1}=B{jJl5FT^QStxwO`Jx&N(;{`P zq@uFB9kKfRw^RUa6T?q}8>#g!^R;`(iGSy0MsJBS-n+yN9Zb>Dk;2JrJ8)ECoN&)0 z2XHG-aCX)q*}hL{YF|NIm|Ia*FT11gXd$vrSp)drp5z~0T*_wJPJG>OF0>dm1+%YB z55sSsX7ruc95hs%g!eqlvo2I&py2iLjYNZ_OuB1cq?u^n!Aqp3RpZh=%y>uN<=OP> zs1;s1x^k$h?#F%@r#ECDqIC7R298iuTNg4*hW@752}N&HaeJ8{cZwpkjFwu+wN+^` zEtZ~U1(&(oKkSdFIiu4>3gr}&-(85Z!HV6_VUO26NI^yCQ>h%dGvunb+4>;}Z>C+O9OJAin;rA0Tb{yIhMT8O4am$Qx4d&Dr?Z zDB04X{G<%CmD>L1iw91x3)gT-S@4oAISpURuhHoZJCN>5h#j@(mo@B>ng`}#pU(GM zA!q`n#tjA*OTz979{lPU*LR-4LTA_ck7LAhiV=jv45F?h!;`m{A#fgSfrO@OOkQ|%a zkNyj|{4He7Qpb#v1vv?B44f0*c3}TVu)8ZL@r|0n^yAKqj{lhxGg9IEv#Ely1zj-jbJt9A!3%#~?J%^HT>9umER(qc`mHTIxd94vbke?^B zC+?z#aCrEz8HF4wbk_Uh%^n6HPJ-;mhcrP9?Z0MC@bj1Y{ya&Syc4rT?u?De3jnz!5BBEq6&CA*L1fkm%Leq<~2QY z8@gYlH+NbBcW10@>V(qlGZjV~XW&;}0Zit=<_5f<4t5+fsePdD9=ny#XUbiZ)$B#eCxdCk&U-`aH%=Xg2xJ;_!D)= zH%jbj1xfx!TDZ}gA~~`RbqqmXpBp5|>p^AD+)n&JzdtV7@6;0tO}N-b5Qsmk{4F%4 z1mXp?ECszkxEyydiLW)PnRc|axTR3`cn}Q#Vl=Ke>I@GaKYX3i8nf9@m2i`#w5Jle>WlSGkZgSZ zlyTZ?38&h%fVhFNIB@oCf>JzD_FdHe16BsN%x{Jab=gHkLrI_jHA+BnMOsVARH}_| zvPYLBBr5r8h#5@E!-av9%7d!dGsu^3e+I;ImaN`8g~~opwz=9)HTBr?%i7vn^I5}6 z$|=OmyPB_>*%rqB*liO-lCFWK*7KV@p5CkcQ(VbS*JP01cPE1*J^5<48D;coLd1`N z0qGC7N7#ODiszuqB}`)Hag$2j_G2D9+27&eRJ62Cv)_8@P~bENAAKRaQYnJ11oHQx zH^6ILeTQ6jNCWEfZ>XBfo&S-=HzsD9@T3={%0>lCUg(m+db;I$g0Q6x?H3`Rmne6n zHK=)H*XRu_SoT}C5-8}b8kaA!XxEVYa6&khuedNL9v1(cyT0BJI*J-5mAam)_J&6n zbT{>>2Rn``lG=vvtYVq&0f7@S1Ka&`*_Hu*utz`twqN!H9za0GeN~1H8@B+nzxO9T z7SZ*-yRsM#UN+R52gH6ZrZz#3Yj zeihnITI-|>Mg*p#wfAJ{|0Q2~Pa<#;SfESe(}s=9hGBOw?&CV&e$)wM6Okt(Qyfy` zYwh4Ltdq)L(4~`a>K#kJJ*41#l!~~AkQ0v7doowq3b9YTk z{Lk~ef**SqlCdIHEigLh#{)$z3y&(kL|{c@Rc8zO$EO8~2}ouVSaQ9q!6$Kg^nh}q zqp4SO(N$7XVVvy6bj!LNw3bB`wSp9mCEfVR=}W;c@sku4+ZDkg#(V8gaH>P{lpV~P;i+P9_3_D};g1UK_! z9;vTV%v{lMH4mgH1ofE>g|*+)nlfaZMAoo5YEyqm8&=D}7xd>)+7L8=z2$2(b>9*W z_ z4X5*DUot7y6pNnvi;^iTq>dGG9&)O~sXjSXn;38$72=m#L|U{;tF5j+L2?oFv%058 zh=+&g^766>3670d%*7<-3!Qx1F3UG`+~kBSk&7j{dHZq@8h`?U5}x#7;U4-mf4cAmAx%H#8}1a zwGm4)YQ+;*Pt9tmg#;7C5t2P|I45-9!K0)|Y3R}ik(l2tnUg(77ghLfPYbdSRD9X! zhDez`5cb#jif-VH-;KNF(YtzxolEsCRp+2n!W7HkV7prD8Gu*Ad|04sXbvvLi@t-! zUS6Emy}rdldy9pmpaz#i(j&kX{d7=^)D)R@;%7;89HiyWz=)rf&>Of?5Fhv7oGVqc z^9d4SAawBcXd835tP2+V-2-IU~aOtmq zcUj-dP>{&jjo=qIe%#?jU8zCVKh+Q4d^$Tj6qFfnA#^9Hh#5jgtsO^770S*$6!y}} z$qp-PuTFBh>evHm!x8<3@wr>8HlTHv}LY|D@1 z1Dgn$bPm6=>t+ogu=7Fmd#nFKKQ1}5w@PYVyF^JzxjCILZO$@wbq11?&y*}vXE6iG zz`%e813^GQ0CZ>8Db4PLt=VGbv0EHk5V;JVqnv^*ano9ldg+E$7A)q_ccLXlvNLX( zlpxV`&Ik0k5SH-$f+0Rg$xzcW4OaLKCfbm}*P(!%7xjeT!Bi2EH5G#I-!P@7R#o^K z_OLK>wpcT}zct3Zcjx6pv~pp75^3|TJTZm;*hf%|!2jEYy)=izE)+xOE7Q}{6MRcL zI*n?T;XfD;;R{X{%WHEgzM{TpeJRCM-xO~ zF$RpMb1!rRaJ6_nG5Nl%Y`E?I6;JwZAk<#22JrjdKLQG&rsKAau^AcT9o{d)1?WIJ zHxvAhr;CjJ5!k(8h&-D;cmR6&i4F}e8mssmjI0>By&V&ce;TCV24M}cxY5!$FZyt{ zG7!!Gu5P1gU_h+rbp=5kU!u59prEZC(XCGeFs)b$d54EJS7xhu+UL6ywS@OE_Khmb zIqLBYUg?MPwPaQ+46gKw;TD(kRY^m`Z@%w0nMX5)^6_WdR=n=+?tKFTwXPSsnvJ$& zjuX7%`uaqX?+IkYDNQbC%gtP{IsWya12o1dCGu2!w2*l7G$h}6D{ue~PN1_ey2Yf>BTjcEQ?AxQ6kaDd?6iiHU5fPD~ zJ3KzGq`p28)6pbFGAQth<_sW%SLdx4IWtFYXY~slKCc`!s%2RKcY-6}c`WG2Y~nPn zZSJAjUtL?XcXdrv8*P?obvfI8UWtg;_0{?!+oD0q&z}jTBH1+=kzBArcTrO&dPK7) zwZZBIl&nnEs(d7!+Z7@FAE-d7YB?6GC0e`39cY(nZMEZpT-Q~{5D@zLri}S=t=yR- zTWTa)dV157`Eocs4kSH2Jzy*6^5NlNGF#Ystp(lA&aUJA*(w+ww?7b(531{OtC!RF z-7DzAk}dV=W#dCmUtho8e+3vpDw{KQ2BIDJhS5R6z^-m@^VBMJ;c!?&+dUtohz<=c z>v8gxB!RCPS!bp7&$0sGnBe%t*y7X8LB54L)D#B{49w$M;|3O^p~zCu+Spj+`C4nO z)dKx^CjZ30aLlK*3m>(H2%&8K?Y=NSquHN8vkD6fb8~mU+KrW0#U(<+z|eK%<$t{d z3qd5@Uoy)quUZ9id-BE&ODv*H0RXl!^$-Mng<=(8{t^b{x5oWuzoua8qLbkw_OmV% zS>Z9!(d};!r)u`IS}!_MZP!|+3S?6uhj!v=)Q)*BfLvg++v2slUYL#~&_xjPzXw}} zL&9NoSyi?N3lZBrV+hq*Pcv%*LxA(i{O#FFqczg6e})D#1+rdub804E)K?m8pyA+l zj|wyQfsg6#;9sZX*hP%aPEt?*t9e}V0!sQ-0`Zi^L;qobzSo1 z{>);ff$rmJ!gn~K+2f9y|NW5!=m>tf(K{s3JUww#%8$pTm5)ycnWfePGcz|SC(SqG z+>FUG=o#YbDk>@o6u=lGNs5G)lYFvJN$CA@U(Pl*GZXulM4U~Ekcgd~T`U5t8|d=i zvEYDpbi7Wh%N0-|Oon|>n)R0dfLJbdcyoWeKXd{MZR?eW$X~y}D|Fj64Rm-t?~NC$ z3|?GRqYfn#g9`?}he&f~6>68t}`nfiZN^OO+QkQ+aC;J>*ib1qUOYb0_d zp<9s)duP5+HmyjX`KASjW#voY8$J~Q8J;8ooh)5bZTb7-#Nro%^($W3vx@8!^$$11 zWZ6SJ{#gS0kt8Ic*}+?PC`UCR1uwYR7R~|<#6qN(am^aJl`iQ>Tbb|S1;+{r^iJgA zi|j^29EK1K=R%z+XXd#@e|DgT7?1xO`MBmv~ zmo&MRUpen|TDUk%E2FAV)CLU~wi)z3cY1dNsoIV#{cHfs_CJgmA^BG$3LMR?h>yv}~j9$Q-6ym3DY8DRN|Yj_nEr?BaS_ z@)5wKG%{KZ`luyOG?Mrw0c|pd2O+g($|%yADqqB6K5Ei(!E)76_aY1PNp+M{bpP6j z(;5`B1sEwqAHwxJ8~mcx6rIS!ysQxR2>+WXC(`F~4iiRVS%h=aSp7>RD0bDGOi=T? zcSmSdT`N?S99b4_Qe%g(x(N7jbPm+%ZreB5BWaSQb=J7}kyk}@Y)K6?A(0q%tNp{v z;U*WalPc|nYCUFM+NV9mJdb^55TW8vSNn;^%HFUJEUzRlL_4AABcRQ8xx{$!bx zeqz&|`Pt34jUi^>b!mb!pBIyYHJ;TLPy2o-kZa=4tkE}~8K7G!&TmgXvaqM1$!)Ek zO<|l~?6tm%CUi@jx6AcjM<8eLlon%BIBN1_svPtqm5sq{UxfFWQ5nkJm%VeD#&)@d zeIn^w&Hr%$k}oxOrcUl6GSTI(qxbHngV8;NR11)}t$3dQpix(7sEi2v*LZ^XgApGL zPSp%8P*e26@DgVl$8=be@7#IZDhsLasUV~cePeTKA+gzZ>QOaK#3zi}Ax?>CFNI3Z z5w9ei7&SRc8XjJf8gJPfO$Y8QFq@1!OgrLwP(Tr<(96VJkJo1BFdUx zE1<&&ObulkcoV8a;MSMl z^j~BMvMYY#mqy*4sH^HAbZtE8mlR&xvVE zI~$FR5qU@d2JuZd60+F?$66?-@O47VET|xsLd0E{A;*S~FFKjg^&)V-)C*gdoo+XoQEllrwj+U? zReBB>BK(6ByHUd|Sv$m0o|w(j#6$nIV@ojONQ`>H0*GaQg#^hyw)4~Lz1OJOTv4gY z^byu3>=HL~^&&{>-`g=r6+|~R&$EUzDT+0kKNM0KN0mP0!FA|H_RAV^MP$8tQnqgB$pZdebP`Ncq02hx);8{8e$QVJsT z{@1K4(6(1>w(lu}B;sEPeeFVP}Q2%9=}-! z2a#u!`CV1!vV>+Wn-*$nkx^gCp6n)r>ozm z+>u~{=5~tE(Qw3zNk@~uzYvx@7QGXnkxi&PfecsgG`K6o$k2Snx?2>j>gNk6X!E*6 zC{ngdk{ z&UngpYC7#{ma4wowE)@<~;uOpsifU_LbG9(9qT(TGX2#&Uuqd2v zSBx>TY38u}+`LN1Ud5bLbn#E43l#A_~#_G8P3b)qk1|$&UOezryGOmw*0c! z14A$Q%5NUZ{~%pYGR%AU+XfF!vL98{{LC6|Od6twCK4Zz(^$+6?QZRYq;WrJC9DaquuWd?XW!@X8Ge_u0xV)G#~pV+G%gz9)(%M8O? zaNAj!OXm_ApMvpjD5HQg#;3QFU?{UVNPmXNb*amBw6pL}7%LTA!H>!)LMv92;*X0} zCSLLyhFhzjCamJqsZF!|Yu0CcM`8Y(ovgfdv0`Vym<@aCm||z6_;tLp>O34MKeVtV zlb9zP^aM9#)X@Q{QJ=&$-hiLT&Ax=GSf1M1#lhS>GDpd5kvv|HxMmA#g|!Q6XBy?%imH~!$Y1n)Gt-zEABE@dWeix+iF&Oz{b(4X$yn{*N=_B|e=Nd$ zfw0k1ldDoX^qOY3HS87S59n7@Cevq*xqfz#$u$gZnOBy(wVoO20Jn)N*>iB-(nr7C@#=>ATEX)H>+ zh*eVt*r6P(HKN67|`b`%`YNl1SRJNN( zRyD+_!ynd=f3#S2DoNzxs6~F{jl@12d?x}4ZB?Vl`&^ZKU!LI5LZ1J-fdF#4F{w(k zJgI@6!a!}!ai*aiW@j9(=B7;jrbhC8qn_zmD->gpqHiik;XVveC_EwSk;RbQQo+;8 z;6gLTm7^tV(SiBVtrl9xH$4|vM0G#9GFH9s;FXarlti2j7G)+frsi^=)QQVp4M`NP* zA1$cK67F=rWY;ii%A7_6m=CVc2(_=&sV(-V<)TUGOi@xis5it;Nz6?)HUh(j@g+yE z1?%}at{{J4(+XL1G7$#kVxqk4f9v-(gviJENM-~_bVds_)uyaP3`TwO;-X}IeA5jn zxK;A`fTc~ZO&cVeSyCtx;WmUcdOrB$-c0(sFlKs0EAAncjdB)h|LEk3bG$(lnzR5L z7MdaX`(JQQcoZWtBY1rkp`mw?LWeGO+Z!edYwm7{wic&OIJKWBGC4*&XCl=FjlzqZ z>1k+gS&e$NqNkqC#X%y|OS#0i%nd);Vlw@GEH9to-Qm5|#~Pu~eQ{h78F1Pcee#`L z>!_2lM@o$NJH%O(+r}XE^$7i8EE>1st5mcfF6A|^RsM_dmb1bEQ(t~(cZ(z&g&`2g zTYsVSgs8f-+tX3Dl(wT%$;Ci6i6nbwP*(rpXVfWAw^11!XB^@3ojzHp;3i<1Xxq?> z@qDOj(uGOztsY#Iq2Myo+%$^8Hw)MVDSZFsj$QWFLg&vo2S>EjI)ByohvctJ@#Urk zo!}KCI9{20M}2Yhwe!f>7+uFs6nBNuUtFhaW}!g-J#|*eXgZm_Jsj$R>zkXS<$9|? zQ`x5ZV&%fT2rETxZ5c&HWS3U_)Up1(k;H1v@>S1^_KNWoq`Upcs~yUCDS!e+3T1co z_JX;(x&i=0JG~yG^eH_PUgV^anU*e&t8r+lRx+st4x`+_MJK0LYY<={xYc5p=g=aB za^`ho|H-E+v$0dK%eo6jC)QtUIgW9qM3`YgrCD=b;bA}hCGBvS3*rTKC9&*OSruk@ z(C#16(a8U)r1YP30k{(RzxH?nwzmx(937XM9VsyBwSPLh0O_-!xJPCEZ2lj9MW<6{7g;iC50E)t7F-`iPPFn^|tStkulMOm#C|v-fSW=}Ff8wC0dBG!^{olWT zS1nnip`raen$A!4`KP@{gw$nN{U;`7TEAQ0$A_=7{T_$ebaZn{oUr`iE?g^d$r_*> zYye5gR-pX(Kg8)zT4rkFG|@)_6!=QL6@@F=*dnlqPg!cEJ<*fB!0A|WRz(1nUX%H* zuB|=#{`R6#Z;4JJm(~T~gfC!_m)qeC(*So&9j-OkJayp)nCe{vU%e*X#s678^ZV*P zL%~d;=+HpX{=k9D;PZZNnSTS8_*eHUb~m%i@>c*Kx$gc-xVg2}4X_x`neI|^&5oyi zTmTQA99u&X+XjFK2-SUeh6a_^pvB<(cy*-LZBs9F)+$$3QdY(WAOMMYR31>SRr>*a znRKprU`21g+2wDUxYB4x2*|f$z%s>dodmDa`2>4vT z)@;A(KVEK`+^o5**wk5)6*3Y3YC?9n2gp?^6%_d8?QIzwR@)R20Lx$jY*nG%tVD(g z^dq48)h_P=VNgy$H0yl3$NdbMa0mh!6BA01Q1@?in&ULWDUS2D8@U3xbZXffq1Avq ze9=(Tb0AOv(JGfhQZHe_qO~FKNKWaB!sm8)IcroiZ-IEcThMdgi&ra=c>usBkRl$B zTa`5kl*0XoFhu z018?dq_u^)TBn&o1Ej9fhlB*Y^VUJxt!#LSD+-PqFKH(+3npw!~^Xk?wpC)(M zy79-VazoaA0$ z05!=8bRAJkOKKXmin0YF1*k7*SfSojzv_7e`&z9ebhgmI4N0FEMmRlu!L8T|{^Ib1 z-9`OOu&JJ9Z2z_rrQV}tBNHV{W@AJ>^6E=wFh%WfoV0GZn~#cIo!)BN|2HK?YFe9a ziKb_SI$9=^;TtV{zgS^RLW0!lZIpF%C=qYvvxW@=(rPTy&b zhP5iq>IbO3q$Fv)PeKG0CuE8)0KkaM`MdZ50EUM&loF?+6ib5b^vsJvfnVXhgu9h3 zu*B=v<^RWV*Zj%JifyQJ!njR0+GkrPp%B{&iX5mLt?^YVk6RC3<$YR;wc?@4Dk1s7 zVKhUt$WO}^8f+>)1zq+;NNO7IWJDLc|2E9y_W4Q%Q7352OW5nmbUZ_LUd;wNjqumQ z`PnIbQPL@8qLb>_|3EjgwB6o(8;~d_&G?4jf2JMa<;f3lWWft6b4L!+eXSCc0gDHb z=Mn^!Tn3nF1cH4<(686TW;FZ-^!Hg3BTG=o4bi?aSb-JMu%4$vXJgFdLT@bgG2HyG zlw42D?s37Vyh~A5iZ(~+i;L;WK^`hdUv$tmvjw>Ancfpi7S#5aE7@0BxZHfjCBvg+5H{B{s^x!yEm!;{_r(<6ML$;AuyG z;$5}B8>fBJotB7b36B#G^W&({ThiG8m3E^a7Cf48v+6*ZhrQx!27#X%A|(8Ace5{H zR(6Z=k^{5EM((#Ry@Mou_P;fhc)eiZk4{E7#TRn@_e0+dA5_-f66i*tq;HI`U!qzA zP2M|WF2$I}2Y%Vl(4#SLIR3u1GF_^PxWu0ya&S(LRFT0GpF)TRE7#K?l7Hd zVNR)v)?a-o&dVpSK74-@>BvyJH|j(O4&O|*y4vkeWXg+(fWu>`T8I8iim(0E|PS1MLsQkMa2)!M-I4_L%-GHg`8Pj||S#firx zYbaeYJ8DR|2MPaAls);xoqED=X`0v3GI+b9>>Q66tQesm|XEGVMpEin7Y(e5LM z17Zv*%0_F#Zg?!fP(=amX!`{`(o%Z={FM4c5doTviVy2UE~*vm>`%A3Jno`zffvDD z6Ot+7Y@GP>!q2N$(Mi4tc?t+hl}CBKJ|XW3kLP*1pvX1u+DigtKS+r8Tu{b*o1AO- zRMS}&&=wj+N|nQcaiU3@@Uzwt-`Cv2uUU%J3Qp6=EWAi2tgPYs-@J9my)zg%A~+`j~ax;%4yW|D@D>VVA2_M66rhH zpZc5H!5VNBK!C4TmvXAzmcTdB-|2_9R%eR+v5e_vx1`Pz4@xn!|MOdeM=b~6pJDU> zboE+Es7Ny3V^7-ocsZ5Lw^2ik#P?zt{jJwr8Fz2)R@m38%8SY$h&cR6x9-Wavx!tZ zo_@}DqDX02g4+=xmU`!ql>gDADEQ(PMn2SCs4q^nlA4;*Tc8DZ;ZV{uNY6ecxnh)` zHh-(7#xYI{M3q}Ue?egK>3Vhgq8f?9J)yHWETXWhd!?EvZ>fhI!%9Fx?XP z*wkEATx1V*y|)|;Y;kjVR!mpERg%t33D7cX?(vU8V^%b|Wl!e5+QF$y%d^FQl~nC$ zE~9I&Inn9J_-e5(g|_CE#4-^gIe{CRfhu`R-U%byGtWEq%h&Di)CI%8!e@gv1Q%4Q z%8=MOE5<8St0TPmViHS)cr^}|>TBmEM{wQ?x6p%rp8n=hJI+ao6_wJ9fWReV?yr!n zr{8ObLRI;j^DGv#tLEuuSwi4vqBTB^8+t#oq3kIbwwF}&#=W__2eBR zU>M%Yl0;TUX=|)_E*+otIGj%ND)^ReVad62&Q&#^J)BPTBTCD~VpoH{!#nii6U68WFi zN@)M}UxGwS8g#SbGO+mJ`J=(6vZskT@RWyUzRf!3!_|f^5PWtum-Pw|sKUpp&!T6f zV8#7SNNfs~dQwRuJ1!`kH4Y^O6*y zood8i8Akl?SU$_nLcq>gSqZWLG^LvrNC za-d6}2Vsi-Ms=ChWAS-}M9i=aIPd4)C3$5M2?Xt=&Hd|oj&`hC?snk{{9krdhcK7m z(=X63rz|NQ465hLKbjhgzfz+$^khtztn-S!S_%x<;+bEa0IXEARfV3qX3r3Lc zj^zoM>9YBvrc{~8Osm=!*6Kf!ChWFjbp0kaMHq1uuVv{&G}(K1J9EBm9_d<+26i1N zTgQ{ULpUp#Wvje!D=nHD69~*UjP6>pX$cp=#_{#n`t1(C69oVRFSgON_N^qDuUqlu zy`IEuL`=Z_B;(85Kg#t`lk-P)YXYe{k^l{s63fHWw^t?8PISrL8{8_Ydhk)azzO+e z?Pl$n1XdZC)UoUZlH`u1D}@0AL<>rMl=4*Me?5=p31gE+R3Ih{zCwxZey+Se5Bs#9 z3od0~2U(@l(5fT)zO2N0CWiPpAbzI$@(ATga;L~NPS?bg4hVcE{uz*jXT&)lSm9GJ zCGUbFZM(`gH*J=)hK8pXNN@dUN@ZDx+XK65fm4!N9Z2vwO-)V96XgXfGt%xaQnVM~ z(G(2={vMO0>j(tD&FmTf-RdvLEDZY61W*~3ZRYp8Zm)pz?`vG^RHoZ5HTp01jXM$G zMIc;yoyxbpSsgV9ELnk9(j|*UZyWwT`JhPA_6Fy;H{E$Cs?x&6m}c z*J9&NoOyDix6p$2kfBlhSZxDb;g4$up|39b zvptQ?ST_jF1LE8S9K4%k>z?(tdl%Xrh^@`pSU56qoC$|D*Rc9q8v&GO7DCAm&aY+!n(Wh8i9vik;wFbI^}e>T(5Xdp}hn6U3aSez>a7P z>mFDzbv{bD{C>t`l9k#EyC9%-{_m-RC2Q>tFKj?#Xn$BgIWB{?pOFHK1azHj73$B0 zGE5LCA|fIHoqjqxI@%*>RXp?Xv%`D3A0(f_y}bUQX8%4n=;MbNkkH%nv6CN+J*{xY zsLNGO9Q^@kIBe(o$P)z7H`goCHx5R&DgZ-@-P7LL_3AZhT%iJ#)3r4nP(e&;y6F8} zZW29wNwe1Wah(pEuP)b_;(GgcFJ~;f6+aPPsR?i3pK#5^E^vS|nD#XGw(oS*)YPzC zFtGSw7kOfnch+pUY+8=TSmk*Gegyipb8qPR?H_}If z4HqLe_zfrv9NYI4y&2)R(qfCph80^!=lNev#B&h-07<|F1fvA@wNQ-mrlur7)dZju zAed3Y!r*Qf90DicDm=X+KCK5Fa9zM80fZLi0D-CP&xu>f4;nxk`MqXaSX5Lb*!Ukg z3l-a2r9kSkZFIal{-IePvo0kB0?6{8vhBQD!?j(3ZsU&&D>Q(xS#GV;o~|+|Ky4}D zKw+SxvmP3GeXg{jwou}~hCvYzbF#y;@7Cgx{dbRPygooE)FBcX{1X;I5o?#RV4(@c zIU<1Oiz%>J0nGq7%l8W@a`XvwL0i{|T*SNNb;Z1BV~~zfotqni`=mab}gi9dO?Upa{EoIER}3|HlOYq&;()>3b3p*x3$mPmhOlowGtf1EL>WX?8q-f`v8O z=hpnycr{-k8(|@&}YUgk`Neu9@=s8O=GP0nuGFp(=*ViN- zcZYhxZGfcy}sT|I2}&<^S^E(rtx|v z%+9I+R-D`Ilz1|qH1$L$gU*oU>wC#s)X768EA0hbX_^LGHHm6VLE8n7Zk zfNaPsC?HAYUkBeyIsytMC!6i+U=pJd4l7ojIxQZj!>>4b>9zf zCMG8JW(P8$c6SE|ee<%i{CwV?xAyi#f%PNsjeR{m0ZX-JGo@+_Z&#l_D4<3v7OOZN zO$YhD?hvYLXskWpeGX(mJ3l#jdp@b$+1e8H^5Vf|vj*u}S-}PHX-sTvv(pg@h=qlP z7f>JSnws<1meA4M$WSmn%!fXKq699w;`N%cy1E2wt*(_!{{+J^=#sdcsZC8y;}R0C z|6%GWsH%#Yn^S@yBO{mTbrSINcZN_u0L|j_KsAsfR7}hPfS8H_M=~BCIzK*B0;ta} zz!VK8vjqPi%HBJk%l3~OR%9dzktAefD|_#$&gykLUHex~?m}e9!N39_MjwB2_q4gIhxiY`Nf-NsUe*z}_SfK$11S$aGm-#e^=!vA{OXzDrk$X8j-s}O<9(70a*dY4^z?q%@ z^@icd*Jn(+mA9&N72xySym_;^x!E3sq0uaQGS8pW!!qGA+vfyp{f!$pj$qDrbaxL6 z3-o~2?;1AIHn0GA_wUQYGwQvIQTY3}DRKvcgM%?~aA;Uq6fXPK2tp*9vXVRlBO?j^ zF7+(Hy1`^nM=C2T3;JXqu@nSCodxu~ZG8MQK=hIpbb=p$o>A5&8)U-8|S zkdSy5ElZ6Lgvz^+5F7xHMKV-&CanvN%+24&#@+=ft7L|X!(5}^2Zphc5kfaNx8RTv z1crzEb>l7@8UX=;jg5`vSb<*D%~P0^ds{O}@Q@GY>u^)!V}bVdTIX_^4Ja95h(E{1 zvKlp_#U~`RF!pbzP!g-oFs4l4SM{ux@hWv1J+4VD}v z3h_LmppVtp*Kapv1C5kwrrg{QZ&Y2-5qk@NiHahG-c?iD_`pk?#Zt-?)yAy`|N=Rez}flpOFn@C47z&Wa=n zdF*M~&rMLWy?aN&kqzv|P@YyP!vqyOJ3HLEN_gDFIeDe2@z1x=(a}$m;?(4NwY6X_ zpuiFeuY3=+&|sD#xvs8mQE{>BEFacB6%~~atfB569^SjWkAi}Ns$6y`VM=Gh@BqVS zV{5yAs+Q;r`2QU$sx*c}1Nn1o# zD_p|c_lSvC*dv`U^zR2e5rZ`~mnrwmb284<)YKj_Yg$9@X_y_uc#&83Hb!pIUq^e^ zjNVOIy(>_K&wD*)Y}>2rUR!Gdo_ID@9Mu4mR*aO@`^>YG*N3w`6bA7v`yLegoSNyd zz7i7?tF4AzTRhKuF;(fHky#|Br8S{<$`K99Vmy5OMj#=1?PpOC&2nO5BFw7v;@pGr zl5gLdfyfZeB$JVro`cU~I{EGSv*@kq@Ao7n+ul67^aN$_J}zNcDJ)5>Kw+^G{|-o| zvDjM9^S|&L8cS?)b|RiWStiAKey<5DME+sTt>5JZN9dOXxIf+Q7k-t%Mq@8W!{4R} z#>O?1yDwz(Q&IQn=a{P~wuyo1Q4MI@=yHSuM+hGP}Vp9)jj+0ry82C6%1 z49aih%~qpdeXCHLM5sKbWC_YRqEIx>(P&|0x4f?6=F$1q+ zhXn~(XI{U4?R+09lToNxKPD!IN~9UVGOku1 zhJG(Drl{ojhlLfE*TS8AY(FdVdTY7|I81tGW;1vTuwW>usEENb4XYb9HMNqarW7oq z0|Nt4FUJruYpd}_7ZM>o>=TlNya#3% zDP{5T@vWxXU|)qrE)p1FlUb%=AM6b0jif#b&w>3cW}U;Ga2pYzM2E)%@C z|1??F^^Jg_k#NFtAw}l^3AW0;a!;|I;Vh{d(~z1VkC8=uTJu($oN61ztIvmGidgzd zum?5CD?gP|H6EGA3aZGnrPy5~m}U+2I;bC^F7XnsBKO^vPmbRZOuAJo@Y%A)>1Y!5 zZgIE4=XW~o+)U*dBcT~+J-BTrT_W*j&-0SV8y4}5nq4Qv-!O@a{?#h z==1a|c!Mtb)841lcI3b^=ME+06A1~Vkbw0YinMCaH=ki`Be;LR2e^CePq+u$2L}aQ z<7)$H7+x30w1`tiCFfI&{+pcXhndkb8FGmNvEXwc@$&MLk&&@?bTl4Jm*(WM7Vdfj zT)ZKH%=#-n&*Q~AlNEMeWBYcnB|;5l0o@8%wODP&9|Hs22o&!AP@CEYRg}!m-@gmM ztu~B}X$X6CgKZ<1xx#sC+OkYrOk7+!cLd5qAThK1(yyVT5H$gZ}{iW{s{^9p_LlJb$l+hw6uhVfk8k<)(d6#^TBkiruR4|EBz^) zn?pcIfCi(bJC+@x_=_tl3LSJ(Hcck7I=1->4H!GDiBK%tMhIfxp9Tae$R<*_zNf|IG=)4(LyE@E1fj=wP=}3d8Zj|>$ zvzW_I$&AC6v8*kZ3;nTm(!JcqT4jOXytlq~c6L@@a`yVu{IC;#@$5umO1_Nst=98G zyu(M%=_nc69Ih?Iv7H~M16fs~8MUajeng{yw5l)6Og4NypDJ5Ap8sQyUe}gS%~rsx z)GV~*#IkFbiS)ht^di!`uo?Cd)`J9q$QtUYZx*Hu@4ub!I$BA74Sc2L3&jz1&t zZEFSN5HA6z&*BHZ+3%KDgnr3a?f$KIeIypNRo&vE8Pz6ur_Jtx(xqZnwHaqucel-K zu;J>Kd)0~a#lZ{eKND(?o~BFoh~0HMwX4c!WRE#oU_u?aM);c=FF82BS~bI4#nEJE z`0`0R49%msz+%y;)Ay7yX}C?)D#6!rZx!=Iqz|qA>?x1JXp?5ZuqER8o=ri?c;_+Y z`Bl@c>mpUfRy&&+C<-^+eJ@-~*h~!z^XmdfWOfS~ z#~JoVUrA$7Yfb!Kx?27=pW8^McEIAD^6S01^j}%D?O~99o3{5hTzV*UT0po!dD5@>$f~5= z^QJ<2g!YQJTZ^+Uy?vk1Y*^bTqCSCGf?hq2CtHeUOZgi7Bb_6!)JUA&JxKQt6Alu` zbc5E!xJF+`zvUbq4S&Ny_y_awr&ep=d12L%S?J|!)T@cXTpeJX_qZGU!$IpfF zTT`c@eDBqYbMC21PGHcTykgI{HX1(XikIuoGxh}=JnNZm^Q)@?S(n`L3#2ngZurDA zk9{Q4Uy!+cen?Q|&Of1@tkiN~Mu0V`qFN|pJvo^>UQTnZOg(6+@pau~gnm=G*m=p1 z1zUr>iud@ntWh>0MAtb@v&d#Oxj4AZZYbKic-o3d*%T(17 z%YoEs0)^iX+}`7qV5C=u?fsY+p-$Rpm%z4UFE4#%bt^#QN^b;lwXc7mlZGm<(;S(T zs~j;2NvaZ^m3yhbSjsKYWD3kiljN>&jpvs-w;4TqMRmSDE!)SQXV<;U)qXX6aO_vq z#^uw}^9Ujt&UBA+X6gK24llDk?&3t_xj%nR>QKta+&=ZhkQqH_m_C4jU4upBM3kpg zplLwn_c-p3g=blhC(89&A9KewgP_kx^}84EQL7n~y)pQ)E5_dtluX9?D~iPuKAWCV ze6i^N_vqG{e!(1x_6@TOF~YyXiGF=D^rIeaY;W4NMsqnUN>>H-lb?&-T6kAF(0Tht zLe1>K+uK>OdHQr_M&nEZP2VUgELL>>?i5|!HoRcNnPa@VePiftH%XSp9rpUnYRq@= zVSOyw-}#Y~6djaS>}YGr4RI9&>n#=9jeI&dq^0JMSMpM9#1`Fr{K?Dnm79o-Eyq!| z(RXe1cV*<9OaeJpoK}^I*{~kUE_Oxp_J*i<+K!B58;QD*`YSiRv-bi)mn2J!iH%L3 z7qj`|7|p2PdvZ?Q*dAiBg;oyj9e98Er;l#{PwE!TH?+CCBQ5}YxZI$tZ5(&J?D_Y# z9BQN?`u9RQKmz{#uRz)p3OeLV@3w>SJoD{Opuve|?U~_(t$OYgrM2{0LDuv9{ z!U9?`c2l;yDmk~s#hds%T6CY{F9l$t$;-(-8C{`|2FKeptp|DP%kS`pr7e?_)zdSa z@i8&9aqq9euMoYJ_>A(_ZRF#Kx<~|wDE;@-(p(k&_g!C$Pnc-`eWCLI_QFIZ*tz7A zgc5u(aJgPT^Q9doU=4#0r}!S)Oret%DiG`KcXjvl+!b(nEF>hJ!bl`A9UIUs0JNo07|rXkgX3(BX27=&IgY@rrl~ zov`mUovRK7ZN_N*@u4*CPX#*el7zPxJO6F5i^d4uZ7rBsV5Ft}u(Go9!80T&AONeb zt_~z}Yu<;pPz`_>Yd%Ut-w5hXXu^Lx@ zL?IA%LNG-)_J_ERq1Gf~Of2q1fye zy`~GTAsas{a7|21Kqd9VACKzs;!G{I_+_&2T=CWZr7s;03c8R3P2jZ9JM!qRJ6BK2nfW(=S5~-?f37> z3{f1<2YsP{=CT?80lwZV#60#CcC|a`j>o?)cL3N70J$NXMK5V`?Wzl)wsNs-e$(IG zO2N?%6BlG_01p@&88yJ&MznKCL4NJpHKbP*78ZtahJ=!NsJsLYr(RM&d}wTHskl42d=IE7r}lk@8G|gvBy(t^YWGKVz$niS7GCuN-3}1v zz1`h70ucLXZ%7eA>|qqUlZ2BHJc59r39Rb@VPRu4K45W1x;>a!#ekwh4c-FJT}Nl< zJeZ5Kq$3}m!GBQ@oGDQtAV~H&rgu5XO99|4slGAK8f5m4d< zxGn@E+TOMw92%0Akr}k}0vZCb{%aU`v;aby8&956_x#wYN2hxNO?=s-le?Ia;hJ~y zF9HRn_~_y}2b*J-P@2t{fY0@b-!SM>j8GfIm`RQe-%(Np3}4Enxrs+5eQY0u9z06M zeaV-gh7ZL|go#0|8J#Zn#3|#|e5_?AgO610b^5L-v^-hUb5in8GBh$thN+4%^~;=Q zRrre^q($(9KFNsTat?oR9nF?L2e{Hvi%@|AR zJ^rc3W1+(7YO;Tgd$THZ;+!9oopM%Y2HmVr|45D!%%(lb*)v^>c%l|{Rd(bunr%cj zVD}mMRrOYUyku&_w6%j1y_AZBXY=e9g7mI9P6}jTk57g<00bwYpV*E_7g-AsJ4c`| zUY-8V4~xdecrogoJ9kb%(h1cQXuaD;MxsDNNfFtBD0=HJFZdAv`_=kr2;9c-m>5X~ zh0wZCrHjOF;A{*58m+401?~8co}NG6Uw-&W4t;KzO*k9_pSKirW2>Y2_W)S^FBIws zir!=aOErcl;PLu_AVc03I4R(GgxO+)@94W+0rU+ttuP5Urm6@sR07h{sNm;=$plGs zbaVhwXJuzkgU^E~q~T#GDJh|2VoC?xD4yRr6cB;=KYv2x9xebvY0~VEhY%x;jg1UR zbB8ltk_=Jv0HDIBw4A9EM3x#z>p^}D^t!Asrg&h-Vddtw0QddLBCZMO!T}1!tI`dH zSRZKeTwGiXt*m6=VqGtem!)NE?#m$f=L7NgFj6i%Eq7pV0zT|Gr7(6Ig~eU*_s8jO zJ)tiTZjQF+zVaDyq@cgMj#qcXmib!1ZMVYW%G^j^_soN*95xi$y$`a?7;Wr+buS7# z29u<2460EsN!lN@c;T0^hPJ=$jTcnHJEC9t*_XH>POs+vJvTHn{FfO@!QzDH;9+_y zrav_c3zYFMZt-)+r;FJqmijSYI$}&|QIv%3OD4$eN?T8zPHO0}I5awi#}5-^F)+(f z&iOLRs!Ps|QHAV#%kr+*hTGNsY>aM?)!f2*=pI(yc`%?uh~{}$a_Y_nPo~5zWjsyz zckKyNuc&f!%M<(+m+0Rzeb{jxDQF&73iE?aWOZ-(Ph-jGq{rd^vFR(Mk3wgu=^G6va15^tj zul>Lb!(H*-ee?|=yI9_rOGU1K&0+ZmaGm4%?(O|Ic$<#(r`CY_0BhD7f~*RkqN1)W z9)3xg`%@?s@Z?=eicwilJWMBmg$7{jI%msKlY!L|L5@)%9tKcJa`+Y~Y~KS42)o(u zr6pvRW-2BX6n5<{cF{93)-alQ0NVtMi(W=f1z_{FXS-eSI?9-?efd5VA|fJyyaiun z*6pH@i;Ih&E6T@l*}fU8&k6iXKU~;tfU7#C)tTr@fV3us!EPV+B^g!jPMAUz(W%T# z5dJmWKP4UNV|Bsk=QC^z#^|>*OO5BbhXHW`{<>rL(RaTffl{AQTxlX4W%_-P44 z_q~>nw$w{irH0k)MEE~m&=GvXqTXVhkz=(d4psii6FwKxs4j0M!xwt4TU_Zx+~SXQ zqbw5DF}_u?VZp0mLnyh$WA>MapzoXH0ee(l`H(GrGb1A$S~jICi>{OwncX`-^wB?c z-n~cEgr>@?f@QeY`If9`r9y4RU?6QMmj31Y)bJ~8&ghlCB`e)pKVm=K56H$~G0c=b zPDmzZ^Zuw4F@gIwusKBfRU+w!nyB01^Bi-W@!#jAJ9Z?LKO8#gLEy%ToR+%!C@Qm? z5@Et|p+SA`yKC4mCBz>_0-3J#=KyjPPi6?OUjxlWynt&2Ff0 zONHoV#vZszc46Z|f@lEblZQNq|44BcQr4IS;-i^$*g#F~@m7Ck)7cC5V^-s4|C$50 zVV0YO3^RoX2M1Er_^^NQzS*M#dSz@T2{y6jQ(xl9=733U-f&( zlB&-)>AM7#Sqf{X5_=~}UOz{Rj*f-~pvdd;qGoi&JQhk*_zLc`a#*m_Btixc^I`Sm zs;0pDpIU%aC~g3yWi|YP0uLzABCwvt!WdFUc06WdL%w@*Wkwv~CIA|z2&}~FuNrQha+?Rdys^Mx8QJLesQM@^lkj2YZSSO7XlJxK8Zk zR<9UBElJkT3)0R}d9wX$QCh)UFT9^nitg;932@bk?>^upa~56~_=JvwrcYCWn_f7srNxJRzux%c$6J84XJJqvf#);3 z#Z6$(z?|`Ia(AWLvA!kA^8^cuc)-oWrKsb1U%od7;C^N5bsrleBO}BVjnj!5`mJpi zLQ4S}fR6A7;yhj#0@#Ft=U5^E+A*C`^#;00N-x!>@*uDDzfo?7MLHjohT0b_&mSLOZZ+L|WvH+gaUqtAw8D*&RaO%~fz#%Bp{Z7XH@uA~ z9tL1L;w}R_&EuC#asaWfzyySiv}QeCOG}H@c~cki!~Rv=ety@W3qSi~=Y>!(V0tSy z?;&}pn3z{M1P$re9!EZY{+DaR^h>=7L23*cus>>Q4xiaR6zC0pY&Q}7(kosvNN~}X zlwoivrOM=`NN5?MjjZAa&x$%9nP4}PpqMpSMKka=ZerHEE!)(pA z`cSeqB}hR3uO~oy)st1(r=wo!y}}2^`?<2AtLmqr!^d_!nO)3ugTHv{|Uu?&LPsloUK1vZt5&Gm~L(RVMJ2Mg7iL2 z9Cl;ie!)1c^OqMF*~QgaNxMdzhA zT&%07+>n1RIbGN1NU*#v5xP6}G@&wOXf^OvRa@$-iy`&(P(r~;-YQist=NL}^d}l> zYUy2lePfHif3EX??O#G?sA}~S-HpEU+mu7^objZ)uBbol&YGK;>}C= zh9kBKWj~WRxrwcYkC5?p3f)hn}9VclQ+6EB=X?3<5@}*-8{`i=&Qu z9&qV120fo_jVkUsbEqfuk~%#lh`6tiT~9mbN8wD|DJ;C(axpEL-$+44B|c`z-WapA z-8Jb|y0-k%vNQPc7Ek=dWqh;j;Y#^O2!N-#c4@h&n$f``XvJ_v!=l8j_s^ksI?%NF z*?hC<)n;P9pcDRDW35a6b&7lSi6Rz-n?#cWVfxT29V27fw{N$h*9Q?AFor+~aq7~b zrG)yQYTer00-Z|xq9bscA7wHQwBoq?Ghlk5y~v4jmZ0-_*n4))&UZhKO&m(z?u8gNTTN+g z6XV`QNCn@?H?Ph0qWDsvZ%KVj%~2*mig1 z!RN*^_Br4B#Q+)A3$nIY*)uz5Yy{!+rPXZW!V&i6vn3%SlMVA2+BOm4$iPx0a1h3B zJm*v!vTv$0R``bnin`eN|Nn#q0WAgmFl8Y2^Jk9Ngb21c7rXaFjxGT(6HiZ16Akff z4Cq(qPe#RBYOT%8%z(QC=}DFA-^|a>^6+Z#xWf0;#(R z@G#>52hAH$g%ceN5W zir7f}Qdi9yasY7!uxrp^=l%3Su44c9Lob^P-`E8ScB^5!)*fvc8L3J+*M>Quuj*ltu@}W+?ZNfr^v`8(P0!HPt7|F6nf3^L2O4S zBJ^+kEo0r=#8F?Ru49`I=#UV3u@cZqQ>lF=8e8{_pAIyUO;G>Jkf6{8VRFYamlu-Y zcFxGisNL;k1o;ypK~(^K(u@fZyb(~o44W_mT|yxqK@hlN|MgUzwt^D3{QIz?8qi>xH7A+H~rRE zwGzuaMb>yA-8iW=%!&IHm?>JA!*o95L4r~Eu=LcI(bEoRwzcn6y6~G!87m6lOW|Za zOpE!|rp@@tH)sw{4c+yh;lEiKeI51X!N0i@xSY?V^`q0YM3!+aMt--G;^7;5Wd^}m z;>yHf+7d#x|C^LV5_^h|`$4hI&4VhB1jh(0+;~k-&)SFoWF)Fe#U92j$A9BwRtmoM zZ2o^_BvGAT|LlK_kY=e*62tv1ucHg`eGW&|$y?nJ>aph$x>O0tvB5PDz=#V54fqek+6lFziY-&}^k zb12o4PEDRUQsi*MQ{g&3{ek}UKUf7_q{}AfG+$dP&n9gmctwR-0u-2<-}w2R`ZT!$hGHrxVoJact-A}-DEirWBV)KVQmq&37^jJ zp`IQ_o{D15pmlak|HW$P@(C!{`A{erj@NbOM_=jZ-el~i^hZ;s|I9wG{zmh0N`Xet zZG9t~)qAp_o10SqFsCP}DE+J2DGdbXHq*6tqhwkDn`LEXy)p~CAd2MKVb8 zAdD6uvrZsk5yc`@t!4mpBg$1Mjfb_g#1?+mI6nf_MiyuZL-YtmU9Rgb%CNj5o!UI0 z40u=mdO}wX)ilzBkQ8Hbtf=la$z!U|4Ih29`R;Dg*r(D$KOyIChgv`O?6u6i?-r#2 z(;>#(0(;bKxMg{ga@vSpGUZOqZBh_Q*;f+so-&!5XWgFPifO626GMMy;(s+qEwJUs z6`sh>iM=>31q-i1907D*)PrC(2B|Xxl?=YoWbicsw<6$?8<|k75 zF^p$WAItMGh@|N7CY5;r_W_#-Wm{Pi0V$uvT9em&Ys!C673<>suG<$W-`Xa{Lca|s z78|kpx=c_-p=1`^Sh>^%bjRV^|y@%@tr~X6eZN#sc)?(E9NFPzZV=v6`KIAGts zo{Z*7Ye$slMmQ4iXXC>2-bc~mC*z^!4JF(T5f(35f059(b>{G4-@gAlJ-1{orTQ4v z@mOz6L`T)SW5AYrz9B;Au1HWFs(rBBl1K{wW{DfoyV}hCHJg$@d@&er2uTIDoh$ci zov#-}MQhXn*dG#!HUw$1}8N4N@brSWuhxqgoei;6mq|#92Pxpua9(MS5MwG?YuPrq*rB64=#@6XAjFicgkR0EGKR-bw#QOL# zVjQmT0R=25$Si<&LK@toBNw7a`rVLqQjnAYcp_8jkmQ*{MOky+8<%*5XGBhpHt_&Fy$ zEHT&7)(%tyT3q+C)h8I&ihf&L7-wqKSCuEv@pWgM#rrSeqtTh<7K|6P>S>AV>{1Ox zl(4<+4<5rjc4Q58q$j=p^w>!7_OqG1ykhDvQ@THhiuNDc1aT)LeCFx@rvKO#at+#4 zRx2*I3LX6?09ji&;i#)7V?y{efKZX-79>d);86tW1jyFd(h{+i06u}}1y?kuqg){q zH=fTa5VY8!utxm>IKs+I{bia5PfCNo;r6QY`H2%UX3*;+QcjW@zP@PwFF0FrPp0h7 zJvekJEUmn+Ii^Rk)7&RrZ7#Ir*v_UG{ZsJNrJ&e+XDmu0Oy)Oa>_)k2aJ2N-_%`zR9!6joDE-Gq0X`~;- z7FBk5@p4eAH)3H5b?}j;J^5CM$y4(7(+Y9nL{kMG=Yd<_g`;8>6v}3{toRs0`0Ip1 zR}@9*52X^UmG#?V!ZK6uE9WRK3LX}Uu13C@Cyxh_IdCChSC0b7;;+}` zp%*esl9MT*=dXgxkIC3EiBH`0+Kd~@=kZdV z&zQAC0{!58M#5?dhrKRJyDUG3DnznPx>1nRG_!rR9!PGO2GowI_c2 zLHzp1+z2IW?^=#j;hV28%3nxk3?x?-C1iY*#??|XDgD0*Vr=!#UpQjN z$*M?AeHBX^NS-YIqfB)D^%{7^p{7A9!g}az#GVL5mIDaL(SyjDfbJ2X6hG*(w$dZCtSxcA|~ z?GJuzBkZ^H|LJOOEva6-di-kISnX1~ktxakU%$Pk)LWpMMvs>G&C{lQ+BdKK;e4c$ z`O~Pw!$=+8c>y7``WS1Mv*Q1AXa9m$(ydlx$d{t^nnhX^Ju#ni!=JqTAvyI&pGqFv z5G5LEhyP^X%RhF}6cqWcccv-8=Ks_)F)v1I_Nauhclg$^Z2aAWIGP}$HzgkJSIg0c zFIe12kvbBh*oDrv#hI8o3n2v@3lPd#kYs}39w|ZqE?EI85(Px&;1oEYX^hOE#N^;E z%)JoAeFUOqc8kvC9soHhd3cDypa6!Urlp=QRi5X3z=a}edj$4=JL7ekP*`^o2zx4E ztWA)w4NA`@J*}+kgt2Y#dqK+}0?8{tWkTP);jXhV2(b$cRh=ObYBgu4a3^p$SFU z>oJGXJS`u<*@f6+A;}-6@MlQW2TlO2GVx@BZ;CAX$j)7pcpNAppX#J{oL$nuUc0^ia)Z)?<&^*=x3h6t6#@dCqjP zE~{S0AKe#t!*bez?((cXCeWdA@Z!SP^aH`#mbA-*_WNH83UPc8V4!dK&OwxFMY8w#=^ z5JdpGnY+*W^@~tufgbp>pr#xE4@+z4{h*v2`kb5`L@ogCK=wC#mYx^K7RDwfSl6$o z!Z_MYl=uN^9sp@(gMgDpKQd4NmUsXB+7;*#dw>FjeD-vB9S4X~^w%B+Wz zTlK7)ar$mBWGN`WXPsky{3b4nSQ0SCyZQI=;uwKn1}fVo+CVH;t(zZ@NZTi*f1_KKP{5zrvL6XiYW<2l3Zb)}IsugBuV*=|ABm}6_{=?u#Vfac$ z#l}wb+Yx;nS}i-&JlAfDX29$#0X8VvDtN@{A& zP)k{YbPS!eIf^)6>A7y@c~GKve`5)^edVF5pNJ;~pG} z;fFz%|0uG9nC}%GJmz3h8z{91-k2n5w-J1ed>&crp zd;k@GElJAFT^IKtLq$dPh(-h=K&wHX%-t8P=V#X{>cJEGMLy~O}Nu(7*n)e|_L;{)mX_4Nz{b;B6*%gM{%<*_%6qFC~~qdyBlfUWKA z*}dy|BSMoR#gf13!DOcO{d-^u%iX(ok(?yN5Cc05uy8fjU)J;;s%+ixi;IN~ZJ3%Y zHt1j@Tgwl1nuymKBRSA(0{7l^Q zI5_y#G=bsL6XvGp<+(Gc{BlhPw7*%3f}qE0|IeXIR8-W+kA6Y3YcRr|1Qa&vjM;Wx2+@)_`U;2jbZ6Kn75%K}22 zRM;~f48t+*+ol;-O&xqme%l zWCrz~plyo$yWFR$qS6S)qW0e2g7QLRkcdLOgE_dPkl(N~{}f^O6clcPg9`Xv;9#Mb zLPx}*V6Xy1wA%AG1%^LYP?Lkn)7XEJD&U_i&hv|ECrJjt2ri71(9&09D`J z-Tj%%mIRUVA;%{e+cLf#wJ4+)U&0Qdv#?n;=(fG{fs#apOIVDz8mHIl`h*ttpUOi z@a(os8pmcdXIB+o)5<0v z;r!|BWkfMn@To7ZKh=!ZQ@A{Ly3^~k&^yJ|Jyt-_;h(Uis=q>F44jQW-EQLtJir$R zk+9&nPE_KP|4OCjVh=kRn_w5>=s!)t?ua)T&Owxf&z20#je^^B-P$Z2y*VC`;b5n_)DFmhx6NP>HxE zcM@6t%cDF^`dU)L_D!1^HsYyTSJgc{&~#^;Jj{FuAi0gL&dX!Rn;$$UWc2lge9*&Q z^ou;^=l=q?_CaJvxJ(8N^5}E&|D9pEK~xnM$2azmFKBBXMysm5>*&hvSfFd&Uy_dy zE=5xM`iY+<|Eb0=>c7{7qDu?!u7h@7+PBb?^lq0E~b`Mm0dU)GlZwQu5bX%bwVnh|TX{}rkyUO&{~I9Wate?Nn}Ib(k0p=at6 z6_bp$-9?z!g|#Q7Scz{mzbD;HUf!e%S#wY0!MR~g%6nvtp6+B7fUF2 zT4%|WKfQCOFG=KujodQJxmC54;*I}`{FSm6e=k8rW@Kj8@$Oi(`AK0$%geseSH+2# z|Gn=i3V#ns+D{3xK#g`&B#f-E$nJ27gk>aB^uLP#;pb4`8E+?ZyEuP)q-}e1+rHGN zY?3rM#JVNW4LARV5F@Z=DWf0-$X%txbQ+)HWyib`r)b#kE+%d+IBYUBIH=5Eo9oo` z6X2aR?E)%oG)9>infZYyDo&hwxBhAO$)0YXQGnUof3hYq){`25iC-p-Tv=%veIi>9;!Oq>IrWJk8DW3NOJ%20a) zs?Yfu_9gJmZxMQS$F+w9dv4`3FpZp>Iyfv-KCE5r09&=I_2AWm^xKMK;gz;mOg<2{ z3T6y-Y1ryD(et0}{Cri_{cX(0`19WUg1%@^Zy4&h?SgDOy2eJ2qm=xV=r%1u$C(RG zT|!1%SKUYc2Q^dV72*G$wc+H@`}&3l-6*Y!+q4I{+4$?|(KL>~V!nB$;1t%*>&nwG zr3&uwiW)2~)VMHukaQhWne(Y$9UF9PvLwCoXAbkK@wX$1=Gjrqh>B~o8cdM>&V0*; zi|5nlhK!qu=kdyy%G<3b7~Ue<0yDG|?1o?O9jK$=%g~ay?)?()uh@Yjs2>P*`_ScL zz2dpk(o2m)7rz~M-(S(%PY73!p-tm`2?NW=ZX2xi(aobivXIEDQUR@Y^Q_hRH`;RV zp45K2*sH>CnIy=uBxDfC!eFmXOT|wN-lpTQNX67I4)V3urslsRp_uf(M&{}~*1msg z!_m$7U*954ap*_|u;LfrznQS{IFF@waJ75Le)99q?@XFwL$o>T`Rl#TX7g%Zx?fgR zpPs{mI;_9Y8v1*(OikAfXFjM558$j#@@3H13SsLhjL$!7_NXaEmx&cW+ab3cw!kao zjuv5&Cdo;EqK4?jL|69C2e`tvp&x_Y5tt=x&bCoZ&b;9+FbB7Jbw&f509KFxn zJa;W%E3qDr;JVJ)Rww;L)rK@_sF}GLy^{DsK`8$1cLQox)_b34E^iK8hElNTBt=)U zyuH@(h?S8cdR*_`=l7shMUclYMV+)x9%+OD-yfPNaqrh|; zqa{}~S;HW3G5PVc8#Au2Lsi&u^Xw_aY;^1rTCe_cCgx_hbG#T!`)2#I8eQgd@BR(T zechl`aYwgA+e8_whawC)tFzfEzi7W3Td~}#t&J({`!07mwx*%r=}7Bte%e2)i84J6 zJ!-(bh{}@iJD$@EDhKNVk%&A85>|BQ(gk-fF|X)O#(3ri{p@a(s;e=Z3ic-(9`#dE zKIhvGB@z+0d8%KFXYlrAeCu@OYitS#3l(D@$9;r>^&9`d!^2*q+2O3Bk$vOt<4znm zKVQ>@;8W`Z%P0@xiJxTB5k;E=1hn`(NodLDeFZM0AC4FF!;?DQhzPXXN=@trh+C@F zE@3#B^r}ArL}q`qZG`wZpnw9%wB1-=_D~Gh-=94# zypS~&;mD11WqWBPddOm^a&|3(e{T40d1ltt11WQDg)`c>?Uhg1aG0eF4(k)EI)p

    3Lt-19z%m$Qd$ZPZu7tZ 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 literal 42251 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 WpF)U^u~<6__)$~VRQiZAfA&8l$L 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 Z8-K-2-Yel~FH*qk&MghqQq<$X{{v8uQ+oga literal 40413 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

    Y$Z)k-%B zm6jPWg#9rT|8?U19#ZM1YG+z^|GbIRAcxWa7S^<6CW+Bz*|VdTN{)$Q_yUVC!qM|UT*X=-`nsRXT{w&wKO zK4kwn8OdnE&4p?c_M#6sIJG|aXA(NRGv>8U2NPu9zJH%QbcKe4(}0(<;~;ptKi~K0 zd?Mn>jQ)X$6PKE*WukB3dkIr(F}^obs>+_Vukf(5yIbx1;0)Y`@kl&2DFuZj`05{) zDpV@!^d{MoXw~WQQrdzfr`4bSa2`6G#l`>0^P=Ovogh>%UlyCv`_>W3?gB3#RGchU zYgMZ^0hi(~{@b=QEvH_Z!a>ovaGeq(iRvc};>Xp_Hmt3++4UN`T{>PTKYM=Z!9j`& zWU*T(E;_-=1D~1ri(*c$Ybj^|b;Z|lyubB-y7@)_WTKg1YNS0f`WT^86I-rb#2eX$ z_3`7~q@O*#w6t_D(?nb|ZAQ@55zC3@pFGnPv_vsyXN>Avo?51l-xAu6@DkUvQDLhE zXi|6N>F`pMg~WUp?|ePj{yWt~|yjCe5ygDv7=|wY7`Cji3M=d~-a1 zo^-uJLsGjqax`1!1=U`m8bwAze3WT}`zXYM(A0ZWYd|`2p6U66)K|mEO zI;_J*H8+Il648E^z^cvD;+ZChk_p>VSUeP@ILl#@%@e&i&zCq6;Cq?J!woN4-ATd>%+oyBB> z`_xcxmw)TEulx6{m34mf-4o(@*K}tl(`7>8mmrSz9+(N`*T;U+`@bGABYf~yc^K<+{#fRAe-r^UH1x*NkxaILA1;S2ZU`z#C5s@Ln8`t8OGsEG5`R*MHr7}36`8GU zCvh0V(T$0B3`bc`Bbjm0)lz{=7AOD;6jBw{h~3>ZlwtntKfM6gvn37>zwWo3NER-{@r#80 zOD5uL=%Bv5!p|NRMeYt`sjNVT606-cdh323-2Qc@`qM(})G36LK7v*A$pdOTc|7+t zO|2E;`sKLM2&!`c`)6JA5tT_tX*nzYP4B3pvNF0xrLNITi84^8yxZ8>=@mug?@c!F zADk`IXm&rv7kqsfr;Abkge8~C3iHY5S7TFC3Niu5#@=2(+c=+UYD_y&JMiwg+#Dza zyD*i-L?UrJ%loL*J78QSbZLs!Nf-j|qeyD(p7>XL{CDG?xo4VL8R_2x>E*b|%B3_T zAGN8@nNX>HzXyZ7^c#1~+bp|WyFSbw+ejZ(^)~GzV~dxIwfn=oBhJCSgj3JRkOiGc zi@p2Q{$8Iba(=a+AZ)qTyv9kMio9oQGEQ@wF?ckWK6D;RrfpB+Dum4av|(28iI?MW z?x%m_Hc_>GJtq7l5h;pB&BQ z!y$zZKghWv-xD7^T!3ADvt@rx9qIHPLT}yquo!{u?n&7Mf=3L3(bq%Ls*0XU*84NZ z`kuMZ!Na{(Zk=8A=nC_ts>MUTQ0qt~EL3&pqk4x<^gsOHP-nQVYC*wte)6Z!ZT(sA*_QhdhIl z^}P?Xt}sMqPj77RvHcg#jIn?vomcf=%H$*?{D^=YWebFM9i#voYQ=xGnrHok>WO}5zlfWAa5*39L#faYT7?6{ zv78X#${EU63vrJoSjNQ<_g~a2YIoJNMqgswONPz2X~xYl?pfX9H85lkM`|<}m2C2G zo*+;g$56{ALp$26XN4u0Z5E&+k-w#y(Mh>B;(7a6vbw*+u>n~~0DPnR zR+p_f6KiP9^X^U8+h`!ciY7il$jZu|bBAJy%#d>;uc?Y?Rx@T53P^BNE(N3KT z(VE<1`90>c8Yu7$cA&wJ+gxvap7FMtxk@x{Zp@GVd?}l$8BXrI!~j$xDpT;yfI!ndAt5tcKF8!%&9WpN-7nO;tBnG*U^go zJ*2#(UMKm+Z@+UJTUC%KDy7Bv>E5sN>dDHFXK`@tFA%QCojw$xTg7l~h#zyoC-81HZl!<$OyZODOW+Vgbo|yEhC| zvqJsuY*kiQmk^lYFIPvat(@eN(K~Ooa^ht`m)^D4&7`E0hsQqnetp1}Lse7rFOb0( zn_Vov2f&JiE`vTI=qW*R4kXZB5}(0%i!Lq@$BdN>ZY6*>PF?mV>6Ygw$V-F@)$_)u zmi;(!CysO5YxoUw7Z4DD8s*DKpGO3Tm^^D7#)J-ASbBwM@pNu__E%zl_-nTydk({u z`p9N<8r(9HgSifRCACuJ01pJe$x#Z?=ogNjyqOYyQdx(4=x?)K59hS~MXL;}P6d)j zDFhDp+@IR$M1 z)@#D%53A}3G?M!qt7?spr+Ie4fpPP**PIi!58pBhZ_6njEJ}vZMXV_8$ z+!7Gp0lPW=QV)TrO$>U(?6=MBDBID?-9v+45Xftyv!=EI*&}?2nhdyizEaj5IBQVn z9KYpedU@-XT#0RK{(rA@}rs6?*iZJFs@< zTyKX0gXdK?t1i3i!4Z<~wIg#x7x5E2NCAP&G<@HV%29orm%W@7Joi|^5$He?Ao7Cy z&0$wW%|o`cc22ePi(tr6_LCj8{v0d@!D&z61dQ*)@U2*k>beu81;mw#=4T%Q{mEna z^0f^QW`xzNx-K@$vRM1esR?EsjFD|vjJW6lgh+gdBVAk=ScmD&6tXG(|km{Yxf`OnLUCNJ@SIz8Ta z!~c!(@t6Tw2 zCCGt#p=Wdy`G-hgZLLd$ZcPPnjW1^glPyx<278sx3WHkYXJD%;J(O*`+uR~drj^Vd zsn@DI7#SJS=^U#r0JfkvlS>saCsG^rVp+5iR~~z%#Q? zol|v4n4c6!c!Z2Ag`_7WQlI&(FHdD_>DS2uXUr1Uz!;8fU}~fShe5#qL0)`m*VXt1 zL-fdst*P|Fmnt%}+5Og|@rHK9)GnHgmW9X!{gcll25v{n*Q|PZ55m130xgW@iWC3; z7IS1MjHEjin5F-2`ZS4zOhHc%QIW?7HpFV#wfYh>xugd*TI%ltfMZ}QJ2cIEWG}8g zuG2KInDj67M`jv7WhZ7YC>XR}vjD*D_aYqwLw#aG!h-!ulMx*~eVty1@1i@vhIITs z0k04V`mfyW3%)Kk06KVi*`d>})$`K0eTP9zFN5D_&i&!aOvlJ5_Y{y#4L}vD1K?d% zoZ~FD&XB%UtOfTDzB%lsEzISIV@_Mn%9C1g*ywtg_JAV#harXKIH$mdzjcty$mtcV zeuJHe*2#W@oDKEU-)t`}XgM;f`^HnvBNUi^f52Mt)oWF5Jt^?FaRmQlc=VXIy?(t5 zJ00n>X&|7y3$w7j9FM90@w}aIsx2-5Hpjp03o7cOGO>-GcD8`a?*yNYbc)!TKyfZ8 z%(8;*wdKM3i&lsP1eQ9f-fQmL{m44P+64@bC!ac zY%Oq`9v^RFvrwsj?DSI2g#q3kUPwq0Q~ARhyxTE41v-J{x3dGvM1?HA!Du4hPmGMP zU8bzDDJg*K+5US*ZBEWtuj{?b+j#>{sTaVL_5pHTqIR?JBGXzo>%d%LmXFOpncN$1(q>rkmr4p=0fZ`VkwC?@fZyjYy z$N?e2I(1`7J=)z_45^eu%#QqOua)s@P1m0_bEfPCdhAN15Q4{>RenE;n+{R*fw8|0 zQpsjwVO8;0^e(3wTiJRr^79xG_44ifv$-*ot{z0AJ`%xP#JM6Nb+NFbuLnC2F3+ez zwTrfIRrJrFXu#SV06^%&vB9ehKxq6v=zYdiFRL$&Ak~f17Du@0xyc5|wp%^oTS3E?4Gpv~obMTiPSYz@6ASi(b=j&)6?)hR8U$1D! z1jk;goDbNYapk#ZHWY*ne)u52bi6#;todHc`-6`SuB!sT5rFbIZ)$4#?R{%KVveV^ zl;->Lu)njv&*{b@R+eM7^$jANGlbPdpNk-#jU}&b(O7BhH#b(M!a%_TK@*1+Otb@7Qbia5>z zjDp9Yi$oeVf1Fk|-U9F0RfhJK7GeYbRdh>gj66Cj7FSpogH2>1bg=L%2(3p zx))5`<$cD7wCM#CEwBYH(66(+_d%J9wp27UVSr|1^S-eJG_WL4 z5~XmvP~kA??|?41*@-=N{-XZ}!==}4`gwAauD1ysTA2ZPy4lhpTOJx0M~ayBAvTQ|p z?93`{^W8GL?yFhr*&XJ(n6(T~R!gYZ0B?w+5!WfAio^;nw|KZ|D}tS z+PkX|T&SFkSg=NPg&oblw?d8s*7}x-s`9dXvH>N?5jB)2Nuf-(gxebKR^Z<%@qv+ zT@5qQ#f*=Pm;z|xd6y|5SG8E7p0>C|5P(Io8;Ua|{|~9FE~?ak)4i7@x-LL<;j5VoXsTggfi`O$Zky}uHvr*&_@c32acq61&SI~ypf^O}32 zze-xnU>S~-aW!arW6n9`k8STSnUQwly&`rfK85$AfKR@6C}i@m1ibhH4H@476F@I{ z?ZiqR0Mk%0rmUtGG-{p?faWg^jaJjJOiWCl(|+NE1K9HZY!w6oF&lP4=<4a=u^2-G zZ`xgHc4=yDtp#!|m3*35I)|O-MK|1}b-nNPC}*M<5*}+1ki{ne#hQ_6rrlpe+MV6x zU?7%@Sd;xtJnY_)X@YjORNeq8K09c%ytWvtsf$~(h+4%>9PD29n@43Si78BUT#l?iAq^Tl# zf=d1Np|YxuAz(uT;oJ9a(IQc=9RiryLV1GJXys7s(OMGy2O8Uj*dL3KNo{f%9EIHz zl9!M(08V`-gMX6O{N&TL4c3Eg3-(MzzHQDBKEi?h75Q;&acmAMOU_fmXZWxV>d9!a zIk0ycyX%`(01^SpuS){|FrAQZ;){84GsNm<@WdhJ0qyIWxwDpr9KP4NLai5uUwzj(vpN(KqDqTizR zZ;rFNL(YqhY9PeDG3Kd^Z}7rm2u3UY2{?=o$_h1JmfIS=pdI8+VAe@2uJ6VVZ#<#f z0b0vBi*@66I0XZtp`puJ!k6dddb*SdhPLBdzW>k@%^KgBcb^*5 zDT%y)jX=dpADmdF@G;kTYbn$clJcz8BF%{|tgaXB18Z2yN5If)#d(a%5E!5zdB}t= zN8$j>$=;z#4qxiKu{U-&d#u6oF-Xd!uUTkuAiFOBrJQiUtI<_57r!=0$^}U|AZ@Jw z^M3)44@5+yc z(iD3KpY{~OX|p%DQx1MF%?6mvSE(u}L|1%7vwq)aaepdD*;HSz9}N*1FHQ+7bNdHe${u__R2F=ItLpDCX9!`t;Ymxh5Okl3y$=#&`?7levV{t*E;*y+cO3{PG@@pdHt;^^{`FyDy5`^CK`-n zbbB-l(FWRzNM!H;$XK1#bntYs;`JEs`Nfh=)g%y20R8XKev3UeHr94CC2PA_^W%Dd z{CY~3X|^;Y&);^rAqp^%%;`)3hak8UWGK(h&OTuw=<4b^y1Q4h>em%E0h%DuM{`EM zpO)w;nDhL@=eJ`Ga~hp^VuyDutlZ^83G^POqZIagGMY7mXJpYy=YRtRS+IY+e!j|c zbJQ~~E>7yv5Xxbs(`8~F3mA@i*=7D*p|df&w7oIAc84yh3h|=eM`Fdwv`BG&yZc zBs%%$S%DrOITk>Qn@wtde&>7u56FvF^F*my)+@X~psM)*>o@UUul+txpw*i$gU>4t zV9OeK`xPeo^6)gSU0zHdPK8HgsbU1>tE zP?rT34nTo0Zr)Bv{vqR%+W>qwVy`b?V3Px@<;V6w%r*eT0o>}j6-G^Q@J1oT%J!K9 zNfKZJ{GRR#9o9SEJO}?wL)5bTZ-yWduK!xTi?tsE%?aQ{&1X`8KFA+6y4f_KdH^MY zil*lKm5hO^x;m_gJ`td2B=`a{$=tid%xh-DkE*koN8#k;1o#uMLK&QiI{{ORT62K- zF>t=-?Tn=VD96Ryg?Fo>m*qDAS#3{nn@0rj1hnRphe;aAtHeh!(Of{I$w*u|d0H z!L|V#u*6*oh#k+M-Rd}H@^W*pI*&H?`Ur*Y$pBC$P3ktOJ)CKJYs(k{*c{f+7`E^L zPr;5T{CAMmZ@$WJ!a}fNc5(3`$q#4|7mLIBH#au}K!)s0T3*-yz}SaC)ljA>@EhoR z{^K5lm~|_O-X!0Lq$adD8O{YC#ZYDj?T_`^64B22?>Vv z+Ggb?Xt#2}aPU*XDFP5>vog}s@IVAPfb}FhiUJspS((AD({GW`r#Bmmd{;;MyuU8s zXOR=%(9qV_rUYS%tdIaa#q#4U$q{g}$#i{|PB^vFzUQKH!T0~=0l^uPO7C#oKo}u% zy*?EN@fTLgjcXPHXF~w$0q{=m@V&VadWoqy@#@V8dbuMZ-vFbitnHK3m}>du4n)}ty`TlS=nKCG7MM=5RKcOhr-`E}2IBn_G-$iTxNERs^x zmAC3`!y1#3=cCI~UUe22e!<12)OsH#{il=QfRpK?>!5`9z<75p_8|&6(~rf92RvP7n zVurBosT9k&qMP1lGo)N}SxW=F^4SXiZjt`9W-&7_%sPs+_fhzT>3T<|ic$zu3h8rfzo?iQDRGlB*X6ll7SI_N!+8{3Jc(iw)Pr2pmpPm>ipfvBHMg%o-k@xt&ERHKjYHoODnQ~r#Hhu4)4@2qhjA_yKI_vZ& zpt)eXerUO8j(LV@$KMZX1h#H?w;?GnZ)<;Yx8YBFP9XH$D|E)&QTyQ?8`QH8{AN!R zlSdO4nB@V_lH|dZzOp%GQn$X-<%^jf=0*U{Z%P=?lT0o@uc;e7iF2IUB zb(a_48F`|Ep)&D_Zo=D|CBUK!+O6DxnUL>mVdpo$h@$-I!wGp*v+e3|mDK<+hm3}U zQ@r(A1>?*2N`l_m|LFyILY?^ga4uIsr&g{RAEe1Kqdbea6q+aQ0FN;JpAwYc(KKJ7SLX5=+^*@8-u{lB_$l>6c+kdA>#b>fUXhUUZM>tOfv;Mq=9VPT%HGxyagf|C+G?Fn`^UBLK*sNKM zOcDx;iAt7Wd=|gHV^`gW+uF^A;6#3zhElR9inoXSF)rnMjTyF9Fz_EGwRL=Md0+LI z8He%TcelMtknL)p0KAn2Pmv=_bqIG{JlN0;)mfWv{NUSl{cJ8Inq7Lw<9;Hw-r;BC z>jrQI>ESz|kyvXv`7xT1d#Yd;twIuz$V_b)kj0Agd=NXwRh?9Pd>O~{RrAMQKtLb8 z9v2K)zUC+b%HwM5*jhD-=V^lq*tfapz-0V(n;s zREibV-Ka$p%c5kh8AsHiMT!x5gDzG!WqO}FL9?d$uo4?}2BR2{dbD%PBRDo%MXjV{ z9_)VXKK*pt;n}`k)i`$D#<*B#g$d}X()j(4pY6k9m!+Hux_>*r%Q{=YpUb#4*Zx8- zKD@%6ubPC9g(vQe>w&Bzpq=QU~t zds{Hv&RX(Q>CqrF8Q)>WT5>ldB_^dzCZd&GFeUVQ&H;k3zHnBOs z#9tymxTkcwqv|41yEm1^#KnL6XCcmGR;vm+2~VMM(l8YXgKZtbr#%4cV5XSNZohE?>rZ% z(3&aX?a&WcjTdS(qFO_AtRTF&15>^q>3m0_X!2@`Z|00lK_bGkl3r?w;?hBd<(j2v zKRj5H7v5V#K9QL_N;mBBe|KLj1I2n6|34@@%c!i{Zczgkhzb%?A{`PU-C)oqAR*n2 zAl)5`N`o|rfYKlh(%l^rl9EbypSj-m+xy2kdz>-$81MJvL*-e|T6fKBUUM$3@XPPP zg*qH7D8I(nb3b-h?@w`3Ti&MmTX9`}_PmG+L&rn?L}quS*&RP<;x!L`>n7f6zqSN9 z6aBkiJ7ym@9W31PItlQ!7ijV3Bcb_wac#5@>H=27Nj<+w_8b`n7w@S=FMZ4x-+&K zx5Fhk>VH-%HctQcZTE1-%fQH}CF%PBcV-C0{0(_h?BilztB)DMYES##d(z$WBK3R4z0k%p)o8v zIc3NjFy(POV2Y%b)rWNmILI{(4Gj-h$lqy{ThTBu+{DGj1q`LB$2^;x%Y-N;aw$T= zH8p~Qu6q@KN`YP;K{8>y!iEZz;+BR6pVgsnY4TAQb8sgNe^oi$7xui*&dv@o9>iTa z9FH0J`4d_`5U^W}G9@NTUGl9@RYpQCzwpi6GsTxL)k@9rJx=!KPB-i5SXe^8rFh1J ze_76$I z(b>%nmx!q2t84-aA-C0i@B?UtgpxmgyoCbM;j1e9hohsToJ`EA9rRMve9r<-yY+@I z3Vf)9$Z9_rn_=T>5Bg@^KeXxEs^hGGVy91#`e(5{@0s zrsqmp3g6eNy|2%fO1+IH(=`wxFKzRfUtfM7%#A5DigS|1k`}WnHS{g-_qq=b zIqt}JLY(flg`pdNbu=500ipCes9bcBSPqKVeietAjASfK~s??M=S??tH z5zcg6;obkjgv~YMPEa2Ig7Co@);-t$o!1dfD(ip$u0UuKZRT~heFGwZLkI0(vFCDf zci<^y%1ieb8A-c)c$f`*xdyPyeSbt1kAMId2M4Vlur>1RJUu-R9e%N!^lr71SnFC? zNQ;PEP4T+mg=lOMVr2?Cy0@^$*Z|KCyhVieL|>n>pnB(Kj!NEq`HUwO8(Rd#!-M%+ z{EnN`J$08C8Wh$rSOG@9iw|W0kUQqK6$2@#V&fh{o;T#MC{t2Upk^p$y|@H9jMx3> zF`3sHt8HbX)(^+kAH<-^BB5>9CuZjO&CMY+FI4E{-Ip(v06mrdoWiJRtgrWm85U7e!f_sx0XVr3 zwpqAb*;lU!!NaI|P)0@u9Rq`clJeOl&8ig~nHW`apQOq^1|Hj+BHXvL z*!8`v%(y$2_2=Z|?k}gA@9=M6usg$L?e|pMEp=z@dw@e7?n^YMz&Sa_>7B{%^m;wy z($?uL=cm?zMZulNS;fGG!;xJsQU3+O;>|O zjX_IGi(f`UM6~@o@&)ot9%)v1tLGVmFIi$b;Cqi*{jtrw2+SME)m9YzsrvC_VP)lA zTpST32;ncFf#k}>#AG^_PYOLJGW#2};j6!yeG<=UAqIe%m5q&(krC5-YDyEaX)-cs znAJ;k2h$}X74)w1_GT*6QBJ7wOk?9S$Ucfe%+JcrZ34?5$R{ow@Y4~qy&94) z!&$gXOG^TmXS*lrg^H;&){F`t>V31oqbx9Cyfsx?uuXcv!4%F5-+ogE{pRYs_Sr3Wt6pv=+F{mMG0|lngt$dw6(npc16Yaa~GV`vDN?pX0x@O9uM;SQUyA3IvEj&;L#L)Z~K%Dq)!7hluUf7klz!VcxpvygO||2{nYF07L|g?VQu z`A(7X@ludXg85+^uny^%e23&~Po3|#zwxYcWM;!@x%G*&@iSJu>8vVO#e$XDAyk4I z6A}_Ct-QFFah?w4BidQCg)(rHGYp8OV3eo4zS3%48N?cwRQgQ)K<Ni%-JblzA+I%5DA=s;7ClS-t zC5QcV%=!`z+&^J;gaOpl-F?f#!UDD^7qGs)-|PA_0r{5d|ZXJR4_`XDUHC&VJbVt(Jhv$DnID(2}(N_J2U7=4CSHFLxq zG-NX{59LojX6HO4xcb!e)>?V!4AqyaX#NdV*yvp#?GO|kyf~)gB?=PYfa$xBACZv@ zI2`}RjT?X0*O8+D$QjEsUYAAy;$T)R%+AWMCYF_zQPa?*DrWVYm;RlpOJP*a7ieFf z8G^%HGaO4gy1J-@g;S!U@L&aF;Jl5wPqK%420_U0r6mDA$argSm+&BygO7(jqz&L`M@PrgJQdh*)fV?Z1_vV(7OEo7;6C8t*g{WJA2dARANO14=lW1m*?D| z9~UItP!3KObVDuys-57Qz||G$x7TVWw~z_SK8m~BkR{EFINpFGS@ z(<4KK6$ss)!4qJNuB)u%h3$8Cw!!Zf;bZT)rnh!5SYeg;meQN?moP}gHzkEE#q;E$ zkdV;Hs^%l@>Q{>nr~7~2%6+4vroIY;1$Hx3RMeCBB5!Y$XV0I53{G7=FNhX?)yfZx8K;#y>MG`^3I4{%~OSnH98A>_`}6nOi`AJ+4e z{e|TeFJs8YKySPoJbYZGL98(1m~O$?mfkpXobE?P<78Rh#bFWc7uZ5!?zp(Pn3hgR zk^acBgJeQuQ*@P1U%sTq!GN*;B~(WcDibreju|-a0P$Xq+LZruVb2z*W4c;qL#{_8Brslg z;!uPmysX^=VdNvR{l7|F_5AnhW&P35;3x23Jo?=ujDIisF69>PKR-036q%(%zNBxz z$h-O%$X~mf8su!ayq$xgp)ncQ>q|Zy9~+|xKNZS)r{;h@E<&bhcsnU3kk0(yUu)W2 zbZn=C#;|=(?A&ef&(G$W?TJ@qmfEcbL3lu#ZS)h$tf_fV#Hlgk{aV5T$==~~xf zX~V7Jh>9&%e;hq`W{L8&_GY@Wwv6;(i2Sp%w#YavMSdrDw3(L4{I9FBZx4>d?lDa& zt3N_zuRLm{M7!SArN}5i7nJ84WBjQ8n=1Z`b6bJblw6ueYJR;E?`v|fP*JCOq@*Gp zvQ34w?uogt); z_wAp7m4hj|b@}Z^i+-5+dYHoViGSD{V|Wd|1X0<`kxT#O#yzuKER+1jlG+{IKSxH~ zP&oQ|f;DCwlWWjy*Met^yr!f5JuN-`C$3`EV$09>*TdzFSum-)^#p}NK9B$KuT)?| z8x@(=yArSSERM9qpG)T&d+wP*-wSe%S*l)_>&2cyXlkA~dQa`t3LBE&2w%gaDY9u$ ze^gTv@$P%bXSj-9aep35<2c3Z)YyEiR~^W#HJKbt6?3{OLj09${i!P-ziyE7{kte3 z+m#`tdpzp#(z^Ceo;|%Cx23M%#j=Cz@NvL3WPl`_vUNn2H)zv7|9Tm&s7{eiWwk3t z9jRJm`UUggWW795P((8jGmVy)iW4m;_{KubUrB*a@A3x&?C*zs5Z_pAdaQv#DEa0- z{{t*pfx4tTNmtx2e9t2+v8e>t!zHNOuZNiU8_;63jd*`*ei=vK8q(Gzh9(hq`@a7d z`f%Y*ce!u#K^;VaeTLWAFmzYDoii{e(y510h$IsS_}FI6#Hq_Wt(%_^Nt*Qi;`6~o zy*rod-uLz?X?A{7UhL-UT*0MY-{^~5cG-k`f*+CR{K77-D^K0P#3&&8Lj1jClFln+ zBCNeV@g?5T$B6qZlBL9^Cr7^>V@-39W@}PU{I{CLHffGX*8Skk2-9KF@W zdyq*V3o%}Ak`eROJ^iAya<;x&9NmIph zj5}@w$NM5>?${Eu*WI{Y)ZrUV5fMr-Xw6Trj*#kns81Vsb3dSN=dn+*4sCu6H&vS} zy9`BL+Dv-`pV@bDNysk@H_ZaVu4r&={ zH{>2x)loFZt(tSZl?`LoelEiOFz!@X->M(y_aDFQvdYq-D^b=-V@Hw`_Nj-sSK@X$ zu5-CRXtukrJAOJdHL(28vh_e`=bK5P=>`v88Jl6*P4|1<^}JLe&rN)~r8D2?O(g35 zOz>?MYe_5YMq5s^ZS|RdFY;F8I&P_H=&k!xLqn({)IyV~PWms7;)N4q ziCV=obbNmvd>f`M;v$dw8`RKEpF_kXWw>5ls_A7$bN5HuyCVjamboX>Gj77lxpA2< zp9-0C3Ed>Zp~5)mJDL5(7Jg)a^{un4_e$O9Mgi{8D4}b~_r`2lEbX{u>1F9U+at~W zwwv%Y8Vx$cLJ~E4tUs~+mSEf)iQsW)QE)qVB&+?xA5t(?xry9!FB4Z>%I|i1Qwa^Z zm#%lMh)6KTUsj@$!iObC66!gHqU1>Q92}wrIl0Er7<2`9oKt-=P2wJ+o!VGf79I&` zu3^paK(P=FEWMR(yvX0oJ6KAhIi_7#vx?eTezCl5@ld?i=n;2m?RB`KXH*%KmSrp? zm-OWibw1qVwI$Lu2u`H#joNhgx}appaxwdmBolJhNThUJ9yyYgJ?YWT5Jpw*L#vnI zltr#Zi-E!TQQ5!O@LaKEQIk6oE z-i=K4qhyxUD8H-fm}fqe5R(53&v4^ceZC=c6(wnW^W#Q@1>$)p=F5d)KM>RWv@tpx z!u(fKd3NwQnyJK3VyT}tw?EV9Wss3&gpfOz@elH!4m~`X_vDN(^f0#<%~<@w%z&y^ zm&~Kmt73%z|6_q;3 z9g`U6_9WXxeAHzdAH9As=|pela4jZ$`lNE`Lna!-TeN|zav9}Y_Va2^Zy);~ki5#O zPbuJ>L(IM{BrE_yYj=up3dA-81v+(sy&+rJf{s2qRD;fFb!-^^^aeyqp7_yguw^>V z>0t}#n#ppy>`n666{rr6GOzQR{K!I4oXJO6FlM5xexw(XZIB{uZ>W53J zSmzrT(layBsnSjosGe5qzzjM}!=+k^QytLR*|7gM&%1o@i9FTKlTMDHQdjG#iUxp> z4;iw571B~sQNe-m1%y`?4pVTFCj`YXARr)--zfy2QRVZ{s`L5&SWEec*l!5CGQ>k4 z44VbJ;5VPrp!>>`uqCGC|Efm|(!btCtk-`-mVE1n`!O3tG7y?fk8R((cMqcY{wjxc zlSBX#Ux5c#Z#81x=XryYr}9CGfrf&@2TD@myNUrQh!yhS1M(}Dr&4U#fwR;dhn)NY z(X#**F$8V{Y&jN)3dBBQlVz{t*obV9PS9-5cNLkve1*%1rI zEm98*xDepd_TJEoh2`b9N(@GbQzPj134SFuDQR#}kYvCz6@-TsS(mGtYif>;To9Ba zff>Y7Y>t0lUB5+$BA@meeh6?ySpES7#E^(ZLRVl7NI^dc;p3$i1TgS)Ti)X%aqZ8a zKXqTfmNhqDz1a)b0}pu{LMvzx;H#3e2%L}}FGJ^f?fHQQ2k~u4+L=J?1zac?L_^4@ z>^wQfH{SrC)&K2VJMgKlcRfEoWaQ+S&^LsspeIlpxXpyQSgbi3M2+DVu{J5LlWQ z3PjJqoruB5L#aL6kp}e+qDM^RQy^J^z?$ftl<4RdaGPYHT>TyRU>y-OeEfWzD<*Jvyhw%B-RXZpsNG6Fd+Pe1mI+S%m<*z|RWaRPu2Nv|(w?#7) z?-CGvn}LMn!q15b2=ng&i)IucgNUh3HVx~n6KDle7YM8_u%^Z%uT1bA014=~AO?M9 zAQaODjEFRRSy~DNeDdJI14L+rRwgpCva3^->~t@Zuabj^z47Y@5@17rqYC%qBB4+e zaINjvhJ%23>Ov9)=12no4D(;<%mT52w=Oo^>uN7A+@_|cR;FwC0omQU&l6_c6K`{I z=JJ_CLWv=|-H>gf?DYq5zQBeunXUJUg>bakne)^z=92yCEYUMlcvO4P9LyfEY!dot@o0 ze6#Z#7z4)i^fVy}$Z&RY==jU5aSI0rcA$+OA z;^L;()<9Sm-@sG)`XWVpF7al-7scQ`V87o>OY{2eC+obtP{7@L572;{<_bJR;Q8&n zy|o3j2Rm16;j8WoI}PQkv40F^yvSm5ONQGKnm~(tlr>`RA^XbJ)itkdL`7}+6iJjp zis1hJ`;R#}X;@eaI?t`AtFtc4A@>Eu6@j-2+}7ZQarY(*N`vVR{O}zI)zsdyp4%b%~*I)()BEE zXEP@)jS5Z&nMw>$K92=PVy2fczx_)6TQW}xNJ>BGbm)TI%}aUt)8j1&3;k)akJL0Y z4D|FGAS1?*F=Chy5O59H$j2B9EK%QNDk8; zzFZ3oUT7t>4cKoeTbYrGnHh3;SUMj2_^=&9hWIK9RBb>uND{Et>R168EMrs*4DXMQ zoFN(H8y7e3v8a}rbaLmU^T+Oa1n^lkHDt{MZ80CK9u^qJkyj)BkYIo=L@)#TYuubZ z@6~km_Ksdoe-Xumv^2=2WEIf30m;ME4-Q7aMgWs$-$w^15~MPt%?UKhEIR<8?fbp_ zY=5U5?z{f$*TE_|G>nYWDF@Kt18r*m(g^-G=!N=Q0dR`OC-xw#16Bun0a8M|=f`D! z!VZiIX4-~@h&2(&e}-&CNc90qa&qz+q{FGHsiAXJJKRNRYV@x5cK zri06XRSJX~sHn>C-`s-7F$;89EN3JlC8ZDOtJ!q5OHD8HSk(B>pB%6HRllB{8W|e; zfBQy9Czl9o#}#BJfys|{<;uRtnK|&}kML1Aq@+Di=uA&fuM6%9q`1tzq_W1w_?ShQzT_MV!L_Ye zpP@Po>T$W-OM4)b4JV=$j{_or;oo3A1BDdH#6Hrgm4QQxGZYYjT$pe{2wl)%wz`1J z={-0R2~xo7Y=dE}6gyG}dlC2t_h1wA==mZ- zIR_m-u#iqj?8e=nfy~0g)%H5ym+I?=#R9(2U1H)+?iqJK$R9WQV+ibav%}$=&2C8s z=>h{#H@j~LE;2i}#ooqd4$}6Z(P9OOJcDf~yra2s7LI%RQiZK~8!?tYu;9@2>eZ{2 zcA z`V5x>?cZNR%!<#N(^Zqn(T5e@ckXo~U_COmCHD5U~vufvByQKbU zw){b&e434h$ngCb2Dx-9y$qJkP1Qnr2Jh^H%s)GMDa3WYU1wEGT3=-!^sJOSMX0k7 z{ByA6}6*U3gCQZi2J{CsaCDt1vvB_$xP&+Q8LoErYF2oRGM-OkS0k-+9ugRPLl8 z-eWXT#QszEjx;fz4>36F$DcPFRXjG2 zU{|CH`|136x+}TaAZW!rLfa>#$!5E~#+}fZ5tRxf#Gq{5oF8y{fI96tNXy+au=$I4n{SOfopDY zQ4D=b>6Dhr0*{iNFm75W<>Ysj10{+2rDIz?qxtMSaPWID9&TDy?H6PK4bxro_(i_0 zd!Lx}^UJ$6+^A~YCVx>m{=seodk1$997DpQC5>eV8QZDZF%wBit*zOLzSTUZ1#q9v zO~GaRJ6`x$R{5UL>M5i&P9!=dh55O z;U;-4PPsT4wj8z6Ula(G1wQcE(oC*@W9`XXyMCtVpi}EG)y5LNAnstVa3)p%n;ao* zduVn9vZ-w~8yeXDQm}E5@L~FH^}_;DmRh`pExCn`zSK?PBlCb1&0C4pFM0^S+^Mp7 zaG{qWb#0JQr^vC5yG4qiP2q?U3zz5AXx`O@-8PrI3D4G}PSPQeID#|1_s-I!i*3ob zGHg7;cJ&`U-SSbwaLEbb@8hXCvM#Q^t@&`~N~s})PW{GDFrn+9f z$@!Ccx2uK6vRH;K3}q~_JyQ;gLPr7D$wgT`IPYp>{GG1(0OYJ_V4G7&gAK=xs$E9a z#{$LLZGsAw`n}{w+g~m5R6%f&Eam2%+`Bjon&`3Yx7=RVDw&=5X-KTf$Z z^O$%+>*RHL<)q0I#d6u2n3s|noM|)80S}mE>xV;97n0NVb;Nnx^W^>mFBfc?glQQF zh4&rF3T-?W!bHv`+|}%6NP9e^`8JhfJikpm_#bK6gtrxQq+f}<7j)n54KXd4+1|=# z)R88#O_%869FYd=FS91(PCuzeQ+)BX42gx#t_*V5UeB65d>)7=S^4%Uok`VaQO2dA zy9jZ*qJ>J{F!i_hD)Y5#-v33zUJhqv4+@zMlh>f}+LA~pM(1!bDB5lN-mlE1U6mC- zW231}=n}kt~8=0mJ!rFLo{#*B> zp@EJSi#KeZ+}~u3_P_sQHxU_&Bu8=T1M2b5c7(5$muFaNjiHeC5EAw4+yx_R97aeWr@6~?S?vK?CKsutbT3cn+(PpDVteflz^r=p00 zib$m}DLNst|K4gpwUr^f4y9TU-#gGhFV&xPOi8DBet$|U;F)DiPlh!>I;HL%y-JEvSrb^Y(0U!VwO zLwh^=^XJbYt{~>KP|g{-+G{)2c5PO8^!O1jkE+brUrfUtSKbExvxm3UHe&0?%m^=b z&uy%=9E<+Lw!-%w<{#Y;n^+KXh;aJGkKe~zj^azK(61_%JAxz~0rJu|9j{IVTZYpc7v|o*?jf&ZvCmZq zr*e=XSSTqe!D=qJK=~(u=r5KzFm?p}6t*BHFLc_}h7PIp3=H$o3A7&4=#ZuM`ThI1 zc^|8OGdgss6S*JqF;Aq4Fm4ed_7VEc0KL!T#M)ofVF%QiU(^(jUGd#eDUa-F8 zb4DQY$H&CPL`inr;D!HHzIDv2t`ZD7rH<>5Z@8H`&_1KNt-&? zU7RpNhWxXYcncgr(HonFR<6{YM1_YpWJt%vLOqla;Tvca1Qz5nB+;QyVkq39|A|7O z*8^<V*?vQiSutKvJM5 zUTrpbR>Sb;1`CHAq{d?s5|CQ2H*P^Wum*r90B@F?0)f~kro#27AAcvpF~GHPJ=~Cm zzb5^O38cDz)P>4RP*cfVANZdj0Vl0o;yY+>R-Z|iRT=%~ufJ{3rZ;8lGG zaETP?85T{*DxGF_c6X=4kseSCWw^v1JNrAD$+b@b0ipo_;I~~2uL#3PJTDLVk@xx} z^B9O1R5WI8wT(44`fAs>ZUc_g)73?^HSlKbH>XJELC=;OT8L3iBeb>XL}UFAFgQD-lNEfUhw5U%)Kp4MHa0pf`^ zkM4{bVKO!{`fl7q96}}>0)a2$N+MW?SS68S4H`)z=JnZO-Q~#P3$0prUKDT!2bL@0 zTiq9M#)k0=c#Me6P$B^92wJ-q0fd0J8cNE@{07MhX(RxF)i1lk;Uo|?pj@5?kReDV z>{e4eAlU)}MC2HtI?!np6~ROWwI}A$oLgNnEZ=|#o}io|7XaU+8p<^h^9^|T5O@*# z`ucl)9{HB=sgXoj>5P~bm82cO8r(6^QiaO2+E$Ol*@^nvU_ z*Mv^cgN|nXuzr@kCV`4R5MLrqwp{nuM8R8wy7=5z-+e)5DmG}lbB{&48|)wOQ@1=8kKwi*JSDCm*7)Y`J zdILNFU;G6A4K>OSUw*~DfBz#qZ@A2p22d$B(xH+OR*lHyWbIWxH8nN&v+Xv(tZ(1F zL;u92)(GUC$9@GHC`+z(O*~MK(E^=5@LfCF+jU2>m7$7p^duPsny3GN@*6QctaQ!_ z9FZO94kZ+b=rsj?ciA<*0H9-D5Dk(QFi8->Kt~(lD}YF!In*+ErYRyZu^aS5(6&qv7Di#(jph()zbJt*$p}+?{%NfDJ!xI6= z7z$63!E|`$IPxFzYuXW`|yv|L`e`($5k&f7@08aQ9lC~ zaCULgv$T`}$r1D=gWv7pKw7Rmc0YOpf*yd@WyoH%_4LTUpwC2O91RSnT$e zUr0!hLnZ~v#;KyEcx`{91HNpYoFoBf9iGd|Or3CBD47Y+l+xN17$Ji&&S7~cWHUtn zPt#=(==PJ_M(hif;=uca6=mz-pcPUPfKPVTatd}}lEZ%ZOiJn|lrN9n*r~0pWzwpG zvdAcPtO-_j_UBnjl#w0aB!a*ODzg`2$|6`Ah!HZ_VHlqjZSU<3k8M>}RUz%{0C<3f zEt;`wVrcl-s1xse6SU{UX*Vo(_G0zLm*5b68@S;KAnYqV6X>ww1+Z@j?y7)*z}nv{ zldY}Sy}Z26&d+mXxH&k$kXXCYz#r}59b*E?8u0SsV9-79$=T8+rd;uJJKTnr8APqE z8JBrLS1W86Z^9}t#$E8t?9h*d+X~sFVB4vO;m(+tR#EZlauXDPU`y{IS@Vw*ogf_< z8R>Go7{hp<+j(pDv?^t%#|fM`*!LqKO}B0XVi+eelkyTcbAa|$Oskj^l+J;ENMtBl zT3YUzvBlkjX8}8w1?dqH2&1M4`I795NwS>)>YTJlzq*qN16zc%K|5^VE}J!n3{!q^ z5J)2Sm^IPWeNt}q3y_j9%v{)_<(>Taug)pxL7mEc%LjyMGg$U@bzQ0N>%#&(%Mi-U z#Pl1wfwXjXz6bJJ`>Y>%-b;Nc1($VukAbra_itn6@QZ+^n#8<*^cWy>vda{{q4*7{z~XxYw`yC_=K}U&fhr)8l97 zK2gZOt|y z85vkZUn(hyJbQ+Q3>28h4MRgnEyWvHSm8j9wAq7IH&NIt86G<>oP01@s_SuI2q?@| zgM8Tx1QK}L=Mi(@PDYT?f(7oI;sc4?V* zV}3ZLAQw3TkV66zD!=X;7#JYs^-w9#pfv-u5K`6OZ5O3#Pu3V=b5}9@Z3b)7@#?n} z^gDN2K}>}soa#-k)RHAn*t6Ur$AJ{fL#;ukieCnd_*ic12k@Jb<|>eRfFx`^bR71B zBN&uc{D#6F-L>JYC#z3#VXs&@mHBiCr|~q!ELdNg0DHsP>pkq`V^!`Os>cna;3D$y z@N7Y=n>kQR6Gg(0rT8?*aEn$z5@q5lHHU`;Ns4e2NQD|x5=XD%~I|?86zHHk|$vW zzS*i)V-Y1(QDN)bhENgHOPW&ev|W~C<~o!rSQ~z=%P|!VJ+`BT``+Ehukv5Kc$NSA zJcaSW0*?zPW7~x4RHm%q!WZl>k(?_sixn@l>nEkeJC`{7X|3t@iY4Y>c6Iipe9n3# zVcm0*@ltemwWx4%^#MCN64Wi`>N;rDIuIXah+Ti|W+4@A_WTM}?D&sI1&`1h)8uk_ znK+1#G5k*g!iG(VpECLuS}~(nneAlyMvVND*vb}Gu1sOO81cEyAV^4MlPB@T3#Q zbJV!xLk=Y9i({_gEEPT=6GtIcXXbgK)#KZ6qWDzbahYAU_)pCf{dKfgb4B`gjIdGwtLXO)MF%atL$wTt2^JOhwtwMwXac66(~svau)}s8G{J_pvUt( zTXq+D*Oa%%KkRTkYWA|=S0*+@iVPQLhrH>p#dfRFPY{4B_6+~~r>o`Hay{(`L&_AX zorZrK8XNgdJvi0Ksf00U_^JF^Q}Nq(U2pV;sZG+w$iHvvR>ueiwc!jXS4I3Uk>kne z9YnaB>b-D`Yd4hGOx$PQf6Qv470WerCGIM<+(N8iXJW-=%V$)!(6%qO_d6_-40uYE`D8L{Z+ixLc=?sqRCbKVUOccJF+?pce3Lv>(w=xt{4tT zKk?lSRqOXYWQMDtqmw2j%_S0Zl6%?ED0GQavN%aNs?gddXxMpARL<(> z%=bUVuc9QUOBSp%mFH0{#k2esV|{+z^P$`EhP`lgpa9>8iGQM8zmDJY*KTirGm_E3 ze>xm8A`^KoF&kkjCH%o5*2y;2qFjMVy*#cb$GHFD!;h7W3sz$*zsARMszhxzWC}Kp z0@d`2^ms!Wb=2w)##t6lr^UYDvOiVN7kgnMM>m$wQ&;kCKY_dWBv>wSTp*@jXCu=j zx+6SIRKrt&g7kBZwrDWZ8?KL~b@YU*%J&j^=XWn|bvyML?@5EkC`>uP94o4QNT{#* zc2OhLM+dcT`)&jTUzLFuuQrgl=nHHUqhR#1JklRX zc#t7mbEnDKDTI5l>HB@pLj0QnZV~^l@0Zzi?^iev`%aDM5f;&o@Ab^owz{isT*5$E4+d_2&Oz!nb5PouA>GUC)KU(0FPEb%#M^|!PV z^Nt&S%ENJ9zUi&3Li3BNrfMN!>!u$LKS65^QTIs!!Q7|s;bDT&B>i3OmcNxbzVpxT z>Y=<(m!}O?VRJbq(oA;n;Tl!SEFPl8F4AQli*C4D@rfk#T%2iu&-$xu#jmzLuWZa9 zHv@S)0*6<%`}dBLrfMSVPF?1XO?&W};j+-NT9pDdv*)|VZBtsa7?fhEqS1J5{AJuy zR=O5LI(`J*v-r&w#YLmdyq^v`i9z{Au`bt&ipF-B9p5;=t_VQ`t%J)89MHT`?_47aZQh#bBj#GOQ1%GmWcN9|_C!zL1ck zppeQ)iab^NtGuu=r!o=!#}lIkzPZN4W?j{J;N?AC%#w=p!HWAJO& z@~XV$dM?`CS?QlGHve)|ya4>nSt}n-M@$* zh8~|SpDs*SWmhXjds+vZbd1<)e{2lnHPOrqhR);>OhbzA>g>W3%3e z_N{pjK3TG_HT+4ST03I{WvZ*a-E;-fmpPvOFS+I>qZ2aN;lJCW|5I_qK-=cMB)PXz z8I*#8NzjDn?DAkk;L)0`&g{`!BIBP|$Hhb9-%}F5w}`KpU^b?_wURBD(+4eOn^B5rK$qrx?jaLANJ9KU&inF_X%wzt8q6WyoRK(y!;y+kP#*e zCYs&x&Z2qBCdf^QNeO~gtAA23+Q4eH$7-Q5vg?`BKQehah{epTbj32s9p zoV!6I#Kp$;7NJD$TAWNPh(th98i1@pt{)ZYDz*&~7SO~^@zHgJT7zx@C8t}VUT1y~ zkQBoOvazu_15$+$_z_4$Sfp-HX9^584vysTOx^!3i$f6w8&DXCR1tkd^N~1Z_&esw zHSe05nt^jwQ)jpheZc9k?V+{e>H?5PBvyf24UW}Q@CBjLA1QE$OHG3>1(YfzB;-Z4 zmpS|qBsu7~xIV$7MT!x9uH0~5&4~F~ZcT>BA5cKu0B>>V6FU6};Xg2Cq)Hcb#ip^b z7^fMJ7^vAx0%)60PIpjc{{W%4f+gnek8mAMZaL$75tQ$`hzw6J?LaOQPFy|xU}?T zz!a+GL}?@SEG#g+!EZx!OW;n1#>Rj^!nzi3kqIS2)x6LErk_7*PCV<O2`HQ9uOR2Gh15$T!H7502ws$jKRl*BdyqXv+(*zZ!BtSixlX zAcgZHm~!if-SQn6A&~0#hi>ZXC8j=a-`;?rbb-a|7!zu?;n%?&gFH#g;9!x8Z*4Zx z4gzMQEznfYi(?arDBHp)o}*)8UYV_2PF{eDbyyG*svjvoq^BpRr+)`;v?zq>1C44$ zw+^GsCrTcI%$vVy9xIrk*a5HK133vAB9S;b9f}LpLXHI1FcNr(5c4Aw8_X;{FqU7m zxIy_2DzW73A>g`5D6)oEn%TU0gF+4pDs)_c!CmQj&Ij>-Gqif`ZRIrOAO?&V3ZgSG z{tQ^fkfQBetskH6Qi;KvdO(4@4k|8(#ptby7$5LuGGn~EpcoroST_JS4ruiXsGl%d z9kj7h%>hF(sh7Nimv}_OLJ5`@GWB3$z=r_YZTa=X>2~PYs{I+r!HC=p=@u}*`@s2O z(5%+X87YE>7`3Mx{2S9X(uj@?vL0Bb(1rjA`!V#Dt%NooVBI3}kp0Hgaq2GA{2-_n z8Uwzux4$}D+$VHJccR1$jONHsp8|t}Zv*aVf=cJvSzTz`27K5rH5sxBZIIo8drF|= z?o(GM466VTySG4?*`Y`i3@V_{mNT_UV1j>9$=N-_Ad_EQwumH=U20{vXGw{WX z(QnDhGDO=#XBQyhqJVBe7Kh125z_^U4twa+35XX8DP^Ea7g9M)8f70LwJ6oM3Jn6l zDg+w$rJ~{|^}f|)8S}-(MXpZWMG);zbO-3>evC9C0b@7`M&2OQodY2>rWbbnOXzm+ zR}a?eT(#mrD9^kLo6p>{CJ-?0+@e1KrC!X(1B1KCY1rKiSU8fpHXIzr(RXO zp@4t%8<^sKL03F)Sl*C?n$X$Sa}c?Mq5PMG%koK{imEg8&9H=jumUf3L0Vk^xr`Pn zqXfMZ)>uM#|JQepKyvgK(PH7-7850_&kascpxE6C{X{I7SQMu0pIkXG{gDnr0JWiy z?k$+@+dDh@P?#J@(gK-7DB7ms;J|}*Bk&GsCrm>I!DS#q&ta5-OuGy@L=*7)X|oQY zQl8iIj0a8?CNRprbd`sIzS3hV5T`9#oa?|x3cNb?UjoG7Vc|LWf!_-Yk>vqtB7BROqdm-JcYAvd#%CbP2u!=rpUIovBbms+Yd-jt`u zgLa+iiVtC7Mc}3DI#}lSNlB3gBe1H2pppPy@a*EE@+vDNd2H%0yCVR698$iN=(D&oM0P)^pn*d92%AgJt2i*3>zbY zSsQmB;@wQ!Rd!4+8Vh~*j+~P6OQ!*xosIyg-L8u%Fp-czr=Xy~zYvDn_@I!G{4HYN z)!+w$Rf8R*i}0RBI~XXiG8m!v12hhk*q}LuZ3gZRB@8#HJ#T`%tfOhEdYT>N-68XL z>p2!mJcrpcdHJw80k9#ttK`7N-!8$t{i$r}zsWzlxyEadr|gA3 zpUtpKL+cY4`dBD_0C1QDi6y|g21jnNog(%8FmFv@%M)t@s64&m1f7DAHVq&%LvEpy ziai+vV`h6}#u%Z*6GuI?x6hz&gJO}%VjoXH;J{E;?H|QUc=R_8p_LQYYhtL{pkQZ@ zgeg4$rYq};x@kXXCEZDqGikrM23dQ^ z^25R$Nbx*hF{{FU6$eHqoCw2`lS5KcQsxkK0sgN*iBi}F--&B%1e9bz+JNKr1oB=# zIEcbrzoFxKOatGCUFOliDG1xpVVeZfKwO6HAk(TrW)`lnVQj2i<&V?+ZW(U_j09Gs{7ZD{I411`B zfE-kq1U2$jBzPiCE`a14;5BU@tGxDM(kbMOAe9D?f$vS^eW|DF@EZOuqNgJTMhOWY zRB}WiOBK^acC!$w33y>Efyc<5T?{uBd4m{`ek=zc)!&c>f=&^7a6TI5)DDM5@$}a) zo76B38gjoaH}i_2DdR&j!SHvbS$Har?xKrgH!BNYV?>JIz#$}T zui%aei%^T)X-(T2<}(gH<-Z|c^w9nKfUt2i^I~HeO*f&_rpwJ_!iK7s(E@)0vT`v~ zB;M$f`=rqoQ%eR7*cUKNywHk$x;A}PUpTg*xsFEu7=7W!KAZAs`~~h(-;m|29WQsU zhoLw@q&+Ea0p-&-8-5&&KDc*v?k+r5baZs2LMCugv-6P#2bdX zoJc_SdXH5dZQp_j1%)5wP$L!Oba}Vin=6`gPFljt>{^gQa=UaCwMei21;I@&xeXNh z@x2S2K{wIwoY_~3CU3k;Vozyd<}NageaYDwoaObNhEk!Y`=>}?g`cg))ndxA0mlUr z`%E#HwD8DA-)pC4To(8WSMcy21RJRgyK|MQOUKd~p0P)~OE>QRC}${v**@%mS~vq z+Cgc1clU55%(0Cj^#Fm|6yYFiyyD~EJr_LYEW16I{<~T~u309YY)xpp!ck6)`)lXH zn#Z7r{k2pfr32UeOnxQPR}Aq}1C?FmRz^Bk>sxvfVgj+m9>qW)jGnHDp%{c`y*Z&~ zQ=drd1ZmKOKJ6N_gxJ!Ou)>Pfy=q}Y4ueT1nwLl$r0<5<}|l|sk)^X=7%CXrChx0J@rdfLj-s^>HC%1HI5pE-xl z96pRmL2Oq=h^V{c8~V;wzU!AHlG@Q0d(En=e3YLOe$w$(vba6|lZf+pYFQjcxAU%Q z>nAg^#nz7QDxUYjAJE=p%bl8`npKX821IkcJ_X@qWSB^phJfYCvckDd6lxLIEwAtV zIvJYOk-a64*IS@|qq~=};1*cn{{H@6U(N*m6kk7NxwRo)S6hQ>&Ww&{9bkbm;Ubf{=rDllAoWsCf_3EA)Z@->=oMh18CxIb` z55iWe->UE0D1WZ-h`^QNBo$bEA}#i4TEcrz`<{c6435}`WHY;ts*EQJLLIK_SZsw& z`7)=@jw>kq?CmIt*+ZTq+9Mr%>lX9%1?+;ZO(#t^I{plji9gys$NFaDet>^>4+JMA zU3&>~l+AAU&>W&mTDoPfrod3W&D!TEw{{K<)}k=>)kIU-+R`vIol#J}5eOOXzhk4& zI41ErrdU#rj!_+2AX%`DNPgOVOQ7*gt-$uP1xlLOjmOQZPmQR0qBKU|)SKXubeZ%d z;?c`1W}@viBoWgyIX~_#_`0r&k6Ts{MCa7Layf(Pd@*H98;nWotjRMoE@Rx0-uc4? z>6%dJRM-Xw@q5ey5FXOA}bWK|094GD;J*|+BZNcU?h=DVE`=7HmEQ#;B7V&&D57@r4pK{^iJljia! z8+wvcsBctfH3=?*)s5%tSwc63)$0f3ii2k2CFVbwYFGaFbU5D^e^7*guy-|ng5VrE zJJVOhdF0gQP$@m#Sd)I$|HSI@&*Q-U0{21%&l~mGon1Mr+sZG*tP6iLyRt2Qb5 zPudLrxS}7MR#kc9aX2cF$s5Z&4|YBA?+VJ_A1tP#RwfV`mBGs~QH*)i7&P~RgvTY4 zl$6BQm`TW$C+YCK-@U-EM(tM>)3>i_1HTeAAg76S`GP`9N@{+(@>@=6G*22*3&PW( zI%~rT4TpX!x$@4O+-LZC@2&^?F@F)i!sK-lo1_^nFR+Iy2bHf=wEQ|~T# zf}yK$`{oN2YC(N{51V&p;5V?(y`frFmESzco;)Kz>{nlTN$~`j7|*=)k{oz^)~}FN|f?X9H0fCR9|_zK>Sd?Q7z7{CKPdoGV(# zPrvq=Mx#NkR-;m>xO?|5DwT@j;$lilN+>NYrL?rP!nLx5r%O&w4z8|d+LcvGnOyl* zzF)MA+)>elK3n}$=(jY32kZKYJ);}GDO2Y%ckWyC=#@qM{<~?96ZbmXZrwSdiqv zYg1mNy#r+K-oXJ)Z>Ia&VONdym&*oxfZ@wZWnF(l!&0KrAd|^)aIj~|qWKITHkkho z|De9BB?t{%TVDQKlNyb;Q~&2M>3zak(13zIJ=16W9z*$zA3VtVX|-CkTCE}Tr_pH8 zXf$ZGT9NHDBUxElC=@jx_FDgnNZ+}h_1~Z3S`pZK^kCG~Dg4(nvZ@cguY9IYqtQ@Y zT#UQByQwNIJSBek;a@~A`-~s=ZZ}NcxOp?DMiV(2OU6&FRvR*YGMNlZOG`1auZ}dl zjGv%aHyOWLCXqatk78kAfu*ITQP3v>Kl5N~YipJnKd{4hbObS@AO8&c*QkEmwvv(( z!wpTmejB!7!v>+e{0FbUF_Uk%Z$K`W)hOswt4px7G`o-O8q@dgl%3Eg2tw^Jn@^Ck zZ+w05r|7F*`NuQavw6rwb+;ln}DwPVAN@WGfPUyuI61>zK9in|UoP zxZa=J+G^jjUAa=J6sc5-TrS7T$_klGW)%2|;7<^0huH;w@aXX#;={o_=)d7NR%Nr* z`Y~Jjn_okitW;D~guT6e)emgMdiLnbtam0cb$U2S|J-D>ZeK;>zxa~Yty;`3b)o}5_*etP0Vz+9pVeftgr2aRO?x>&k&@p!xvNe30xbBG-`mU|_Ty3{+`Q^IG z{%g!%5Cy>$%sTKB1asBUCo47P$vclyQG3phoK3rSZ5aOYcwU=0h7qs4h=YSYIoY|K zJ$IgOwkOlAiw`G{?ZVml$#yBKt-!Cg+qe97ociwFvfaGmi=rUZ4zpRuPiR>3^YcYl zAQ)x!^go+>&EyyY8`Q}*!ZpZT~rJK@u*13{x+!nbn`wuO0w+6tab z(Y|Gazw+I?BIv7I;{DrjUA=ns=?(ns?d{3W&#&*Q2qqxf*4U#0J#!5HMEh2*zT2}l z0w`0oZ$gwRI-Tz6?dr9+w-?_y8nFEQe38{Hr@n)N+EiFrDB8CI_1(s` z6-3oV`-*_C{)o@#hRZB>?hu5Asv+IzME6|98p?Ab+E)OYq?C!QF$qJ52NY&z%pm?wWPy zLqo5otIqCSRlCoA>fMAZ%6~&fz()WB14EXQ6jKHRgYX9f12=?&0j@9@4e+icsQq>UNV*2HiG}YmN%!XA3XiE+G1`{A6By_L$t&BHOn<6r}SIY z29b%izpmC%*LcjOZ(vR$n$-avCiL-@l^-z>4hd!B{i5L$k}1@hl|a|KlM0<#hYP_gwwRnA0+g;*#mNwH3o-N!j4G&J-T(cO2)=sP>* zj&(Y2?o{=hi6FF(_7>XcUMtSsek0u50fXZ4Rj=E-;%fd`m4mXk7jv)LN%O zd6ZWq!=1k|*(YPQ;J#VI+M=`XZ!<)+|Ct6CdpSHj?4Y-jDI8G)YEt=EQkXa$OaAO} zBJNAeM|a6k=d`XL1ggW3?kulxL;jYiHPjCJ1K-y+oGJV#Q@5Z!GpX8bWPIGE6XEO$ z%Sgzt*?sdgUl`5a=#HsQqD>~LeSM&P`#U;=hmL#{1J9`Q;?)W+{#Y`k-;nn1 zRSp}DC^0=X_6{2ySLX(l|Erj1ka8HI#lr=a!Ul!~27u1%hfBFjM zlDeTgHrnkN{SWSM_f1qT&~Iyxpdp$E$D>S}w>#Dxg-j%M&VV>C&cCm2+-i)<_c+PNE4;;~I>p;sl1)uV}SB$P9T@eEGhiMuEg z_k$)>R-PNTi(wR$F9O*#Qx*vF@eRkML?j5?%nJMBx}a<7m=|XTROG6wu05eNp*O0K z_e1S}>E7WIb95$@_n`NXuPr$f;b^xi)zq8!appVC` z#Sl>;yqCfII(NF&EZmV;UA`pKe(A-_EMX_dAHZQuS8O5K{CYk8r}eHQ045;p*oF4m z;4^PyAzdDZ$k#KIxegXO&jT`ev_Im(g8rB3&p-nWiK)VW>s6RCw};#~IE(b>Eo z@fS$QOiGbuRLX81t-Bj7TFgyfyj=N(NrE*g=sP5OhUdWX^Kl&&r?2Cmx z{Td{Vi}>+C>k{I3zBoJ~E%d%8+h0lF!78R|pF_mgk-rdE<`evaOXw{mWMY%rRN|hO zZ=eu=yZ-H;^PkkVvkPatzT3n80(Rn__&XRWgRDM%C~+M5I`&Hv@0n)@VuH=Xm+%l( zU>)Q!$vj+_CGvATqq0G0uGSpQLA}f#&GB#T=RB9bkIhx&_Y+-3=ywn2G{_1uTEhPtgH(j;D=kH zMz;rdi-Z?9oxyohW~L5^+K{hp$BfPCmJAG~GG}-!{oEdIbCYi@>r0{=O5k%enc95h zN_2akBg=om{iujot}7e&R+Rq;wE7i9-@a9_K>PiTA6Jc~^l1R?^c*|R{`r;d)9?S@ z1fg?3h`Ta99p2^6-d$UrKL3}0^`Y+M>QAYNZH=rwr1X#7M>g&+>gjr2oxsE2!Zk! zRsBw?Pa=a&#wZ(0{dZ=GPKkAsfti{4x#{M;=$M0Vf*gzxB{Yo(YPsS;%rGL?fNw zL2tu@epVUAw}&$&>np9g%n=b0BUWfX#z_B4UL`@BERy}(bZq0PR0 zC`Bo2Q)*xIr8W+qGZfQF?ohi&gZlF?FS$cx57cTwmXWjWsCU13*;W~?>*5Y7q38;D z$SxJ{-~U)lT;RyXkUL+rXE(pqc;ohFshPPM+8cn4Bo2N)l_49rp+MA-z;I8#X0pSy za*jPv-08Af4RtU;U@Zn|KDbf_yyZ;j?9d~>F&lKqwz;0#WNuC@#C43CrLMhhR1j&2p&;Zr9P5gYFBcGDN?VYC@eSUY7&kIZp&%DGp$iAk zLpu0BbtpPp*=t6hJTqq|;W$1V(l>a4v(G087F=G>1%VrK`*vDjb>2gF$Wfox!>s#= zU>~n@LIRJS^zETotv>AWb7azKB79aUcnQ%=irBVFeJys9*v_N`+plW$yTJm3ENBYs zgg0-}-A~@bD!soFZUT1TG)(FpKv<#5qs=&}S0<@Z2%M@~eMd||)w05wWi)qAOgqK* zW(!ZUsOokKFv&Y0$B>Cfp z=O=sMXH8p24K;Zba#n^i&VQ~dIN-<@R)x8xYFJhp%~C>0GegZ!?r6m&1vf~ByN=oO zYVa&4D~zdu&`#61s1njrqWe)Is=8(0oG25M=KP4Qe6K3>=LG%aOA_<*^QAedL|2Ej z8?3~Yl$5mCYesi_1_w({Hufeiv|wCSOI5jSo&~99utn3#C~ZB4Z{H8SzBKzXn6*K; z{7oDKK@b?|eZ8}Uji|~S^P;G$2<&m-jr`Y~Y(m`dvopd!4ldsuw&1SPQRqlM*(;@$ zQt#`*ELe3@!I{hjd~z|`<$-8dpZa6r@OQ5JmZ*elJ+*g|5{~j!{p9 zSq3JW6GQD-+B)yed8${)N^*iiLb(EeKurC+M~-W=DG}a>GHIQ=#hP&ZxFAd`GrB>B zG_MyzF>8W)H~7&;zyo=Zw95w(b(H23Fv z7h7sBn!jZv-DJ{TVOxA|op?J)AaS=Q2-}U&af? z2IJ}`BRmah$$YRh?~2f_uhbdA_As#-CwsID$qgk*BiiwBtH@v*Pi4XZyNYbV$N;-? zh5@^ZOzaybdmDZ&zv!sWUNr2Bx+`0<+gpO>&6Yq7ywF-EXE3cH=wDdDKG#{tR*p!U zHCA!{^{^nt_k*4H85R@hgo&gM>LNxUEMX7#DgReyJo$a;#GNgc9u5~PvX^y3utQ?j8!lY%h5l&U~AQd^hs0)%{Pa^DQnmgJ?2SQ1Ao= zc~};)?EcJBA){`1Uaqf}BFv4`J=PzKl9#Gv@ez8JXj2urIb!dX-$XJ(vb5u*)xViU+rT7z9F zOzIcN)KAeKK@UHD{Q2-Vn%9P!pO4%tM5Zb{zd%7_pQZ7ICSiObY(wjA&f}e}w(SqX zUsEK)@6xW5+FV6u^e+4tZsbR5Gucz~gCyn?J<>DyhG8JA)PtKGbK20VIrt`*OK?fH zPH&hFo`^rhB8kF@B`IwN_kL(@*F<|{ah$s$1>S%I|BD{BI;o)YdD&C#wmr=h7?B;@{$QMmDb%0VVHvI5A_G0g&=bs{yM|ZN*!iGG;n}ev zjGnQP#lJzh4m5WiY$;l>hw<>bZHn~bg@ND^>? zx>uWPrKxr@MEu3MhU$y^O^oy2etg?mbkr3sq9;l2#g~20N!N=+1c;EGcdZO0vsNSL z+EzXKGUVILZb*iUDn^-sjBJf7!gvEcL2%9;Xt*WjOLma3<6Mk7Y_)35u&f;EbS&m^ zmo4!Zg01CdgI*9_tvt2^+fcvTr&4ZkRA6qtMuOKL;?B3i_)D95$mvN{nkg~GnoFw% zA8iNp!e5S)TfZ;h#+I@!2ILwB{`rHd(>p}24pOrW->#xb=Mn=ik-`3b9#vQ9&q%Wh zp5GYTSU8phwOSbrY33NC1J7>`opf`iTrm^cqSIV1FE0_)jxlHQ(FkhRQ$%5<^qE>kkmXf>NJR*DYO z8O)HsAQizgOl})NV-Bn17*f+5odH&ihG#*742S^)~akUHE>^gDS)}( zw?jRfCHU}Uo;Vqul__>LTYegCTv1YxB6W|zj%GlC;=f+%Ba`pY zMg&WRst|qi50i%jN^r8rrcvhlobwkCT%l_QF@9InV<{diKIS4T5f`NN)2;H%BMztG z?jk(FfvTe6puUlpxK!;TOY%*dle%}=QB*5~{c^-D;a_ORL&UJxt_VAI^mvhl`_z;& z%PVuTKjJPJncVl_qA3gRW+JO1 z%b z^8mp__?duWAGjmAUuo*!J{cnvwtuNteiw29c_|qUv{L0PB5D&3_~4EzH$>r;Q@9kx z|4YMlJcHQL$KZ0lIV;F*o%~v=iU79-J$5o)2cb>uTigSuLTIu?jn?UhvlL2R)e@U# zcH<7QFlfA36PBhD@LMQ8cnhgiB8Eb>XuvxaAx2wDk2q59xT|?X^I4uj(d`f^jrE5D z?d} zGdJQ#&d9ajR!^D)FU`&oUcE7#-A6JxDVqT4;Cs9j~vt6pNbuWBSZVh9loGYUebvyw)1jsjo+N2;tzvQN%l z>a4Iq@4g6}!_LE*3Y$D+6AZehr4_`zvH!m#)Zk2kZAk$%)(O*`q5m~W%bN)$Xqfev{v1#k*Lw~ou|H)9bq}}t5 zE@H0%odTI|vH}55u!ll@a#zgf)tc@w=0yosG$*|0%P`WBHx}uJ3a5k;L46kNaA4P9 zyqqmHAASd=5KB>)vWeP7Lqjt-S8F^-{eW>axa&AosYB$Yy{;&|UxP^LIU_2nZI7IL zUTy%n>3s=~x?lMCi|3+u%ijKQn(D-rPr&Q$#(6%-;&V$&3vIIWa-(geXkORCLemMB zLr=YYHt%lH{btIz37dx!#zk~rmeh+5-C5aw?$-1R1CU>aQSYkBb#Wu zCeV6ZhoWgX-5e<8_}pn-U0vbd@{Fdkm;ClMSz(*HpH=>J%5hTundG>Tk zPR~#XWFt;N07>Na>-|Q(*S+0DHeYCUHA}na?e~8}@vEN4l?~^)G0b|ceFpDO8Zbz> zUB1g&B^>F0q?)GtYCp9@aM7zF%n3z~m*X*ui zEnrQK`!@WIr-0M`M88FaZ$u>Ewa>-_NREz!t1H-d>dJB_o8ED{I}g7X<}lMTlGM^OaJon zg3IsznSSne9NYEb!YCmj!Tso02`+~Pn%CXQRy6neW-yNaW{%g{R(W;DHtch|F*hVOT-e(fdqZP?0E=JmUetor~KZZ z4c?wN-shV^jkYWKGlx|SV9qVNCyTW|MSjA3!o&=UjYTCRBm4L7UkzXo1O&vx%k?Cl zpf}I`suL<0g+$b5PcY)*>F&8{t#;+h>$x8dBV)y~|LN84sK%OtogH&< zad*7wlg1HWCsT$_!K z_6qoi(izU{dp)|UEMKY7=|V%S!9ma+xbqH8?2LrDr;(LCXV(0xW`}a4A%eH z5EOj;he0iyrdTZ%NaDT;uJ3&*j){=&Efv;!@Hg-02lJ7#&K>3rT==$7r8f+8)zc-b6Os~f)(>Gv5 zX4>1H1$5|>BfueH{uX>gO<^&Re}8*DTxt4IwDa)zsOKWowCae69U1)R55Ha8DOVTK z&C|of5CIMUm{r4cl^);A>#GtiCV)hw*P*77oDcqroOS9~aQ>|*2^<<7E%+LWf==ts zI(oCRtM-+%^ia*-#o_(+-s$P)P`bcY=JD~7)oQks`pdbXpkNf?mxQ1oC?pt2NEoEe zQI^hsz(Gk(9Wr03!~VSwZr$^k2?m8wveWlG6Ep)N(z+H+6g)?Mo~+K5NzR2car`WO6d~ zxE`m~ek+gz9C54C+s6lw-3&>)vT=$gkogwq<`OuPU)S@#!hSb4Zh1ayOXsx41~zN5 zzBq-f{OHVXaoSH2@D_a7{K-Rzvc0oYyJT~7I1_qsU;#L+QMv*3rF?o zi{&!a=_H$%eZjC9HHE)_Cs!$vF9OWuf4S%l3JKwQ@BpIh-o$@FKFfd+l$uJTK%y_N z&!u0VVFi|X?WP`Pot&A;!0A7pqzn2F4Tk6b51{;5)BoqB@_%lg5=|S{jSuYJJM?zX zf%1>;5w%Lnd3ep42>s}3WY^&W19GpmU2(Xa^E6XhCMiA6ct{2Gdd{G0i0v8D-n34o+v_s^>GKEj;2**Gts4FM+d&c2Gjf3 zl#26zsmZAK?e5CZKp*D$-n&&U#%{qMuapR<7--azvp8AK*P243LG$@+KHkA}~?)QdtaKv9PgQudc84%qOxOh=hDsXO__OMLtek_Qvou ze0@90Yij#j(rr&g{s=0z+BX4w71{=`j*LAYfPhso>FgNK3D37+f6|@X)_*lK1VB z^GU~b6}qGN#~*ivj^ zosH{oqsm^5Omr?4<>H{i#7Jl(iKJ2Y3O>$TXtE&^5IcIYAR zXwxA?*Ykc{qb16{hNj8u5{%w#sr70pI2NvCl>R`ih>X-TY4-2F;W*;2+h+`&${IDM zbvMDb4+0$tzi*tUQ&9Fxnv6#?DWZoN-JfYh_4Q@6kF4?`V~lu|jGhbV#F*AY&F1N+ zr)M-d<;3?!l?qj9Nv|8*Y0cV)m-~&UNRN6P*b<{&=|#UfpFuYyV;HXg4*tXH@CVcw zz$0Me!wF3RMm;aavZJ|4zWz>{eKYr|)QzR|>T!sC7Xx|fU6SH-O%ft%n9^_iOv>ij zgpT#lS5`k>!qXF9=BqFHV=`vhVLWM&1vufeM%^@9N-4aXs&*A2_IO#pk?DfR;IJ%P zXSq93{rA%;)Jnfcu8cEn9`kQPs`ztr%kUipGzD0$gJY`?##@DYx+1 z^-w$Ih|@pAVRS~y{kJH`_E_&zJ$^&kQH(P`8q|P*)*_*Quk3&;WLXG?^dk9E|jk?dScRcid8CBKZ0^D$YZ_wxMKX%-n zLM`H${i(*R_nWQ#r2V9=W(l9!hHf&&W-)EGW{Ft6&_`rkN{f|XFka83$z?!`zeSJ^ zjr#3}UR^j&hPp0?WP4obF%hUT;%9JY3cQ`ZdeY;Ngp+=cLx4t5?adD-_KBZ${<_3_ zbg3kUG@aWjHRW&K`>e{i0bh?%8Ok6gefTh1xmYteV0XUKqs&7ERlx;IhL8+YR(*S?fWJ zUo7ODM-FD~e?pK7u#)JL-sY<9^g*)oYdg3zB~}rEaR*dTBoXFMPy$czN;Z}RBC9j4 zM|V8~E=y1fnYugs{snZD=ku&~&e7I}x|v~@P4Phn@u_u;YU+bmw#y=qPnUihvH%ZFHe-%{$cMt}PMl@88DK%l8(=2N3pdZ9^P*iUs{W)zrLgf;B;hVT?p z-c2)w-jqM*=E_yBEB^N5p)V>}7%a(_fDP$RA8T~MVPdGYpS90BO{}LNLwjVnvh`Z` zADB1R1J((J$FNmh%;HFh@^-$bxYA(xrQ_Ik(sYt#KQ4((}D&XC$mYpN$t+ z%vDK~Tv_qH>j|_so|YFkkw%;a$Y!(!sl97T{ypUE`%%7HW4A#v8Q8?aW@gC|Fo(67 zuIFtv%jzNFLDD5vPm?G4o^&F;KPNFzjI?}ABB7xdowX+X@?ye#l!_)$TC5NeJd5?K zv}BU1F-&a|xT!L{HkTgQ?1$ZnqK?t;I&8RbY001dh)&S0gbBwYMmz8aN93 zFBX9gkj=4m96BJ(qMh zOuEf%n^l@acVPyObvPVyNsIRT3mHJY8E@#>96(K zqPb372?lP%Z7MzwQP`W{MkuH!e*e8?zsOodQ(yVL)ffF#X2!vA1thzDcPBdy%eAy| z?nAh!V3P2sJM5_2YpubyA!$a9PVM(SXWV5tblX~t=^$Ie{k#D8=?`V2^~CVYETZQx z6m;)RN)k>0(14a`(Lo#WRSzi;mw6a*MyIw?gtge}l2CSSYs=t~H>ZkbQZ^)WQlVDYBW`pqZsv6=eM9l}c$w{C+bD=0Nm6H_QsH4{=?gUA?% zYIZeGWwuoL@u?gRF8$l;SOSZ^?XELtnc^Nx-RJkYFS1&B!bBYD4ivGq17?FFr#>~1 zW{hOp4VvH0ZTjhr0*^3?@6*BvkIfSP4o>?V#CBf2tEXrs z^Mg*cU?0O=f%2`0u7a-1XT2l^r18}X!HgyiM}e$-J7n2D0X^{Z`DEW;U$!mChM+-~ z!h>XYGdWri9Iu^k@LS+M+tP!FR}Xp_9EJ#8tW-4J|oW zw;xi$+moewlyXlAeSPA!R+npME-?xKS|lYoAnP*Y^!N7z`U^r7*i>e{9=oQQtj>B- z-SX8{-6Ux$03?X#DQ+Gg%ap5EUR+*YI?rqKpSKATge{zZclYFQsd96~m&$3y-1|YA z&#bhB+y%fu3(T62d{8X$csvbf*P)q5HZ3mJ{8KZ2;gxae?-h9H#}&F_E$O} z54*10MCJeTf9q~8;DBV)q8l)bMj^*!GDqOw{=OG4AJ8Tv49L2tL|b&3QAh;GLP>lj zm6SdK7|3wCP|Epqd2U7v0|0(Qg)oX?*riq%u!i+Zl5%ppK!P3ZI0i6@9N#C)j;Et? ziKR{;ZEj7(7beqAI|}SnE)p^Hv4YTJ#(_m8HUU(0Sv(F9LPA2s0ENl%Jfh=uJ6nzO z3%vMTG6N)_7?XP}K^BV2khEfmjt!gDsy@~boli#$Z+A_dmu(xbG4~sOpr&k)?Pi;v@GMjl}C09x=@w03g>LdmdU^+D(9MweN8U=*nDZ908yX7?PO| zpJ(lb@zK$pR0Ch5E`RXk^>zDErY1BjtYB%E-9I|tVhFbY{$+Ny+H!Nck~%gft6rhm zZSZ!517IMJ*V_d=0OCdBuFun@<) z6D=;A#jYeemFCC2%xY@`_3~uED_iI1v7&joYUS!z)Ny9QRg>$dA#h-P&IhClWcrLk zLK~y{oU`^;o>;35X9XM&$FsjMVg>GS4SXM|HhiCLqgOt}Ic;aHkvc!x8{`Lp=j;Lq zIlx?`M*&_GEx(^5((s)r8vwsMu|m|ev|(OnEwKJZy&;!N=Aih@%u#=ENX=$@veT8O z5&+6LAI~FKs*iU6gdK(G3V?)V^SrUpZt5UoHrD@@7bx7I%~Ty|UHtFqB%4{c+1?n? zH37Ol{FmhQ(r>ZE$cnaTi)CsIXPxi964Cf`7DTUz2nal0cZ_^)XC~Ks!(6BO|Bhbc3f|U&rQw;;3WZ;=T5fA`y-wfKAEN z?qqhtY;a<5EG};^952M~0` zuCK4J^U-WLfEH7cPrydr{D8)o2+*iPFP{;D^DF3dIYD$c!1(t%s&98neIBadf`WN_f$f||Rf09Kr;{7dx% zA71ZIYVetc_HG%jG}^uZ1ja5-(C=#qk`XXtZIa3Emzq`*C)bkSAB?KwbM z0Wl5`RZIc2&8Yt;t)}L)=gmQYM8Otdv>7l?vYA}bKVebX+%F6P`x)kN5hmeKP*OG( z!U(by_LmxMPqSA9h<6vT5OnoCU zVoS&O=?X<_0H}PjQrG{(@I**O-P?ePiwH1VAPf#=a9aPhYRD4w$pE4p@SJG*!3h8w zXW8G`=>>KIqCp@MJUl!?Ugt0X&a(l*g4p{)5!#q|P|5*DEyS;m0EH&w-!-9EdZJZU@Z_Zcf-?R$Vpt(o!;VHA zdXJ*wN^t&bDyd7U6MnN$b!ks%q5k@K)Twq6?Oet}iE*-iU88tq@vguB$&FIfna_>n zjnq|P0wTH596%-P6hUZn_L{?LtG7r& zG1Z%4s5M?rlJvIXnukzyMWy!c=I?1;;B4QmA<^u8X|7BI&)>h;VMh!n&SRGA|4kR) z_uGciRk0KTE>gQM5wiTtv3VV^UB#yL&4$N2*#agQgNP_ZT`8eMi1>B8Vr0dF!5bz+ z>XAziIrkdvd@Qo}MVOI5c}7wu-1Op*TdVm_@+YwbpFlW}IZO*l8uwan{obgLdN^%_ z5eT_p+=)SArYAG@!bVXrmw+QH`$#rqF$p}<#DCb3+Ij?UqO#MmFzqbrMJ`^5@LDpM z=dZW>7l9U!()81f-N;!jQK)H(Ui?J|?aw6*cA_bphN z4HVTaO&;w9Sr0!m3r64Ea3mDFnJwgtn`D*Ofgm8mr$%{-BhA#bc@M2|J~=a|KbA+E zmh+srHXlnR%vYJ(9!_r8Qh@^YR668v!1jo@!#2(zdLQ&39wFY^arv8Z_TPQNBrF}S z)pAchNiULqCK6EZShb_v-PMx)dpxC()nDiAge($7G*fIkmY)BudV$^aj*X4pWVS|E zVYW;a9hBoQNRNdGvt7 zM82y-?}VW=>x4NKX`WvQx?MlkcLYK?CTae*ZPY^U2|r(Y)I|iLxSRu8Q!tjr;NF9d zolNX>%yJkva4(UA8`D;UDk6eO@!NfZ3vb-z420rSV7?4o;x`~?<8D0{Zz$5(HZ)M@ zI-1%Fa#i!MhB)mT4qB{xe6rA+)IFwM?2j{*;Mo`-*LQt;2~}M z*Ka`b+RlnM`1DA5)_L`NMNmsxwv{ANqZtH~67nK;#XzU}!kE@{D$aU5ju7uNZUbU8 z?Y84&*C>w9X^co;bN$pt3HdAY4_8b(o=GW**+Z`402JP0ipMS<$2nJixVD`3vUW;T zhvX4rxJfc}gqbVRG+H}v^l!IRG*`Ohw4ftv^i!|xa1We;YDo$KTc+!CUdfZuU#13* zz&Do!=w3nCSMAfXn+pp@pTEDgYVQt0=R3U-<=mLE>c3aYcv7iX?2`(YGa3B*-@&Se z{}-%M)$8bBM?IdjnpK01K#HP#{V55-z*v_v>U7?D;}(gxJB4YMtoksfouREi^*3sy z=@2#mcip5X2wv91^An%f3rp=&2=e=XNXqxdlX^_PkJnM~6Qm6JIV6Ep3r~0{oi=7i z?g6p%!@-@&DZ73x$?ji^`Kl<&!pLV!VLoTL4pKn0 zcMyZCu2X~6NgV$$Ga>EQQxdcc1OJ7_X`=ouwz7_=+Cr<3%n3#{kwRfd*lg)w`t21y zTa>zDnc|a1XRC(~o0eOwu`EdY&U*6uxF>;8Y)Dd;8SJSS?DYBBC8M_&leLD}-<2fg zmi)Z*q#rX1kQfh)mX?#sH`iob?TukWbCH??^?s)-bMda8z|O_mtwW5H#5_|B*! zuFrC7l``m+l5S1~GcvxaVU7IRk7eE61)>fdSz+FL#qnmX2iU9K*(Aw;pqTbmDq+SF zC*Cu^!?eU&J(=~+4KVLL<5!O*X<25n7`J^InpH1-k`Fd|$U0wWTk~D3 z1M|tP&LB!DZH8gUt(F@AeZGr|Id4Is+zP_z(+vd}WpMHPev_v@`wOKA#Ix!RhO?Q!q7~e zC>^G&wy>ZEGIhBw*bQUXJ}<(u)<4+^cXCP44NqJ=Hhr3`q@`P8T1;lYpN6UAy6nUo zi1Ug$2{k)L2i);FS{13s^?J&njsE#O&}nc9MjoXvC0kMhs`Y!?^J&m-q6H{9x^@8d zMap+9ctUS>jz-6~Pt<%?uZ-GRVr?#FOEDQ{58HbSQ*<_<6QN;Rc47*_Z8y)G&no+gnGe)1|=2G;-{|6}Pmi&JJr9T=?y;&nKJc!0AgRF;E?K4@fbr{$+ zmCyX@642^79lN5~m+Z#FrHg6@%4B!b&$8_F8^wrV&sK-G*Wdm$9rB3F-;>7q`CdS0 z6CWs4OMJ6=skZ3D1nHWmuRnp&MU^88tgT%|Le@c6sx_wv{<0LU(fW z@06Hi!5ckv(T_eOk%^^?46I*8R(|mzN~a+@yZ%EKpy~x@BvKUcC*9VXy%rM;+Duua z*wH}@S486ma*EBY0_C_EO1Yy662)c!GvAEHI0>lw5Q}yW5~%9GI6F4Uacw?lKey{f zzxkX;zq(LS1=Co;ZsZoY<4k?rr~`)r@7M%0m*P7hyhkh}H5we48)sOtqOv;ZxXfC) zA*sHA7IO1T#&dM)+>U7ew0z04FQ)gfBd6pfWD}f9j-N&)+{2e3BdthwTHQ9a-bfQ9 zIRZ{#I2iXi)0AeghLRrFbneZS`|!XmGa&l7uI3AE+oa~tkhXL7@lx;1D)_~BvYhA4 zpPkjZLrKW47w3K1UyU{I#Co~jG8QI8Iva1&=pjV+K5^F<`un(uRcMB7CyVXLO7;O8 zvV3d_j|J68$^Uy&^Q)M`It>#;WMZ^dcH=B3%E8?axyWhtz-)l^hbg~|`B5#Ff1Lu{ zlnjV6SLEIE+;p`K@i}+tpz2_?%v3Tgqja*a1{D!nn7x$y%Vry;shxX}hV0q9)9;sq6518ua&R%y~>OY2$DsV@apw4GcPH zP4-hsss2bx%FQQpZiULD8Ch6j?bcd7cnR`90l7(8_sAmfRW72~n^ZAbb^DfXwU%w` zXzqDDY;-rjxfvJWA-!9h(?v3ir>+_QOKcFS{HqYaMzoj+fIPwysJj6q4LK9qkqdDP z`+MEOe|&LzX9^hPb{*B^DTY;2d%VvNG3?mV`MH546R29sx4bnQLp&`%{Gq`rwaG3?;!TU+A>=rUyzS^k>Ks#_-4H<88 zq(E{Kgw|8=KfEc(!s!1wDMZahV+xu%?E7A8*rf4(#aE;pE>Y0E&_vZirw`O_VSfN9 zaG)q>@s9^PfH7K*JOL@qZtWm(@8o24xFa>tEe6mV@dBXpP%!U4#=^w32N;Ft-N`T{ zD!<|>uYunyC*abe++1M@VKOMv1@j-SU!nW~1J$$aIuyGkc7E4SPH#dKmzH0bIhtf2*~U{6hUSaS;Ie31rKVy!-~xtv@I8^ zh~D1b0A~ZGAyhvgEMWk?ux1wqRs)D>t}wUz0bM}*iP~4>l46Z+&Tq`Akw9)*XEu&6 zpT!dZq=l&b7hnnkx0pa0f9HHB2IH1)qBRCKGsKo$k5W#@`G|I6-aCWsx6?vD2>;Jo~8W;9jIyh zezDmNcT=xde25Ns!}RWC2@o-I{a7EHD)`oN+PE?_G}JXY8EZLH%nG0y zZ*T9Kl~YO@nhz}&7z|Kd%Rb3ZQHeTNvt(nlSQ9{}QY?u^+lMT@2acH!eYjLlgFz!- zaaYpuiqK7z^$Iu#3HNiZa{U^hpb}M8#RQaOe1JNGnvO2~<;7dQQoFxQt(?c_iGxAC zViVAb-SSoesB0h!@8ufwPRYZQwxI774WNySd7U4CZ^M>ss2Lc_ZC)W^QT{eqYXG{Y z!3wSV#X3_&fQv$H0#ZmojhDQ8`to>Pq0@wtI;wVly*>W%%z)JE0pKPA*;r&^0)RSB z3{jaEuCNsZkdk??PCzKvtjoOo+fv2S<9NPu>d@JO13!jDXabO-eFzi}0Zaz0{qOS? zTBf7N#(iO*Rz3E!0ndqwiXH%eGcqz-b)J!1br>Z25Y=^?uq9Ut*>4I<#1Mveb_xM< zEI=We3ZNi(`}^?2wKl1izWD#81>h#)b1ek0694rWI}#onRLP7MVDu>^9Om`_)yE{0 z`nS8Ar%DfKKxLNLlBI)zDGH#H+hz0q0JtKGZ#oTSk9G6Kas=8O*^KJiUVva`WgWn2S-I! zRrP#_s}Rt$T}<$u+h1&o08~-j%8GubSdM~`acoA*y75CKS1g|`T_T^&4>+`s^FLxz zSPK*Ip^*e!>IgJDYuV4K+ZB4f!T6ZC9}9|m!<*f;EgKMpPIdTry;-+P z0))~BC~SdNp0`K+z*-&x4oOc>-le6b7l0ub0l_oc^MxQD0D7y7K$yvg{&gxxdYcWW z{eR=J4_jAkn^>I>6q)t^3;{~c!}&@AKr&V$m&tW=G#B}Se1X}!>C7u7C6%X9tq)v0 zjxcsRU(b$;Lh^msg0<^>bp-^mHQJT8BL;de#|H2Dz{if|2oM0&I)+$48d!(_)`sQ| zri%~(ac0~HzDfg#)(Ny4TeM_m?Z?kJ>E%h7T6)?hD5t&@~^7Ap%wv5UlC; zIxw{7(%H@XGKJ4nP&YRAk@D3p`8%j#3_=^3WmbkqMy%SfyZ-z`3ls|ZRXZi?S@Gqr zl#I-s`SM6RQnrXz*MQ6-hee)iJU;aA{LSD_xGqT4ET^N)7uKDPVHOofsZ(w`;RnPg zC~%JO?y+bU?ldlH^7PyiYZlhHPwb)M&skb&gn=^S+mV)i%+aPl8i^TAc-qlK`v}eP zeN$s{D*80@F{b~f_|J9|bzU@GI9phGKIaK_#MhJ(m4b`zIi4vX!sAhK7n@fo)>`DFt zT>fbtzMdqZ9zfX1+kL#Y@M8tazwp|z(kHoSK)7du*ekw@}HSvk(<0sg$+uo}CJjGnh> zuB7|ZEV#J1K+Ajv2d&F7q2hdNKviX>T}vo-r>w$HV%chqmS@agd93RacQq!BG8$h^ z1$^+so#?)_#1<~U?-=9WY5ZFG_n9mG4LA0{pDPk7T^;%|33%u|Oxy*y?}%lwuT3j% zHy8-<)3wa9DALg{pqM<>Bj%Thy_nVy&FzfbuA-J?3`T9CPO~Xza!gEeKNr=W9YvzFSzB3mCUQ5Nfd+Fg!V)_ctLqba?X1ChXh^h<$MYd~b8mgT z>o~%rhCw;o`GM1B)KcQ}rPI-YOCB7A7ZZ$C_ql8?9F6bh?O3bjMo1(a)vx|2)5`vn z+7)lbAHJR!eSMnMGlyke$H^n5 zeZ@*%LyN85$h;gEFal>$`&{{6TXRcWUouWIUPP=_xeMLEe+FtC~igbde}G#!vVD_ zbs_CvJDV#(MtFIJ1#~p4eJRdFTuE7bsnHR4V=TX^DY@JmFZ>uEW3^y+l_(PZ+w=Zt zJ^OwkQxE>h91fJmr)a6FHfOH{TqR4@4OPO8$V*mZq`#@X$n##5?L|F!b4ny8AK9%P z>L^E8V>01*DOSUJ9=lGa8PxkdcPp$1oxAtGX@%IKZd(~OO0vz9?t70p|Jqgv*ah94 zj3XpfSGeSom`zn3^-th-#J+v-E2gV_E`Yp0EvdU@QT|FytBlb|I{ilIO#(gZ+2w*E zbVoItpYIH>>=SG;IoL65ETXwFMa9smd~}QaF_zxX;DRL;$dxwrw64`Yg5ZIW#0!mt zc>VLjIjeH4Hts}P&XCIIco^Y<%72C!bp5EF6GSoQqSHpjm^&O#+>XzK4`|_ye<&DM zwJV296V+s8Z?6m-DOCWmBK)tXJy6=td42ZxQGfcb<@)0dRujR=F z={~)-RT(Jl!FNkG2pdzzfs!)xn{Q5mHgb)rP?9fSzMMRJxr%lLhfl5Se=en zgnL&5rBCwqg}s{9HKGXaqnH|ce(|w}$g?CfG~*i|9lH~P4sWz%lqjxEC9X{w+x{(3 zjx=VH*DAMi|E!w>p0b-%J_^@DYqwp-g}ay*SJ`FhUuBWsYF`R8)FRN452nE0{q+#L zcd}}IOL;exCSz24G!U&pIa__Gy<=iEA(xEqx^%W?f*|vp+e?sA$00yvwfqBw5bv{-0T9j4xeqTC~G-d~<&jPpA*uD4KX_-FlGl@GIF z?)etPue8Vm@_S6txzsL&Wp-T!bvbh!#k7>81DVC|)gvy~dFsIBTiqcYs1ru58squtvZ=PkPj2fd=d9=P`}kI}lwykDIS#2l2m zyNx4h9dDrJ@Y9K4{CqcK)cZ>(#p^)7Yd43Q&p*`NcsKG(eCMs!jWbkoXMo@bKE-f*9<#hdNzoMh?K}3&n?*6%QTz~$%8hc6OchY4TY(+N? z4cp2{QLY_(5Gg6u1zHr2MwzO{sL`J!eSLKI72e<*s(OOu7EDS3saK0 z^&9C=)cAfa)Pt>zrDgNRzFZkcs<$xkeqHOW{`oGx>I)kxHua+Tt9%!;V+jt7_PF}j zj2<#2eGix7h;H?Ne^VQ(s-E5=Z-6dsr)h1yEPLqTJn21p;`j4g$-$qyz8v#CNL}GYWcT$T z!Wj(wtm^9cdl{ZGfeX9~TDXm-2L1b)lDBP|-k&s(x&KZeU*N$hD!tj>a7UR(0HjxA z3m#7z-9+DHTar5&v3;rDFc$ZSZg`I6{mJ&HXrGx|rRc#H(%z_o*vdF_Nf; ze}DUUAm-C6!Fh$D;c-LmxmZRE8J=c2v%`RGp7&p~l*P?9pUn*&SD0c;4WBP%R(;-& z?J;AO7Z!P5iP3b3LUI(2;kv#luX@>RFZS~zDvn(`hDx>s=EIz?9}Sws-ZZ-DEFR|_ zs5hua(N}gHC!l;I@1*Ao1A#}Pj?UmN@x9f``-N?8_xSB-Z}~*<@Eb>U$aJJ!#dT4w zUc1@;1`GQ-x5sWQcd&MU%42gKOP?JE$JC6eqz>P{UmY^BHIo*dlx)!RcxmhEQeKu_ zKDd8>_eU#s-dWIZ^-tz@KeVXJ-eoQ5ZXmY+JE?cykH={Q4d?Pk2T4V78=JF)%JG0J zFDonSa6tXjDSVS(3m0S4 zq|l-%z%T#7Jt4~8V(OvF_%Y(7dXMvqxvq!mU!voUOi4P8mF{6B+^M~I;!&gVil%Lz zi$7_?Nl8h+TIZ#IV+fmsU*#U|M!(5K)L5E0wX8Eqt0d^d#EHuzq0K;XT`o}|+0ODj z_Gg*Txu$?Ot^M_iP~z{#My>XW3FM!RV`%#SnmD()Q`wd4bzpa%7cdQ90RhMIt9#TP zotg1BZWxqIOlA0EEV@^JDUH7B@6iOI=Yrl$LO<|>#W^e80X z`JZXv^*fnhN!vx(hqhH$^W407Q*MX3)}M)qDJ3=4ZSy<-Vs-MFX>CVS@KtHTu!DC8 zvNR}=2$h(WWNyRsogN*v*znxm5Y^#jLfLV>!C(6WahyZ%@0dQCpyskDCgjUe%5=c! z$XUWjK$j+@R(Ef_S)~0UKc5j=`UeljYzR;)j2r1cAQu3B{+;SN3UZ3@S-fxwk#{JA zrKowgm&(f4Rxl-S>ErdzuC6aBX^Us2?MZd~I-iS=r7fYPb5(Q4NEh#av(tTMO zWMtOHHkOuMJ3qTpxy;c>NlBgbMY0=pw6(_{-w$vAB_zpq>*-z41FeFH$2oxqtFucA zJvelS5K^XA0AKSF`&M35bO#ZSB_}8Q)TV=(b+PYdVRLgDukBE!^Q?%nib|@0lVOcy z2UBf2fOtQamcmq-9QK`hHi&+oo3C@9$5nte-V>Ko$HdK?b%mAfBrzl=*w?Qgq0cL_Y-*ZbhT`3XF}pFn*k z6m%iB-F7K~K)^}LfLQClccefdC{Xt0!qI`lbqugWfHoVvH!0oR+-^z+-V83x45S2k zW1iNUNr3LpAy5gX0{*+OygX4XouyuQTU7KdA_@Z^GvWgW1l2~Bla0-CAejRY97|{C zp?CLl*P9(00I~+y)#J~S5@@6V_p{@x01(Ly{*40GZv79QcUD$b5L-8#ISQBkIE$(O zCV!sR9h$%+I>5rvF)=MIEIL;+gNESidUE8WDyyp(U<_GJ6zi}XH&m*pIviYfVA8m* zkKbV+!p_LZ0CCkI`HX3cUlKSb!MGd-qo<pZ>&=*u%#$dZ`yV$QVZVOC*DS43s;Mo=Oze$P=ho%Od0UFV$ zBw-QbaB^S(MX<_f8p#ZRM-fmBh3`?SX~il4xQE)|0RL$j8Y;`nUxldA6;KJgs9)GJXI4Jt+QAg8>Id06P$B7L}GRfeV-fbY37-L#qU}Tj1rnPfl)b zWNhpTC`g&_+)+|xop}KovTxvD6-h6j`1ASm=RDBbMU!)*VPay!nXcyr9WTGmD=e&W z{KkVoTI}FrU9IdeGXoJTqQ5&j@&(KZ}g)@;)l z2-QvwHXYJjs)`1-dcagWRp&sauCA__uhn|ILIvP`bW{{BJW36Xjk|Eub_NCKhpQ~_ z`5kUKHNUgAwM9N5@N`qK+_dFWzRK%p>#*V|8(2VBRaN~2;oUOu8!$rUn{`W*>TC%0 zb#;4zGoS#FQ&(44?DFhyUVc7>QA1Qzl<<=yE*O~b$WpPfv6=dx4h0XLcf3ihFgLMp$e+$A~%eTj2xYu03o~vF90_(3fAiK zhiyYWQDluzj(POTjk7f}C7|X#Ffix`oLdzv&Cd2FHMO-?KRciK`ukhj*eD!s&E98C z0#`6WuUGiBTc2<_n}eS{`$xD4mTz9~XWP^D1bTXUGcz+>yu4jqT~~a3d=56JBVuCk zVeGF0X;KIs9t==rW#wPf^_cXI|@F=q{-WQroj#Q_{79SK95c8!`mZQ*|B75 zlvGt2xVf*R5EB!FYPBa%DS?X|@9bdOMGSoXy;Z?5zX=HmxkBIra!Me{><_y5OM@iI zsjFW@T>n2ho&v%1KvOfgrA7Ru#0d)ul&(b>dP__F2?%Zr2Tkq&yGr16MrHv1yDce6 z1GNhUwCVZz`Dvm)vCNrI;ujVy;6ZV7b>(t?;Qwc)vs32t;NXU*!MyXC89=cy8ziKp z^hwGac#(1aRw-}aKG4@!gnWQsGmX4J)AfA)N(wg*gsZ}%V`CHoj^v;pwc7hNBDidB zW7C_&riYYO82vo4lehTowV!5oeg2G>uhoD2clFMlJ3oP}h^7|*FmzZ9LSA6VQsU!@ zj7>};qoNi+C9%O{@bkwHa&y{?%~BL&=N7w#!{m<04Ado40NqZwFlt0Ne_dODkTf1uj{w2tf`T$ zm_#0cq@)`tZI>5K-1zPN{gLD2+AxN(@$mA1LxS_Hw*5lw=;%oKL~#v1T9JVWPB2Q2 zp1bv;>VQv_KNFe%ps^gc=lAyZ*4Nh`ZuGE)>4#j{J#W{4ACgN(;RSYf_R8AY?vasK zoUKQpki7D@n^*%yXN(V`PF`hZx`s zDrUZvFV@UUY09Lua?H2a?PSPEh=>;>Mr+G(eS@m%>urH7Digt1b%In+M5YWSX>oIN z(Bq4EA52m)SH8dem!E{o(cRq*-Qok_&g3Bv0U94TTymqUAtH-JZ5JmFFaxG?TVg=n zfl_J#+_EDbiD7bj`Yk9c4oN=-e>06gL`(5~Nr&`WS3M~lQBXZK1uLz{yL&>>!B1nw*f zOl@iqZ-EpYnC!YgeR|Q|Er%3cs5m`7Ypv!#jxa+?kG?(oX3j0gvZUycULF3lDvXH& z>xG(yDw!s8IML1bujbrp8cdpeH!y-fL>d479sIP6!)LPG_2nNe{Xbt~@=UmBy>51~ z#R_-Z;#+z}Q>}G)9FOvc?~f(wY}oYi+6FQa3(C{Id~n@`xV=4L_xH!IPsb_d<;{=w zlj5sndUA@He;MQ{I~{-R^;Ws}DVc;pf}8!IsQk9okwTcJ5Jwume{YR%8r~lwtZQO@ zmBJ$LT|RX)vZuynJnFu1;3z8eBL8plYPFc^<@$c#y{RfudrbQl0LIu!@9xOmKR?v? zdrU;?q%3O$$iT^sjL)&F<2zJ>lyA;Q_Nw;2U{(F=kpwL^$1Z;$JOruf5m zM3#}vVT6T)1I-Jbt*tGPiy@7Tk4u7v4t}NDW<08k%z`QA7-q(`iIPb*j!|eNKravs z!US%|DK2=J2cRtJSDJ;mQKr0cf_4`;N%n`WH(|0{ zW)Ob#Ifc86eCpfx@1rGpoX}WAua@NI-iBe^Gcr=uaSmo{WYmJIKp#3iXJ==aQWKHM z#E2z5J^dKcjSQN+Ibcx(qoi+Ya~9MZ;K%8L))bsb^vHq-nq|a!(JKb$tORWaG->?F zI`prQ%%Gj05i~@Egi^qw!bdk>oNUk^HDxX_{rSl)IQO08qg2faM-9g4gR!`mQRb@k z#StqZ7Bc^>1&B(NNZ6gKer5Ts#?}5Pk(Wmp3{KXAG}Fn+_2OYaD)9DLMKsE(^I9(3 zXW|<1Hb;*HVEw1|gubd6_h@HF!4PGD*Fcmv4X^&0+@PmIjvC{^rv9i^U}@~`vu?8$ zYRcYq@`ohBOx!7r6qb=jD@sE+H=@)Vi1*Y9sb}%5oMLF7`0L5MZ+#YVH3t_WmR48i zTVuWMglWu&jJ?=Dnh-7Gom8VcJEV=5oh`ZY!PnCnRqnIry*Z@;TMwCIb7Q>w63PrG zd^xKe*`De|E-`WAhLX>F{))#vRAcrw<@>Parh{s|VptGi`{Tl!q$Z8gj-ZE#Iw8FD zL%u-}%bRZ-w65}m)B=7yi}YBR^D%#anNE0OCcS=b$wkg`_pU<4T)Ua7elI*=dmd*JI+?f&kzdpr(tiEkQK z(=>SKx*XnrjpK5;yIL^+ftwX1C0>OguRJ#g;v{aT>{j4A9?^!99lv-de_1Zbv@`c^ zaV1Bq$oUMNISW6xflHA^fJPB1l>fqSVc>L;Jvqg_h zRk^oxdiUb!Uww4V5TMeC;=7hd^`>g6lVfe)SYEjg!;it5M|f#jXMz{y?&pl{$m+Lv zMMd%b+(sp#k`LN@(_cNM-8}tl=S#NVPP7&cWc z_Ekk&qn|V6XMI)PU)^-JxZ+&mjq2kTlbXc#kbHd*{+$oqu)z;eV@jly6jBgqvrt*AsQ6uAbMc_xRCKsTA(u=+JFG&b1hB zq5`7NDx(HXzOp)Gu7j+(lm=}I!oe8(2AbDi3&y`p_OSn`|1+j|NY-CDgX9ncV2w`k zMnzNVkIWZWC2c97(zBTEbn()q)aHta_03MtO?y+OsJky2FIjA;F$CfA%tVM*9Zd7_ z=~7r7P$?&x06Ws@+o8;eiUJ2P!n{Bp6i_EqO4lK@4RMxnZS}WRl^Z3l1 zK2lPv5d5Oi_=bjOPv|hH`sXIjxZNK0ky;VX1qz;8AgykQ7WVhh-Yw1FaXw=SyKN`d z_Uji2*ptmoWMz`~uEyP=$Cq;4zB1kr)qUw8F2CFhpLNo8tMuk$;)P;eJQRQKtjrJ- zqxY|j&=O5o-g?peHJMy>btu@HH=^Vt(on*odT*7(#+@bE^jaf+!=%A_t3lNERcg^v zYKPa$43T5vgB6ObnP5K$JZwJ#vDxC=FScIhN=2>Ypgy&uaHQiAD|~FB7)>k2OH^qA$`kRX#kkm#Hp0|P7^Fo&K5X4fe6t~06aDy<=gQJ4pcL(b-N6N>({1}b9ddu6-bMO9Vl)!bq7c34ItukVyFe4J(C zb@RMN<>iMrBj)`+Ta4_K(|km9OzB+)MsNN-N@4ycn)H`vm(zSQveqoqDGX_(Qp?0B!2VS9*E3qg`C7+SRE95Y+>cdyac=Cs_&^ZPSF36# zq4ox&fMY_~WxV^#HHFi{uc_PjRj=F@Q|;#C3U&3bg9@m~kn-lu*T*!T9(MbW%)Tem zB}@r-=$JeXrV|ZG+0@%5H|6)6&zj5@O_w^8X6}t83dzvyaivdQ%igsj9pAj5xkG(| z;FQ#6PNyWU4)H>~r`ug{$)5XUQ0L*y*xn;rGMvzR-54kmbui$%`!L!zSK|_AGsbGz zv9sDTGJQ2h;o*KpPw>Yqs@Y5An(Uz1KQw9Y3|MR3Mst?U!PWOod4AVSxfuR0JvooY(eW6d3T`AwYiZJidPY>SXfo zkMyXYa|Z*COLF5zofmf)shN`#$NC{DE({@a_hG!?NUi)Q{0YW&^DVID+jC z9+~|>#YQPBE0bp%ku81qPVw`VDJ*U~Qv_*$HL%PfLGS}s%5r3tNRh#k@xP4*s4{$E zn70C8ssFsV8I1+NEb`)aivOGnpu1ra`T&w5OD7Pl0mM-2<%YcTwEGG-el*BP$^n}I zwdD@1d;!h}_oOgq+Zhi4xlcf23ckma_ow8NfnqI?#`tU$L5<6l5d1do1n^u%6%}4} z`Zt-GUoOs1Da8Feqn7j_5APmLKsQXVEF2s?9UUPcUco0Ld)<`Lw*K+eZA9(~-54z1 zCO67N9!SZioNt!-^>{cge@%;~Bi z=L68KV`8GNEQ+y~4omNcY0WOz=Gk`v@XJR4=`d5m1 zyFYLSJKr5DxXnA!K_&`R4*!;A&x;$)mlvm>GbJ;3c3h!5?rqv`9e9RImI6l&vg$`& z8Z6@lV{20%yx7{#4~*U}xd4&{ZT4dTHH8CCYIiq<<^v9Ip`xO~*RBk{wY|Bb33ral zrMUw>EqZkxeA_*MwE<+>J1`Ih3v~#(w7`pY_G+b;3`_%9P)k$OjC~B=8u{V{(wM_q z9h2rsJHS*ae2<7gx7caMHM1uS7z*~aYc_zCslMTh1o(c2XC5G!R`piO7z_wXM1;mD z2vi6czaK`C%O^mhqUszbc_2&@R-A83Si>;&H!y?q$&PIXjXq~=#T>q!{^&3iuu-G< zJk7|9Tem2Mh+O?_ccrP)rc{$(rQKGj0X>N|F)_WB}T$h9Hwl8 zHgXOPrUbfIibC#7&v#{PEi7cr%xEEU6V}JBKiW~>yUY*GUtahCQPK+oq6;!HAwyDd zYxUPiuJ7Z=Rc0M%|0Ec^3_5!X7Jw?yS3^eYxA!N$GFKp^bi6>CHW<)$jHe-g{>nsO`7^uzWOJ;Lz{bV~(Uqh8+V_KH@1x&Z=Kwjeu(2&7_H96=)5IRf!)k{AhyqDU zb!j_SP*uePIHlFP73Ucm009Uif)aSVjOgU0baf{tqzcE(xyXNw6@F1WPDzct)`ppo zQR<}fc=m94y}<_i&g1=2;@4b#_a+qm77Y)hS&m~Tq}lo@#hwP8ZO{mLCR@xoicVH8 zZfbf@V_v_p8q%3V;`G&<{*se$c6tNb&v4XHc$Vsx|6v|olJd8zdoing*0W3TCBOXf zx(4sdSTZJ;()8%+U0qqG)Uxa};M4fBpoS_`KNklrGTg^S zG0w;(8;o>V*-ZO9{!NOGCU+sfAhkUHngse9~th0gE4R~ zaDuPjR@ed13u+Vv00%K}V_B1MQdPrMnY!Rtpwx0fh9;mz?I(V`< z-zGU9bSeHt;*=d;gjzieP`bN^2gHofv9sgBgn{r=4G@hC<$^*o@Jwy-hN#ziH>7ZY zN_pC;joH-H)Dx7*zkfTP9BzMsNB|_m01?K+*a8mD($ey2OG`k>*Js1-c=J!%LpSr$ zdmJrGXVASYSUSw9)@}*nGPk>OB@Z)Pk*-pTUh7m_s~;`q2yPUWTsW%9?#8$XF*V6g z5nR1`YJq`SeIq(k0^?Z>I)m2IP~c~XcATqlFx0dzi%#hVmPY% zjA!=VGv(#My|@@FiMW;+`}Y+Z@(aW=!&q0fK(Krx+JG>$knY(n%o4+NkoCUHA)2}_ zv8*6&qIz4v%5P$KH&y-DiK_iI>A{mb{C!_+uZ^5;cvo!v52@z5;bZ=~*7e$(dg&S? z_ez3FoDIG*VC3RN--~&3)b6*saHaj*w^ZO*u2WLJ=rH?nd9i)zyHQpTF&J454JmAT z<--6eES?ZWhCw}W0}g1Br%3xdsXQ4q;afqMa{F_=BHzUrL1c)G6>6*kP-pzXGZGj; ziZQ^-KOtE0yLTwXhIyi%4Q~Cs{QUVajPYY{Iet1`Utj+ORK{m$7(Rab)Y;L2>hJFl z2);1TA^_?2R+s8mg#w+4(Knm==FKR~(@e__0L4SB1_-8Q3dh`ln1m4GL140uA!Gy@ zJsM)WVZRmv?8uJ}-g+)^wtV`ZB2t~TwW3EK`;PhJ10Bky&{Fz#Z)2Q@1j&Bf!*buJ z-8|>X#pFfJ3USV1+~s>U; zj3jQ!=w~j4lrlseJ=g54@2w1c6JM&9&3^wSGm`{Peq%;$id3hiUjoUB+a!mslZ?-c zQe1a2{LT`kOwr7*Q{Y9NB=#r||2C4b(`WzlQr5MxsmJ{UmgbwAQh0A2X~_pykGNHw^20#DYMOUugK+}%6BeoZbdWrw;1jK56H z(w!NCyY5veClU`gKG+uj*rhfcT0^O|!)<@0ZMjze^#w;TS-+@H>g__u)ZIDV`1jph zvIjS=U!HKjertJHFm%N6r)$fV6aMQWROTZ;om-dxnTnuF-ZtBuIDkFozpW`LI65D7j6ct)=e;%_6!q$6Vo_+f( ze&0KRu8gM6nueBf`q?)R@i-+ED&{k^E3O5Ex3cy?^qa@2jN7jL;?&hv=;TVOpsjn* z*hb@v#8|b)DzEgxx2%lrsU%8`2$mB0=RQ66RmT|$VXV>C3NQ3MBPMMolFfQDG~tGk2< zZw?L@|5iX%a{)I+dPG+Up+(}-QGm%{VP!4meP37gwXLbY9wa_+=PSYE1=&AOVLB== zFVD-%b6x&)1Ev!{y-b6KmlJKVKZ?opfUT#V6B4ENt;zj^d@JIeET z*J$)DBO3anhYv~1H7xe0iQQQH&18Rh77UfF{TX*x=ji)ZB{WA&+o_sNT)2&(3FKVkEm3tc2if5GK?AQzW5%CRPrJ$|i zimPfZz}458ur>%hjr-gB`n8m+*Wn9gor+17=zQ(AMS*2h z0eFSFdwT9`Y9g4U(R)Yu75v24^M45LCHzTJ&i7m!eFhLTc^~!x#8*S(XYSxIy>7|< z3{!8z3w0WveR-|Z&Z+6h)+Z6B1bmb8*B@Zx*lL`miSP2hizL8ja*x6_I;S$7)tvFW zvcS`-E**r52$qQt)^{}dM{S>I;8{UiE3$nfN5V8ZK^yH}?){cAG=n-me_?OCJM8E; zQ7|7`#0Q|_V|RE6&rErP_2Pn`GDeTY?UlMBqmJbk=`4N8sNWdB5N2ClrUnIXk-u~NtIzpI(NbeedM07T2SFV7vsCRBIMvl zK-7aOq|~@E9-_N=?1pJWpFTCHcfJLQYB}JA`}~GK3P`5$N2$)m1!)zay2*pjZTRqk zvMGp>2-~H37XtzOVHE_TjGrqjy};$odvl$8Ou-RaqIgN%?}@APVYD^gfv+)7X21~*InV~sF&^@ z^eS9^x!>d&Igjw4nnKOj!8uF~tts+`tt79dvm{FTEZ=ad^YCchNl4^0H8r2E0YJg^K2N~v;_O(E1C$XAe0+(+ z!^1WlC9W=pqDP2UVt1iOkb?$TH0WIfE-rr8d=U^bi34H~8lBRbQk&S;?;GHw96CDP z9MVGpt_I@m1IOH<7Q%wo`8@j_ z78f4e`3JCU#FL7hp>EYKF>k02*)wwJ;SRpy+h0gF-_z2k*On}!ME$U5bK$Hemtq#L zEQm-@qgPQ&zlrt6;EgMQ2wF2$9(dp@6Ob*j?CiPIvAJ>h|1BP!xQt}FsKu>_F8L4@ z&z5M{s!o^N9xPp9?lQ9_qOta=iA}0R+Q_0ojqJyu=ffZ+!Mi~`n8#D9%B%P-SGr;{_gj5f-Tqr#f?i^PL4#3e zJM;x^>hK&qW~A+~Y-X_H*_b5L!ie%nJxKxRZ1HR8e4E8BL>oZGy2GZY-M z-(JC~JuBunV`;3<8UY#`R@l5Su^{_+z&awj>^6x-d_N#vXM8RH=AY52Czv&Oxjm{NAJ5__wW)Pp_}VomtOzX z@%x5!FLUsXiZH^R2SQOc1;N@Or+|3U#xu4MA^|we}^awVfvT%I_NoINZHuOH} z0e|H>NS&iSW0)>B*v}H{-_{k<;V`ul%Rf@(^JvcH*8k{sV5s;xvA8LOJLqBb%BJFq zdZhg5V0yo)_8jU7g5bJ z{5FP^C(YEg@0kL9-~+PWR*SwIESG~=(~sp@h1;~bZ&QJSeu&MCK-iZ8PBTwCa|zN> z`aObd3_9%Ra5K73K@M=U%V_)L{@=gZ-}Q5zHb*+qp6h~!T|@^UnlH(x42SP3 zD|eDD!@@8hf(7^OL={5KQA#e3OB}v^qxbIrO?`Pt2H9TC=3aP08a6EoYXYqz5)~B{ z2BLnB)zW4o5VS6swEq{R81o-Uao5`}+vLGfckPM4??1dk838lWv0 z{_TPmg2{kV`~E#?nH)h?P7eL9~T*>-zuhl>P@w`ky02 z5Y~TzT?9-;&rZMokCYc+SJD5#t}7uaScZgQ$v`M-mP{a#jUabG!s?2O9vP9Tz&q`v z=}{bu-8l@_M68_EKlaq!_f-S{6XZ1JPj1XZkRkZ6aiMhwr*mVB3UY$AiMktTL(|lu z_4PhaB}>{I3RL$D803bmU%dXu4A$8@^+uR%VAw(7$^>u#tP@@(CU(POZu-OXK^p)LVf}{|3^FQ+DUeoD>UXLi z7#doEc!4Z1apy;|%oGBQWh3UZHJ+a4@E=w1ypCySm$Js!_xa6Rr|w?HHDQU(eru5` zDT}%G3@vV8`w(d+Qq$7Xn$5iQzy3(i#guaNrm)@At~X0ls-m_rQNNN=B(^90V!D*Y zORBAaLld#c?-YHdfrqVZ(sm9o(L(Cq6%P*&NVahE^y~&HCCD#!7os@bVLb|qjknEh zAVmXN@;BI$1vmMF8^D|$^Yd*=A%@VgAxd3H0QF!?RJFUtzxrA^pXUN%8j(GQ1n)H1 zvkg8juiN)gwWA7mkudAc{vqtmh_SW&K>ELU zjAIP&CN}q zY0fTAx1F>*lk>G%zg3#cg2KB2m)GVq68Z`a5vaPl0Bei@00Z!>zV7b4vM3*7w{q;m z-uC+WyxT#K7%e|2wRfZEf3XsK@3^FYz@By!{~wzv*@L8O`=c%`hwuGygbqEt)1M@} zeVG>cav`$6qEr;#_0TGtv#n}M*p;n6d#iVT0+aVXx(n@{J75GWkFTUn9$%;W_|H0A zQdaH>Prv9Q)~~?eofK_K2T5&a=R(&fB$-T3jLKIXwf7+2 zhpB3GTIz{DJ4J6VDnI5$A+41xkj3N~aU)RgJBIMve(Ym!M!CcdAX zt6;^BaUZ0wH?ivBkNhQlW#}N+@l^j3N{2aUhkAchKpSplV*{HnMQLVt895 z6OcA&Igeq(rN^6flRJO@(2IyrwzRIJBqt>yI4_LmU3gJU>}Hv+!%S;dRlQ-e|GmDB&Pi-cr zrG0LG{5J)(_AV{^q!2iP@9h6;m<|!i07$=eGKFncdIC`r z2M42Qv)+Ji_sOBj#1Varf~=WYR+axgtYB6-gN|`e54SOkhx!;*k}DtoUBUR<6nHKI z$fgAh2T;?3=(T1AB|TDbHMRXk4npke}QKeB&2jrLd#Zk0{Po zmIofU$jJ0o48>qJ%T7Z6BBlh={t;?4PQ3C-H1)nQHg6}+AYSKifm2Fzhzqp8>_*b-q$`6(enA|K^*xVkf* zx$=8L*-vsI1O#IWk}N6Nra13zh?!Exws{krYLL48>|ncnwlmDia<}!U?N>-g9f8Z< zfz*8x&so18vh0OlP#CJMAK=Z&GA#ye_-07gkWaIQ;~TjgN|#11XC@{hag~7lAiy%f z)es@81nDS(E^`dLya}Me1nsF@jm;qSnsHH45rSz$q$;vs8lr)POkfm5+Iqdtp}0;;s+|8-LUpKP(jrowFmX~AZX8pU4I0xO+^sU*Z@g}j8SAzz}TS? z6cj|H;RvUJ`2s{uZ-39XWx@|K0fR(?&|)2%CPXdY)kVQ?PXg-mrQ1(e} zqKrX!2tYY_02UW;o>A1)B#a{EK(_n>nfO)Ed&S4U5V^<5#N-Z$1%#=no14@5fmd0t z0ycSiu=P0hrf?`M${oIznuD$w_{9#-Qdnja-MTf15Rss_0;?u4C8esNHeBS0-1y+& z0G8>z0Vkf2imdGPV5IKX^0K_IuMo_~h)ysrju7Nttfz}46G`rUm)kd=`&I1Us8mJs z4PZ7Rs9Vx$Q+{;DKk}aP(`U|H{ga?8yF-z5Pd;IpW>&^e5!DF@FiMicc2l=#Hw{NB z_~k8WR|f7xH%z4R{KyqID{Z*U`Z`qbxw={Tmop2sHa#{Ot+k13q=Za|oaxo4MFK~$ z)mqat%PR4mJ?MH*n!Om4*LLj68R>StIds%mFX28z@DOBJclGvSz_J>JQovCW#F7mF z^Z~;Q+-5cl4rD6j!v=LPJ%<2o;sOyIsEi+dEv4WvdcOoW29uVJ4HxbjNY;n#_&}VA za3d&4Ljb$M0Z0tM)DO5Kpp1j~>*s4z2xVCa`8xe7@admw-`wAR}0{kXuL_vxRwV4jw zG!PKY3)TuTF)=t3WWO&6!v+n!@j5xMR>r&>Rc z;76p|#_{Gi!PMC-oNMK}J3G6!4KF3T@UcrXh(4#e1VoZQnBx?^@>sb3VIMoTP2ec) zO2Dnqdfkw&zt~6ba4bl4I&EiIWlq+%T7Js%Sm}*Ecjpy_P-!HpMp{}L9ww}(9qqtm zA{*X?Ob1*5%lV?PkQtFpfBSa)>Pv}k323T0>L5;=1_iQV;PLGb!zM;@VPN~k&dEu# zBxQL3cp+d1(f{QifY`fmtxnhIaRA3aR83Y^`*`>3*RSuvz@>}{e{JelWO%?|!iGGG z4|vN!LWvOhU<9BQ6nqWW6ESG8(!fVT0?)U47aC}}j*gB9uV0sjA_Ct5?Glgy*NBLT zmDJSoAu~!yIBA}-A5budjnVpn&`>nsa^XiD{GV>N1FeudqHli+qYUJ1k^UO+D@N?vxCLoi2!8&YCY%7N<~bvFtiK6fzkTcAxB2s@G{Cz+)6m0p zhq8$ffeQ-@it6eGz_wb)H=kzfmZXaN3&7CjtWhuUy#BJ_dW^A|o(x*^aE{$8?pIM{ z#%>d+4GZgNl1vQke>0X#+eB*wQJJ02$s!C}mD@f!oy)H+yv(eAwybgxm+}ZDH)L;0 zG1*0}yQYb=r+zbR&|&J8cC7>*eWGH3&sh_Tl(=UsVNC#Lq@VZ+u4oEXYoYs75*@kh zQ?`p=*TQPdY;nLOUHh~#x3Dt*to7{hN6010!-cOLZ2@Ix4iY7c0TkmEXG}Tk>(HaX zwwXUxS0g|P3uP1?17ozw$0aR29pM?EM93G8jWoDf)^sOkW@;8HL{2s}`;^E?5n{K&ios5yuanE3f`K%WBj z2GrMV{6YxA$mcjk7^CnsA%Pg5O27(kxsa&n;;&zd;42k!{egmn!$H0{!OaLLRQu}_ zi{nKP3anuzQ-G?%$Pe$WGgPy&S?OwXyU%<^ z{`x%NG^6%7nQwjM?`c1@_UtwmIicc?w{3Wk(6xv7!PnXjWqu`44;^LEDui_pKMAHO z|23j=7-fIkeBwyUBjhSNI&mucQMC29QtG@iN)0n9l#qnnk=QrUZ3A8D_oh84vt`W| zmvS5)olxJ(B~{P$-_KmmPXw!jR=`CTOEx^ikRVthr=Sr3`gNZQXG>UaZmxlaR>=fJ z$j8A9>ka|}cmxnuPm|;-_*GzTi~yJprcQvH5|WY-qu}${*z%neFnob91T^lZ#a|0~ z_+94G5V1bAp>GvtwL*y>DS*0ef)T!ea#AH9XD^wyT)eugSpk zRqHT$4bsLUA~1o24h;>(IlY{X(Jje`+XUNrB8E;gKFY|*$e$3^#lp*+-_#@;LnVj^ zMnK5_3ff(GytYn_K`oN5eh*wH5aqSZl$zsxWWVe^H1Ai|yd#i#P3t)xwQ74Xt<8D8 z@R$U(`fkI+{AszBtE{EzS9@7Twk3-_D>hy`bC^DOlst17yPs42n2XPo*XJ~>?$(^eTygy; zgT;ZR!F*-hmvq^V)b6VSZ&l77cJP`}s$BUbsi$`55-8i(Ykx5jR_4JUL71W52)a1G zPk~|y71<1iCE|Mo5kYfvGw5aFAFZcCze-3-+FNPfRr&rsnEE83AnW*k1`Wb+jyx`t zM#g7EA_FvS3Bwk&_wKM$En>U`$qt=b2Pv4?`oQpI(Co{N>>B{uHN@b6cu4oxb*O{R z++h1tDRAGYor0}xab-mzid25^5uoh_4wvRZC@r8AA&*gj=1^5Z0RytmtU>(_&y~md ziPxC-iySWS*1f=Z&N5VD#O?uVwx=-PMMA6T0Zrk1=UMw#OB&-& zFa5+PJz-4*Lw79Z47|7&&~YF_DW0+@F2puySVjsiArg7%GF?k+o%?7!nv;piDeMt*N+%-!D4iu0suTzjOwCB6g)mWX zcQ3E9Kg=PpE>+>`^*#1Azk#k2R>d#yFsTw{zm=5l#h zYZ54FV65Yza|WyosFs!ggQz6$TsFS|`*=MZ2YL+yZec$E&Qi{hA9`tXRfEy@P!8{= zBu|=h#v>L_koSFy`v!>*Dj8zR<8jrja9|{o2h8tW_DjFMuU*YTEmFIaB4z<^^|% z&b#y`lvQk_oPiA<5TpU{Ik*6QP?Nd#F_9FBH|b1f)s?TV?}>QClqPGSj1WMmjWT^( zTMSd`?G>OzW1&oPsX?& zPq5Q@sxbt&C{`9M^}Q-$RMUR3a_d89?-$iYv9^)}|Mxv+-@{s8zoXn&L~amLF@8I1 zC8+R#Q+lS(IDWKIDOl{o=4*qcr?+;l{npmO*Az_8I7p)WiABfZm|XcCSC&+;RziyT zUMM)Rr8eR2axeQD3Xb$nZNoi?V>rLZ^CShC;_RwUJYi@?Ppy}p*C=FpZD`qIzQ?*Gw$fV5X6Kky zKYkLzAbaSc=iEVhD zX9hWpdyag*&Up@2vDcf**H2b89KA6_2aoC39id`4anT09(ipL;4+4J|=-0M7e%!q( ze`D^K`gexDL07{7h7P-iHG<}ln3hDA`_Wu{QQgM%TM_EgO6*??Smq?&R>;3tieE3C zcqlq7upL7+T^Cg^$jIuKx71$N%Mk%%u(H2g+2IpP z0F?*`{wcuJu$&o>Zb@{iBOoKbW*|ygr{DCMgVT&N|3DMpn^^B$D`pDEdx!;(vf!TQ z6bBQ@MQT}5Yvw>tVd1c{SyUHKVwpCzLNn?az366%%P`l1I@Y1d_Kk>PxXhTd6%%OQ zv-cz6(L|Nj%zkEWeY3-5KH*N9`i#@Jdnx=`hSasphG$QbdV83bRQ?jZL+pY0k_C|A!KMVu{!BAo=wZcpvzt7m@L=e&p1q^SC9Qo zryEYHUd-V-Ee!9~E5#?8H@fw!3V#)nOj>P=H_oEp=WcN0c~?eqIi|?@ejIQ1^H;Ou zXyS37xXt7GP1HqhL1K}cbp3R!oA4cW-e@rhHcU^N- zYbDGPTCJGxsvJ;~yyJpDRNo%MZNl@w>Mql*Ti#Ci2D7YLY`5MB9n(Ew)Da3W4vh;u zvgKcU;@Yx9R??d_{2Q(L_WUGURsf3F^vC|Qy~&=)NXjY-373Bz%4-$&_-h zU|Ri7r?Q{R`GF8i^2;cq&!@)1D%IX%kCTTl6`__CFE7-eRwP_PEw^3JD6#+8%p864 zz-cE*#hwf|FpBz1;++TI)@TK*gnIO4zgDI#-?$>|`K9RRIvXvvg^k5)Q6b-ccR%Hb zT!1P$r?hRrqPwl2A(yj=NFnxHNEmsDcpJ}Vj`iQcD4c$Gnjp2HPj~;;&5+v9t*%zQ zv1KWlKMseYlr|1#m%d44dHz4x-NIYcLR+^@{g#c=)53`z#|dh;v1iJe_r$k|NtYUO zMnpdh(oIIzhLTB|9Nm8#!NLCzP1L%)dvnsoiw`J`GK*F^E$UsnU((R*dmV@n`H|ya zSWl5qDs&V%y_9&=*T8}+r>%Ls9sYq~^3ULwtD})82MN)0S={GuEg7p8G@IV`elaU_ z+;LBl&kkJqY|!);Bf608S+k`%{e=c40~6z7Kt8R*B)G(ZWU4dTJataMV`blfNA#$SwHVayB?sQKvd)}egp=uC78#Z+^_!(o$i)3cWQxbf%L zpE!PE@fua`xQqgEA*~AWB(;q5ldazM)Z&sVJ7Ev^6i8^n2@3d%L_kw`w z^=by$$`ImgqG?^sjMcK3-E1(kj^E4`g-3zAQn~DWl|)E#MiwZ0%3wy6vwz-2;hxOZm5hHd#%!r5{+Hg!E(yI$87x5|;b)rV{B&EKoCS zUE205O%W-JJfsTjuKV;u!{|()T#1J!j$>5!&pwlZ7X~k{=q=&?rfA!NvTr>oF&m+*ed0sdnSZrQ9s$ z*8i-=QA-S;cCy;k3aWQ(NoUdQUchdy*Uer%S2z5l?tQH2tk*_J-~sssDfCYp*HUXH zT{`jxwZ4SFB)u1%Xal?&HS0AD!%3B{oRa--Y(&rW_lj-*cdUxVe)NCHZjN+ctcWby z(!H?zh5O`;Quf$k%AZdEg)s}af6zk&@uoO5%b%7!zq4}W#;>vKo*|*zv8Q0riolAE zP$=}9T~QF4ntM6(NDte}_BCB-)7~Wjzr1uNGkDsu)!przk;~K)3ER+mO3FL7$oI^S z)juu9?Mo~eH}=^yhtA3NJD55?Rl*P%l&(~FmXR5Y?D+{^ zLOt3~{VJvRT}aPSiAO(XVki@J6%VYLZIZmJXWghqG=<7K+n`o@vW||z5uWfey&}+7 zQ!SvxP0Y+1sH;>_Iy!%0H1;>elmCgVG+$ypKi_LeDRH@k^5pgHCBl0;?+p)o@AO~f zCZ6=qFx+!}=OxT0dH0zD_-ne6*N~a){Lm!zv{LklSeyR-QK2~`h1F((A-O%_=~|?7 z=i<4&e5MDNtArDVt?D&hriG1qmebQd8n*9A0Iup`g%xMyf$=M?tl8s#@e%|tyI z{RRq5@>}1~L&$;h_|-hBfw)kp54?9Fe6G%&(u<<603` zGY8d(YmRboMwO9xiZ9TWhx~X=CUEy+Z941vucB3(l}IgX%Any&h-T(qG_*43$C~>6#2%sGtwk=T$e^DMfem7&q0V`+X9gy9Ot#*RJo<=x%$&1qAPG^ZvO{eAH`g@pF3`eRkcwB5;3@pi_?Ds+=^YGt+&7MiD>3{S}j;e)-H1wjtTK z$L*S(a0kd@I{@bUkg_i zM@ZHA9Ns1>)N_|Vb}Y?E%IST5eOnpYICF;N*$z$yEd%uZ4xEXy${jEPy}i9=W2O12 z^^|Hi`S{A_BlAPgG3A`o6uK21QDbRh%X+p+wWEI#QKW10oI~E(5r$T0C z<~$GylV5s>luLlkJ%fJjKsR`}fPV_`JYQ};`XtCJaQE($#D8u#)N^5ZKlEhT%O{>N z2=mKo(mncGEpXqs`&~M7$DcH%+#_Ma;Z-;-KU<^zTy6|IbTL6>Y z)-L{lKvjUUASGi^_@Dpd)_Cd()b_ic94@#*J8nQr@bjz-0)m2m59b>p=mc1hAT;MWfa2lnfoP-h&)zS=tp;l2 z=OVyq0!IA>r2mLTkbDf+J9rZH(o=xy4?r9d4LC9wdobU)fdOwNPN!PoDt%wv>?X8IX5RKDW>WYnfTru$UD+2g3*B7gGI&;aq6wi*bA)Q=aY+jW`tfa zJZ5@O0KE0}NQL@I75-roLlVI71pn;xxnf#b!51grVM7nBv<{(^NE7T0CMG6)-@OZk zk#ThugzgIl&^!z&@dNTH|3&LLWfc{ty%E!q%Cbd)Dw|npJ@-Rnq*W|@Ngusj)1G9h z!dD|<09GO0AOXf{^MWQHY&1_JqT%0y0s@E;&;;;#1sxrojMspbffo$YaWj-j2B`Ur=x# z+?x>G(hHwx2CgTa^4CGi#3T%mN)XN<!)dtN#GT6{u0;cWDgd+3?ScD!Wz~|8EyM`k8*1_hq%X$>7#2noU zVq)UjzeYnB3CS-708$E!J%>XQ!tnulilBTSq-S;a9iXhqX0{1j4E(^Z3875EEhQj0 zxY^(y;yMRhpp8wak_1o8*JVJK%zZ0%aSH)@84w2duJG8{HYiAZ%n}F)&{(BYI50=x z64nS$|M+qWa85f%upC^E*Gj-^sSilI&*@Hl(1ix^JL-3Lc;GXU8+Q4aR%*JHHE9m~ zJod*pfTaUXl5$5CDtQVtwqU;1J}v_QoP~vp{xMi|_2uXaAYT%O0%&SvZnm_@0`&X@ zrW6pC4V~+qGNysCk^oZpQWkyG$~J*^BZXFz)%_TdU*G^HC}xZX;+NNSTt}y?qP@fd+wjJ_qPnWmOf_HC(@Y_ao9%qQ>J? zhCeD#@Fjw~DP_UpRL<2C>Z_$J75XO#JiP!KM;L1Wg!+!ca>0bK1@SNAvt`!G9xSW` zF*hv6u*gUgEp^b(PRkC>*i8h(e+E?ZW%txXef8Svs zin6jVJ!S_mGhg;3{{vtULY2bvBmRU&!9s8KHy*3%|2sL=U=o3t`2|R>Vcrm=^vFWx z-c{F4T&SK!91g+B4(aIvxD%l4#$W&xFXDj^<`7}(z}`^HBm`*&1NKNpuw{Vu8p4rg zp&3_r_&yy@~dkpQh#4Hk12Xf$XGU4+i(W*`G5 z0Hh(XYXF;>3LP-OyMC9>xb&A>4Cn z$^hwl9LDn4tot)AqJ{z3`Zu^oA<`L89{d1*%Dyes@zu^~P9G3H0O#ZfvmEipgH}W6 zLtPymde9?)=3zVa{bm%Y9S4+Wa@r!ektKb7?sEuc+-V@Grnuy_ps zn+2%>K9sxy8r_0MH~d>7JF)+DY=0C$&>oo4Ah3Av@9)1PR8~>3-LImkCP!U*FPCA9 znG$9kyztwXQR#Tf#YJ%uR%?5oe`}91Yk^T!oxwFgngO*OJYsc8> z0P}f>Lm)*@=`jQT2JA*2d7P7lD$kB|TzhNl^x_(>#+3H9wlJA@1J9MKi+=e;SV;wY zQ;UzyFE4BT4)$(Gqa%bp|ANVH6oS%mk!IoM)K1^>^SCqq{>3-li248T2ebfH;R(T{ zYi0E78sm_(mkkB=-!L_Q5^I~jiy=Lu#QR^H$m4_`oYX(Vt_mZto2ZM8P~Svc>q5}a zm^pSffVlhBfHf?(Cl>GLo43HLwhu`#O`7iDL@=%g9YouEICorlH<;^R{d+;;Z5Gd{ z@KWFN+4FnJtXf6hc5=+IcmCds*sz-5=}>_5V$VW^rU}lDGX{Mgz5@L2o<81i-HdyZA7CNh64z5e3+x~B64n-^|KNsXKT2mME0 z`;P?ppW~y%4j4P=fTh6lsBFc~*7g7_FCRMZq{lE(Cm#XO4Bg<1)Z1F#5f{FZQX3}V*OBy~ z2K$=>$dx>F{wZ|DF#xw&D0D}H7wFQ!0Wcq0Zap_L>iJjxfw-#zBhGeICm(1{BIwtXUOY}AlS0QwK%52?dfJFOdMXSru3VOfusk>zcDMh5ax${0 zeIb3yhXjPHJqhwQu6CsU6R2^Z*&%x(f?x*qNDm!1uRZP0wFVgu(nKD%QT%T3$Anjj zbT)#{UB(|rvbA}kppdi{@+~kPV7Yb;2grDk(jYzN57#R;9Kj<3^o=tRmyquY?pH=Y z`~ou%Q6B=89b_9=EcVv+Yz8+%%MF-=aL36{Q0~N>jZN+U3iciGzXhNoOC{Vq9~CPH zI$&Um_!Icwa1EqqsNVYi9n~Z}KR0I$bR-h=QMByx$1jVtK1dstEtJ51P*n}I92B_4~$cG)TKI zwq_u-cv*sh*G>5^^LkIm(F?B+GCW|^Z!j|A%E-vr^XsO@mt$rJ;(nJ8$6U~M5J=pim}omm4IFu{vC2Y#30FcB1rd>w!Q zZUPN@nawQW?#d7m>YEjt<+56as^D(F%B%5mS|CXocr8DGfI>PY6sbFetr`}d3d=^- zkE$b(E@LnOAFy;J3)F1)&UaS~Z3~``72t%Cs&j#-C?qG4z1&23Yh~x`5P(ac3bb{D zRO*;!|4`uVDm@%1kPHJ1MPMBgA?}@sE(WGyLsQdp&;kSn8BbI?!G1rseUPnHgw&gY zmN5j>$gry;M?0h>X>N_%pse3}b8rT6IK02&6dVKTvT|iD_g17Rvw+56%KF;bP`R z44#NH1JZX;dJrY>kpFX!nYDuh=vT5X3700I(YN(hc|tfnoa%e01Bt#u0iC@eNHuR? zmU#!qck?+qsj-^5xfg7+TJmirZ(Tw#+36(1gM-DW6dGDKtLux!YtFVpJXbsk$+Tni zcrDi34+}Vr^?1#OQPj;I>9Q&TVnaHzC<=i}ReFnfXehiEK;13zRJPRbKVCG))j%|qqGNa2{*Q%xvwWpI!y)mlOIki_5#;lfAD*(AF(PV)xk zkC8fQ!KQyEo2h8%Wv4=@Z7?<*>R4pfv~z)xqH+VA1Fdara=g<) z2rx%*FL3vM6J~$W?k3qa39Fm=cY~{v6c=1(4Srrv4$%6;IG*FyidNhDbkQ5R)RmSB z71m8aO7fgL%3Z8VU&nOq}Nc?d_UGasKShSL)B7sW@Cwta{{}N(3XFTz<>RC~H+lC(wVt zKm5+&uhWxHoJOqSF)?qt*6M4HSUZH`diBh4*gFy?12eIf(QcFhwld!7P&fdeKCj`L zqLMZ6?euKBi;x*k*IRSN{Y3nS?${S)zaZn7cV}pF=@XtW`jQ*V_j5GsK;S8D*U6n= z(s3%#AE>j0i$HB390(BO3J}3nRtiG=M9dHJ^16G!49fWsR{N@Fec535cs>{KWyfRJ z7|x`nk+DsI`ilAP65I-7SB*M&zYLFR*=@~8J@(gOqV=Evol{^KGeZo;!J7-o+kmtqD z|2EY63O}7bFI`w^e;yTo!9Vb(eky~c2N9RWY5kQEm}UOM$q=M`tfBDmVQn`fF1E|J zCz3pMu)N^G*y!kJ1djTyC?%w^tjtTE+ob6^`$|v@>I~lgZP9M3;WO`qS^L*_%y~g*| zwK_Ub>~U*BFQ(zW%7JyjR}YB08WEM#bdyskD|Z%)6J}iQU>CQ}Mz`Kf6ticlOamS7 zapbF$Y$t`<>hJ(mxlv3ptxwurBkNBIsxTejXkh%lsb?uD)P`YWCaZ)kKs82_x;(#< zzCvnICo yyMWRI$=;QkW&igN>0p*~$7l^vy)Z6^oDxlba}q#_^j^e)KXOt}By+?Ky#E(@upB@D literal 44018 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�w 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 G*We9#OS7!jDHh@i@k^y3vT9Tn5Z`wJu@ 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 diff --git a/static/img/remove_row_context_menu.png b/static/img/remove_row_context_menu.png index e9a61dc6c7477a3e3d8569df7c9cc3addf976a0b..a177e8f7a7d59e6a3d54b0952200d771375fba16 100644 GIT binary patch literal 47977 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�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 R{Y)|ZS(@3ImNC4e{|$#BF<1Zq literal 39557 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 O(cgP;PmY#-z<&X;PWfd3 literal 43990 zcmb5VWmH~Gkgg3OxVuAex8Sb9HNoAT;BLVkg1ZDKxVyW%ySuxe&HK*GH?!9H&RX+h zFQD1GpMJV`Rd-!=SBSi<7(5IP3qrtOK;fkoFfPj1fkq{A7bV)l|_0&`}T6?%eBu3>@ zk4%Z(E8*M=Oo=5=$)c&FX$*}UU!p!sPYGM2kAroFUWREjr_1fM8fY>HcTJ>J4_g?Y zu#>K|EWw-aaZIlfw1UI_A!cT?bKif#$OBEz_|;>*9Ft*JbAMC6jCtQ<+_7z+OZ)Nh zkqnB+A4v#mQo0u6V5TUx`B-7F(SHBp_SVsvRfL4g{f>6E$zCp!w&&DXh?@ z0Ux)CRFi|2{&TaSo+QtMUA7jz)&d%3@>jM>*ec{HcSu~MBly>*?j zQswS=z@o)^KS*6!MaWzH(>IaiEOS=tKv218bc_XfhnppPvon4tjLjxgv-9cR05}MZ znA558Jrm7Fx9jUy;`jacG@tT+J{T#YgNC2KJ@G9%@j9$hl>N+VIwTu3*jv$9B2Mw9Bdt}VI(8uA+RVP4+XUx97}~Q`vo;;%)JME1HgQMZi72<5prxt0)1Vy>_Rzt08|MHKzo%YOWm?aep8}V=)jMSx zL+@{`L7FWtzx21=v^`E45yw13SpCj>3mzct);$99%DY0_c_i4ao#*9O$}*T^#M2hi z^_N|*_}9DsEB|MkdULBWXe#GQm(IT4^_gHc!G2J1tba~}Z(?^SH zXcpRHOWX6iX?+NHPY%|J&sTnMA~9W?#(Mib#2+Dt!Z*>%iU!{=wiuAnuH7-*E0t8e z_x>=tWOB%WNh`FXaP%mz3P}KiH#DK+WRskq@4X=(sQh#owd7c&gJ5L3A?#4t#HDb= z!b$iV^h*bP|4V?~Q%(lm4|d)+?C-3whn$9ewSN(Q0aMdo!n^hLQH=+W`` z^rW|8k7w^$QKG3LzOU%zK`#TR-Ows4vXG+Ed7NK;_m78@O7IfbeD78jubt7yTo1lD z@S^sDH>uh$>zrNoQO;|8VTF zYK#c#>N$Pdi(N%}A@*zqJ=44R4JpBIn&o2p>oZSA7gv_4TcxXa4Fy*6|g)bajY+y}PqU$L9S}SmQwDjpu1v!aez!29@7h}r3+oXa zWP4%iIJv}85ZXA)_#-LJUjJd7Xa5z?Io=Mq3g^5`Z`(CTs(JQMXiR=!or4L4|L!e4 zZt#ord-Dx#I?zdl?iD{Asohw=#~R%82lnxH$%O5d zoOak~yL!P6zSqY+T9kEZ-Ct~UP`DljD13z|4SH}gAdO`cdJIEPAR7)t=aIY(>LM+# zdyG+8hpGRqlH+<#^y%zi_bQ79o z4>j|~m702u8VW=IXD1NJDSGFqalYS~Y)*eay%_!j_iA)_Ba6tyQejEHkJ~%s{har? z`k#KYZD*Nx1^(Hmg1KWq*ZkY47W+&2pEeeY|L2BN{_^sI(!6?h=BD^VRrTPE8hEHs zus;%iRSTTRpRz!n^62?!IbTUtm9l*F#wL+LC*Sk=?yM}(lys^sLuP5dTH@J_P0n(i z*kUxL?1IhJmoR$0^ zlCS1QiCG*l27}I8RFYvgnXZ_F;o!+wzJl3b zBNpG3c4qV%|56Ek^ZTVC+^ZzIbscB(mtS=U#Oq%6zreWftDchr-(@vAa^M@>t|2FB zRZZ+5xWHcI_cBS(1-K?%*DDQW(B9Y=y+!Q*h_b5(;c#PYgN8#+g^WFCkXevi+&en2 z`kUe%fp#9u=+(ZB;pX|REeV3I&fWuh^=jo7fj6;NO~w|wdLO>Qe&6{` z1I#%O^U!r)1~rS!(y2!32EIy3i=u;6?D`;w^U2Hk4xlNjHz8r-hvZB_JLtBYb zUS^smGZtgIv+ZTMJw@Ft-nAPpJNOsSk%)lb$!#UqOo4zZ81@ZxUhKUjRWN4X3@wVv zt~kUX?pB;`Grl--jKyuvUP%yFQn}Ig zO4e+PPE8tF%(}Du)$Uv#SWc6+Gp0AjrEG%udMbx3tu)udKeNXCMdb8Fh$NWu^s)Lh z)Wj{uC#{szAATwtwegq34Ipwq^ckYb9gw*Ojn4Lj}pN0ryWC9<$F733v~$y7o&BM{P`! zHV+&PF66k=9wISth2ICW5FPEeR3gBZ7_{Uy?b|CvVV;Tg@J`hx*`IJSxmsT{7}ddG ze4G@0$ciE$p9ek2__9D|dhvYA;wuI@eSD@5B8^KDB0JnWwV1hq>_s`Y8}lXvw|r%- zrx8?F`6|Z$>FIBWvHmj6Ar?0z<9-12184n^Kjt3NM584r>hhFb1=lZSPbj$WpG4tw zxc%I=RmLnwJ2pX4M%GZsyu8Mija4jFsL9V|OuE_gFr^Vt4;3bJ2`jP)(4;4XVMYL} z@G?tf-XDyUJ(1*1&`0;`eo;6XZ_8UzJC58HDcIHjxh*yU#UHnCFX64nxwvBKjkLA@ z{#$PMxMg{se-%LGDRS|Mg8co5B zWsu%@(H6#ck>2m8aw28MLmxwS(&RVTiLtzEBU;jFg0-y*YpsfzV`Gz5%-oB(OK)J* zq#vO68&!CT(|Udm47<%6<*@~B-@WSokC1Hd~o4FuKslBLZ5g;X2FQ|+Cn{W zUvI|ZH6&=T=g%SO93X41ST{V$4dRP!;d-a_IHSk!zy(xlc<{$1Tm2!_&2|h%rfBK8NUU@O&BdODs*#@yP;W$ zqEyxi{Tt{Ia9!W6+pqPdOY`;1RZy?YVKzO}`;of&5{*J{49_ckzxtC&Y#y|9@)O0O zyTjwLsWDlPb{TlxBZ?@92@lQtX7&ek(fsrA_ zs<|$jnWiP9_U{4#7z(tfQq*OSgrWi1ByR=uo$nPWz7Jy2k!EZ^XH9(g(ir4>hJXwF zzRlTpR{vie2V z0>z5TH@OKAhrN!Pd^Ae*^%M{hqyrjJZyT6cQN>IPzkUgPB899WxakQxqLER!Ngo~2 zgW*u&`lBTlmj`dicM9iH+gh7vmETjIiGh&JaaRid{s}fKS0!r7uem(tXq<|0 zx{HLHQpy3Nadvs$q>8L{6JqJ&Qb&bJP1Qkd0+}X-Z@Pvsn|@1rs@!2ao{kKMl5OoW z<*tx5uLMLB+(9cjjXN0r9L;N>+j|_!Cl!A(GDJ2U=y0qV)A>S*pjg^;hq(ix<)3ba zPPN=>4XgDEZno;8%Pe1mAUi4Cq{&lraaU00gSw9L5C4ElC&?yNmzsscy-ZUo8x3! z2QF73M!22y)0o~9=8K%zAY3V=8AV_tdBVj&9d4$mE8M{r9uCzHKhZU#o+ZpW@?|ZV zR#9*of1W_*k@SP%4$ZtwZstRC8s;i)9LJST5Gp~KZ~;c5`5m5G=nbWlL9)F)pp<~f zreXM=JqtWPuEBH-wA31j*~F5JeN_DDMeStrP(F=Scck8jI{4yJ{bKH`Z8py9o+e6W z)PBVsOyH~QMyb(~Dn2FML5n>jfu@{gm)=tPaIejiGW8^~Bj&~nC>yOz9~X(Qx^q!g z4HzV&_!K0gR%0pjsqd{Ot&UvIcs_bfsVS!S62ZuSta$0Q+R*9GZR1>fIF zn(j#o8TA%Z#9zqhoPaahZk~Ey#C&vRpSZaLOaGIvtv7+P!_84?R{krIDwow?D%e1C zm{4{7EX7Sx*Wc>j?fh`rf3nFzld)6p71g9|sf53ty4ls6pb|dvk~F26oMWyVsPKl? zEx(#(zM(I_H(`2idC)fc9oTImxwluMOl-2ZaFm?Eo&w$2;tTVb0@?b69bD@nlY4U33tRA(=Qz$C)MK!N)Mg^RL z*03bJ|8K1Uk7r;oUL~sWTHM!dMH0S7`bC)0T!(wl&n;4`X|N>E3=-rm=I4Yp$>TSi{;-qT2>!*5331ulXo5y+)61)4^_%VJOUjS`cM$ z&}B2+B{;akT_pl6^H&pz=Wo5Bo_cf=lxY;_%QaX4Kd{1~ZZ#Sff>+S&t z?)DRz-@iKa!C=7MmZ|V+EtmAZcr?bIRFlQ6aR2tv(z;i&eu6(iTo_pU(?3QhS~K(| zp+rmC#+uvJ-JVf3?jb^3x=Y9#?brIWg7iVDzXup+P#Mz0v4%UX1d~2nwWB2EfUtE< zO$)+W(-`DzO$Bs+05Xa;G4`CierHN2aGWn>N-pI{8UkxwqW`}>IwM>9p2^@c9#5;R}ft{b^@ zO5{~l#p{3GjdqZQk#kn({d_0u* zjI)+mWXA7P@FHP9ew14RPc|HvHK&}0wC5eIHrF>7+lWz7QT=IXzzXVq1Q9J(MrY?Y zTF1yXV|kAAGwybSdu3Nf<0Y@4{k{fAu3lE9d-rsET=R2PUG^b+@%rj2+wpjA*9?k| zpRFc%HMQMz1IAjt*x!=lAweH zw6?bP?mG+-PGTBBQ)IHun*?obE1Qc+Mf|9xxG9IB6FqE*QX+w{IGB7JXF|K(Yjt%N zIa{zXA5WZ-Mr1k$h~p=7HT~3yctU`Pzai@1J5!`+5XYe8NV><%ZcYQaxJ zE!A5yoE~?Yo9oQ0tSp^6g@%SUxZP4C@?89SrluAFt5&70v0BE^(a}MJ`Ie`$#fE9; zac7ya(&lU_u-xY99@QF(GzN(1fM#(*M|c$c`;+oDw!9< zX0?^blZO-!zL6Lk{gnr*is-rw%qAMci} zvH87tUY~C54d4M7-;kP%2Ss#ds^j%YrsMtU7-0k~v&X|`P#Uj$oy5`i@87#Hbvy)J zTsZy!L?S3i1*S$yQgWf$nc@9b=lz?hDJ3i>eUB;2TtgWEPA*57$8Am)Dsk%Vt8dZJ z&?+1bzxPEEj!(<+%P1=+v=jolhHMGMQlza&$I~U&wzsF_D_xnq?@X2pjAh!bLvOFo zkB0@B4R*UQi;Ihevq$Rl+uPgS6MuviiWKXWGIPYDVq#*ts>k_;e-jBW)LRn*#;_HD zslBloM7Vc7&c8p(zD`O_9m?nVRADhs4-7vzEUdUDW4k}9+UwPAZzNeblh5<7)xPnu z*?Jo<@U&3D^yO9%>q!EH|# zn4C_R0x~lRGd-@LNyH*|fbl|XT=o<0PvuF)i#k-O(zaao;rjdg&tUxmjN~={nA7nH zjsNuqm57Mw;o)JT+1WY}0e|R^aL`A_q(=3_C`5SC(9tiu5&0R-X9}}`C-E)I_(6&D=r#EptWry3pB86jjQN*_FiuH zyFMKj(9qpKY)7#_tkVKHnSc*#$sz?Uyl)NFN&Kb|kIHt3JMit}S=d&u@^dp>V( z=h@xpi@;6eajo*$xBwb5&sLkK>#UYVi?-$XUlq??%QYLjdO}b+Z8ku-ozD!XawYgJ z!lyd@Ag_Um&z7hB>8eJgPJqf;e4mqo9Qb}}gdf74#Dg}cJ7Opj7~?XrdW+O$Ut=~M z2nq%<@i+cj-l$f6vCWg4(EG*K^~++J7PpX)kjvE|g)4AjGaJJJ&X!(B3|MF^X5$g7 z{qd)#C%g03``s|B_hS z-I`2s6*z_?78Wjk7uP+6HaA^AtPa*r59{4LYYNG~I>?Fos@w4kXV}BT0~nfgY|Cxm z@NgJl&X<6d>N8?B03-NVJ>Ug5m?=~Md~`}bp*LWPcNgW}udqSgoxt2m$jIyh4m^Ht zwpfKhG!k!6!@5=JG{VfWbU#{*;EzlyTg&wr_ktxGJ>dKPDitpPt}DkIBHQb#`aK95 z6{C`~T|ed21%hTz#*Uyre}v2_Ct8xun=f(a+qBfM336+hq$?TQ6#!bojnBa0V+jvE@DSc9aj1BA zF*=|6diL$U2;t&cwx=-kp_bRX<&SH(z215~1W(K_XT;9xEG!tr!FxSNtR&4BSE?6Lx#y4W5RI@*DR zHrnvjm>Df@=_l#jcUN$VAkqtMUqZgQDLWZ8SEIYuK@pRs5b-h62G}GvF;whoA8oVh z%VIItFooYTnkxinVbVl;{y57fgCgWTF>40+dg_ecNWuX=qzFmgy!t$fMnxe{BjrECTXwX|P{^R~HdE13xM zk=Ned5qg8Es}ia6?F#H#XCCx}<)pFpT@Y>Np9(~gnR*e)#)|(sL`X5FWeV=RyuxY3 z_RO4((fr++ua8N!2FnZVPzzJzsUx;wJ69EaNd=f{ys4N>u1b6{-SQuYg!fm^@DCbz zgw_5fumV()a`|pm?}n=(B#muaTp}gZf5-7cIqL*jdf>O=mR#EB7oXJnSUn@k!z0QJ zj`XoWFpLvPI#g}Vv6CsM4PbEIQs2B+LRVD+)(ec=d3}Q$IO& zSSGX}`S#(asSFO1n(XP<`Bb@o(W?xDK0FH?@9VBLpA8Kn^lEr1dQWWx4qp$i=icwt zb<_DWxCwL`PSdUg?k7yZRf#hUIAJU%{m&$#;f2a`fY;Xce!aa~U#_>7)7RgkD~A*) zRi0NL{}x6)RuW4gm%yIET2zcXIyw8FT7aFlNACquxPpQ=%}2#$_Wp{SOwk7@bRg^% z49EK|{xTWMxI`#>BIZ4oS&{5T*_ysP-S<8?b zYN^48L3X6C+*xZ^=0;%!TDpJWM+B)}90Yh47E^?6GVFr)fOL|wkD#>>H&x)q+1R)Q zuQ^WVxv1TUNc^um(*8Ek)!Z+NFd%e92Cow1L*3zJPmRlZhSSE(L}6)GCY&{pu}+_u z@@}&%7^g+8h^KaWlu?%{1}z&fq<^yog}$kotuL|s9O`7xtbCrbepn5EbGQIK^9rUS ziqhxyN+UnSXZZRXuhutKI3f1Y3nO`O`U_3UPU~G$V(nhVOTg&^Pix>v3GLU!sGaB9 z%iL7S;fSK1ve%5P#HoQ1Rk^rz3Ah5S1pa8*ohdNWy)qJJnpj6>rJWWuiKmcIHR7J;}l=SR2JW8h`fcQ~d7C6%<`{rYY-?fHV( zJ#9tS*-GVI6DGFmwKMbfzT5_8JWQ^q#dHI2O%(kXd;4991X$&L*|}e-OnG!)SVoO} z*}~&;iwY49W4D>(a}SrUinA{s*JHh?GKcUVSmhy5ZjHZ4#!oetu>I2Gom%wn5lT{y z&{JW%n;eFk=Dhb9Eldt~=TAJB#AG)#vN5{(+7-kxj82jr%*BR+JC2e?Vkiisd>Hg0CisyjKEIHwZfcacG`vT$&!Egs8 z_2zva$R=b-iEltE zqvdi4k-Ge;h&~_BP+BCf)-a)awnOJC9q%e4q1A>Pcn2HJk?w1u=h3I-x;CZEb>%zT zL8m3FxyRWOr_Z!)D>JfE{QIQ_CB~#n>3}dXta#;6LKU;R=9jpsZOm;m~;3!ygY3* z`*0H0DTOg{O<%swY(TElzOk;nwPS!=DktRaOF(V`i(^gf51CB+O8g7ujUNubW{i&0 zsUVF4;sdW0vu{ePY|P9S73jxBl;^6}z+ChOfcfPV46;K_U()pgX#s@Ss|jU%nf z=WsXG2~!hjk;5788>$A05DWRK4U=pD-}3&(R!5gU3~_3yt;6?+#j3>DRgBiQ`9-yg z-2aG9pNyL?VdYIBm#$>sPlR?cQK`B7^R1Yn4h)g8DxC`H<6;l}XeWcQOneOlCdHJ* zo2uA@8@_It5xIiWbcCHQcNafKyU*>ROGYU-{Majy@T6*vfAzvpQ={^qoh;J8bia%b zEYg6@KPWNiGR4pLKC@k0YEO5f{`&jHgP7vgKzw+Fn1&{dte%mr)zuJjfGN-bitvCIyb4W4YrS^P)?d(-kf^{cJH)Yc^v*YI1xz<|$ zU-r1-E83jV-A;_r3$-d(^*k`|DNWYn=bI!sk!Is@dlOIQ$z0ylp(RlRr8kZ0gKKFr z%@Y(8voi+f%)hZ>hvFxUMBs}`GZ&=$j^Jjh_mEVVX}_Fm_~k>J;y+r3L~U0?z6U*o z$lUjYH`$8~aH~-jOgb$IoLz>B#BMD)`Bty%O+^|kLB(G?u{4}8;?(eN>>N_7$SMs* z0VsjGF0EDov2e7VSXUDPz6o#_*Eg>kx zY9@08Af0VEWPg4|w|+I|&EIREI;!f_!^}?K?8aAO&AoqW9glN+Xpj_29Xj%uuRe7> zQ^+lxF}ORj$9TPZShX_VG^7!^;xE6K-{^rL=`D%?GEJ2zRw9kvLz;wL|JA3cHh|(z zUqG;#O$pW#t(o9PW_i(x<#&YytAo{ojA2X7r|Sh$l%H(W(|@dTQ#%@rl@BL$V8z+v z^Vhx^>n7ZlDs4m7AmC=UR{A40i^aaIN6n=)Php{f5`D%r`F)cC-3)fJZzt|WMbO%- z23so{_PA{c2kvyj#>{E9Oyj%mgs+f%7i&ptc#|Ld zAY1sp`7O!82C+rA%_lDzj*oAq;~P8pIgBX|taU>jnd=^NyDmtME1jP(qGF+K(DGY< zG0ALn&{PKp74%Vc%8j)jLjdwZxa@zBB%$aImaqu!3Uy!@V z)RH+GKS}giN$Ll4?4>^Gax;Um>moC6ndY*yy#IBi&STVdS&ox3jGDxcN%7~oztQ%l zRvwR{pP?TO#MPN*IPoM%3h(5xj9e4nL`dn$ALFset!jL}OHHhh5{q&;Q;hadc187} zyi3>FHx%d`Ps9a~dYV*QzQJrIj_GSuqMR0Th7-mGy{RAWCef!EU8n70=XEmgK6MN7J0Zm9GE0c$*-c;z9f3Z#d@@fd;roL4242FNGd8# z+z1ud>ZkTH9~xHxm;ub}0v3wpAnBVc7jCGH*BLW4pNg<37dd27f~?qiQ`W~e3L*_@ z&sdWxy6}ZgFGPyci!-`0wq&6--ZW5}l&Ftvz3xkpOlA!UX;C0#FM^d_q>Te{#$l%7 z5|W-p3>2SwqvtX4sRr|hmL*0uor`sBY21>CdP}RV^v{7x7_)0x!q^ailgM4Kqiiy( zO~xg0-7Ef{Y5?da0+$^iw+p9E0D24@HQx4tB(TvT3oz9!kWCjVQk(*guV^sf09C3n zpZz-}#hd~*&drA_4!7DpP*Rv0{-hqzEq)Zfi*!w}c^mRI6?xo3hr@nPn&f_BjX$|Z z8hb|L1Hqk5h1oLHH0Ny!or>9WVk3P^3j(jsC@~8V?<3(&fphzLr3!MFYv-2P zc?<^n-#TkGfnytv|26poWD=>_%e1t# zhHEXZ9&eBP5mjEm($vek0g~I%?=qd1$yHf*`!_QHpR#$l&;uA($KiCr<>jT`#YQL3 z^GUS>!0m|MKW`c%1c6ywTRW==LrsF@1_5~XWQ8_~?%Lknod5mB{_U>5{c?HzEx~!+ zGqL^s_1wkXz1n=18ryuN+XLW7nt&V@PzVdLfP6@sMkPIc7rz2SMC5z;MWa$SW3kGX z8Zj~=-4~ACoy25dx(pm5xE%F?KLN^-0FbenhLuDeFNuGFBM_wj2GCt%B7oqlT`u)M zSmI3457+0@`VUz1flW67a*&lY zVqks=S_(vne`w$VeV0ulpn?)6860qS{wCtNBFU(+2OzUsg2$|iir)ZOiuM76RK|gO z2f88q`ZeZ*b1i-Ck0LZVU8?;URjEe(SEmzI<#O#&ME;i!05Q9s*3M%w>i#pP+j*V+ zForhW_qW&GVcZB&2so?`n(`JQ0Hhr$$xYgLJ#0ckoAYWD1v%p|4#HzZ&5hWbjv9*4 ze_7r6DpAyB?ZTmO4W=Mv9=Fe!$ISi}_dV|%nXh9t9{FqoXT<4X!e=m+;(E~}^Kw>2 zXSPWi;Ft%?^$c1~4n^~90M@3YqS`ELKKskk3ZVT12d-a|t%bn5_Q7>OfBt-N(Txbk zsNVy{_x4}_IFw$19;;OuLIYnd2e{wicn-c)d3dus2pR_FlkP;8U^qT^!dz+U<7NXk z4Xk;AT&67GKfK;TLtzKBGCRoqLI}@cwGZ7&GjgwzZtW$g(j#ahY`t9niO?hv8}MEfK4inj^T8<5a%7r?Tz_6 z%8v!lDTvaz8#s@IePXX~_YiPwwbkFnQ?fyW@HN^pdN7rLFOWp|%PVzTi8RF9s<5fV z{caT=KLHh_Jkl0%`Te)kQf-3?SmIweeoM-w>X#qz&UhqA)cvBMurQd=>%nKW*}2+i zI6=~g{pU&+Fmakq4j}+ZjRyefrVR&(%gbf|@P0Eu3rLf0k*s@r?A<2LLtKrZ5m(lI z*mlXtr`}tDs29bBp%am?IAiBqCGC7}rDe@ug5CJVdvertGYVqP*bRE!B|I6!5eT=u z(Y|tmT{=-gHd|Zw28OQz{>bK*nPjNRNK$T5j{atyFM@EBYWK*|NfI{B6(?>H2MruE z*5pW2i$=WPAYyWqZR}>g&e6^Pp&laPrB6w^#aT-|Z<(lFww!Qgqhg56)mpS$lT0h6 zI9*1=Vc+er_4lTg?O@@^xc~ZfP&&%wpmAO;#;N7Z$Q!{Le2AdaAI_%*m4YUJIXt(W zB~b!M56C7Dhti_n;i%}6SYN|nNF$Q5u*4l+tNcE-qgkr>8aLpGO*)<`VrmFs3`eTm zsAaW=r>4HAnQ5!VQl0OQg2NS}rhv<+X&%nM(#;vZ(F zs%FWVxFY}s-rC*m{b16i2#NGsTT8VTtn}>OZyr@uRn)IMcMAqDfMv8?4bkvi4UiZb z8vc%tSE5QncMb%QZz90^R z+_tpH<2I|MHp1SOc?k`!HCNnC@)GVu)Mk~@G}dH8qcQ{8dfpy}VbQB8>j+P8w#6d~ zEKbrSTTqC)eZ}|BGVT$k#PhMq$$eFoDg!P=*q*K%7W(7J@CwJwgC6$SMDt&RWvAv{ z6bzOV#cxs>Z5_$glFfQ>3-dN97z1=ST#jOA>wm6YycUMT|_s~-S>8vOJbM+Uy2NuPXR(7sY<|18}hh9 z`jjw6*hJp0{7U&qoYtiCrIWix4(d6+J8fFl>K;x)mRk3=q@1Z!R_GSVxsqYff^QVe zDobC@U4#)}(9S)@)qhE!Ei4Us>{4{9nP>EJ#Tgc6{gnbuQ!VZ$sm0WugES1zdh|Cv zAIPD)@qhA8lt}Ou+J74MVo#ON5I6a0206E~i;a#?G1VrM4Ukpsb`qvrH3B-`0yG_t zuC?*2LryzN_~au!NsWz@WLS8ksTV`q9DOK4MK>b{Q`AG1d=yTtur6G*RX=FlWrSBy zgW6llAhGB=a^I}6v0~QK3q8|uYz~h$eS+H_@vb0K>av!fTSIv?S)QNY$6(|Op;FMh zw&=aC^2w;%6VHz(L`ua2W7(ed8p7_!zt^GM62MF&1Z~$%!^KIG z$?@Kz5qjPrH#?v26=ZsC0mVX=D-F>wyf%NBRTU#wy+Ke*#%%3b_nY zAQSqdKz8%^IBe9Igq=MRI5?(@GQuC*EPrh`JJB?x)>W1A?`_+LlA5Qkp~1&ap`8q3b@DR==bI z!S}+KvNP>Arcd0T_;mM)jUaRrneSU=u}*C@rxV1VT7jmxniOy@t*gozG7%4`A8(2{#lEqC z#!L1VD&)AlzusGT*z^M_O3!Dfx7%`WR`Icu3cc>hAB(0{ntplKZF8AAS0>lQS56je!w1wjD*wyq+>s_ zwA8l;F!xY!aF!D5cTe4D;w+R1ns#f|$Jl!Um~zc9v^ z*|E~zW{8lXzEI`|{8BT8W}npG_XkEiBDY}07GBKpkdL=j`3t;PhhO1B$GFJD=PK#! z5%UYW(*A_gr_~rap5*>=wE#9ooNQ$iF82cfC8f2uN9O&^c4w5D1J~pGyWg?KOUj=a zs(HX|CTc+BA32JDyJA%#H zQuT&!K(ZF(FL*6b9QSga`A*8fP~J%Z0;nqVfpaw+0Z&8URU|%l6_EawyygeCn2&9S zb&TKTLU+yWxD;oYTrR^y!x6o{;13~&V#D1F??Jz?$G6934mTzqXxS{9z3)^Y5uFDqNC>P?k}(x7h|kC4 znB|=^va(-b@=g!C#4~m1l-6npcdR5r^SVHujl~xkl|C6{LcaOF8)Q|bESs0khiOo% zv*FRk4UW%UY(dZF9h4kd$gM(m5ZqJ@-yKa24R4p#Kyq`soLG?I78-`hP^H%m@s*ib zt^TK$A4Ij#O60r8u^k`BHQo9YLLQ2IkwPY4;NUKg;TXHpj_#b2b_kB6$pCXBUICtQ z8@E=%vzm(QaC9ot&_V%iQ)=Fl>I}XAdM2NTuX8cPzmn z%c^@7&Fqw_H6n`jvzN4WDdKJn5pjXVfRK<=GtQ*2U&N@`7GE2#T%bT_uL^6zam%}_ zI74o%Eq~z`Go=qa7GaU?cAS1>{pZUGfn-wO@^UH=Lg`j7VzHXXeXib$)LnT&yusi` z+pT^+y=Ov%Csz%)PMV$Vm~+0W;Oy|C4{~-&f`)^!St~6rerfSZ^W2-_mVyBsQ{{;` z#eNz-9*_tADYVWStk-({W6kd7u%NrjfOk1^xq>^b|N5pCiKF5ML(>alGOR8qM0-rp zYW6w*KhP7nC05K{HL*9|Ffo{dGVjbvY0kJO1Y2uPzj?t6j{!8+Ag$nZqB>!Jk?Gd zkn9ADI>L)c2u+;OwA!%)SDb%T!vq$&g9~@*+|wE~^j6v-mw!JV{OzSu4+Jj?c~OnB z5@7^MA!_BQv%?squ$)-Ttax~QNQ5lGd8zFee9YY@4S#KqP1azYsK<7#ZC7E(lIhFJ?w9(~f+X@Zd5o()FM>&K?k z^VSN#jpxXZs`n{R=_rC038&<)SZP^#nq`ZbFH%5^5`d%>75S|zLC&O)GWad)1b<|! zJy79JRZwe}F2LLp4!X_|<((%T{@btb!W-eCza?J39-+FXdzatpKEYTIk9yDx^u#~B(| zEAM~iKP<1dRPI^v@tT3HBfQu>RP*p#Q)>O3O8)+j7;Y7(RJQANEQ5Dh*UC~ATe2yC ztFwbTk2Emvfh;#NN|=)F^lP6SDZS=@`tvt6{eM=Q{ojkZ zeog`c3}+QV7Gg6Uq7;V5H=v-*YMt8&ZwWwD_K#Oa0BT|Jy*pi&dUmTwS*kyotp`r3 zfWqj9qGAuA@z|ZM@5)i7#aODd3M(&X0FJakILg|rvOaXVSnX=}yjBTn1<2oc@2G`1 z7*u&qwWhL#fLVq$#YcbySQnrv)2m)wQ57b_$xts9{qNLols*d_&>eF9SAE;RHQ8(b zRg?WcaN7s!6Z&uUcBhf}ABB15TQ(ewsiU=#F(;3RR>yJuOD8n z$5+)6iA0ix5YAb2W1JgZYK+%}EyzjiKo7|iCH`A=Tyv>@Hs~TkUbTl7Tc1ZNa9|2z z@OWUvWwYG4Ih_88CV@>m!}Cs!%jx9c>?j0c$A$xkW!`NpjS~>+ zG)>W1`)yYR-#DiaM-rLQUp70?4u)p89Q=RE2&>i6-?Tggd+jCkBuL;#WW|hR5qxGgq~I`M94Mo0c{*lFW?FX-7I= zrnL>o@eBc#YsxH#YWMaAPM9-ajy2l7JbR0+qguZ$EZv3UDjJb* zL&P|%6-%>3zwM)^;l*^gLwh}_-jXte8a0wf808eNlhmKfkaJDTirA5NYIW3brVJ#( z-$>JXQ0eXjA1&OUSY+4fANc~3@e%NHWa`X2j@=erziDRPJ9>JENgI2m zL3Gb5NrZVqYu84SfqFealnYCt=(Tm03{&#wJ9%ErI%YeWEi_Pr_6B219~X<7LBr&w zfLf1q^dpVuujZ8&Y7vH?cR5u z-FPc2E8*}segkCn3UC9HC2Gulk@!-^#^mkqZ`|@vv^RjJ^{dB&O&}uS7$AGoJS~9* zj8FG+tG91{KA)6UyCn(0ZI^qg)?W<=klp|ZPPO;D*Vgv-hvpAJfvlOiyjQ#qMa-IoW17&3J^ps2KtbH-jkr_t+Nx#?W>;h&wV;eg1(= zPy`r8l?@JkH0>r4FHSF-W5O>f2DybT*mF7&LVpBiozeX8tHrtG@2oPuDYGrqE9ZPK z3g<`n6WjiyPaj@VVX=H6Z*+LIs%6M} zj0t`v@b{N95D(h{cxD$`V(IU^SkMfDzt z{mGt(_MC<+KFARQ`7gLJ2b2ns0ONOyOO2uO*5bW2G$ zk`mJ0Al==adtU2#);qqv_xr6e__1z=H&>i7=TT=r-?NMvD$jKKa;+aR`Auyd`8$?Y z1Xs0YA_gR-tBnuw-#K<^$;#Ye`jO|@=-jKKS7>WRY7y))yos&TvVq~od$93XZ|mt` zV`IVEpMytFuo)#)TNFf_*B+5a|N36mk?*{ucb``qUF;ZzHVfN#Dr<=U16R}C(?Bjg z%4Z5L-3{?x=|4>VmiQC0B(=taLUdx=!phR}Xf?M6k*(_L>Nd`IL~~Jdb4S3+A5mBL z6tq<@O--2q-u?iqNDPnFXBZ+-YuJmzJ?JywUmdi1&2TjyL$$Viz5B@t1I{4{KdFVgymR&BRuUI+rGq4k@d zjt|C6$Bp9U$(;ddJLePm4VOOCTY9mMI3Z)X%kx7z!2_wdf%mQw*cgd6cP8zmaE4yj z>V!5*7B}#r_lbW56x<46?;pa}j4{>HATrT)&?628b?(tR*rkS6o zWPJbOg2u}+{9;RA9XKbV^A*Eyxu)p?$=6q3hTayDomyJ+x%h!kHl};}(e_gCmMY#_ zl;WTTPWy_dPVu*c?6=w1imr>%D@JZhsu3$;qLZVMwZxk}5?lVVn*7`2iEp)v?fkVb zgQ!~++HdNrwP%?Qx~}6crM}cjPQNHiI#}LUc_~JjsXRPrf|Gm9`yuyT5{;#{jQuT4 z(a;hePI7xY?}o|NzocE#M-}N%g{1=)@zV+)-RU*u=ntEorFcwT?WW#L^?kOBBO2US z{8!B*Nn-_q_RAavZAe@FNBXw%LIg)gwSS6eLc9#vvbq6~c-;om7&>v*!G~woVM*Y5@`*W8n_f35H$WTx5s#(dUXGGlm5ow<@rUC)~=N7YUDnTC1 z(0h&=Sc64&tDkne6|=s4`7q+Q&V$cUXt{U;MKOjqgK|6liR2 z?Mh@kiS7D+*%{JDY0!igf|uwU_0de`*ht6d_SMBV^#eFX)WzmZ9vYK2VRkF>nojhQ zqiJf*3Zmvx>^fu_VK|3j_jV%N?@9ox z`L&r0iH#-3Tr0U)YxwH^<&bj!5kt^a!6d8m8p<0RKEJ4xhQ}I2`JUf~D;;p7CnDPo zn--7FCz$&e-0LDW%{o|3vsW&u*aCy7*fl9WSF6oW(k>S1=j&;I6=JeQF+}q}m~NBD z73)8qn%xKxwI`friDMw`AwCa&g6`K-H+wLwuAULy{4`p6v}a-S-DrKTYa>OxP3@zN zp=q`yQ=yR4@D|ijT$Z+@{8dbbO^g`MH$(%0uNY==UiGU`XrKIYZ0w9n)ea6pEkaWY zdc<$~NT*PFE!(u_?9q3L+t2u{A4u=UNYmv6YFCL!U;o@HKgT2@-A*PmK$QGjXNGm~ z#PHQbY4}mVgXeC&aR$2!tW#GgG?k(yIB42?dvVy<*m6{Uy)$qCj1=~uflec36%`2) z5s|P}L**cH0R`}az-a#frBjx2X`sbyPxOv0D4sqw-4d`dxpC5AdZJQsp?fOyn{4mPV2*#xN^7&P*r)3q4~+e8 zOh5aH%^_=h@bz63hK4a?bSit*fvINGTkeogYPZuXBTA<5c6G1M9(rAMI+Q-zE2S1s zq`Upa?3aryyR7Qpo`qLwOkaQ0s8qiiJ>*S&!^2(W5yVxh(S9_+6%kcew6?BX7p(nl zm!6^0pnj4>UE(&sIDrb^>PRuy@xouZ&}@;+!#X!>17=K(GR;g->46VNjjCMV$NB6$vQ?H$wXQm*)+q97Ebr-3_6)ol-u&@+pAxHld7xN9iY-V ztx1wUdq3^;Iy#ZI<4RS|9jCSR`!C)nMwh;7%Lq9b&NS6I_oTE)d=ipO2YM*^$_h`a zs=du(S3ANGy(alqEym_P^~+z%Kl9`bxos`1cE7XPq&W9#SQXBj*MDjomDq{%voNS5l=1p z;M-lT#zy~WiUc$oewVF$u}7BMoCUXptG}CIHo|Z#Uo&tbx9Hz-QNiK$ymH=R;!I9` z=)Lk8BR>2*|B}hSd%s0{8S85zcGv$D94gh$x2Yei$N)U$qp5Tev zBVOLovNI*1*%z9FDS=6)Kr|ho8ctfhFh6 zLrgxtiYQE74>rD%9dU1wTgJ*383OhAO?L_8rxzKY{Pt6{uxK|&<#n8y|Ju;l^}d_H zW4fJF@baafces;*hBK3|iBpmM4SHJh!=3x9(fTE^EW*KYp--wG)z)Hm1(p_E)b?cf zVJc2OFQAnTN^Ev#;)z-spXy0w@0PLM_;glCNDc7 zlhGDF9XI6Ewcpx%PY3Ezz1~pIxF>&bPTzT5Pvc_N8kOA3nRd`OYaa9Zol+=OS@nt5 zRh&73-eOHC;47UOHEKE$58GEQvkuKOu9V}liSd3ZzU|U7xz%6>6;sKEB<9rTVHZ8p zqdc>`whu&PJ11|XqupUu7H@WXPgqs7chHr0VURVr+?H!!A@nktk&Os9%B%KWhdY;U zn55D=PV>$PhOW0{?UON-*P>_=ShO83_1<5vJAQX2^j9wBq+Uga5l5aWxno1%7z`!2rlA1C}kLgK2H=;&1 z8=Pp_=<@ugv}X+cSY&n8LCQY!0waw^OH%LVeJ{@&$@miWt1B9u29rM{b+olZ`}=?N za@qJ@F?stIJ6oyvXDqKTZ*XL!qMk{XDn&b9wva_``Gm8Ug=mh+Bp5ZJd7-7FtJ7fq z8XoSgmRqwv(LXk(f^&w zO547g`(mmWE}Q|6>YVMSRkvG=x!#9LGz>f3!Fe|2!kM~r0WvUHeHn#L4yLC+{lU&1 zc<6QKkm9`{t;9`>8iTGWt}HX7#w+!~&wI!8m`?>UbvN~jNx-nypqf`y^uu9y;YVuf zg!xu@NC@ut@3QW;rpPeSqtkx zk74nEprKrbOp;ut&YjRZPx*xrtg4?LYC$`W5D&;5JeADmKlx8K)Xn$sCI6sS{r{5^ z<@j$bp>%Fb0y6^dp+S`@bNqg?f5_2K`MvVG^55Hd@bCK39X|G*zZsS1f7SZY^XJEr znVA{K!yn85P=fbWRsI=7p^P5BT(mcdy*xA)j*gBNH#IdyJ{JZfQi{u_mTa-v2!WG@ z1q+&|$Jv?l#l@*vq^o$p(>6h|kH) zXq*BcA755h7L@J^3JMygrfNp&3mml6)HiP2@Gj5!%zXEKk=dWAVi8ZYM$BIYZg0+= z%%N^`;)16*b_qxp6dPd9R3T}{Cm_%=F?r*M&$x2_egz;e1^5k>_R0YxSd9}B+~H57 z5VO<7yZsIo$!@p24}jlTVu3~p$fp)MqK8g3rETKDd+rpPVey zXMaRAP=GK4y;g5t;@BSE)z?lsZH@-?3z5;5w%7lGQGNc(u#5xx=kxL7$MT$ScMd}f z+)I$1Jr(0W*8-*bnYG4ock(oDIJ#_*C_oDDGkC+|7?qaixQ9Ys$KDd~s&{``wFWH-NOR{@fyz zryabwJ~!f)QAeFo9p{B2e$A_kIf zxpj+x4?n&8=*J4P!cTKoU9>{#iqJSa`BDo03R-1+)2GSu8k-mVg%evME*!#xu59r< z@l@Yr6B_a_t*m*;JMsnR3EqyzYJSRoC7gUir%AIt;+#K+(`K6pd2n@mJVoVJF-8*~ z2TMwZiQPgKA}Tc!Xd->S-t2X(6ze}xc<9L&T$0NmBog36AzE-iomf@=+=DB zIIMbb?d?l4QZZv=JgXb3y5l6`ubOWR$3SfUrk5|7wo`d(#y9ZZ_UZETmE{*{v7@aN^--s3w~6H0pg zL9nt=&CktkwbJJz&^O%>FzsC+UIG)Ud>coF&3}j9lPCWdm&Ky z5?-FLy7I~w>gXq>POYvgU*I}(lyPqfY=>9gyk-7ECqsBd7iHGD&6ComCe31SO-CKg zJ#g+3R;LTUR9H3zd*Bt5P#QcsmBzPqO{~GHr?-aWg(E(zb?Jn%7nHk(z1F!+M0D@t zD|xD_70+Z(jFexL$#q%^+;w-ocr<1`?Cf5hG5)H%s}i}lg3|vT1J72?zCvVYn;qp_ zNmKGF!K;L546hU%n@fvZoN=5=Gegwf1~crHYj_D#)2tgjDjZH?Kc{z<`m15l1No!? zY|9#F4#)H1$2)CLTDrP&S66(A<-*^akn!32Lr-G~MqA!Y&pU^>A!(#EO1wRVo?qMo zmxG8ICmG^8>Uc^%xtu*29grd#nC~`}G)xSjJ{Xu+9Cer)=lQ5wvrL#F0q>V>f=#w@ z0RP@0n_ca^#StqX=2z!&ry!h^`GLzQ`n={z(T1^RsGSPloX8fsL_S1ej0%|=ZmN#5 zEZ|P@`0>Z}NN&a0{6~n&YJ`NE8aZejtJhmrJ32ZXKr@+N@N?$p6530D!df6FV0(Qi zAP_4lc>L+($EyHg`b9>Ln2?E&Rk&Up>&3*zf>)huvh4HvL{&6w$cWYxaR(A}W-V$J zd8KPnU1AwdZ(mI$*U2?L9wG@j7ML8qa|@@iwP<5tB= z35V2uGWKHej0R!>`JZKeseL*ktAn!YN^{it+Kz;yiI~1oi~jFK3?{5PWN*d)V!2k{ zKYZm67MTAFfotD$JSSVvm7yaNbmq3T9k{TRZyOtn0lH}y%=%liK|(uFmLt`3FhKW^ z5g-Koop{@KMj|d#Qb_-u1@6OnuSXPgqf<*uub?`|#AnceS7z_%_zqZ`0-ZMfk%Gry zcbwX+xul|_YaJFx9OSc`n?dhr-`n?pMmT?mU0ramD`kpgzfGGx+Me|%;R@WWJ`LPm z?3$gL(oj(c<_5_bP*EYp$Hzy&Ab7O1Cu?iQfY~@GR=++>lMo0im>~yeJ+uHgC+He;A?)&gfpsRgA zOY7U*{OWDIUeayiZQe%aWJpT( zfWD#}w}|!t+wq%gP08C*M`w!)P|*3P<)+E!s(~IQ0(|#tW>R!SXO{RQ}q>OdkC zB9PV~1z3ckAzi%70TDbSz5SJeTSTm%kZ~RwiWkLU^cmnaz0Q~`_u1G&tQI>h_Lii9 zBRc|ZbW3Mv>ie`_E4$r=jx!KHfAaFWi;v$3X8IS###s`*>VB4%mH_y$@v1U9)2fEW z#7HE+3_v8y(BM(g(q{CYz~G641c`i&+N+Sm;2RbewoS@Oc#A>3ItJd3f~HwDUyonft@;NV~nxNRs%fE%z_ zXeXNGaer`0NMVZj%;g` zHpupX%4ZJ5iF$BRz>$UK)?A!)lDz5{r^42k+^QM+s9=>|m*gzqsMMXr$@ICxX*Su1 zddE-O`WS7Gx^&xNjKjmH74>#F-nS64<$+|&6n2aFLdJTO7ijD((^-8^)3dG|PYw5P z8WwcNv1xpbQ^u8^W*fXwe=_nZN0LfB?U@}_q)nk-A=9L{beD`34y~+0H1*xfSo|ur zAlp;thX-<12C^!r#|cMF-@W8f z-(gF@bC%=g;hCPBdk&bqsnN(dH>6Y`nF*bpoit&uUC*{f9ruksEWfWJ`J(-Zv6yA{

    Zai5{MnXbTZoOP*R&)Lm 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 diff --git a/static/img/unfreeze_columns_context_menu.png b/static/img/unfreeze_columns_context_menu.png index 91715ac15c547a351d5b0e57d8d123c2172d19f7..2b67d0833e873f4f4027dae8ad9e709b61b8a766 100644 GIT binary patch literal 45162 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

    rXz;cU`OE|>D>IDZNXn-&@ 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 literal 41222 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 diff --git a/static/img/unfreeze_rows_context_menu.png b/static/img/unfreeze_rows_context_menu.png index 5334c41c5f0352f1fcc1fc7bc0aa304c3af8c7d1..855bd467c29f2a18e96383cc2a95c46af8fff559 100644 GIT binary patch literal 43998 zcmb@tbxWrA1myD)2*{@xCh;TJcbAu&JtL|A>41+;~`+@OX(+Cx9Jq-?|U8bfVz z$%-`C8@Ws)TjUoM*`*`H5?DiD-!Zemk?=5aD<4k!Ww;(Zn$up!xE5O`U9xA%85pX* z5CtL%LlFha)Ppy_oVTs(M73t}`~0+BZ*6JA&V!c1@oF?0jGpfBa&uD`VU63~{`U0l z$;id;#cr`#Flzx#n6#qktx3H`WmwYjB$5%kLgIWgq=FG zgnJwAV);zR&f%+pL<0f0%43cft_fWeTcvDd{%37Uh7Z9L=0U|qHs=Rd=65+)Y} z#INs5!#8~nohK2=$K8{sA1K$=>9)9oQ_`BZ^J$7V-%zFevPEO|tK#fSC*3`^nJcZg z^mvmph6>t#+KxtjsgAi`DL3&(MU@f%4H8|M-d~$hHl}CPDG@sE9{q_!MHj)X`__fTQHClt;5E7*F+x~_;rzNefFv4b#z^r_j41HDFJ9pOUck24k=Zw+yL5zTG zvesFv_Our^g@<^k)vr%$D*+$S_<|$hJE>T7kay`T9PJ5>2-!7$MB8!KDwvz+VB;Pz zeHUM!Qm&wT2^{UR%1n;TuX`?p$uzMklwn$>$BD9@J61 zuyDVba=xwUVmKK2a`*U6IumtwnT;QHzVo8JK?ZMXZfALhkNO3`~DLuM9)X zE3|YDA4=b%^5%8NFEi8eGPl3IYbo$%4)iGPO8TBhuTQX>pEsEHfcS?mn1Z#=o#Vmn z)~kR?L|81s_1K1(qEq+oMOUHv_32X-_AQN8PPX5^St6yk6~^P#+b2I`_u`Oi)x6y= zX4dDGq4rTR8tgTu$(20HFru?h=Ka61J(kcc^yP-Z191DJxPQLcVWQ~!mertq61gxu z>xrTA*hPZw<`uj9#L|Dj`FyV*_H@%F`Miq494Zb)v?lFX&9^QW8?YX;SyZ{-6tyPV zg;l1>mmde)fL@qgL$NxMHmW4Mrd((K5EH}r?E0W0!%DO%e~a@Wz*~Kzf6DU&rtskE z7WCW2YBTG8$pKYgQ$_g}g^a&x`aOKZ#$lGG(WscFLj@T6--$B*{>J8|)-`&iA7iR# z-%r@S(_Y6N6k|1Jw VSo_ueq3eO!^ZbKQ(?7+4l=(M(nzJk1e0f^ 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

    p0DA-mrTwy4 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 LuTH9#mEV5>2U#8* literal 41762 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

    mJe*8AM5l}U;2RtBOl7D_DF8}T<- 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 J Date: Mon, 2 Nov 2026 12:23:14 +0300 Subject: [PATCH 29/32] [update] separate react section in v6.0.4 what's new - react updates and fixes moved to a standalone React Spreadsheet section - react update line split into separate items - release date set to November 2, 2026 --- docs/whats_new.md | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/docs/whats_new.md b/docs/whats_new.md index 5d6511e7..a39791c6 100644 --- a/docs/whats_new.md +++ b/docs/whats_new.md @@ -10,7 +10,7 @@ If you are updating Spreadsheet from an older version, check [Migration to Newer ## Version 6.0.4 -Released on October , 2026 +Released on November 2, 2026 ### New functionality @@ -36,7 +36,6 @@ Released on October , 2026 - [Removing a row or a column through a merged cell](merge_cells.md#removing-rows-and-columns-of-merged-cells) removes all the rows or columns of the merged cell - New interface and screen reader strings in the [`spreadsheet` locale](localization.md#default-locale), and [translation of the built-in widgets](localization.md#localizing-built-in-widgets) - The [`--dhx-spreadsheet-focus-color`](/themes/#spreadsheet-specific-styles) variable for the keyboard focus, and the formula reference colors with a higher contrast in the light themes -- React Spreadsheet: the [`selection`](react/props.md#runtime-props) prop, the [`ISelection`](react/types.md#re-exported-upstream-types) type, and [`readonly`](react/props.md#init-only-props) as an init-only prop ### Fixes @@ -57,9 +56,20 @@ Released on October , 2026 - A closed context menu reopened - The active cell was scrolled one cell short of the viewport edge during keyboard navigation - A formula with an invalid reference showed a broken or repeated `#REF!` error instead of a single `#REF!` -- React Spreadsheet: the event callbacks and `onStateChange` didn't fire after the Spreadsheet was recreated by an init-only prop change -- React Spreadsheet: the event handlers of the wrapper were not removed on unmount -- React Spreadsheet: the data from `loadUrl` was loaded twice on mount and again over the kept data after the Spreadsheet was recreated + +### React Spreadsheet + +#### Updates + +- The new [`selection`](react/props.md#runtime-props) prop +- The [`ISelection`](react/types.md#re-exported-upstream-types) type is re-exported +- [`readonly`](react/props.md#init-only-props) is an init-only prop + +#### Fixes + +- The event callbacks and `onStateChange` didn't fire after the Spreadsheet was recreated by an init-only prop change +- The event handlers of the wrapper were not removed on unmount +- The data from `loadUrl` was loaded twice on mount and again over the kept data after the Spreadsheet was recreated ## Version 6.0.3 From 5f31f42db611577093e535a8e808c81463496a4b Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Mon, 2 Nov 2026 12:29:37 +0300 Subject: [PATCH 30/32] [update] sync react section of v6.0.4 what's new - ru, de, zh, ko: react updates and fixes moved to a standalone React Spreadsheet section - react update line split into separate items - release date set to November 2, 2026 --- .../current/whats_new.md | 20 ++++++++++++++----- .../current/whats_new.md | 20 ++++++++++++++----- .../current/whats_new.md | 20 ++++++++++++++----- .../current/whats_new.md | 20 ++++++++++++++----- 4 files changed, 60 insertions(+), 20 deletions(-) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md index a0612ee6..f7f1444a 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md @@ -10,7 +10,7 @@ Wenn Sie Spreadsheet von einer älteren Version aktualisieren, lesen Sie die [Mi ## Version 6.0.4 {#version-604} -Veröffentlicht am Oktober , 2026 +Veröffentlicht am 2. November 2026 ### Neue Funktionen {#new-functionality-604} @@ -36,7 +36,6 @@ Veröffentlicht am Oktober , 2026 - [Das Entfernen einer Zeile oder Spalte über eine zusammengeführte Zelle](merge_cells.md#removing-rows-and-columns-of-merged-cells) entfernt alle Zeilen bzw. Spalten der zusammengeführten Zelle - Neue Oberflächen- und Screenreader-Texte im [Gebietsschema `spreadsheet`](localization.md#default-locale) sowie [Übersetzung der integrierten Widgets](localization.md#localizing-built-in-widgets) - Die Variable [`--dhx-spreadsheet-focus-color`](/themes/#spreadsheet-specific-styles) für den Tastaturfokus sowie die Referenzfarben von Formeln mit höherem Kontrast in den hellen Themes -- React Spreadsheet: die Prop [`selection`](react/props.md#runtime-props), der Typ [`ISelection`](react/types.md#re-exported-upstream-types) und [`readonly`](react/props.md#init-only-props) als Init-only-Prop ### Fehlerbehebungen {#fixes-604} @@ -57,9 +56,20 @@ Veröffentlicht am Oktober , 2026 - Ein geschlossenes Kontextmenü wurde erneut geöffnet - Die aktive Zelle wurde bei der Tastaturnavigation eine Zelle zu kurz an den Rand des Viewports gescrollt - Eine Formel mit einem ungültigen Bezug zeigte einen fehlerhaften oder wiederholten `#REF!`-Fehler statt eines einzelnen `#REF!` -- React Spreadsheet: die Event-Callbacks und `onStateChange` wurden nicht ausgelöst, nachdem Spreadsheet durch eine Änderung einer Init-only-Prop neu erstellt wurde -- React Spreadsheet: die Event-Handler des Wrappers wurden beim Unmount nicht entfernt -- React Spreadsheet: die Daten aus `loadUrl` wurden beim Mount zweimal geladen und nach dem Neuerstellen von Spreadsheet erneut über die beibehaltenen Daten + +### React Spreadsheet {#react-spreadsheet-604} + +#### Aktualisierungen {#react-updates-604} + +- Die neue Prop [`selection`](react/props.md#runtime-props) +- Der Typ [`ISelection`](react/types.md#re-exported-upstream-types) wird re-exportiert +- [`readonly`](react/props.md#init-only-props) ist eine Init-only-Prop + +#### Fehlerbehebungen {#react-fixes-604} + +- Die Event-Callbacks und `onStateChange` wurden nicht ausgelöst, nachdem Spreadsheet durch eine Änderung einer Init-only-Prop neu erstellt wurde +- Die Event-Handler des Wrappers wurden beim Unmount nicht entfernt +- Die Daten aus `loadUrl` wurden beim Mount zweimal geladen und nach dem Neuerstellen von Spreadsheet erneut über die beibehaltenen Daten ## Version 6.0.3 {#version-603} diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md index 09716e08..7e71b02f 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md @@ -10,7 +10,7 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리의 새로운 기능 ## 버전 6.0.4 {#version-604} -2026년 10월 일 출시 +2026년 11월 2일 출시 ### 새로운 기능 {#new-functionality-604} @@ -36,7 +36,6 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리의 새로운 기능 - [병합된 셀을 통한 행 또는 열 제거](merge_cells.md#removing-rows-and-columns-of-merged-cells)는 병합된 셀의 모든 행 또는 열을 제거합니다 - [`spreadsheet` 로케일](localization.md#default-locale)의 새로운 인터페이스 및 스크린 리더 문자열과 [기본 제공 위젯의 번역](localization.md#localizing-built-in-widgets) - 키보드 포커스용 [`--dhx-spreadsheet-focus-color`](/themes/#spreadsheet-specific-styles) 변수와, 라이트 테마에서 더 높은 대비를 가지는 수식 참조 색상 -- React Spreadsheet: [`selection`](react/props.md#runtime-props) prop, [`ISelection`](react/types.md#re-exported-upstream-types) 타입, 초기화 전용 prop인 [`readonly`](react/props.md#init-only-props) ### 수정 사항 {#fixes-604} @@ -57,9 +56,20 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리의 새로운 기능 - 닫힌 컨텍스트 메뉴가 다시 열리는 문제 - 키보드 탐색 중 활성 셀이 뷰포트 가장자리보다 한 셀 모자라게 스크롤되는 문제 - 잘못된 참조가 있는 수식에 단일 `#REF!` 대신 깨지거나 반복된 `#REF!` 오류가 표시되는 문제 -- React Spreadsheet: init-only prop 변경으로 Spreadsheet가 다시 생성된 후 이벤트 콜백과 `onStateChange`가 발생하지 않는 문제 -- React Spreadsheet: 언마운트 시 래퍼의 이벤트 핸들러가 제거되지 않는 문제 -- React Spreadsheet: `loadUrl`의 데이터가 마운트 시 두 번 로드되고, Spreadsheet가 다시 생성된 후 유지된 데이터 위에 다시 로드되는 문제 + +### React Spreadsheet {#react-spreadsheet-604} + +#### 업데이트 {#react-updates-604} + +- 새로운 [`selection`](react/props.md#runtime-props) prop +- [`ISelection`](react/types.md#re-exported-upstream-types) 타입 재내보내기 +- [`readonly`](react/props.md#init-only-props)가 초기화 전용 prop으로 변경 + +#### 수정 사항 {#react-fixes-604} + +- init-only prop 변경으로 Spreadsheet가 다시 생성된 후 이벤트 콜백과 `onStateChange`가 발생하지 않는 문제 +- 언마운트 시 래퍼의 이벤트 핸들러가 제거되지 않는 문제 +- `loadUrl`의 데이터가 마운트 시 두 번 로드되고, Spreadsheet가 다시 생성된 후 유지된 데이터 위에 다시 로드되는 문제 ## 버전 6.0.3 {#version-603} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md index dc19a194..b7c1bfae 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md @@ -10,7 +10,7 @@ description: В документации вы можете узнать, что ## Версия 6.0.4 {#version-604} -Выпущена в октябре , 2026 года +Выпущена 2 ноября 2026 года ### Новый функционал {#new-functionality-604} @@ -36,7 +36,6 @@ description: В документации вы можете узнать, что - [Удаление строки или столбца через объединённую ячейку](merge_cells.md#removing-rows-and-columns-of-merged-cells) удаляет все строки или столбцы объединённой ячейки - Новые строки интерфейса и программ чтения с экрана в [локали `spreadsheet`](localization.md#default-locale), а также [перевод встроенных виджетов](localization.md#localizing-built-in-widgets) - Переменная [`--dhx-spreadsheet-focus-color`](/themes/#spreadsheet-specific-styles) для фокуса клавиатуры и цвета ссылок на ячейки в формулах с более высокой контрастностью в светлых темах -- React Spreadsheet: свойство [`selection`](react/props.md#runtime-props), тип [`ISelection`](react/types.md#re-exported-upstream-types) и [`readonly`](react/props.md#init-only-props) как свойство, задаваемое только при инициализации ### Исправления {#fixes-604} @@ -57,9 +56,20 @@ description: В документации вы можете узнать, что - Закрытое контекстное меню открывалось снова - Активная ячейка прокручивалась на одну ячейку короче до края области просмотра при навигации с клавиатуры - Формула с недопустимой ссылкой показывала искажённую или повторяющуюся ошибку `#REF!` вместо одной `#REF!` -- React Spreadsheet: обратные вызовы событий и `onStateChange` не срабатывали после пересоздания Spreadsheet из-за изменения свойства, задаваемого только при инициализации -- React Spreadsheet: обработчики событий обёртки не удалялись при размонтировании -- React Spreadsheet: данные из `loadUrl` загружались дважды при монтировании и повторно поверх сохранённых данных после пересоздания Spreadsheet + +### React Spreadsheet {#react-spreadsheet-604} + +#### Обновления {#react-updates-604} + +- Новое свойство [`selection`](react/props.md#runtime-props) +- Тип [`ISelection`](react/types.md#re-exported-upstream-types) реэкспортируется +- [`readonly`](react/props.md#init-only-props) стало свойством, задаваемым только при инициализации + +#### Исправления {#react-fixes-604} + +- Обратные вызовы событий и `onStateChange` не срабатывали после пересоздания Spreadsheet из-за изменения свойства, задаваемого только при инициализации +- Обработчики событий обёртки не удалялись при размонтировании +- Данные из `loadUrl` загружались дважды при монтировании и повторно поверх сохранённых данных после пересоздания Spreadsheet ## Версия 6.0.3 {#version-603} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md index db875a22..1f3daaab 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md @@ -10,7 +10,7 @@ description: 您可以在文档中了解 DHTMLX JavaScript Spreadsheet 库的最 ## 版本 6.0.4 {#version-604} -发布于 2026 年 10 月 +发布于 2026 年 11 月 2 日 ### 新功能 {#new-functionality-604} @@ -36,7 +36,6 @@ description: 您可以在文档中了解 DHTMLX JavaScript Spreadsheet 库的最 - [通过合并单元格删除行或列](merge_cells.md#removing-rows-and-columns-of-merged-cells)时,会删除该合并单元格的所有行或列 - [`spreadsheet` 语言包](localization.md#default-locale)中新增界面和屏幕阅读器字符串,并支持[内置组件的翻译](localization.md#localizing-built-in-widgets) - 用于键盘焦点的 [`--dhx-spreadsheet-focus-color`](/themes/#spreadsheet-specific-styles) 变量,以及浅色主题中对比度更高的公式引用颜色 -- React Spreadsheet:[`selection`](react/props.md#runtime-props) 属性、[`ISelection`](react/types.md#re-exported-upstream-types) 类型,以及作为仅初始化属性的 [`readonly`](react/props.md#init-only-props) ### 修复 {#fixes-604} @@ -57,9 +56,20 @@ description: 您可以在文档中了解 DHTMLX JavaScript Spreadsheet 库的最 - 已关闭的上下文菜单再次打开的问题 - 键盘导航时活动单元格滚动到距视口边缘差一个单元格的问题 - 含无效引用的公式显示残缺或重复的 `#REF!` 错误,而不是单个 `#REF!` 的问题 -- React Spreadsheet:因仅初始化属性变化而重新创建 Spreadsheet 后,事件回调和 `onStateChange` 不触发的问题 -- React Spreadsheet:卸载时未移除封装组件的事件处理程序的问题 -- React Spreadsheet:挂载时 `loadUrl` 的数据被加载两次,以及 Spreadsheet 重新创建后再次覆盖保留数据的问题 + +### React Spreadsheet {#react-spreadsheet-604} + +#### 更新 {#react-updates-604} + +- 新增 [`selection`](react/props.md#runtime-props) 属性 +- 重新导出 [`ISelection`](react/types.md#re-exported-upstream-types) 类型 +- [`readonly`](react/props.md#init-only-props) 改为仅初始化属性 + +#### 修复 {#react-fixes-604} + +- 因仅初始化属性变化而重新创建 Spreadsheet 后,事件回调和 `onStateChange` 不触发的问题 +- 卸载时未移除封装组件的事件处理程序的问题 +- 挂载时 `loadUrl` 的数据被加载两次,以及 Spreadsheet 重新创建后再次覆盖保留数据的问题 ## 版本 6.0.3 {#version-603} From 56438dfee92583c3a1677940a8f1258f64419e16 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Mon, 2 Nov 2026 12:45:02 +0300 Subject: [PATCH 31/32] [update] note core changes apply to react in v6.0.4 - paragraph in the React Spreadsheet section: all Spreadsheet updates and fixes apply to the wrapper - added to en, ru, de, zh, ko --- docs/whats_new.md | 2 ++ i18n/de/docusaurus-plugin-content-docs/current/whats_new.md | 2 ++ i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md | 2 ++ i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md | 2 ++ i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md | 2 ++ 5 files changed, 10 insertions(+) diff --git a/docs/whats_new.md b/docs/whats_new.md index a39791c6..daee478d 100644 --- a/docs/whats_new.md +++ b/docs/whats_new.md @@ -59,6 +59,8 @@ Released on November 2, 2026 ### React Spreadsheet +React Spreadsheet includes all the Spreadsheet updates and fixes listed above. The changes below are specific to the React wrapper. + #### Updates - The new [`selection`](react/props.md#runtime-props) prop diff --git a/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md index f7f1444a..0010734b 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/whats_new.md @@ -59,6 +59,8 @@ Veröffentlicht am 2. November 2026 ### React Spreadsheet {#react-spreadsheet-604} +React Spreadsheet enthält alle oben aufgeführten Aktualisierungen und Fehlerbehebungen von Spreadsheet. Die folgenden Änderungen betreffen nur den React-Wrapper. + #### Aktualisierungen {#react-updates-604} - Die neue Prop [`selection`](react/props.md#runtime-props) diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md index 7e71b02f..5f912df4 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/whats_new.md @@ -59,6 +59,8 @@ description: DHTMLX JavaScript Spreadsheet 라이브러리의 새로운 기능 ### React Spreadsheet {#react-spreadsheet-604} +React Spreadsheet에는 위에 나열된 Spreadsheet의 모든 업데이트와 수정 사항이 포함됩니다. 아래는 React 래퍼에만 해당하는 변경 사항입니다. + #### 업데이트 {#react-updates-604} - 새로운 [`selection`](react/props.md#runtime-props) prop diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md index b7c1bfae..d1761af9 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/whats_new.md @@ -59,6 +59,8 @@ description: В документации вы можете узнать, что ### React Spreadsheet {#react-spreadsheet-604} +React Spreadsheet включает все обновления и исправления Spreadsheet, перечисленные выше. Ниже приведены изменения, относящиеся только к обёртке React. + #### Обновления {#react-updates-604} - Новое свойство [`selection`](react/props.md#runtime-props) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md b/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md index 1f3daaab..50a6ac90 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/whats_new.md @@ -59,6 +59,8 @@ description: 您可以在文档中了解 DHTMLX JavaScript Spreadsheet 库的最 ### React Spreadsheet {#react-spreadsheet-604} +React Spreadsheet 包含上述所有 Spreadsheet 更新和修复。以下是仅针对 React 封装的变更。 + #### 更新 {#react-updates-604} - 新增 [`selection`](react/props.md#runtime-props) 属性 From ad78e10ec4e1a1c1e04fc4cc2bc0d7b75dd2e3ad Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Mon, 2 Nov 2026 13:08:20 +0300 Subject: [PATCH 32/32] [dev] move translation sync markers to 9ff2cef6 - ru, de, zh, ko: .sync updated, translations already match the English docs --- i18n/de/docusaurus-plugin-content-docs/current/.sync | 2 +- i18n/ko/docusaurus-plugin-content-docs/current/.sync | 2 +- i18n/ru/docusaurus-plugin-content-docs/current/.sync | 2 +- i18n/zh/docusaurus-plugin-content-docs/current/.sync | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/.sync b/i18n/de/docusaurus-plugin-content-docs/current/.sync index 8fee4307..0532604c 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/.sync +++ b/i18n/de/docusaurus-plugin-content-docs/current/.sync @@ -1 +1 @@ -1853f2853225a3d5774a2d166077a4404f555063 +9ff2cef64e00d4e77947433a670dc5d573fcc7f4 diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/.sync b/i18n/ko/docusaurus-plugin-content-docs/current/.sync index 8fee4307..0532604c 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/.sync +++ b/i18n/ko/docusaurus-plugin-content-docs/current/.sync @@ -1 +1 @@ -1853f2853225a3d5774a2d166077a4404f555063 +9ff2cef64e00d4e77947433a670dc5d573fcc7f4 diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/.sync b/i18n/ru/docusaurus-plugin-content-docs/current/.sync index 8fee4307..0532604c 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/.sync +++ b/i18n/ru/docusaurus-plugin-content-docs/current/.sync @@ -1 +1 @@ -1853f2853225a3d5774a2d166077a4404f555063 +9ff2cef64e00d4e77947433a670dc5d573fcc7f4 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/.sync b/i18n/zh/docusaurus-plugin-content-docs/current/.sync index 8fee4307..0532604c 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/.sync +++ b/i18n/zh/docusaurus-plugin-content-docs/current/.sync @@ -1 +1 @@ -1853f2853225a3d5774a2d166077a4404f555063 +9ff2cef64e00d4e77947433a670dc5d573fcc7f4

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 OUJqndWD2B=U;iJyV1YXT literal 0 HcmV?d00001 diff --git a/static/img/row_height_dialog.png b/static/img/row_height_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..34f58f5dc5c9e5fab185103278c1358c52920448 GIT binary patch literal 7849 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�&$^>DJU$o0(oNsmcPN$H#Nol&*0uwd0; z@mPY{*c%k<+74zQf9EJqIMs|fap;%68LO}}8^WsvvYVaFL_GR7^}-m!3PKIBbz$z2ycdDJVK_#Hin6gB?cCG(E7BWm9Dc z+pI$Wt#Z5%0ieNLoo}=9@O%VD5LIN*!9NI<0ousS%zSZF)3O8zI2&N{U~4M1yjzC`^egO31J!wSN5cYx!p#bgBVq>N7=(Tn-)%tv$cy*~4*cAZi4_7(sJYaw2N;Sm#4 zHq!g#{Jg?#PCAVEK|6QQE|FTM1hV}-QDjt<<<-UMb0MM3{h+k<>C64h>rQJv_bG2Q zY=CXPxY5JUFKfd`tmXQ0`^F2AN?z~)zf5XW?KH<7d`jd})1W%Bw)V=@f0g+eJ3DM8 zEBp%-#s_e`8Jm)xj;wWGsJ*^A&o3&nMt&7|!osq**U!!Gw_|>rlmXGt-J$|&wz;f% zZ_gttD(VZc?m(8UHpif+=kezf=NtT{uq8?wTG|vI zi(71LZ1?WnGv2v$6Q%>v0F*KQ{{0(}oUDSv$lt$zxn^Y>BlW^{U%h(9Z;RMzte)5` zGHs#>@4%WR_yiiI>Xgd3=xE2|Hqbm!1FCiQe*r!>2gd4=z+}$OngfYa1B_o&FoQIbia{B<+MMn!g@%WF_H)*l^QCaD z1>xZ0^4cP(b&K@dHpVI*0NK>~sbaC%8xLGgVBtDt9eJZ@W%l>)b#q~~P`I-oEocw2 z%gf2%01^XA?ui*-77!R682|z}G&IC+y8ZdjpFcQhtGr{IKC|=NJ;%+*;_@*xU96db z?SKUhT7twMJa_=T*y$kT+BFQz7+C`XDC-2`_fo)N0ha*a9^fx*SL5v9Fb6W2 z;XG4~=UrDhz$}uk20BH8J9mEC4Q6bP>*(s1yG)4!`TobvjmHsH)VAtn`sXq)FK@OA zZFAusup&jE@j$p**Z=R>X_<=?gND#1`cA&!n7S3z!(Aw74vSxyf ziwkg;IB>7≺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 Date: Wed, 28 Oct 2026 13:59:26 +0300 Subject: [PATCH 20/32] [fix] correct v6.0.4 a11y, toolbar and action docs - formula help close icon: drop the claim that it is focusable and works with Enter/Space (it handles only mouse and touch) - ACR 2.4.7: the link popup is back in the list of focus rings - customization: Border color updates when a border color is chosen, not when the active cell changes - beforeAction/afterAction: groupAction is the action run instead of action when cell is a range, with example values --- docs/accessibility.md | 2 +- docs/accessibility_conformance_report.md | 2 +- docs/api/spreadsheet_afteraction_event.md | 2 +- docs/api/spreadsheet_beforeaction_event.md | 2 +- docs/customization.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/accessibility.md b/docs/accessibility.md index 405eb322..4c829a98 100644 --- a/docs/accessibility.md +++ b/docs/accessibility.md @@ -123,7 +123,7 @@ The headers are not tab stops. A click on a column letter, a row number or the c | Cell editor input | `aria-label` | "Cell editor, B7" | | Editor of a cell with a list of values | `role="combobox"`, `aria-controls`, `aria-expanded`, `aria-activedescendant` | The list of values is a `listbox` of `option` elements, and the highlighted option is `aria-selected` | | Editor with an invalid value | `aria-invalid="true"` | The saved value of the cell is not in its list of values. The attribute is updated after the value is saved, not while the user types | -| Close icon of the formula help | `role="button"` + `aria-label` | "Close formula help". The icon is focusable and closes the help on Enter or Space | +| Close icon of the formula help | `role="button"` + `aria-label` | "Close formula help" | ### Toolbar and menus diff --git a/docs/accessibility_conformance_report.md b/docs/accessibility_conformance_report.md index 0cd23b43..0c8a9180 100644 --- a/docs/accessibility_conformance_report.md +++ b/docs/accessibility_conformance_report.md @@ -109,7 +109,7 @@ theme" is a configuration dependency, not a defect. Criterion 4.1.1 Parsing is r | **1.4.13** Content on Hover or Focus | Supports | Toolbar tooltips stay open while hovered and are dismissed with `Esc` without moving the pointer or the focus. The invalid-value tooltip reports an input error, stays while the cell is active, and is removed with `Esc`. | | **2.4.5** Multiple Ways | Not Applicable | Applies to locating pages within a set of web pages; out of scope for a single embedded component (host-application concern). | | **2.4.6** Headings and Labels | Supports | The main parts take their accessible names from the locale: "Spreadsheet" (grid), "Formatting" (toolbar), "Borders", "Search" and "Link" (the toolbars of the Border popup, the search bar and the link popup), "Main" (menu bar), "Cell" and "Sheet" (context menus of the cells and the sheet tabs), "Sheets" (sheet tab bar), "Formula bar, B7" (formula bar) and "Cell editor, B7" (cell editor). The select-all corner is named "Select all", the search bar is named "Search" and its buttons "Previous match", "Next match" and "Close search", the button that adds a sheet is named "Add sheet", and the other dialogs are named by their titles. | -| **2.4.7** Focus Visible | Supports | The keyboard focus location is visible at all times. The active cell always has a 2px solid border, and the focused cell or cell editor has a 2px outline, both in the primary color of the theme. The formula bar and the controls of the toolbar, the menu bar, the sheet tabs, the search bar and the Border popup show a 2px focus ring in the `--dhx-spreadsheet-focus-color` color. In the color palette, the border style list, the dropdowns of the toolbar and the menu bar, and the context menus, the focused item has a 1px dashed outline. In the list editor, the focused item is highlighted with a background color. The focus indicator is shown in every built-in theme. | +| **2.4.7** Focus Visible | Supports | The keyboard focus location is visible at all times. The active cell always has a 2px solid border, and the focused cell or cell editor has a 2px outline, both in the primary color of the theme. The formula bar and the controls of the toolbar, the menu bar, the sheet tabs, the Border popup, the link popup and the search bar show a 2px focus ring in the `--dhx-spreadsheet-focus-color` color. In the color palette, the border style list, the dropdowns of the toolbar and the menu bar, and the context menus, the focused item has a 1px dashed outline. In the list editor, the focused item is highlighted with a background color. The focus indicator is shown in every built-in theme. | | **2.4.11** Focus Not Obscured (Minimum) (2.2 only) | Supports | The active cell is scrolled into view next to the frozen rows and columns, so it is never left behind a frozen area. | | **2.5.7** Dragging Movements (2.2 only) | Supports | Range selection has `Shift`+arrows and `Ctrl`+`Space`/`Shift`+`Space`. Column width and row height are set with the *Column width* and *Row height* commands of the context menu, with undo. Hidden rows and columns are shown with `Ctrl`+`Shift`+`9`/`0` and the *Show rows*/*Show columns* commands. Filling cells is available through the [`groupFill`](api/spreadsheet_groupfill_event.md) event, which can be bound to a context menu command. | | **2.5.8** Target Size (Minimum) (2.2 only) | Partially Supports | The fill handle is 12 x 12 CSS px. The column and row resizers have equivalent controls, the *Column width* and *Row height* commands. The select-all corner is the 40 x 32 CSS px corner header cell, and the toolbar and menu controls are larger than 24 x 24 CSS px. | diff --git a/docs/api/spreadsheet_afteraction_event.md b/docs/api/spreadsheet_afteraction_event.md index f2ca244f..9914ea42 100644 --- a/docs/api/spreadsheet_afteraction_event.md +++ b/docs/api/spreadsheet_afteraction_event.md @@ -42,7 +42,7 @@ The callback of the event takes the following parameters: - `col` - (optional) the zero-based index of the column of the cell - `val` - (optional) the new value that the action applies, for example, a cell value, a style or a size - `prev` - (optional) the previous value - - `groupAction` - (optional) the name of the group action, if the action is applied to a range of cells + - `groupAction` - (optional) the name of the action that is executed instead of `action` when `cell` is a range of cells, for example, `"groupAction"`, `"groupRowAction"` or `"resizeCol"` - `pageId` - (optional) the id of the sheet - `pageName` - (optional) the name of the sheet diff --git a/docs/api/spreadsheet_beforeaction_event.md b/docs/api/spreadsheet_beforeaction_event.md index 76995cab..bd601d81 100644 --- a/docs/api/spreadsheet_beforeaction_event.md +++ b/docs/api/spreadsheet_beforeaction_event.md @@ -42,7 +42,7 @@ The callback of the event takes the following parameters: - `col` - (optional) the zero-based index of the column of the cell - `val` - (optional) the new value that the action applies, for example, a cell value, a style or a size - `prev` - (optional) the previous value - - `groupAction` - (optional) the name of the group action, if the action is applied to a range of cells + - `groupAction` - (optional) the name of the action that is executed instead of `action` when `cell` is a range of cells, for example, `"groupAction"`, `"groupRowAction"` or `"resizeCol"` - `pageId` - (optional) the id of the sheet - `pageName` - (optional) the name of the sheet diff --git a/docs/customization.md b/docs/customization.md index e831e3a8..fd2f02ad 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -31,7 +31,7 @@ Then you can use the name of the icon as the value of the `icon` property in the You can add the following types of controls: `button`, `menuItem`, `separator`, and `spacer`. -The *Text color* and *Background color* controls of the [default toolbar](#default-controls), and the *Border color* control in the *Border* popup, are of the [`navItem`](https://docs.dhtmlx.com/suite/toolbar/navitem/) type. They draw the current color with the [`html`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/) property, take their accessible name from the [`value`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/) property, for example, "Text color: dark gray", and open a color popup. The Spreadsheet updates both properties when the active cell changes. +The *Text color* and *Background color* controls of the [default toolbar](#default-controls), and the *Border color* control in the *Border* popup, are of the [`navItem`](https://docs.dhtmlx.com/suite/toolbar/navitem/) type. They draw the current color with the [`html`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/) property, take their accessible name from the [`value`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/) property, for example, "Text color: dark gray", and open a color popup. The Spreadsheet updates both properties of the *Text color* and *Background color* controls when the active cell changes, and of the *Border color* control when a border color is chosen. The `button` object has the following properties: From 45abafaef0c16b878c73f5697ee5222234941ac0 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Wed, 28 Oct 2026 13:59:37 +0300 Subject: [PATCH 21/32] [fix] align v6.0.4 docs with the final behavior - search highlights and scrolls to a match, it doesn't change the active cell (data search, Ctrl+G hotkeys) - formula bar is empty and locked while the selection is off - ACR 1.4.11: 2px applies to cells, formula bar and bar controls - announce() example sets menu: true so the command is visible - selection config: Ctrl+F6 skips the grid, not the sheet - four screen reader locales (grid added), calendar and timepicker locales in Localizing built-in widgets - read-only mode: no context menu, Shift+F10 and Open filter - getSelectedCell() returns undefined when nothing is selected - what's new: cell links rendered as real links, Alt+Enter - customization: all default toolbar controls are navItems - merge_cells: whole rows/columns also selected with the keyboard --- docs/accessibility.md | 10 +++++++--- docs/accessibility_conformance_report.md | 2 +- docs/api/selection_getselectedcell_method.md | 2 +- docs/api/spreadsheet_announce_method.md | 5 +++-- docs/api/spreadsheet_selection_config.md | 2 +- docs/customization.md | 6 +++--- docs/data_search.md | 2 +- docs/filtering_data.md | 2 +- docs/hotkeys.md | 6 +++--- docs/localization.md | 4 +++- docs/merge_cells.md | 2 +- docs/whats_new.md | 1 + 12 files changed, 26 insertions(+), 18 deletions(-) diff --git a/docs/accessibility.md b/docs/accessibility.md index 4c829a98..de9aba60 100644 --- a/docs/accessibility.md +++ b/docs/accessibility.md @@ -24,7 +24,7 @@ Conformance is reported criterion by criterion for DHTMLX Spreadsheet 6.0.4. The | WAI-ARIA semantics | The cells are a `grid` with `columnheader`, `rowheader` and `gridcell` elements. The roles are always rendered | | Focus model | The keyboard focus is on the active cell. Tab enters the sheet on the active cell and leaves it from the last and the first cell. Ctrl + F6 moves the focus between the menu, the toolbar, the sheet and the sheet tabs | | Selection model | The active cell, a range and several ranges are exposed through `aria-selected`, and the extent of a range is announced. The selection can be turned off with the [`selection`](api/spreadsheet_selection_config.md) option | -| Read-only mode | The sheet can be navigated, selected, copied and searched; edits are refused and announced | +| Read-only mode | The sheet can be navigated, selected, copied and searched; edits are refused and announced, and the context menu is not available | | Screen readers | Tested with NVDA, JAWS and VoiceOver | | Visual accessibility | The `contrast-light` and `contrast-dark` themes, a visible focus indicator in every theme, and cues that don't depend on color | | Text resize and zoom | The layout stays operable at 200% and 400% zoom and with text spacing overrides | @@ -119,7 +119,7 @@ The headers are not tab stops. A click on a column letter, a row number or the c | Selector | Role / attribute | Purpose | | -------- | ---------------- | ------- | -| Formula bar input | `aria-label` | "Formula bar, B7", with the address of the active cell. The input is `readonly` on a locked cell and while the selection is turned off, so its value can still be read | +| Formula bar input | `aria-label` | "Formula bar, B7", with the address of the active cell. The input is `readonly` on a locked cell, so its value can still be read. While the selection is turned off, the formula bar is empty and locked | | Cell editor input | `aria-label` | "Cell editor, B7" | | Editor of a cell with a list of values | `role="combobox"`, `aria-controls`, `aria-expanded`, `aria-activedescendant` | The list of values is a `listbox` of `option` elements, and the highlighted option is `aria-selected` | | Editor with an invalid value | `aria-invalid="true"` | The saved value of the cell is not in its list of values. The attribute is updated after the value is saved, not while the user types | @@ -371,7 +371,7 @@ To show the data without an active cell and without selection, add [`selection: ### Translated accessibility strings -Screen readers read the accessibility strings from three locales: `spreadsheet` holds the names, cell descriptions and announcements, `colorpicker` holds the color names, and `message` holds the names of the alert buttons. Set all three before you create the Spreadsheet. See [Localizing built-in widgets](localization.md#localizing-built-in-widgets) for the keys: +Screen readers read the accessibility strings from four locales: `spreadsheet` holds the names, cell descriptions and announcements, `colorpicker` holds the color names, `message` holds the names of the alert buttons, and `grid` holds the announcement of the number of loaded rows. Set all four before you create the Spreadsheet. See [Localizing built-in widgets](localization.md#localizing-built-in-widgets) for the keys: ~~~jsx const deSpreadsheet = { @@ -386,10 +386,14 @@ const deColorpicker = { const deMessage = { aria_confirm: "Bestätigen" }; +const deGrid = { + aria_rowsLoaded: "{count} Zeilen geladen" +}; dhx.i18n.setLocale("spreadsheet", deSpreadsheet); dhx.i18n.setLocale("colorpicker", deColorpicker); dhx.i18n.setLocale("message", deMessage); +dhx.i18n.setLocale("grid", deGrid); const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); ~~~ diff --git a/docs/accessibility_conformance_report.md b/docs/accessibility_conformance_report.md index 0c8a9180..583649c6 100644 --- a/docs/accessibility_conformance_report.md +++ b/docs/accessibility_conformance_report.md @@ -104,7 +104,7 @@ theme" is a configuration dependency, not a defect. Criterion 4.1.1 Parsing is r | **1.4.4** Resize Text | Supports | Text can be resized to 200% without loss of content or functionality; the toolbar, the formula bar, the sheet tabs and the dialogs remain usable. | | **1.4.5** Images of Text | Supports | All text is rendered as real text. Icons are font glyphs; the product uses no raster images. | | **1.4.10** Reflow | Supports | The cells are two-dimensional content, which the criterion exempts from reflow, and scroll both horizontally and vertically. The toolbar, the menu bar and the sheet tabs fit a width of 320 CSS px. | -| **1.4.11** Non-text Contrast | Supports | The focus indicators are 2px wide and drawn in theme colors; the ratios below are given for the default light, `contrast-light`, dark and `contrast-dark` themes. The active cell is marked by a 2px solid border in `--dhx-color-primary`: about 3.9:1, 7.7:1, 3.4:1 and 5.3:1 against the cell background. The cell and the cell editor that have the keyboard focus get a 2px outline in the same color, with the same ratios, and about 3.3:1, 6.0:1, 3.1:1 and 4.2:1 inside a selected range. The formula bar gets a 2px outline in `--dhx-spreadsheet-focus-color`: about 3.9:1, 7.7:1, 5.3:1 and 6.5:1 against its background. The controls of the toolbar, the menu bar and the sheet tabs get the same outline: about 3.7:1, 7.2:1, 3.9:1 and 4.9:1 against the bar background. All values are above the 3:1 requirement. | +| **1.4.11** Non-text Contrast | Supports | The focus indicators of the cells, the formula bar and the bar controls are 2px wide and drawn in theme colors; the ratios below are given for the default light, `contrast-light`, dark and `contrast-dark` themes. The active cell is marked by a 2px solid border in `--dhx-color-primary`: about 3.9:1, 7.7:1, 3.4:1 and 5.3:1 against the cell background. The cell and the cell editor that have the keyboard focus get a 2px outline in the same color, with the same ratios, and about 3.3:1, 6.0:1, 3.1:1 and 4.2:1 inside a selected range. The formula bar gets a 2px outline in `--dhx-spreadsheet-focus-color`: about 3.9:1, 7.7:1, 5.3:1 and 6.5:1 against its background. The controls of the toolbar, the menu bar and the sheet tabs get the same outline: about 3.7:1, 7.2:1, 3.9:1 and 4.9:1 against the bar background. All values are above the 3:1 requirement. | | **1.4.12** Text Spacing | Supports | With the WCAG text-spacing overrides applied, no control label is cut; the sheet tab bar scrolls when the tabs grow. | | **1.4.13** Content on Hover or Focus | Supports | Toolbar tooltips stay open while hovered and are dismissed with `Esc` without moving the pointer or the focus. The invalid-value tooltip reports an input error, stays while the cell is active, and is removed with `Esc`. | | **2.4.5** Multiple Ways | Not Applicable | Applies to locating pages within a set of web pages; out of scope for a single embedded component (host-application concern). | diff --git a/docs/api/selection_getselectedcell_method.md b/docs/api/selection_getselectedcell_method.md index 7aa6e703..83d8b0a6 100644 --- a/docs/api/selection_getselectedcell_method.md +++ b/docs/api/selection_getselectedcell_method.md @@ -18,7 +18,7 @@ getSelectedCell(): string; ### Returns -The method returns the id(s) or a range of selected cell(s) +The method returns the id(s) or a range of selected cell(s), or `undefined` if no cell is selected, for example, while the selection is turned off with the [`selection: false`](api/spreadsheet_selection_config.md) configuration option or the [`selection.disable()`](api/selection_disable_method.md) method ### Example diff --git a/docs/api/spreadsheet_announce_method.md b/docs/api/spreadsheet_announce_method.md index 3b4246e8..04127f90 100644 --- a/docs/api/spreadsheet_announce_method.md +++ b/docs/api/spreadsheet_announce_method.md @@ -24,9 +24,10 @@ announce(message: string): void; In the example below, a custom menu command counts the empty cells in the selected range and announces the result: -~~~jsx {17} +~~~jsx {18} const spreadsheet = new dhx.Spreadsheet("spreadsheet", { - // config parameters + menu: true, + // other config parameters }); spreadsheet.parse(data); diff --git a/docs/api/spreadsheet_selection_config.md b/docs/api/spreadsheet_selection_config.md index e8c743e8..5e2e54e2 100644 --- a/docs/api/spreadsheet_selection_config.md +++ b/docs/api/spreadsheet_selection_config.md @@ -39,7 +39,7 @@ When the property is set to `false`: - the cells can't be selected with the mouse, the keyboard or the API: the [`setSelectedCell()`](api/selection_setselectedcell_method.md) and [`setFocusedCell()`](api/selection_setfocusedcell_method.md) methods are ignored, and the [`getSelectedCell()`](api/selection_getselectedcell_method.md) and [`getFocusedCell()`](api/selection_getfocusedcell_method.md) methods return `undefined` - the cells can't be edited from the interface: the formula bar is locked, the fill handle is hidden, and the [`startEdit()`](api/spreadsheet_startedit_method.md) method is ignored - the context menu and the column menu icon are not available -- `Tab` stops on the grid once and moves the focus further, and `Ctrl + F6` skips the sheet +- `Tab` stops on the grid once and moves the focus further, and `Ctrl + F6` skips the grid The columns and rows can still be resized by dragging their borders, and the data can still be changed with the API, for example, with the [`setValue()`](api/spreadsheet_setvalue_method.md) method. diff --git a/docs/customization.md b/docs/customization.md index fd2f02ad..5973384e 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -31,7 +31,7 @@ Then you can use the name of the icon as the value of the `icon` property in the You can add the following types of controls: `button`, `menuItem`, `separator`, and `spacer`. -The *Text color* and *Background color* controls of the [default toolbar](#default-controls), and the *Border color* control in the *Border* popup, are of the [`navItem`](https://docs.dhtmlx.com/suite/toolbar/navitem/) type. They draw the current color with the [`html`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/) property, take their accessible name from the [`value`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/) property, for example, "Text color: dark gray", and open a color popup. The Spreadsheet updates both properties of the *Text color* and *Background color* controls when the active cell changes, and of the *Border color* control when a border color is chosen. +Like the other controls of the [default toolbar](#default-controls), the *Text color* and *Background color* controls, and the *Border color* control in the *Border* popup, are of the [`navItem`](https://docs.dhtmlx.com/suite/toolbar/navitem/) type. They draw the current color with the [`html`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/) property, take their accessible name from the [`value`](https://docs.dhtmlx.com/suite/toolbar/api/api_navitem_properties/) property, for example, "Text color: dark gray", and open a color popup. The Spreadsheet updates both properties of the *Text color* and *Background color* controls when the active cell changes, and of the *Border color* control when a border color is chosen. The `button` object has the following properties: @@ -119,8 +119,8 @@ The [default toolbar](/#toolbar) contains the following blocks of controls: - the *Undo* button (id: "undo") - the *Redo* button (id: "redo") - the **Colors** block - - the *Text color* navItem (id: "color") - - the *Background color* navItem (id: "background") + - the *Text color* button (id: "color") + - the *Background color* button (id: "background") - the **Font** block - the *Font size* combobox (id: "font-size") - the **Decoration** block diff --git a/docs/data_search.md b/docs/data_search.md index f8686d63..433ea08b 100644 --- a/docs/data_search.md +++ b/docs/data_search.md @@ -13,7 +13,7 @@ To open a search bar, use one of two options: ![DHTMLX Spreadsheet search bar with a text input for finding data](/img/search_data.png) -Type the text to find in the search bar. The first cell that contains the text becomes active, and the counter shows the number of matches. To move between the matches, click the arrow buttons in the search bar. +Type the text to find in the search bar. The first cell that contains the text is highlighted and scrolled into view, and the counter shows the number of matches. To move between the matches, click the arrow buttons in the search bar. The search results are updated after the cells are edited and after another sheet is opened. Screen readers announce the number of matches and the address of the first match after you stop typing, for example, "Results: 5. 1 of 5, B2", or "No results". When you move to another match, they announce its position and address, for example, "2 of 5, B7". diff --git a/docs/filtering_data.md b/docs/filtering_data.md index 4664cba5..50ce3b69 100644 --- a/docs/filtering_data.md +++ b/docs/filtering_data.md @@ -30,7 +30,7 @@ To open the filter of a column without the mouse: ![DHTMLX Spreadsheet context menu of a header cell with the filter icon and the Open filter command focused](/img/open_filter_context_menu.png) -The *Open filter* command appears in the context menu only for the cells with the **filter** icon. You can also choose it after right-clicking such a cell. +The *Open filter* command appears in the context menu only for the cells with the **filter** icon. You can also choose it after right-clicking such a cell. In the [read-only mode](api/spreadsheet_readonly_config.md), the context menu and the *Open filter* command are not available. The filter popup takes the focus, and `Tab` moves between its controls. `Esc` closes the popup and returns the focus to the cell. If a dropdown list or a date picker is open in the popup, `Esc` closes it first. diff --git a/docs/hotkeys.md b/docs/hotkeys.md index 4c5bb597..81acdc9c 100644 --- a/docs/hotkeys.md +++ b/docs/hotkeys.md @@ -11,7 +11,7 @@ Here is a list of hotkeys that you can use while working with DHTMLX Spreadsheet :::note The shortcuts for cells work while the focus is in the cells or in the formula bar. The formatting, undo, search, link and add-sheet shortcuts also work while the focus is on the toolbar. When the focus is on the toolbar, the menu bar or the sheet tabs, the arrow keys, **Home**, **End**, **Enter** and **Space** work within that bar (see [Moving the focus](#moving-the-focus)). -In the [read-only mode](api/spreadsheet_readonly_config.md), the shortcuts for navigation, selection, copying and search work. The shortcuts that change the sheet, including **Ctrl (Cmd) + Shift + 9**, **Ctrl (Cmd) + Shift + 0** and **Shift + F11**, are refused, and screen readers announce "The sheet is read-only". +In the [read-only mode](api/spreadsheet_readonly_config.md), the shortcuts for navigation, selection, copying and search work. The shortcuts that change the sheet, including **Ctrl (Cmd) + Shift + 9**, **Ctrl (Cmd) + Shift + 0** and **Shift + F11**, are refused, and screen readers announce "The sheet is read-only". The context menu isn't available, so **Shift + F10** and the Menu key don't work. To learn how the keyboard navigation works with screen readers, check the [Accessibility](accessibility.md#keyboard-navigation) guide. ::: @@ -250,11 +250,11 @@ The toolbar, the menu bar and the sheet tabs are single tab stops: Tab mo Ctrl (Cmd) + G - moves selection to the next found match + highlights the next found match Ctrl (Cmd) + Shift + G - moves selection to the previous found match + highlights the previous found match Esc diff --git a/docs/localization.md b/docs/localization.md index 2c122a1d..2b91a402 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -304,12 +304,14 @@ const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); ## Localizing built-in widgets -Spreadsheet uses the Colorpicker, Grid, Toolbar, Window and Message widgets of DHTMLX Suite inside. Their strings are stored in separate locales, which you can translate in the same way as the `spreadsheet` locale: +Spreadsheet uses the Calendar, Colorpicker, Grid, Timepicker, Toolbar, Window and Message widgets of DHTMLX Suite inside. Their strings are stored in separate locales, which you can translate in the same way as the `spreadsheet` locale: | Locale | Strings used in Spreadsheet | | ------ | --------------------------- | +| `calendar` | the month and day names of the date editor and of the date filter | | `colorpicker` | the labels of the custom color mode in the color popups of the toolbar, the name of the palette, and the color names that screen readers read for the swatches and the color buttons, for example, "Text color: dark gray" | | `grid` | the announcement of the number of loaded rows | +| `timepicker` | the labels of the time editor | | `toolbar` | the default accessible name of a toolbar | | `window` | the default accessible name of a dialog | | `message` | the accessible names of the alert and confirm dialogs and of their buttons | diff --git a/docs/merge_cells.md b/docs/merge_cells.md index 54e58507..62e46797 100644 --- a/docs/merge_cells.md +++ b/docs/merge_cells.md @@ -52,6 +52,6 @@ When you remove a row or a column through a merged cell, every row or column tha ![DHTMLX Spreadsheet context menu with the Rows submenu showing Remove rows 2-4 for a merged cell](/img/remove_merged_rows_context_menu.png) -When whole rows or columns are selected by clicking their headers, only the selected rows or columns are removed. A merged cell that spans them becomes smaller, and a merged cell left with a single cell becomes an ordinary cell. +When whole rows or columns are selected, for example, by clicking their headers or with `Shift + Space` or `Ctrl (Cmd) + Space`, only the selected rows or columns are removed. A merged cell that spans them becomes smaller, and a merged cell left with a single cell becomes an ordinary cell. Merged cells located below or on the right of the removed rows or columns move together with them. diff --git a/docs/whats_new.md b/docs/whats_new.md index 0780dccf..d6fb40af 100644 --- a/docs/whats_new.md +++ b/docs/whats_new.md @@ -31,6 +31,7 @@ Released on October , 2026 - The toolbar color and border popups take the keyboard focus when they open and close with `Esc` and `Tab` - Text composed with an input method editor (IME) is shown in the active cell and starts the edit through the [`startEdit()`](api/spreadsheet_startedit_method.md) method, so the `beforeEditStart` and `afterEditStart` events fire for it - The [`setFocusedCell()`](api/selection_setfocusedcell_method.md) method moves the keyboard focus to the cell +- A [link in a cell](work_with_cells.md#inserting-a-hyperlink-into-a-cell) is rendered as a real link that opens in a new tab, and `Alt (Option) + Enter` opens the link of the active cell - The [read-only mode](api/spreadsheet_readonly_config.md) keeps the keyboard navigation, the selection, copying and search, and screen readers announce the refused edits. To turn the selection off, use the `selection: false` option - [Removing a row or a column through a merged cell](merge_cells.md#removing-rows-and-columns-of-merged-cells) removes all the rows or columns of the merged cell - New interface and screen reader strings in the [`spreadsheet` locale](localization.md#default-locale), and [translation of the built-in widgets](localization.md#localizing-built-in-widgets) From f6a2ff817fb076c864cfbf48784f9749d8ae9c3f Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Wed, 28 Oct 2026 15:09:04 +0300 Subject: [PATCH 22/32] [update] group toolbar popup focus in what's new - the color and border popup line moved into the Keyboard navigation sub-list of v6.0.4 Updates --- docs/whats_new.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/whats_new.md b/docs/whats_new.md index d6fb40af..98134da9 100644 --- a/docs/whats_new.md +++ b/docs/whats_new.md @@ -27,8 +27,8 @@ Released on October , 2026 - the focus stays on the active cell, `Tab` and `Shift + Tab` leave the cells from the last and the first cell of the sheet, and `Ctrl + F6` moves the focus between the menu, the toolbar, the sheet and the sheet tabs - the toolbar, the menu bar and the sheet tabs are single tab stops navigated with the arrow keys - new shortcuts are added, for example, `Shift + F10` for the context menu and `Ctrl (Cmd) + Shift + 9` / `Ctrl (Cmd) + Shift + 0` for showing hidden rows and columns + - the toolbar color and border popups take the focus when they open and close with `Esc` and `Tab` - The arrow keys stop at the first and last visible row and column instead of moving to the opposite edge, and an arrow key at the edge reduces a selected range to the active cell -- The toolbar color and border popups take the keyboard focus when they open and close with `Esc` and `Tab` - Text composed with an input method editor (IME) is shown in the active cell and starts the edit through the [`startEdit()`](api/spreadsheet_startedit_method.md) method, so the `beforeEditStart` and `afterEditStart` events fire for it - The [`setFocusedCell()`](api/selection_setfocusedcell_method.md) method moves the keyboard focus to the cell - A [link in a cell](work_with_cells.md#inserting-a-hyperlink-into-a-cell) is rendered as a real link that opens in a new tab, and `Alt (Option) + Enter` opens the link of the active cell From ba324160cdb317bc3e0b86d856861d332c30fca3 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Wed, 28 Oct 2026 16:26:57 +0300 Subject: [PATCH 23/32] [update] simplify a11y, selection and Excel import notes - accessibility.md: removed the IME sentence from the cell editing paragraph - getFocusedCell(), getSelectedCell(): removed the undefined return case - excel_import_export.md: shortened the import/export announcement and the WebAssembly error notes --- docs/accessibility.md | 2 +- docs/api/selection_getfocusedcell_method.md | 2 +- docs/api/selection_getselectedcell_method.md | 2 +- docs/excel_import_export.md | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/accessibility.md b/docs/accessibility.md index de9aba60..929928d1 100644 --- a/docs/accessibility.md +++ b/docs/accessibility.md @@ -176,7 +176,7 @@ The DOM focus is on the active cell itself, so a screen reader reads the cell, n | An edit of a locked cell is refused | "The cell is locked" | | An editing key is pressed in the read-only mode | "The sheet is read-only" | -Enter, F2 or typing opens the editor. Enter saves the value and moves down, Tab saves it and moves right, and Esc cancels the edit. Text composed with an input method editor (IME) is shown over the active cell from the first key and opens the editor when the composition ends. +Enter, F2 or typing opens the editor. Enter saves the value and moves down, Tab saves it and moves right, and Esc cancels the edit. ## Keyboard navigation diff --git a/docs/api/selection_getfocusedcell_method.md b/docs/api/selection_getfocusedcell_method.md index c429523d..1142c280 100644 --- a/docs/api/selection_getfocusedcell_method.md +++ b/docs/api/selection_getfocusedcell_method.md @@ -18,7 +18,7 @@ getFocusedCell(): string; ### Returns -The method returns the id of the focused cell, or `undefined` if there is no focused cell, for example, while the selection is turned off with the [`selection: false`](api/spreadsheet_selection_config.md) configuration option or the [`selection.disable()`](api/selection_disable_method.md) method +The method returns the id of the focused cell ### Example diff --git a/docs/api/selection_getselectedcell_method.md b/docs/api/selection_getselectedcell_method.md index 83d8b0a6..7aa6e703 100644 --- a/docs/api/selection_getselectedcell_method.md +++ b/docs/api/selection_getselectedcell_method.md @@ -18,7 +18,7 @@ getSelectedCell(): string; ### Returns -The method returns the id(s) or a range of selected cell(s), or `undefined` if no cell is selected, for example, while the selection is turned off with the [`selection: false`](api/spreadsheet_selection_config.md) configuration option or the [`selection.disable()`](api/selection_disable_method.md) method +The method returns the id(s) or a range of selected cell(s) ### Example diff --git a/docs/excel_import_export.md b/docs/excel_import_export.md index b9424017..03c75327 100644 --- a/docs/excel_import_export.md +++ b/docs/excel_import_export.md @@ -38,8 +38,8 @@ Go to: *File -> Download As... -> Microsoft Excel (.xlsx)* in the menu 2\. Check your downloads directory to find the Excel file with data from Spreadsheet. -Screen readers announce the start and the end of the export to Excel, and of the import of a file chosen in the file dialog. Loading a file by URL is not announced. +Screen readers announce the start and the end of import and export. :::note -Import and export of Excel files use WebAssembly. If the browser doesn't support WebAssembly, the Import and Export commands show a message with the text of the `wasmNotSupported` [locale](localization.md#default-locale) key. The [`load()`](api/spreadsheet_load_method.md) method with the `"xlsx"` type, or with the `"json"` type and no URL, and the [`export.xlsx()`](api/export_xlsx_method.md) method throw an `Error` with the same text. The error is thrown when the method is called, so catch it with `try...catch`. +Import and export of Excel files use WebAssembly. If the browser doesn't support WebAssembly, the Import and Export commands show a message with the text of the `wasmNotSupported` [locale](localization.md#default-locale) key. The [`load()`](api/spreadsheet_load_method.md) method with the `"xlsx"` type and the [`export.xlsx()`](api/export_xlsx_method.md) method throw an `Error` with the same text, which you can catch in your code. ::: From 5bde9b295fcdae7e2dcf81f30ee99378819d8d3f Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Wed, 28 Oct 2026 17:07:56 +0300 Subject: [PATCH 24/32] [update] sync ru, de, zh, ko translations with v6.0.4 - translated the new Accessibility and Accessibility Conformance Report pages - translated the new announce(), selection config and selection enable()/disable()/isDisabled() pages - updated the translations of the pages changed for v6.0.4 (hotkeys, localization, what's new, API and guide pages) - added the Accessibility sidebar category label - explicit English heading ids on the new pages so cross-page anchors resolve - .sync markers moved to 1853f285 --- .../current.json | 4 + .../current/.sync | 2 +- .../current/accessibility.md | 449 ++++++++++++++++++ .../accessibility_conformance_report.md | 220 +++++++++ .../current/angular_integration.md | 6 +- .../current/api/api_overview.md | 7 +- .../current/api/overview/actions_overview.md | 11 +- .../current/api/overview/methods_overview.md | 3 +- .../api/overview/properties_overview.md | 3 +- .../api/overview/selection_overview.md | 5 +- .../current/api/selection_disable_method.md | 47 ++ .../current/api/selection_enable_method.md | 42 ++ .../api/selection_isdisabled_method.md | 41 ++ .../api/selection_setfocusedcell_method.md | 27 +- .../api/selection_setselectedcell_method.md | 3 +- .../api/spreadsheet_afteraction_event.md | 29 +- .../api/spreadsheet_announce_method.md | 67 +++ .../api/spreadsheet_beforeaction_event.md | 29 +- .../api/spreadsheet_deletecolumn_method.md | 30 +- .../api/spreadsheet_deleterow_method.md | 30 +- .../api/spreadsheet_readonly_config.md | 34 +- .../api/spreadsheet_selection_config.md | 63 +++ .../api/spreadsheet_startedit_method.md | 6 + .../current/configuration.md | 35 +- .../current/customization.md | 11 +- .../current/data_search.md | 10 +- .../current/excel_import_export.md | 8 +- .../current/filtering_data.md | 16 +- .../current/guides.md | 10 +- .../current/hotkeys.md | 201 +++++++- .../current/localization.md | 149 +++++- .../current/merge_cells.md | 12 +- .../current/react/overview.md | 8 +- .../current/react/props.md | 11 +- .../current/react/themes.md | 3 + .../current/react/types.md | 8 + .../current/themes/themes.md | 28 +- .../current/vuejs_integration.md | 6 +- .../current/whats_new.md | 52 ++ .../current/work_with_cells.md | 17 +- .../current/work_with_rows_cols.md | 66 ++- .../current.json | 4 + .../current/.sync | 2 +- .../current/accessibility.md | 449 ++++++++++++++++++ .../accessibility_conformance_report.md | 218 +++++++++ .../current/angular_integration.md | 6 +- .../current/api/api_overview.md | 7 +- .../current/api/overview/actions_overview.md | 11 +- .../current/api/overview/methods_overview.md | 3 +- .../api/overview/properties_overview.md | 3 +- .../api/overview/selection_overview.md | 5 +- .../current/api/selection_disable_method.md | 47 ++ .../current/api/selection_enable_method.md | 42 ++ .../api/selection_isdisabled_method.md | 41 ++ .../api/selection_setfocusedcell_method.md | 27 +- .../api/selection_setselectedcell_method.md | 3 +- .../api/spreadsheet_afteraction_event.md | 29 +- .../api/spreadsheet_announce_method.md | 67 +++ .../api/spreadsheet_beforeaction_event.md | 29 +- .../api/spreadsheet_deletecolumn_method.md | 30 +- .../api/spreadsheet_deleterow_method.md | 30 +- .../api/spreadsheet_readonly_config.md | 34 +- .../api/spreadsheet_selection_config.md | 63 +++ .../api/spreadsheet_startedit_method.md | 6 + .../current/configuration.md | 35 +- .../current/customization.md | 9 +- .../current/data_search.md | 10 +- .../current/excel_import_export.md | 8 +- .../current/filtering_data.md | 16 +- .../current/guides.md | 10 +- .../current/hotkeys.md | 201 +++++++- .../current/localization.md | 149 +++++- .../current/merge_cells.md | 12 +- .../current/react/overview.md | 8 +- .../current/react/props.md | 11 +- .../current/react/themes.md | 3 + .../current/react/types.md | 8 + .../current/themes/themes.md | 28 +- .../current/vuejs_integration.md | 6 +- .../current/whats_new.md | 52 ++ .../current/work_with_cells.md | 17 +- .../current/work_with_rows_cols.md | 66 ++- .../current.json | 4 + .../current/.sync | 2 +- .../current/accessibility.md | 449 ++++++++++++++++++ .../accessibility_conformance_report.md | 220 +++++++++ .../current/angular_integration.md | 6 +- .../current/api/api_overview.md | 7 +- .../current/api/overview/actions_overview.md | 11 +- .../current/api/overview/methods_overview.md | 3 +- .../api/overview/properties_overview.md | 3 +- .../api/overview/selection_overview.md | 5 +- .../current/api/selection_disable_method.md | 47 ++ .../current/api/selection_enable_method.md | 42 ++ .../api/selection_isdisabled_method.md | 41 ++ .../api/selection_setfocusedcell_method.md | 27 +- .../api/selection_setselectedcell_method.md | 3 +- .../api/spreadsheet_afteraction_event.md | 29 +- .../api/spreadsheet_announce_method.md | 67 +++ .../api/spreadsheet_beforeaction_event.md | 29 +- .../api/spreadsheet_deletecolumn_method.md | 30 +- .../api/spreadsheet_deleterow_method.md | 30 +- .../api/spreadsheet_readonly_config.md | 34 +- .../api/spreadsheet_selection_config.md | 63 +++ .../api/spreadsheet_startedit_method.md | 6 + .../current/configuration.md | 35 +- .../current/customization.md | 9 +- .../current/data_search.md | 10 +- .../current/excel_import_export.md | 8 +- .../current/filtering_data.md | 16 +- .../current/guides.md | 10 +- .../current/hotkeys.md | 201 +++++++- .../current/localization.md | 149 +++++- .../current/merge_cells.md | 12 +- .../current/react/overview.md | 8 +- .../current/react/props.md | 11 +- .../current/react/themes.md | 3 + .../current/react/types.md | 8 + .../current/themes/themes.md | 28 +- .../current/vuejs_integration.md | 6 +- .../current/whats_new.md | 52 ++ .../current/work_with_cells.md | 19 +- .../current/work_with_rows_cols.md | 64 ++- .../current.json | 4 + .../current/.sync | 2 +- .../current/accessibility.md | 449 ++++++++++++++++++ .../accessibility_conformance_report.md | 204 ++++++++ .../current/angular_integration.md | 6 +- .../current/api/api_overview.md | 17 +- .../current/api/overview/actions_overview.md | 11 +- .../current/api/overview/methods_overview.md | 5 +- .../api/overview/properties_overview.md | 5 +- .../api/overview/selection_overview.md | 11 +- .../current/api/selection_disable_method.md | 47 ++ .../current/api/selection_enable_method.md | 42 ++ .../api/selection_isdisabled_method.md | 41 ++ .../api/selection_setfocusedcell_method.md | 27 +- .../api/selection_setselectedcell_method.md | 3 +- .../api/spreadsheet_afteraction_event.md | 29 +- .../api/spreadsheet_announce_method.md | 67 +++ .../api/spreadsheet_beforeaction_event.md | 29 +- .../api/spreadsheet_deletecolumn_method.md | 30 +- .../api/spreadsheet_deleterow_method.md | 30 +- .../api/spreadsheet_readonly_config.md | 34 +- .../api/spreadsheet_selection_config.md | 63 +++ .../api/spreadsheet_startedit_method.md | 6 + .../current/configuration.md | 35 +- .../current/customization.md | 9 +- .../current/data_search.md | 10 +- .../current/excel_import_export.md | 8 +- .../current/filtering_data.md | 16 +- .../current/guides.md | 10 +- .../current/hotkeys.md | 201 +++++++- .../current/localization.md | 149 +++++- .../current/merge_cells.md | 12 +- .../current/react/overview.md | 8 +- .../current/react/props.md | 11 +- .../current/react/themes.md | 3 + .../current/react/types.md | 8 + .../current/themes/themes.md | 28 +- .../current/vuejs_integration.md | 6 +- .../current/whats_new.md | 52 ++ .../current/work_with_cells.md | 17 +- .../current/work_with_rows_cols.md | 66 ++- 164 files changed, 6958 insertions(+), 274 deletions(-) create mode 100644 i18n/de/docusaurus-plugin-content-docs/current/accessibility.md create mode 100644 i18n/de/docusaurus-plugin-content-docs/current/accessibility_conformance_report.md create mode 100644 i18n/de/docusaurus-plugin-content-docs/current/api/selection_disable_method.md create mode 100644 i18n/de/docusaurus-plugin-content-docs/current/api/selection_enable_method.md create mode 100644 i18n/de/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md create mode 100644 i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md create mode 100644 i18n/de/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md create mode 100644 i18n/ko/docusaurus-plugin-content-docs/current/accessibility.md create mode 100644 i18n/ko/docusaurus-plugin-content-docs/current/accessibility_conformance_report.md create mode 100644 i18n/ko/docusaurus-plugin-content-docs/current/api/selection_disable_method.md create mode 100644 i18n/ko/docusaurus-plugin-content-docs/current/api/selection_enable_method.md create mode 100644 i18n/ko/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md create mode 100644 i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md create mode 100644 i18n/ko/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md create mode 100644 i18n/ru/docusaurus-plugin-content-docs/current/accessibility.md create mode 100644 i18n/ru/docusaurus-plugin-content-docs/current/accessibility_conformance_report.md create mode 100644 i18n/ru/docusaurus-plugin-content-docs/current/api/selection_disable_method.md create mode 100644 i18n/ru/docusaurus-plugin-content-docs/current/api/selection_enable_method.md create mode 100644 i18n/ru/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md create mode 100644 i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md create mode 100644 i18n/ru/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md create mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/accessibility.md create mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/accessibility_conformance_report.md create mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/api/selection_disable_method.md create mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/api/selection_enable_method.md create mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/api/selection_isdisabled_method.md create mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_announce_method.md create mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/api/spreadsheet_selection_config.md diff --git a/i18n/de/docusaurus-plugin-content-docs/current.json b/i18n/de/docusaurus-plugin-content-docs/current.json index fdeac066..e32ca3e6 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current.json +++ b/i18n/de/docusaurus-plugin-content-docs/current.json @@ -83,6 +83,10 @@ "message": "Arbeit mit Zellen", "description": "The generated-index page title for category 'Work with cells' in sidebar 'docs'" }, + "sidebar.docs.category.Accessibility": { + "message": "Barrierefreiheit", + "description": "The label for category 'Accessibility' in sidebar 'docs'" + }, "sidebar.docs.category.Frameworks & integrations": { "message": "Frameworks und Integrationen", "description": "The label for category 'Frameworks & integrations' in sidebar 'docs'" diff --git a/i18n/de/docusaurus-plugin-content-docs/current/.sync b/i18n/de/docusaurus-plugin-content-docs/current/.sync index 96f6c508..8fee4307 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/.sync +++ b/i18n/de/docusaurus-plugin-content-docs/current/.sync @@ -1 +1 @@ -2b6d3c2fd433461ffce34526974de3f1ba5161a8 +1853f2853225a3d5774a2d166077a4404f555063 diff --git a/i18n/de/docusaurus-plugin-content-docs/current/accessibility.md b/i18n/de/docusaurus-plugin-content-docs/current/accessibility.md new file mode 100644 index 00000000..d057e6fb --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/accessibility.md @@ -0,0 +1,449 @@ +--- +sidebar_label: Barrierefreiheit +title: Barrierefreiheit +description: Machen Sie DHTMLX Spreadsheet für Tastatur- und Screenreader-Nutzer zugänglich. Erfahren Sie mehr über WAI-ARIA-Unterstützung, Tastaturnavigation, Screenreader-Ansagen und Themes mit hohem Kontrast, die auf WCAG 2.2 AA ausgerichtet sind. +--- + +# Barrierefreiheit in DHTMLX Spreadsheet + +Dieser Leitfaden richtet sich an Entwickler, die DHTMLX Spreadsheet in eine Anwendung einbetten, die Anforderungen an die Barrierefreiheit erfüllen muss. Anhand des Leitfadens können Sie die Komponente mit Ihrer Checkliste abgleichen und für Nutzer von Tastatur, Screenreader und hohem Kontrast konfigurieren. + +Das Spreadsheet rendert WAI-ARIA-Rollen und -Zustände als Teil seines Markups. Der Tastaturfokus bleibt auf der aktiven Zelle, und die Symbolleiste, die Menüleiste und die Blattregisterkarten bilden jeweils einen einzigen Tabstopp. Änderungen, die kein eigenes Element haben, etwa eine abgelehnte Bearbeitung oder ein Suchergebnis, werden an eine Live-Region gesendet, die Screenreader vorlesen. + +:::info Ziel-Konformität +DHTMLX Spreadsheet ist darauf ausgelegt, **WCAG 2.2 Level AA**, **Section 508** des U.S. Rehabilitation Act und **EN 301 549** (die technische Grundlage des European Accessibility Act) zu erfüllen. + +Die Konformität wird für DHTMLX Spreadsheet 6.0.4 Kriterium für Kriterium dokumentiert. Der ausführliche **Accessibility Conformance Report (VPAT® 2.5)** ist verfügbar: [Accessibility Conformance Report](accessibility_conformance_report.md). +::: + +## Funktionen {#capabilities} + +| Bereich | Unterstützung | +| ---- | ------- | +| Tastaturbedienung | Jeder Befehl für die Zellen hat eine Taste. Die Symbolleiste, die Menüleiste und die Blattregisterkarten sind einzelne Tabstopps, die mit den Pfeiltasten navigiert werden. Spaltenbreite, Zeilenhöhe und Spaltenfilter haben Kontextmenübefehle, sodass weder Ziehen noch ein Klick auf ein Symbol erforderlich ist | +| WAI-ARIA-Semantik | Die Zellen sind ein `grid` mit den Elementen `columnheader`, `rowheader` und `gridcell`. Die Rollen werden immer gerendert | +| Fokusmodell | Der Tastaturfokus liegt auf der aktiven Zelle. Tab betritt das Blatt auf der aktiven Zelle und verlässt es von der letzten bzw. der ersten Zelle aus. Ctrl + F6 verschiebt den Fokus zwischen dem Menü, der Symbolleiste, dem Blatt und den Blattregisterkarten | +| Auswahlmodell | Die aktive Zelle, ein Bereich und mehrere Bereiche werden über `aria-selected` bereitgestellt, und die Ausdehnung eines Bereichs wird angesagt. Die Auswahl lässt sich mit der Option [`selection`](api/spreadsheet_selection_config.md) deaktivieren | +| Schreibgeschützter Modus | Das Blatt kann navigiert, ausgewählt, kopiert und durchsucht werden; Bearbeitungen werden abgelehnt und angesagt, und das Kontextmenü ist nicht verfügbar | +| Screenreader | Getestet mit NVDA, JAWS und VoiceOver | +| Visuelle Barrierefreiheit | Die Themes `contrast-light` und `contrast-dark`, ein sichtbarer Fokusindikator in jedem Theme sowie Hinweise, die nicht von der Farbe abhängen | +| Textgröße und Zoom | Das Layout bleibt bei 200 % und 400 % Zoom sowie mit überschriebenen Textabständen bedienbar | +| Anpassung | Die öffentliche Methode [`announce()`](api/spreadsheet_announce_method.md) für eigene Meldungen und übersetzbare `aria_*`-Locale-Strings für jeden integrierten Namen und jede integrierte Ansage | +| Standards | WCAG 2.2 AA, Section 508, EN 301 549 | + +## Abgedeckte Bereiche {#covered-areas} + +Dieser Leitfaden behandelt das Spreadsheet-Widget: + +- die Zellen, die Spalten- und Zeilenköpfe, verbundene Zellen sowie fixierte Zeilen und Spalten +- die Auswahl: die aktive Zelle, Bereiche und mehrere Bereiche +- die Formelleiste und die Zelleneditoren, einschließlich des Editors einer Zelle mit einer Werteliste +- die Symbolleiste mit ihren Farb- und Rahmen-Popups, die Menüleiste und die Kontextmenüs +- die Blattregisterkarten +- Sortierung, Filterung, Suche, Datenvalidierung, Links in Zellen, Import und Export +- die Themes und den Fokusindikator + +Die Barrierefreiheit der fertigen Seite hängt auch von der Host-Anwendung ab. Siehe [Verantwortung der Host-Seite](#host-page-responsibilities). + +## WAI-ARIA-Unterstützung {#wai-aria-support} + +Das Spreadsheet fügt seinem Markup automatisch WAI-ARIA-Rollen und -Attribute hinzu, und Sie können diese nicht deaktivieren. Jeder Teil des Widgets hat eine eigene Rolle und einen eigenen Namen, und die Namen stammen aus der [Locale](#localization). + +### Spreadsheet-Container {#spreadsheet-container} + +Die Teile des Spreadsheets sind separate benannte Steuerelemente: + +| Teil | Rolle / Attribut | Zugänglicher Name | +| ---- | ---------------- | --------------- | +| Menüleiste | `role="menubar"` + `aria-label` | "Main" | +| Symbolleiste | `role="toolbar"` + `aria-label` | "Formatting" | +| Formelleiste | `aria-label` am Eingabefeld | "Formula bar, B7", mit der Adresse der aktiven Zelle | +| Zellen | `role="grid"` + `aria-label` | "Spreadsheet" | +| Blattregisterkarten | `role="toolbar"` + `aria-label` | "Sheets" | +| Live-Region | `role="status"`, `aria-live="polite"`, `aria-atomic="true"` | visuell verborgen, neben dem Grid außerhalb von `role="grid"` platziert | + +Das Wurzelelement des Spreadsheets hat keine Landmark-Rolle, sodass Sie es in die Landmark platzieren können, die zu Ihrer Seite passt. + +### Zellenoberfläche {#cell-surface} + +Die folgenden Attribute beschreiben die Zellen als Ganzes. Das Element `.dhx_grid-content` trägt sie: + +| Selektor | Rolle / Attribut | Zweck | +| -------- | ---------------- | ------- | +| `.dhx_grid-content` | `role="grid"` | Das interaktive Grid der Zellen | +| `.dhx_grid-content` | `aria-label` | "Spreadsheet", aus dem Locale-Schlüssel `aria_grid` | +| `.dhx_grid-content` | `aria-rowcount` | Die Anzahl der Zeilen des Blatts plus die Kopfzeile | +| `.dhx_grid-content` | `aria-colcount` | Die Anzahl der sichtbaren Spalten plus die Spalte der Zeilennummern | +| `.dhx_grid-content` | `aria-readonly` | `"true"` im [schreibgeschützten Modus](api/spreadsheet_readonly_config.md) und solange die [Auswahl](api/spreadsheet_selection_config.md) deaktiviert ist | +| `.dhx_grid-content` | `aria-multiselectable` | `"true"`; `"false"`, solange die Auswahl deaktiviert ist | + +### Zeilen und Zellen {#rows-and-cells} + +Die folgende Tabelle listet die Rollen sowie die Positions- und Zustandsattribute der Zeilen und Zellen auf: + +| Selektor | Rolle / Attribut | Zweck | +| -------- | ---------------- | ------- | +| Zeile | `role="row"` + `aria-rowindex` | Eine Zeile des Blatts. Zeile 1 des Blatts hat `aria-rowindex="2"`, da der Spaltenkopf die erste Zeile ist | +| Zelle | `role="gridcell"` + `aria-colindex` | Eine Zelle. Spalte A hat `aria-colindex="2"`, da die Zeilennummern die erste Spalte bilden | +| Zeilennummer | `role="rowheader"` | Der Kopf der Zeile | +| Zelle | `aria-selected` | `"true"` an der aktiven Zelle und an jeder Zelle der ausgewählten Bereiche | +| Zelle | `aria-readonly` | `"true"` im schreibgeschützten Modus, solange die [Auswahl](api/spreadsheet_selection_config.md) deaktiviert ist, und an [gesperrten Zellen](work_with_cells.md#locking-cells) | +| Zelle | `tabindex` | `"0"` an der aktiven Zelle und `"-1"` an den übrigen Zellen, sodass die Zellen einen einzigen Tabstopp bilden | +| Aktive Zelle | DOM-Fokus | Der Tastaturfokus liegt auf der aktiven Zelle selbst, nicht auf einem separaten Eingabefeld. Während die Zelle bearbeitet wird, liegt der Fokus auf dem Zelleneditor | +| Verbundene Zelle | `aria-colspan` / `aria-rowspan` | Die Anzahl der Spalten bzw. Zeilen, die die verbundene Zelle umfasst. Die von ihr verdeckten Zellen werden mit `aria-hidden="true"` ausgeblendet | +| Link in einer Zelle | `` mit `target="_blank"` und `rel="noopener noreferrer"` | Ein Link mit dem Schema `http`, `https`, `mailto`, `ftp` oder `tel` | + +Eine Zelle enthält außerdem visuell verborgenen Text, den Screenreader zusammen mit dem Wert vorlesen: + +| Verborgener Text | Wann | +| ----------- | ---- | +| Die Zellenadresse, zum Beispiel "B7" | An der aktiven Zelle und an jeder Zelle eines ausgewählten Bereichs. Screenreader lesen die Adresse vor dem Wert vor | +| "link" | An einer ausgewählten Zelle mit einem Link. Alt + Enter öffnet den Link | +| "locked" | An einer ausgewählten gesperrten Zelle | +| Eine Beschreibung des Formelfehlers, zum Beispiel "Reference error. Check the cell references" | An einer Zelle mit einem Formelfehler | +| "Invalid value. Choose a value from the list" | An einer Zelle, deren Wert nicht in ihrer [Werteliste](work_with_cells.md#using-drop-down-lists-in-cells) enthalten ist | +| "Filter" / "Filter applied" | An einer Zelle mit dem Filtersymbol | + +### Spalten- und Zeilenköpfe {#column-and-row-headers} + +| Selektor | Rolle / Attribut | Zweck | +| -------- | ---------------- | ------- | +| Spaltenbuchstabe | `role="columnheader"` + `aria-colindex` | Der Kopf der Spalte | +| Ecke "Alles auswählen" | `role="columnheader"` | Benannt "Select all" | +| Zeilennummer | `role="rowheader"` | Der Kopf der Zeile | +| Spaltenmenü-Symbol, Symbole ausgeblendeter Zeilen und Spalten | `aria-hidden="true"` | Dekorativ. Die Befehle befinden sich im Kontextmenü | + +Die Köpfe sind keine Tabstopps. Ein Klick auf einen Spaltenbuchstaben, eine Zeilennummer oder die Ecke wählt die Zeilen bzw. Spalten aus und gibt den Fokus an die aktive Zelle zurück. + +### Formelleiste und Editoren {#formula-bar-and-editors} + +| Selektor | Rolle / Attribut | Zweck | +| -------- | ---------------- | ------- | +| Eingabefeld der Formelleiste | `aria-label` | "Formula bar, B7", mit der Adresse der aktiven Zelle. Das Eingabefeld ist bei einer gesperrten Zelle `readonly`, sodass sein Wert weiterhin gelesen werden kann. Solange die Auswahl deaktiviert ist, ist die Formelleiste leer und gesperrt | +| Eingabefeld des Zelleneditors | `aria-label` | "Cell editor, B7" | +| Editor einer Zelle mit einer Werteliste | `role="combobox"`, `aria-controls`, `aria-expanded`, `aria-activedescendant` | Die Werteliste ist eine `listbox` aus `option`-Elementen, und die hervorgehobene Option hat `aria-selected` | +| Editor mit einem ungültigen Wert | `aria-invalid="true"` | Der gespeicherte Wert der Zelle ist nicht in ihrer Werteliste enthalten. Das Attribut wird nach dem Speichern des Werts aktualisiert, nicht während der Eingabe | +| Schließen-Symbol der Formelhilfe | `role="button"` + `aria-label` | "Close formula help" | + +### Symbolleiste und Menüs {#toolbar-and-menus} + +| Selektor | Rolle / Attribut | Zweck | +| -------- | ---------------- | ------- | +| Symbolleiste | `role="toolbar"` + `aria-label` | "Formatting"; die Symbolleisten des Rahmen-Popups, der Suchleiste und des Link-Popups heißen "Borders", "Search" und "Link" | +| Symbolleisten-Schaltfläche | `aria-label` | Der Wert der Schaltfläche. Eine Symbolschaltfläche wird nach ihrem Tooltip benannt, zum Beispiel "Bold (ctrl+b)". Die Symbole werden mit `aria-hidden="true"` ausgeblendet | +| Bold, Italic, Underline, Strikethrough, Lock, Filter | `aria-pressed` | Ob die Formatierung bzw. der Filter aktiv ist | +| Schaltfläche, die ein Dropdown öffnet | `aria-haspopup="menu"`, `aria-expanded` | Das Dropdown ist ein `menu`, das nach seiner Schaltfläche benannt ist | +| Ausrichtung, Textumbruch, Zahlenformate | `role="menuitemradio"` + `aria-checked` | Eine Option einer exklusiven Gruppe | +| Text color, Background color, Border color | `aria-label` | Der Name des Steuerelements und der aktuellen Farbe, zum Beispiel "Text color: dark gray" | +| Farbpalette | `role="grid"` aus `gridcell`-Elementen | Das Grid heißt "Color palette". Jede Farbzelle ist nach ihrer Farbe benannt, und die gewählte hat `aria-selected="true"` | +| Liste der Rahmenstile | `role="listbox"` aus `option`-Elementen | Die Optionen heißen "Thin line", "Medium line", "Thick line", "Dashed line", "Dotted line", "Double line" | +| Menüleiste | `role="menubar"` + `aria-label` | "Main". Ihre Einträge öffnen Popups mit `role="menu"`. In den Popups haben die Formatierungseinträge `role="menuitemcheckbox"`, und die Einträge für Ausrichtung, Textumbruch und Zahlenformate haben `role="menuitemradio"`. Beide melden ihren Zustand mit `aria-checked` | +| Kontextmenüs | `role="menu"` + `aria-label` | "Cell" für die Zellen und "Sheet" für die Blattregisterkarten | + +### Blattregisterkarten {#sheet-tabs} + +| Selektor | Rolle / Attribut | Zweck | +| -------- | ---------------- | ------- | +| Leiste der Blattregisterkarten | `role="toolbar"` + `aria-label` | "Sheets" | +| Blattregisterkarte | `button` + `aria-pressed` | Die Registerkarte ist nach ihrem Blatt benannt. Die Registerkarte des aktiven Blatts hat `aria-pressed="true"` | +| Schaltfläche "Blatt hinzufügen" | `aria-label` | "Add sheet" | + +### Dialoge {#dialogs} + +| Selektor | Rolle / Attribut | Zweck | +| -------- | ---------------- | ------- | +| Dialoge für Spaltenbreite und Zeilenhöhe | `role="dialog"`, `aria-modal="true"`, `aria-label` | Benannt nach dem Dialogtitel. Das Eingabefeld ist mit "Width in pixels" / "Height in pixels" beschriftet | +| Suchleiste | `role="dialog"` + `aria-label` | Benannt "Search". Das Suchfeld ist mit "Search" beschriftet, und die Schaltflächen heißen "Previous match", "Next match" und "Close search" | +| Link einfügen, Datenvalidierung | `role="dialog"` + `aria-label` | Benannt nach dem Dialogtitel | +| Warnmeldungen | `role="alertdialog"`, `aria-modal="true"`, `aria-labelledby`, `aria-describedby` | Benannt nach der Kopfzeile der Meldung und beschrieben durch ihren Text | + +### Ausgeblendete und dekorative Elemente {#hidden-and-decorative-elements} + +Das Spreadsheet blendet dekorative Teile mit `aria-hidden="true"` vor assistiven Technologien aus. Dazu gehören die Symbole für Sperre, Filter und Spaltenmenü, die Symbole ausgeblendeter Zeilen und Spalten sowie das Symbol "Alles auswählen". Ebenso ausgeblendet sind die Ebene, die die Auswahl, die Kopier- und Suchhervorhebungen sowie den Ausfüllpunkt zeichnet, die farbige Kopie der Formel in der Formelleiste und die von einer verbundenen Zelle verdeckten Zellen. Layout-Wrapper haben `role="presentation"`. Die Fokus-Sentinels vor und nach dem Grid leiten den Fokus lediglich an die aktive Zelle weiter. + +## Auswahl- und Bearbeitungsmodell {#selection-and-editing-model} + +Der DOM-Fokus liegt auf der aktiven Zelle selbst, sodass ein Screenreader die Zelle liest und kein separates Eingabefeld. Wenn sich die aktive Zelle bewegt, liest der Screenreader zuerst die Adresse der neuen Zelle, dann ihren Wert und ihre verborgenen Beschreibungen vor. Wenn der Nutzer mit der Tastatur oder der Maus einen Bereich auswählt, sagt der Screenreader die Ausdehnung des Bereichs an, sobald sich die Auswahl nicht mehr ändert. Eine Zelle, die zu mehreren Bereichen gehört, wird nur einmal gezählt, und die Zellen ausgeblendeter Zeilen und Spalten werden mitgezählt. Während eine Zelle bearbeitet wird, wird nichts angesagt. Wenn ein Bereich auf die aktive Zelle verkleinert wird, wird die Adresse der Zelle angesagt. + +| Situation | Was der Screenreader erhält | +| --------- | --------------------------- | +| Die aktive Zelle bewegt sich | Die Zelle mit ihrer Adresse, ihrem Wert und ihren Beschreibungen, zum Beispiel "B7, 120, locked" | +| Ein Bereich wird ausgewählt | "B2 to D7, 18 cells" | +| Mehrere Bereiche werden mit Ctrl ausgewählt | "B2 to B4, D2 to D4, 6 cells" | +| Der Editor öffnet sich mit Enter, F2 oder durch Tippen | Das Eingabefeld des Editors mit dem Namen "Cell editor, B7" | +| Der Editor einer Zelle mit einer Werteliste öffnet sich | Eine aufgeklappte Combobox. Nach ↑ oder ↓ wird die hervorgehobene Option der Liste vorgelesen | +| Die Bearbeitung wird gespeichert | Neue Formelfehler in den bearbeiteten Zellen und in den davon abhängigen Zellen sowie ungültige Werte in den bearbeiteten Zellen werden angesagt | +| Die Bearbeitung einer gesperrten Zelle wird abgelehnt | "The cell is locked" | +| Im schreibgeschützten Modus wird eine Bearbeitungstaste gedrückt | "The sheet is read-only" | + +Enter, F2 oder Tippen öffnet den Editor. Enter speichert den Wert und geht nach unten, Tab speichert ihn und geht nach rechts, und Esc bricht die Bearbeitung ab. + +## Tastaturnavigation {#keyboard-navigation} + +Die Tastatur funktioniert, sobald sich das Spreadsheet auf der Seite befindet; eine Konfiguration ist nicht erforderlich. Die folgenden Tabellen fassen das Tastaturmodell zusammen. Den vollständigen Satz an Tastenkombinationen finden Sie in der [Liste der Hotkeys](hotkeys.md). + +![Das Dropdown "Horizontal align" der Symbolleiste, mit der Pfeiltaste nach unten geöffnet, mit dem Fokus auf seinem ersten Eintrag](/img/accessibility/toolbar_dropdown_focus.png) + +### Zellen {#cells} + +| Tasten | Aktion | +| ---- | ------ | +| Pfeiltasten | Die aktive Zelle verschieben. Die aktive Zelle stoppt an der ersten und der letzten sichtbaren Zeile und Spalte | +| Shift + Pfeiltasten | Den ausgewählten Bereich erweitern | +| Home / End | Zur ersten bzw. letzten sichtbaren Zelle der Zeile wechseln | +| Ctrl + Pfeiltasten, Ctrl + Home / End | Zum Rand des Blatts wechseln | +| Tab / Shift + Tab | Innerhalb der Zeile nach rechts bzw. links wechseln. Von der letzten bzw. der ersten Zelle des Blatts aus den Fokus aus den Zellen heraus zum nächsten bzw. vorherigen Teil der Seite verschieben, zum Beispiel zu den Blattregisterkarten oder zur Formelleiste | +| Enter, F2 | Den Editor öffnen | +| Esc | Den Editor ohne Speichern schließen | +| Ctrl + Space / Shift + Space | Die Spalte bzw. die Zeile auswählen | +| Ctrl + Shift + 9 / 0 | Die ausgeblendeten Zeilen bzw. Spalten innerhalb des ausgewählten Bereichs einblenden | +| Alt + Enter | Den Link der aktiven Zelle öffnen | +| Shift + F10 oder die Menütaste | Das Kontextmenü mit den Befehlen für die Zelle öffnen, oder für die Spalte nach Ctrl + Space | +| Alt + ↑ / ↓, Ctrl + Alt + Page Down / Page Up | Zum nächsten bzw. vorherigen Blatt wechseln | + +### Wechsel zwischen den Teilen {#moving-between-the-parts} + +| Tasten | Aktion | +| ---- | ------ | +| Ctrl + F6 / Ctrl + Shift + F6 | Den Fokus zum nächsten bzw. vorherigen Teil verschieben: das Menü, die Symbolleiste, das Blatt, die Blattregisterkarten. Die Formelleiste und ausgeblendete Teile werden übersprungen. Eine offene Bearbeitung wird zuerst gespeichert | +| Tab / Shift + Tab | Den Fokus zum nächsten bzw. vorherigen Teil in der Tabulatorreihenfolge der Seite verschieben. Jede Leiste ist ein Tabstopp, und der Fokus landet auf dem zuletzt verwendeten Steuerelement | + +### Symbolleiste, Menüleiste und Blattregisterkarten {#toolbar-menu-bar-and-sheet-tabs} + +| Tasten | Aktion | +| ---- | ------ | +| ← / →, Home / End | Zwischen den Steuerelementen der Leiste wechseln | +| Enter / Space | Das Steuerelement betätigen: den Befehl ausführen, das Dropdown öffnen oder zum Blatt wechseln | +| ↓ | Das Dropdown öffnen und den Fokus auf seinen ersten Eintrag setzen | +| ↑ / ↓ | Zwischen den Einträgen eines geöffneten Dropdowns oder Menüs wechseln | +| → / ← | Ein Untermenü öffnen bzw. schließen | +| Esc | Das Dropdown oder das Menü schließen und den Fokus an sein Steuerelement zurückgeben | + +### Popups und Dialoge {#popups-and-dialogs} + +| Tasten | Aktion | +| ---- | ------ | +| Pfeiltasten, Home / End | Zwischen den Farben der Farbpalette wechseln | +| Enter | Die Farbe, den Rahmen oder die Größe in den Dialogen für Spaltenbreite und Zeilenhöhe anwenden | +| Esc | Das Popup, den Dialog oder die Suchleiste schließen und den Fokus an das Steuerelement oder die Zelle zurückgeben, die sie geöffnet hat. Im Modus für benutzerdefinierte Farben zur Palette zurückkehren. In einem Farb- oder Stil-Popup, das aus dem Rahmen-Popup geöffnet wurde, es schließen und den Fokus an seine Schaltfläche im Rahmen-Popup zurückgeben | +| Tab / Shift + Tab | Zwischen den Steuerelementen eines Dialogs oder des Modus für benutzerdefinierte Farben wechseln. In einem Farb-Popup oder im Rahmen-Popup es schließen und den Fokus an seine Symbolleisten-Schaltfläche zurückgeben | +| ↑ / ↓, Enter | Durch die Werteliste einer Zelle navigieren und einen Wert auswählen | + +:::note +Für Aktionen, die nur mit dem Zeigegerät möglich sind, gibt es Tastaturalternativen. Die Befehle *Column width* und *Row height* des Kontextmenüs legen eine exakte Größe ohne Ziehen fest, und der Befehl *Open filter* öffnet einen Filter ohne Klick auf sein Symbol. +::: + +## Assistive Technologien {#assistive-technology} + +Das DHTMLX-Team testet das Spreadsheet mit den folgenden Screenreadern: + +| Screenreader | Browser | Plattform | +| ------------- | ------- | -------- | +| NVDA | Firefox | Windows | +| JAWS | Chrome | Windows | +| VoiceOver | Safari | macOS | + +Screenreader erhalten jeden Zustand von dem Element, zu dem er gehört: + +| Zustand | Bereitgestellt über | Gelesen an | +| ----- | --------------- | ------- | +| Position | `aria-rowindex`, `aria-colindex` und die Zellenadresse im Zellentext | Jeder Zelle. Die Adresse steht im Text der aktiven Zelle und der Zellen der ausgewählten Bereiche | +| Auswahl | `aria-selected` | Der aktiven Zelle und den Zellen der ausgewählten Bereiche | +| Bearbeitbarkeit | `aria-readonly` | Dem Grid und den Zellen im schreibgeschützten Modus und solange die Auswahl deaktiviert ist, sowie gesperrten Zellen | +| Verbundene Zellen | `aria-colspan`, `aria-rowspan` | Der verbundenen Zelle | +| Zeilenköpfe | `role="rowheader"` | Den Zeilennummern | +| Umschaltzustand | `aria-pressed` | Den Schaltflächen Bold, Italic, Underline, Strikethrough, Lock und Filter sowie den Blattregisterkarten | +| Markierungszustand | `aria-checked` | Den Formatierungseinträgen der Menüleiste sowie den Einträgen für Ausrichtung, Textumbruch und Zahlenformate | +| Fehler und ungültige Werte | Verborgener Text in der Zelle, `aria-invalid` | Der Zelle und ihrem Editor | +| Links | `` und der verborgene Text "link" | Der Zelle mit einem Link | + +## Hoher Kontrast und Fokus {#high-contrast-and-focus} + +### Themes {#themes} + +Das Spreadsheet hat vier integrierte Themes: `light` (Standard), `dark`, `contrast-light` und `contrast-dark`. Die Themes `contrast-light` und `contrast-dark` erfüllen die WCAG-AA-Kontrastanforderungen für Text. Ein Theme wechseln Sie mit der Methode `dhx.setTheme()` oder mit dem Attribut `data-dhx-theme`: + +~~~jsx +dhx.setTheme("contrast-light"); // or "contrast-dark" +~~~ + +Details finden Sie im Artikel [Integrierte Themes](/themes/). + +In den hellen Themes haben die Farben, die die Zellbezüge einer Formel markieren, einen Kontrast von mindestens 4,5:1. + +Das Theme `contrast-light` zeichnet dunklen Text und dunkle Rahmen auf weißem Hintergrund. Im folgenden Spreadsheet ist das Kontextmenü einer Zelle mit dem Filtersymbol mit der Tastatur geöffnet. Sein fokussierter Befehl, [*Open filter*](filtering_data.md#opening-a-filter-with-the-keyboard), ist durch eine gestrichelte Kontur markiert, und die aktive Zelle ist durch einen durchgezogenen Rahmen in der Primärfarbe des Themes markiert: + +![Spreadsheet im Theme contrast-light](/img/accessibility/spreadsheet_contrast_light.png) + +Das Theme `contrast-dark` zeichnet hellen Text und helle Rahmen auf dunklem Hintergrund. Wenn der Fokus auf einem Steuerelement der Symbolleiste liegt, ist das Steuerelement durch einen Fokusring in der Farbe `--dhx-spreadsheet-focus-color` markiert, die in den dunklen Themes heller ist als die Primärfarbe des Rahmens der aktiven Zelle: + +![Spreadsheet im Theme contrast-dark](/img/accessibility/spreadsheet_contrast_dark.png) + +### Fokusindikator {#focus-indicator} + +Der Tastaturfokus wird in jedem Theme angezeigt: + +- die aktive Zelle hat einen durchgezogenen 2px-Rahmen in der Primärfarbe des Themes +- eine Zelle und der Zelleneditor, die den Tastaturfokus haben, erhalten eine 2px-Kontur in der Primärfarbe des Themes +- die Formelleiste und die Steuerelemente der Symbolleiste, der Menüleiste, der Blattregisterkarten, des Rahmen-Popups, des Link-Popups und der Suchleiste erhalten eine 2px-Kontur in der Farbe der Variable `--dhx-spreadsheet-focus-color` +- in der Farbpalette, in der Liste der Rahmenstile, in den Dropdowns der Symbolleiste und der Menüleiste sowie in den Kontextmenüs erhält der fokussierte Eintrag eine gestrichelte 1px-Kontur in der Farbe `--dhx-color-focused` +- im Listeneditor einer Zelle bleibt der Fokus im Editor, und der aktuelle Eintrag der Liste wird mit einer Hintergrundfarbe hervorgehoben + +Die Variable `--dhx-spreadsheet-focus-color` ist in den dunklen Themes heller als die Primärfarbe und kann in einem [benutzerdefinierten Theme](themes/custom_theme.md) neu definiert werden. Der Kontrast jedes Indikators in jedem Theme ist im [Accessibility Conformance Report](accessibility_conformance_report.md) angegeben. + +### Farbe und Zoom {#color-and-zoom} + +- **Farbe ist nicht das einzige Signal.** Die aktive Zelle und die Auswahl haben einen Rahmen und eine Füllung, ein ungültiger Wert hat eine Markierung und eine verborgene Beschreibung, und die Formatierungsschaltflächen melden ihren Zustand über `aria-pressed`. Die Farbschaltflächen haben den Namen der Farbe in ihrem zugänglichen Namen. +- **Zoom und Reflow.** Das Spreadsheet bleibt bei 200 % und 400 % Zoom bedienbar. Die Zellen scrollen in zwei Richtungen, und die Symbolleiste, die Menüleiste und die Blattregisterkarten passen in eine Breite von 320 CSS px. +- **Textabstände.** Mit den WCAG-Überschreibungen für Textabstände wird keine Steuerelement-Beschriftung abgeschnitten, und die Leiste der Blattregisterkarten scrollt, wenn die Registerkarten wachsen. +- **Ins Sichtfeld scrollen.** Die aktive Zelle wird neben den fixierten Zeilen und Spalten ins Sichtfeld gescrollt. + +## Statusansagen {#status-announcements} + +Das Spreadsheet sagt die Änderungen, die kein eigenes Element haben, über eine höfliche (polite) Live-Region an, sodass der Screenreader zuerst den aktuellen Satz beendet: + +| Ereignis | Angesagter Text | Locale-Schlüssel | +| ----- | -------------- | ---------- | +| Ein Bereich wird ausgewählt | "B2 to D7, 18 cells" | `aria_selectedRange`, `aria_rangeExtent`, `aria_rangeSeparator` | +| Eine Bearbeitung verursacht einen Formelfehler oder einen ungültigen Wert | "B7: Reference error. Check the cell references" | `aria_cellMessage` | +| Eine Bearbeitung verursacht mehrere Fehler / ungültige Werte | "3 new errors. B7: ..." / "3 invalid values. B7: ..." | `aria_newErrors`, `aria_invalidValues` | +| Die Bearbeitung einer gesperrten Zelle / eines gesperrten Bereichs wird abgelehnt | "The cell is locked" / "Locked cells were not changed" | `aria_lockedCell`, `aria_lockedCells` | +| Im schreibgeschützten Modus wird eine Bearbeitungstaste gedrückt | "The sheet is read-only" | `aria_readonlySheet` | +| Der Suchtext wird eingegeben | "Results: 5. 1 of 5, B2" oder "No results" | `aria_searchResults`, `aria_searchMatch`, `aria_searchNoResults` | +| Der nächste oder vorherige Treffer wird angezeigt | "2 of 5, B7" | `aria_searchMatch` | +| Eine Excel-Datei wird exportiert | "Exporting the file", "The file is exported" | `aria_exportStarted`, `aria_exportDone` | +| Eine im Dateidialog gewählte Datei wird importiert | "Importing the file", "The file is imported" | `aria_importStarted`, `aria_importDone` | +| Der Befehl Column width / Row height wird angewendet | "Column width set to 120 pixels" | `aria_columnWidthSet`, `aria_rowHeightSet` | +| Ctrl + Shift + 9 / 0 findet nichts zum Einblenden | "No hidden rows in the selection" | `aria_noHiddenRows`, `aria_noHiddenCols` | + +Um das Ergebnis Ihres eigenen Befehls anzusagen, rufen Sie die Methode [`announce()`](api/spreadsheet_announce_method.md) auf: + +~~~jsx +spreadsheet.announce("The report is saved"); +~~~ + +## Lokalisierung {#localization} + +Die zugänglichen Namen, die Zellbeschreibungen und die Ansagen sind in der Locale `spreadsheet` als Schlüssel mit dem Präfix `aria_` neben den Beschriftungen der Oberfläche abgelegt. Übersetzen Sie sie mit der Methode `dhx.i18n.setLocale()`, bevor das Spreadsheet initialisiert wird: + +~~~jsx +dhx.i18n.setLocale("spreadsheet", { + // other keys of the locale + aria_grid: "Tabelle", + aria_cellEditor: "Zelleneditor, {cell}", + aria_readonlySheet: "Das Blatt ist schreibgeschützt", + aria_selectedRange: "{range}, {count} Zellen", + aria_rangeExtent: "{start} bis {end}" +}); + +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); +~~~ + +Die Teile in geschweiften Klammern, wie `{cell}` oder `{count}`, werden durch die Werte ersetzt und müssen in den übersetzten Strings erhalten bleiben. Die Namen der Farben und der Schaltflächen der Warnmeldungen stammen aus den Locales `colorpicker` und `message`. Die vollständige Liste der Schlüssel finden Sie unter [Lokalisierung](localization.md#default-locale) und Informationen zu den weiteren Locales unter [Lokalisierung integrierter Widgets](localization.md#localizing-built-in-widgets). + +## Konfigurationsbeispiele {#configuration-recipes} + +### Barrierefreie Standardeinrichtung {#accessible-default-setup} + +Das Spreadsheet benötigt für die Tastatur und die WAI-ARIA-Ausgabe keine Konfiguration. Um die WCAG-AA-Kontrastanforderungen für Text zu erfüllen, wählen Sie ein Kontrast-Theme. Weitere Möglichkeiten, ein Theme festzulegen, finden Sie unter [Integrierte Themes](/themes/): + +~~~jsx +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { + // the keyboard navigation and the WAI-ARIA output need no configuration +}); +spreadsheet.parse(data); + +dhx.setTheme("contrast-light"); // or "contrast-dark" +~~~ + +### Schreibgeschützte Einrichtung {#read-only-setup} + +Verwenden Sie die Option [`readonly`](api/spreadsheet_readonly_config.md), um Daten anzuzeigen, die Nutzer lesen und kopieren, aber nicht ändern können. Tastatur- und Screenreader-Nutzer können sich weiterhin durch die Zellen bewegen: + +~~~jsx +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container", { + readonly: true +}); +spreadsheet.parse(data); +~~~ + +Um die Daten ohne aktive Zelle und ohne Auswahl anzuzeigen, fügen Sie [`selection: false`](api/spreadsheet_selection_config.md) hinzu. Das Grid wird dann zu einem Tabstopp, den die Tastatur lediglich durchläuft. + +### Übersetzte Barrierefreiheits-Strings {#translated-accessibility-strings} + +Screenreader lesen die Barrierefreiheits-Strings aus vier Locales: `spreadsheet` enthält die Namen, Zellbeschreibungen und Ansagen, `colorpicker` enthält die Farbnamen, `message` enthält die Namen der Schaltflächen der Warnmeldungen, und `grid` enthält die Ansage der Anzahl geladener Zeilen. Legen Sie alle vier fest, bevor Sie das Spreadsheet erstellen. Die Schlüssel finden Sie unter [Lokalisierung integrierter Widgets](localization.md#localizing-built-in-widgets): + +~~~jsx +const deSpreadsheet = { + // other keys of the locale + aria_grid: "Tabelle", + aria_readonlySheet: "Das Blatt ist schreibgeschützt" +}; +const deColorpicker = { + aria_palette: "Farbpalette", + aria_colorRed: "rot" +}; +const deMessage = { + aria_confirm: "Bestätigen" +}; +const deGrid = { + aria_rowsLoaded: "{count} Zeilen geladen" +}; + +dhx.i18n.setLocale("spreadsheet", deSpreadsheet); +dhx.i18n.setLocale("colorpicker", deColorpicker); +dhx.i18n.setLocale("message", deMessage); +dhx.i18n.setLocale("grid", deGrid); + +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); +~~~ + +### Einen benutzerdefinierten Befehl ansagen {#announcing-a-custom-command} + +Wenn Ihr eigener Befehl die Daten ändert, informieren Sie Screenreader-Nutzer mit der Methode [`announce()`](api/spreadsheet_announce_method.md) über das Ergebnis. Das Beispiel fügt einen [Menü](customization.md#menu)-Befehl hinzu, der das aktive Blatt leert: + +~~~jsx +const spreadsheet = new dhx.Spreadsheet("spreadsheet_container"); + +spreadsheet.menu.data.add({ id: "clear-sheet", value: "Clear sheet" }); + +spreadsheet.menu.events.on("click", function (id) { + if (id === "clear-sheet") { + spreadsheet.sheets.clear(); + spreadsheet.announce("The sheet is cleared"); + } +}); +~~~ + +## Verantwortung der Host-Seite {#host-page-responsibilities} + +Einige Anforderungen betreffen die Seitenebene und nicht die Komponente selbst. Stellen Sie sicher, dass die Host-Seite: + +- die Dokumentsprache festlegt, zum Beispiel ``, sowie einen Seitentitel +- eine Überschrift über dem Spreadsheet setzt und es innerhalb einer Landmark platziert, zum Beispiel `