@trebco/treb 23.6.5 → 25.0.0-rc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +8 -0
- package/.eslintrc.js +164 -0
- package/README-shadow-DOM.md +88 -0
- package/README.md +37 -130
- package/api-config.json +29 -0
- package/api-generator/api-generator-types.ts +82 -0
- package/api-generator/api-generator.ts +1172 -0
- package/api-generator/package.json +3 -0
- package/build/treb-spreadsheet.mjs +14 -0
- package/{treb.d.ts → build/treb.d.ts} +323 -271
- package/esbuild-custom-element.mjs +336 -0
- package/esbuild.js +305 -0
- package/package.json +49 -14
- package/treb-base-types/package.json +5 -0
- package/treb-base-types/src/api_types.ts +36 -0
- package/treb-base-types/src/area.ts +583 -0
- package/treb-base-types/src/basic_types.ts +45 -0
- package/treb-base-types/src/cell.ts +612 -0
- package/treb-base-types/src/cells.ts +1066 -0
- package/treb-base-types/src/color.ts +124 -0
- package/treb-base-types/src/import.ts +71 -0
- package/treb-base-types/src/index-standalone.ts +29 -0
- package/treb-base-types/src/index.ts +42 -0
- package/treb-base-types/src/layout.ts +47 -0
- package/treb-base-types/src/localization.ts +187 -0
- package/treb-base-types/src/rectangle.ts +145 -0
- package/treb-base-types/src/render_text.ts +72 -0
- package/treb-base-types/src/style.ts +545 -0
- package/treb-base-types/src/table.ts +109 -0
- package/treb-base-types/src/text_part.ts +54 -0
- package/treb-base-types/src/theme.ts +608 -0
- package/treb-base-types/src/union.ts +152 -0
- package/treb-base-types/src/value-type.ts +164 -0
- package/treb-base-types/style/resizable.css +59 -0
- package/treb-calculator/modern.tsconfig.json +11 -0
- package/treb-calculator/package.json +5 -0
- package/treb-calculator/src/calculator.ts +2546 -0
- package/treb-calculator/src/complex-math.ts +558 -0
- package/treb-calculator/src/dag/array-vertex.ts +198 -0
- package/treb-calculator/src/dag/graph.ts +951 -0
- package/treb-calculator/src/dag/leaf_vertex.ts +118 -0
- package/treb-calculator/src/dag/spreadsheet_vertex.ts +327 -0
- package/treb-calculator/src/dag/spreadsheet_vertex_base.ts +44 -0
- package/treb-calculator/src/dag/vertex.ts +352 -0
- package/treb-calculator/src/descriptors.ts +162 -0
- package/treb-calculator/src/expression-calculator.ts +1069 -0
- package/treb-calculator/src/function-error.ts +103 -0
- package/treb-calculator/src/function-library.ts +103 -0
- package/treb-calculator/src/functions/base-functions.ts +1214 -0
- package/treb-calculator/src/functions/checkbox.ts +164 -0
- package/treb-calculator/src/functions/complex-functions.ts +253 -0
- package/treb-calculator/src/functions/finance-functions.ts +399 -0
- package/treb-calculator/src/functions/information-functions.ts +102 -0
- package/treb-calculator/src/functions/matrix-functions.ts +182 -0
- package/treb-calculator/src/functions/sparkline.ts +335 -0
- package/treb-calculator/src/functions/statistics-functions.ts +350 -0
- package/treb-calculator/src/functions/text-functions.ts +298 -0
- package/treb-calculator/src/index.ts +27 -0
- package/treb-calculator/src/notifier-types.ts +59 -0
- package/treb-calculator/src/primitives.ts +428 -0
- package/treb-calculator/src/utilities.ts +305 -0
- package/treb-charts/package.json +5 -0
- package/treb-charts/src/chart-functions.ts +156 -0
- package/treb-charts/src/chart-types.ts +230 -0
- package/treb-charts/src/chart.ts +1288 -0
- package/treb-charts/src/index.ts +24 -0
- package/treb-charts/src/main.ts +37 -0
- package/treb-charts/src/rectangle.ts +52 -0
- package/treb-charts/src/renderer.ts +1841 -0
- package/treb-charts/src/util.ts +122 -0
- package/treb-charts/style/charts.scss +221 -0
- package/treb-charts/style/old-charts.scss +250 -0
- package/treb-embed/markup/layout.html +137 -0
- package/treb-embed/markup/toolbar.html +175 -0
- package/treb-embed/modern.tsconfig.json +25 -0
- package/treb-embed/src/custom-element/content-types.d.ts +18 -0
- package/treb-embed/src/custom-element/global.d.ts +11 -0
- package/treb-embed/src/custom-element/spreadsheet-constructor.ts +1228 -0
- package/treb-embed/src/custom-element/treb-global.ts +44 -0
- package/treb-embed/src/custom-element/treb-spreadsheet-element.ts +52 -0
- package/treb-embed/src/embedded-spreadsheet.ts +5358 -0
- package/treb-embed/src/index.ts +16 -0
- package/treb-embed/src/language-model.ts +41 -0
- package/treb-embed/src/options.ts +298 -0
- package/treb-embed/src/progress-dialog.ts +228 -0
- package/treb-embed/src/selection-state.ts +16 -0
- package/treb-embed/src/spinner.ts +42 -0
- package/treb-embed/src/toolbar-message.ts +96 -0
- package/treb-embed/src/types.ts +167 -0
- package/treb-embed/style/autocomplete.scss +103 -0
- package/treb-embed/style/dark-theme.scss +114 -0
- package/treb-embed/style/defaults.scss +36 -0
- package/treb-embed/style/dialog.scss +181 -0
- package/treb-embed/style/dropdown-select.scss +101 -0
- package/treb-embed/style/formula-bar.scss +193 -0
- package/treb-embed/style/grid.scss +374 -0
- package/treb-embed/style/layout.scss +424 -0
- package/treb-embed/style/mouse-mask.scss +67 -0
- package/treb-embed/style/note.scss +92 -0
- package/treb-embed/style/overlay-editor.scss +102 -0
- package/treb-embed/style/spinner.scss +92 -0
- package/treb-embed/style/tab-bar.scss +228 -0
- package/treb-embed/style/table.scss +80 -0
- package/treb-embed/style/theme-defaults.scss +444 -0
- package/treb-embed/style/toolbar.scss +416 -0
- package/treb-embed/style/tooltip.scss +68 -0
- package/treb-embed/style/treb-icons.scss +130 -0
- package/treb-embed/style/treb-spreadsheet-element.scss +20 -0
- package/treb-embed/style/z-index.scss +43 -0
- package/treb-export/docs/charts.md +68 -0
- package/treb-export/modern.tsconfig.json +19 -0
- package/treb-export/package.json +4 -0
- package/treb-export/src/address-type.ts +77 -0
- package/treb-export/src/base-template.ts +22 -0
- package/treb-export/src/column-width.ts +85 -0
- package/treb-export/src/drawing2/chart-template-components2.ts +389 -0
- package/treb-export/src/drawing2/chart2.ts +282 -0
- package/treb-export/src/drawing2/column-chart-template2.ts +521 -0
- package/treb-export/src/drawing2/donut-chart-template2.ts +296 -0
- package/treb-export/src/drawing2/drawing2.ts +355 -0
- package/treb-export/src/drawing2/embedded-image.ts +71 -0
- package/treb-export/src/drawing2/scatter-chart-template2.ts +555 -0
- package/treb-export/src/export-worker/export-worker.ts +99 -0
- package/treb-export/src/export-worker/index-modern.ts +22 -0
- package/treb-export/src/export2.ts +2204 -0
- package/treb-export/src/import2.ts +882 -0
- package/treb-export/src/relationship.ts +36 -0
- package/treb-export/src/shared-strings2.ts +128 -0
- package/treb-export/src/template-2.ts +22 -0
- package/treb-export/src/unescape_xml.ts +47 -0
- package/treb-export/src/workbook-sheet2.ts +182 -0
- package/treb-export/src/workbook-style2.ts +1285 -0
- package/treb-export/src/workbook-theme2.ts +88 -0
- package/treb-export/src/workbook2.ts +491 -0
- package/treb-export/src/xml-utils.ts +201 -0
- package/treb-export/template/base/[Content_Types].xml +2 -0
- package/treb-export/template/base/_rels/.rels +2 -0
- package/treb-export/template/base/docProps/app.xml +2 -0
- package/treb-export/template/base/docProps/core.xml +12 -0
- package/treb-export/template/base/xl/_rels/workbook.xml.rels +2 -0
- package/treb-export/template/base/xl/sharedStrings.xml +2 -0
- package/treb-export/template/base/xl/styles.xml +2 -0
- package/treb-export/template/base/xl/theme/theme1.xml +2 -0
- package/treb-export/template/base/xl/workbook.xml +2 -0
- package/treb-export/template/base/xl/worksheets/sheet1.xml +2 -0
- package/treb-export/template/base.xlsx +0 -0
- package/treb-format/package.json +8 -0
- package/treb-format/src/format.test.ts +213 -0
- package/treb-format/src/format.ts +942 -0
- package/treb-format/src/format_cache.ts +199 -0
- package/treb-format/src/format_parser.ts +723 -0
- package/treb-format/src/index.ts +25 -0
- package/treb-format/src/number_format_section.ts +100 -0
- package/treb-format/src/value_parser.ts +337 -0
- package/treb-grid/package.json +5 -0
- package/treb-grid/src/editors/autocomplete.ts +394 -0
- package/treb-grid/src/editors/autocomplete_matcher.ts +260 -0
- package/treb-grid/src/editors/formula_bar.ts +473 -0
- package/treb-grid/src/editors/formula_editor_base.ts +910 -0
- package/treb-grid/src/editors/overlay_editor.ts +511 -0
- package/treb-grid/src/index.ts +37 -0
- package/treb-grid/src/layout/base_layout.ts +2618 -0
- package/treb-grid/src/layout/grid_layout.ts +299 -0
- package/treb-grid/src/layout/rectangle_cache.ts +86 -0
- package/treb-grid/src/render/selection-renderer.ts +414 -0
- package/treb-grid/src/render/svg_header_overlay.ts +93 -0
- package/treb-grid/src/render/svg_selection_block.ts +187 -0
- package/treb-grid/src/render/tile_renderer.ts +2122 -0
- package/treb-grid/src/types/annotation.ts +216 -0
- package/treb-grid/src/types/border_constants.ts +34 -0
- package/treb-grid/src/types/clipboard_data.ts +31 -0
- package/treb-grid/src/types/data_model.ts +334 -0
- package/treb-grid/src/types/drag_mask.ts +81 -0
- package/treb-grid/src/types/grid.ts +7743 -0
- package/treb-grid/src/types/grid_base.ts +3644 -0
- package/treb-grid/src/types/grid_command.ts +470 -0
- package/treb-grid/src/types/grid_events.ts +124 -0
- package/treb-grid/src/types/grid_options.ts +97 -0
- package/treb-grid/src/types/grid_selection.ts +60 -0
- package/treb-grid/src/types/named_range.ts +369 -0
- package/treb-grid/src/types/scale-control.ts +202 -0
- package/treb-grid/src/types/serialize_options.ts +72 -0
- package/treb-grid/src/types/set_range_options.ts +52 -0
- package/treb-grid/src/types/sheet.ts +3099 -0
- package/treb-grid/src/types/sheet_types.ts +95 -0
- package/treb-grid/src/types/tab_bar.ts +464 -0
- package/treb-grid/src/types/tile.ts +59 -0
- package/treb-grid/src/types/update_flags.ts +75 -0
- package/treb-grid/src/util/dom_utilities.ts +44 -0
- package/treb-grid/src/util/fontmetrics2.ts +179 -0
- package/treb-grid/src/util/ua.ts +104 -0
- package/treb-logo.svg +18 -0
- package/treb-parser/package.json +5 -0
- package/treb-parser/src/csv-parser.ts +122 -0
- package/treb-parser/src/index.ts +25 -0
- package/treb-parser/src/md-parser.ts +526 -0
- package/treb-parser/src/parser-types.ts +397 -0
- package/treb-parser/src/parser.test.ts +298 -0
- package/treb-parser/src/parser.ts +2673 -0
- package/treb-utils/package.json +5 -0
- package/treb-utils/src/dispatch.ts +57 -0
- package/treb-utils/src/event_source.ts +147 -0
- package/treb-utils/src/ievent_source.ts +33 -0
- package/treb-utils/src/index.ts +31 -0
- package/treb-utils/src/measurement.ts +174 -0
- package/treb-utils/src/resizable.ts +160 -0
- package/treb-utils/src/scale.ts +137 -0
- package/treb-utils/src/serialize_html.ts +124 -0
- package/treb-utils/src/template.ts +70 -0
- package/treb-utils/src/validate_uri.ts +61 -0
- package/tsconfig.json +10 -0
- package/tsproject.json +30 -0
- package/util/license-plugin-esbuild.js +86 -0
- package/util/list-css-vars.sh +46 -0
- package/README-esm.md +0 -37
- package/treb-bundle.css +0 -2
- package/treb-bundle.mjs +0 -15
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* this is our main file for building and generating API types.
|
|
3
|
+
*
|
|
4
|
+
* because we're using a custom element, we have a class that inherits from
|
|
5
|
+
* HTMLElement. that's fine, but it means the build output can't be used in
|
|
6
|
+
* a node environment (for testing, for example) without a shim.
|
|
7
|
+
*
|
|
8
|
+
* we may add some separate build targets that exclude the html
|
|
9
|
+
* element for that purpose in the future.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export { TREB, TREBGlobal } from './custom-element/treb-global';
|
|
13
|
+
|
|
14
|
+
// import for side effects
|
|
15
|
+
import './custom-element/treb-spreadsheet-element';
|
|
16
|
+
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of TREB.
|
|
3
|
+
*
|
|
4
|
+
* TREB is free software: you can redistribute it and/or modify it under the
|
|
5
|
+
* terms of the GNU General Public License as published by the Free Software
|
|
6
|
+
* Foundation, either version 3 of the License, or (at your option) any
|
|
7
|
+
* later version.
|
|
8
|
+
*
|
|
9
|
+
* TREB is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
10
|
+
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
11
|
+
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
12
|
+
* details.
|
|
13
|
+
*
|
|
14
|
+
* You should have received a copy of the GNU General Public License along
|
|
15
|
+
* with TREB. If not, see <https://www.gnu.org/licenses/>.
|
|
16
|
+
*
|
|
17
|
+
* Copyright 2022-2023 trebco, llc.
|
|
18
|
+
* info@treb.app
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import type { FunctionDescriptor } from 'treb-grid';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* this is similar to a function descriptor, but we need a lot less
|
|
26
|
+
* information. not sure if we should composite them.
|
|
27
|
+
*/
|
|
28
|
+
export interface TranslatedFunctionDescriptor extends FunctionDescriptor {
|
|
29
|
+
|
|
30
|
+
/** original name (name in english), so we know what to replace. */
|
|
31
|
+
base: string;
|
|
32
|
+
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface LanguageModel {
|
|
36
|
+
name: string;
|
|
37
|
+
version?: string;
|
|
38
|
+
locale?: string;
|
|
39
|
+
functions?: TranslatedFunctionDescriptor[];
|
|
40
|
+
}
|
|
41
|
+
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of TREB.
|
|
3
|
+
*
|
|
4
|
+
* TREB is free software: you can redistribute it and/or modify it under the
|
|
5
|
+
* terms of the GNU General Public License as published by the Free Software
|
|
6
|
+
* Foundation, either version 3 of the License, or (at your option) any
|
|
7
|
+
* later version.
|
|
8
|
+
*
|
|
9
|
+
* TREB is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
10
|
+
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
11
|
+
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
12
|
+
* details.
|
|
13
|
+
*
|
|
14
|
+
* You should have received a copy of the GNU General Public License along
|
|
15
|
+
* with TREB. If not, see <https://www.gnu.org/licenses/>.
|
|
16
|
+
*
|
|
17
|
+
* Copyright 2022-2023 trebco, llc.
|
|
18
|
+
* info@treb.app
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import type { ICellAddress } from 'treb-base-types';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* options for exporting CSV/TSV
|
|
26
|
+
*/
|
|
27
|
+
export interface ExportOptions {
|
|
28
|
+
|
|
29
|
+
/** comma or tab */
|
|
30
|
+
delimiter?: ',' | '\t';
|
|
31
|
+
|
|
32
|
+
/** optionally choose a sheet to export (defaults to active sheet) */
|
|
33
|
+
sheet?: string|number;
|
|
34
|
+
|
|
35
|
+
/** export formulas not values */
|
|
36
|
+
formulas?: boolean;
|
|
37
|
+
|
|
38
|
+
/** use number formats when exporting numbers */
|
|
39
|
+
formatted?: boolean;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* options for creating spreadsheet
|
|
44
|
+
*/
|
|
45
|
+
export interface EmbeddedSpreadsheetOptions {
|
|
46
|
+
|
|
47
|
+
/** containing HTML element */
|
|
48
|
+
container?: string|HTMLElement;
|
|
49
|
+
|
|
50
|
+
/** allow drag-and-drop files */
|
|
51
|
+
dnd?: boolean;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* expandable grid. if this option is false, the grid will always
|
|
55
|
+
* stay the same size -- if you keep pressing down arrow, it won't
|
|
56
|
+
* grow. defaults to true.
|
|
57
|
+
*/
|
|
58
|
+
expand?: boolean;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* key in localStorage for persisting document.
|
|
62
|
+
*
|
|
63
|
+
* it's possible to set this to boolean `true`, in which case we will
|
|
64
|
+
* generate a storage key based on the page URI.
|
|
65
|
+
*
|
|
66
|
+
* that can be convenient for quickly setting up a document, but don't
|
|
67
|
+
* use it if the page URI might change (the storage will get lost)
|
|
68
|
+
* or if there are multiple spreadsheets on the same page (they will
|
|
69
|
+
* overwrite each other).
|
|
70
|
+
*/
|
|
71
|
+
storage_key?: string|boolean;
|
|
72
|
+
|
|
73
|
+
/** don't load immediately (?) */
|
|
74
|
+
toll_initial_load?: boolean;
|
|
75
|
+
|
|
76
|
+
/** show formula bar. default true. */
|
|
77
|
+
formula_bar?: boolean;
|
|
78
|
+
|
|
79
|
+
/** expand formula bar */
|
|
80
|
+
expand_formula_button?: boolean;
|
|
81
|
+
|
|
82
|
+
/** scroll to cell on load */
|
|
83
|
+
scroll?: string | ICellAddress;
|
|
84
|
+
|
|
85
|
+
/** sheet to show on load, overrides anything in the model */
|
|
86
|
+
sheet?: string;
|
|
87
|
+
|
|
88
|
+
/** add resizable wrapper */
|
|
89
|
+
resizable?: boolean;
|
|
90
|
+
|
|
91
|
+
/** export to xlsx, now optional */
|
|
92
|
+
export?: boolean;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* fetch network document. this is a replacement for the old
|
|
96
|
+
* (deprecated) option `network_document`.
|
|
97
|
+
*/
|
|
98
|
+
document?: string;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* fetch network document (URI)
|
|
102
|
+
* @deprecated - use `document`
|
|
103
|
+
*/
|
|
104
|
+
network_document?: string;
|
|
105
|
+
|
|
106
|
+
/** freeze rows */
|
|
107
|
+
freeze_rows?: number;
|
|
108
|
+
|
|
109
|
+
/** freeze columns */
|
|
110
|
+
freeze_columns?: number;
|
|
111
|
+
|
|
112
|
+
/** row/column headers */
|
|
113
|
+
headers?: boolean;
|
|
114
|
+
|
|
115
|
+
/** recalculate on load */
|
|
116
|
+
recalculate?: boolean;
|
|
117
|
+
|
|
118
|
+
/** show scrollbars */
|
|
119
|
+
scrollbars?: boolean;
|
|
120
|
+
|
|
121
|
+
/** show tab bar (multi sheet) */
|
|
122
|
+
tab_bar?: boolean|'auto';
|
|
123
|
+
|
|
124
|
+
/** allow add tab */
|
|
125
|
+
add_tab?: boolean;
|
|
126
|
+
|
|
127
|
+
/** show delete tab */
|
|
128
|
+
delete_tab?: boolean;
|
|
129
|
+
|
|
130
|
+
/** set a reference in global (self) */
|
|
131
|
+
global_name?: string;
|
|
132
|
+
|
|
133
|
+
/** support undo */
|
|
134
|
+
undo?: boolean;
|
|
135
|
+
|
|
136
|
+
/** support in-cell editor */
|
|
137
|
+
in_cell_editor?: boolean;
|
|
138
|
+
|
|
139
|
+
/** prompt "you have unsaved changes" */
|
|
140
|
+
prompt_save?: boolean;
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* toolbar display option. true or false means include/don't include
|
|
144
|
+
* the toolbar (and the toolbar button). setting to "narrow" means
|
|
145
|
+
* include the toolbar, but use a narrow version (it compresses the
|
|
146
|
+
* align/justify groups).
|
|
147
|
+
*
|
|
148
|
+
* the toolbar usually starts hidden. if you set this option to "show",
|
|
149
|
+
* it will start visible. same for "show-narrow".
|
|
150
|
+
*/
|
|
151
|
+
toolbar?: boolean | 'show' | 'narrow' | 'show-narrow';
|
|
152
|
+
|
|
153
|
+
/** include the file menu in the toolbar */
|
|
154
|
+
file_menu?: boolean;
|
|
155
|
+
|
|
156
|
+
/** include the font scale control in the toolbar */
|
|
157
|
+
font_scale?: boolean;
|
|
158
|
+
|
|
159
|
+
/** include the insert/remove table button in the toolbar */
|
|
160
|
+
table_button?: boolean;
|
|
161
|
+
|
|
162
|
+
/** include the freeze button in the toolbar */
|
|
163
|
+
freeze_button?: boolean;
|
|
164
|
+
|
|
165
|
+
/** include the chart menu in the toolbar */
|
|
166
|
+
chart_menu?: boolean;
|
|
167
|
+
|
|
168
|
+
/** include a recalculate button in the toolbar */
|
|
169
|
+
toolbar_recalculate_button?: boolean;
|
|
170
|
+
|
|
171
|
+
/** better support for headless operations (default false) */
|
|
172
|
+
headless?: boolean;
|
|
173
|
+
|
|
174
|
+
/** max size for image, in bytes */
|
|
175
|
+
max_file_size?: number;
|
|
176
|
+
|
|
177
|
+
/** initial scale */
|
|
178
|
+
scale?: number;
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* show scale control (slider) under the spreadsheet.
|
|
182
|
+
*/
|
|
183
|
+
scale_control?: boolean;
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* show the stats panel under the spreadsheet.
|
|
187
|
+
*/
|
|
188
|
+
stats?: boolean;
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* save/load scale. this can optionally have a string key to disambiguate
|
|
192
|
+
*/
|
|
193
|
+
persist_scale?: boolean|string;
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* target window for hyperlinks (default _blank); set false to disable hyperlinks altogether
|
|
197
|
+
*/
|
|
198
|
+
hyperlinks?: string|false;
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* enable handling complex numbers in function calculation. turning this
|
|
202
|
+
* off doesn't actually disable complex numbers. it means that functions
|
|
203
|
+
* will not return complex numbers unless one of the arguments is complex.
|
|
204
|
+
*
|
|
205
|
+
* for example, if complex numbers are off, `=SQRT(-1)` will return `#VALUE`.
|
|
206
|
+
* if complex numbers are on, `=SQRT(-1)` will return `i`.
|
|
207
|
+
*
|
|
208
|
+
* even if complex numbers are off, however, `=SQRT(-1 + 0i)` will return
|
|
209
|
+
* `i` because the argument is complex.
|
|
210
|
+
*
|
|
211
|
+
* currently this behavior applies to `SQRT`, `POWER` and the exponentiation
|
|
212
|
+
* operator `^`.
|
|
213
|
+
*
|
|
214
|
+
* in version 22, this defaults to `off`.
|
|
215
|
+
*/
|
|
216
|
+
complex?: 'on'|'off';
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* for rendering the imaginary number. this is intended to support
|
|
220
|
+
* switching to a different character for rendering, or adding a leading
|
|
221
|
+
* space/half-space/hair-space.
|
|
222
|
+
*
|
|
223
|
+
* this _does_not_ change how you enter imaginary numbers, you still have
|
|
224
|
+
* to use `i` (lower-case ascii i).
|
|
225
|
+
*/
|
|
226
|
+
imaginary_value?: string;
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* support markdown formatting for text in cells and comments. at the
|
|
230
|
+
* moment we only support bold, italic, and strike text.
|
|
231
|
+
*/
|
|
232
|
+
markdown?: boolean;
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* show tinted colors in toolbar color dropdowns. as of version 25
|
|
236
|
+
* this defaults to true (used to be false).
|
|
237
|
+
*/
|
|
238
|
+
tint_theme_colors?: boolean;
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* show a spinner for long-running operations
|
|
242
|
+
*/
|
|
243
|
+
spinner?: boolean;
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* start with sidebar closed. defaults to false.
|
|
247
|
+
*/
|
|
248
|
+
collapsed?: boolean;
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* show the revert button in the sidebar. see the `Revert` method. this
|
|
252
|
+
* was renamed from `revert` to avoid any ambiguity.
|
|
253
|
+
*/
|
|
254
|
+
revert_button?: boolean;
|
|
255
|
+
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* default options. some of these are unecessary but we're being
|
|
260
|
+
* explicit here just to be clear that these are intentional.
|
|
261
|
+
*
|
|
262
|
+
* @internal
|
|
263
|
+
*/
|
|
264
|
+
export const DefaultOptions: EmbeddedSpreadsheetOptions = {
|
|
265
|
+
formula_bar: true,
|
|
266
|
+
in_cell_editor: true,
|
|
267
|
+
undo: true,
|
|
268
|
+
scrollbars: true,
|
|
269
|
+
headers: true,
|
|
270
|
+
export: true,
|
|
271
|
+
tab_bar: 'auto',
|
|
272
|
+
resizable: true,
|
|
273
|
+
hyperlinks: '_blank',
|
|
274
|
+
max_file_size: 1024 * 92,
|
|
275
|
+
|
|
276
|
+
// popout: false,
|
|
277
|
+
// imaginary_value: 'i',
|
|
278
|
+
|
|
279
|
+
tint_theme_colors: true,
|
|
280
|
+
|
|
281
|
+
// I don't think false options need to be in default?
|
|
282
|
+
// although it's nice to have a clear reference about defaults...
|
|
283
|
+
|
|
284
|
+
dnd: false,
|
|
285
|
+
add_tab: false,
|
|
286
|
+
expand_formula_button: false,
|
|
287
|
+
delete_tab: false,
|
|
288
|
+
|
|
289
|
+
// changing default value for expand -> false, it might be
|
|
290
|
+
// useful to disable it but the common expectation is that
|
|
291
|
+
// spreadsheets can grow.
|
|
292
|
+
|
|
293
|
+
expand: true,
|
|
294
|
+
markdown: false,
|
|
295
|
+
spinner: false,
|
|
296
|
+
complex: 'off',
|
|
297
|
+
|
|
298
|
+
};
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of TREB.
|
|
3
|
+
*
|
|
4
|
+
* TREB is free software: you can redistribute it and/or modify it under the
|
|
5
|
+
* terms of the GNU General Public License as published by the Free Software
|
|
6
|
+
* Foundation, either version 3 of the License, or (at your option) any
|
|
7
|
+
* later version.
|
|
8
|
+
*
|
|
9
|
+
* TREB is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
10
|
+
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
11
|
+
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
12
|
+
* details.
|
|
13
|
+
*
|
|
14
|
+
* You should have received a copy of the GNU General Public License along
|
|
15
|
+
* with TREB. If not, see <https://www.gnu.org/licenses/>.
|
|
16
|
+
*
|
|
17
|
+
* Copyright 2022-2023 trebco, llc.
|
|
18
|
+
* info@treb.app
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import {tmpl, NodeModel} from 'treb-utils';
|
|
23
|
+
// import '../style/icon.scss';
|
|
24
|
+
|
|
25
|
+
export enum DialogType {
|
|
26
|
+
default = '',
|
|
27
|
+
info = 'info',
|
|
28
|
+
error = 'error',
|
|
29
|
+
warning = 'warning',
|
|
30
|
+
success = 'success',
|
|
31
|
+
about = 'about',
|
|
32
|
+
initial = 'initial',
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface MessageDialogOptions {
|
|
36
|
+
title?: string;
|
|
37
|
+
message?: string;
|
|
38
|
+
icon?: string|boolean;
|
|
39
|
+
close_box?: boolean;
|
|
40
|
+
timeout?: number;
|
|
41
|
+
type?: DialogType;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export type ResolutionFunction = () => void;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* rebuilding the dialog, like this:
|
|
48
|
+
*
|
|
49
|
+
* +======================================================+
|
|
50
|
+
* | | TITLE | [X]|
|
|
51
|
+
* | [icon] | message | |
|
|
52
|
+
* | | (progress bar?) | |
|
|
53
|
+
* +------------------------------------------------------+
|
|
54
|
+
*
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* modal informational dialog that covers the embedded
|
|
59
|
+
* spreadsheet. not fancy.
|
|
60
|
+
*/
|
|
61
|
+
export class Dialog {
|
|
62
|
+
|
|
63
|
+
// private model: NodeModel;
|
|
64
|
+
private model: Record<string, HTMLElement> = {};
|
|
65
|
+
|
|
66
|
+
private layout_element: HTMLElement;
|
|
67
|
+
|
|
68
|
+
// tslint:disable-next-line:variable-name
|
|
69
|
+
private visible_ = false;
|
|
70
|
+
|
|
71
|
+
private timeout = 0;
|
|
72
|
+
|
|
73
|
+
private pending_dialog_resoltion: ResolutionFunction[] = [];
|
|
74
|
+
|
|
75
|
+
private options_: Partial<MessageDialogOptions> = {
|
|
76
|
+
type: DialogType.initial,
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
private set options(options: Partial<MessageDialogOptions>) {
|
|
80
|
+
|
|
81
|
+
if (options.type === DialogType.about) {
|
|
82
|
+
options.close_box = true;
|
|
83
|
+
options.icon = true;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (this.options_.icon !== options.icon) {
|
|
87
|
+
this.model.left.style.display = options.icon ? 'block' : 'none';
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (this.options_.close_box !== options.close_box) {
|
|
91
|
+
this.model.close.style.display = options.close_box ? 'block' : 'none';
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (this.options_.message !== options.message) {
|
|
95
|
+
this.model.message.textContent = options.message || '';
|
|
96
|
+
this.model.message.style.display = options.message ? 'block' : 'none';
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (this.options_.title !== options.title) {
|
|
100
|
+
this.model.title.textContent = options.title || '';
|
|
101
|
+
this.model.title.style.display = options.title ? 'block' : 'none';
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (this.options_.type !== options.type) {
|
|
105
|
+
let classes = this.model.dialog.className.replace(/dialog-type-\S+/g, '').trim();
|
|
106
|
+
if (options.type) { classes += ` dialog-type-${options.type}`; }
|
|
107
|
+
this.model.dialog.className = classes;
|
|
108
|
+
|
|
109
|
+
if (options.type === 'about') {
|
|
110
|
+
this.model.about.style.display = 'block';
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
this.model.about.style.display = 'none';
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
this.options_ = options;
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
private event_handler = (event: KeyboardEvent) => {
|
|
124
|
+
if (event.key === 'Escape' || event.key === 'Esc') {
|
|
125
|
+
event.stopPropagation();
|
|
126
|
+
event.preventDefault();
|
|
127
|
+
this.visible = false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
private get visible(){
|
|
132
|
+
return this.visible_;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
private set visible(value: boolean){
|
|
136
|
+
|
|
137
|
+
if (value === this.visible_) { return; }
|
|
138
|
+
this.visible_ = value;
|
|
139
|
+
|
|
140
|
+
// we want to mask not just the spreadsheet but also the toolbar and
|
|
141
|
+
// sidebar. unfortunately we built the node structure the other way.
|
|
142
|
+
// not a real problem though, just requires some reacharound
|
|
143
|
+
|
|
144
|
+
// actually check that we can do that with CSS -- siblings FTW
|
|
145
|
+
|
|
146
|
+
if (value) {
|
|
147
|
+
this.layout_element?.setAttribute('dialog', '');
|
|
148
|
+
window.addEventListener('keydown', this.event_handler);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
this.layout_element?.removeAttribute('dialog');
|
|
152
|
+
window.removeEventListener('keydown', this.event_handler);
|
|
153
|
+
const tmp = this.pending_dialog_resoltion.slice(0);
|
|
154
|
+
this.pending_dialog_resoltion = [];
|
|
155
|
+
Promise.resolve().then(() => {
|
|
156
|
+
for (const func of tmp) {
|
|
157
|
+
func();
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
constructor(parent_node: HTMLElement) { // }, options: MaskDialogOptions = {}) {
|
|
165
|
+
|
|
166
|
+
this.layout_element = parent_node.parentElement as HTMLElement;
|
|
167
|
+
|
|
168
|
+
const root = this.layout_element?.querySelector('.treb-dialog-mask') as HTMLElement;
|
|
169
|
+
if (root) {
|
|
170
|
+
const elements = root.querySelectorAll('[data-bind]') as NodeListOf<HTMLElement>;
|
|
171
|
+
for (const element of Array.from(elements)) {
|
|
172
|
+
const bind = element.dataset.bind;
|
|
173
|
+
if (bind) {
|
|
174
|
+
this.model[bind] = element;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// console.info({model: this.model});
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (this.model.about) {
|
|
181
|
+
const html: string[] = [`<div>TREB version ${process.env.BUILD_VERSION}`];
|
|
182
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
183
|
+
html.push(`<small>(development build)</small>`);
|
|
184
|
+
}
|
|
185
|
+
html.push( `<small><a target=_blank href='https://treb.app'>http://treb.app</a></small>` )
|
|
186
|
+
this.model.about.innerHTML = html.join('\n');
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
this.model.close?.addEventListener('click', (event) => {
|
|
190
|
+
event.stopPropagation();
|
|
191
|
+
event.preventDefault();
|
|
192
|
+
this.HideDialog();
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
public Update(options: Partial<MessageDialogOptions>, delta = true): void {
|
|
199
|
+
if (delta) {
|
|
200
|
+
options = { ...this.options_, ... options};
|
|
201
|
+
}
|
|
202
|
+
this.options = options;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
public HideDialog(): void {
|
|
206
|
+
this.visible = false;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
public ShowDialog(options: Partial<MessageDialogOptions>): Promise<void> {
|
|
210
|
+
return new Promise((resolve) => {
|
|
211
|
+
|
|
212
|
+
this.pending_dialog_resoltion.push(resolve);
|
|
213
|
+
this.options = options;
|
|
214
|
+
this.visible = true;
|
|
215
|
+
|
|
216
|
+
if (this.timeout) {
|
|
217
|
+
window.clearTimeout(this.timeout);
|
|
218
|
+
this.timeout = 0;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (options.timeout) {
|
|
222
|
+
this.timeout = window.setTimeout(() => this.HideDialog(), options.timeout);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
import type { GridSelection } from 'treb-grid';
|
|
3
|
+
import type { Style } from 'treb-base-types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* state that should be reflected in toolbar buttons/selections
|
|
7
|
+
*/
|
|
8
|
+
export interface SelectionState {
|
|
9
|
+
style?: Style.Properties;
|
|
10
|
+
merge?: boolean;
|
|
11
|
+
table?: boolean;
|
|
12
|
+
frozen?: boolean;
|
|
13
|
+
comment?: string;
|
|
14
|
+
selection?: GridSelection;
|
|
15
|
+
relative_font_size?: number;
|
|
16
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of TREB.
|
|
3
|
+
*
|
|
4
|
+
* TREB is free software: you can redistribute it and/or modify it under the
|
|
5
|
+
* terms of the GNU General Public License as published by the Free Software
|
|
6
|
+
* Foundation, either version 3 of the License, or (at your option) any
|
|
7
|
+
* later version.
|
|
8
|
+
*
|
|
9
|
+
* TREB is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
10
|
+
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
11
|
+
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
12
|
+
* details.
|
|
13
|
+
*
|
|
14
|
+
* You should have received a copy of the GNU General Public License along
|
|
15
|
+
* with TREB. If not, see <https://www.gnu.org/licenses/>.
|
|
16
|
+
*
|
|
17
|
+
* Copyright 2022-2023 trebco, llc.
|
|
18
|
+
* info@treb.app
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
export class Spinner {
|
|
23
|
+
|
|
24
|
+
private node: HTMLDivElement;
|
|
25
|
+
private visible = false;
|
|
26
|
+
|
|
27
|
+
constructor(public container: HTMLElement) {
|
|
28
|
+
this.node = document.createElement('div');
|
|
29
|
+
this.node.classList.add('treb-spinner');
|
|
30
|
+
this.node.innerHTML = `<div><div></div><div></div><div></div><div></div></div>`;
|
|
31
|
+
container.appendChild(this.node);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public Show(): void {
|
|
35
|
+
this.node.classList.add('visible');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public Hide() {
|
|
39
|
+
this.node.classList.remove('visible');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
}
|