@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.
Files changed (217) hide show
  1. package/.eslintignore +8 -0
  2. package/.eslintrc.js +164 -0
  3. package/README-shadow-DOM.md +88 -0
  4. package/README.md +37 -130
  5. package/api-config.json +29 -0
  6. package/api-generator/api-generator-types.ts +82 -0
  7. package/api-generator/api-generator.ts +1172 -0
  8. package/api-generator/package.json +3 -0
  9. package/build/treb-spreadsheet.mjs +14 -0
  10. package/{treb.d.ts → build/treb.d.ts} +323 -271
  11. package/esbuild-custom-element.mjs +336 -0
  12. package/esbuild.js +305 -0
  13. package/package.json +49 -14
  14. package/treb-base-types/package.json +5 -0
  15. package/treb-base-types/src/api_types.ts +36 -0
  16. package/treb-base-types/src/area.ts +583 -0
  17. package/treb-base-types/src/basic_types.ts +45 -0
  18. package/treb-base-types/src/cell.ts +612 -0
  19. package/treb-base-types/src/cells.ts +1066 -0
  20. package/treb-base-types/src/color.ts +124 -0
  21. package/treb-base-types/src/import.ts +71 -0
  22. package/treb-base-types/src/index-standalone.ts +29 -0
  23. package/treb-base-types/src/index.ts +42 -0
  24. package/treb-base-types/src/layout.ts +47 -0
  25. package/treb-base-types/src/localization.ts +187 -0
  26. package/treb-base-types/src/rectangle.ts +145 -0
  27. package/treb-base-types/src/render_text.ts +72 -0
  28. package/treb-base-types/src/style.ts +545 -0
  29. package/treb-base-types/src/table.ts +109 -0
  30. package/treb-base-types/src/text_part.ts +54 -0
  31. package/treb-base-types/src/theme.ts +608 -0
  32. package/treb-base-types/src/union.ts +152 -0
  33. package/treb-base-types/src/value-type.ts +164 -0
  34. package/treb-base-types/style/resizable.css +59 -0
  35. package/treb-calculator/modern.tsconfig.json +11 -0
  36. package/treb-calculator/package.json +5 -0
  37. package/treb-calculator/src/calculator.ts +2546 -0
  38. package/treb-calculator/src/complex-math.ts +558 -0
  39. package/treb-calculator/src/dag/array-vertex.ts +198 -0
  40. package/treb-calculator/src/dag/graph.ts +951 -0
  41. package/treb-calculator/src/dag/leaf_vertex.ts +118 -0
  42. package/treb-calculator/src/dag/spreadsheet_vertex.ts +327 -0
  43. package/treb-calculator/src/dag/spreadsheet_vertex_base.ts +44 -0
  44. package/treb-calculator/src/dag/vertex.ts +352 -0
  45. package/treb-calculator/src/descriptors.ts +162 -0
  46. package/treb-calculator/src/expression-calculator.ts +1069 -0
  47. package/treb-calculator/src/function-error.ts +103 -0
  48. package/treb-calculator/src/function-library.ts +103 -0
  49. package/treb-calculator/src/functions/base-functions.ts +1214 -0
  50. package/treb-calculator/src/functions/checkbox.ts +164 -0
  51. package/treb-calculator/src/functions/complex-functions.ts +253 -0
  52. package/treb-calculator/src/functions/finance-functions.ts +399 -0
  53. package/treb-calculator/src/functions/information-functions.ts +102 -0
  54. package/treb-calculator/src/functions/matrix-functions.ts +182 -0
  55. package/treb-calculator/src/functions/sparkline.ts +335 -0
  56. package/treb-calculator/src/functions/statistics-functions.ts +350 -0
  57. package/treb-calculator/src/functions/text-functions.ts +298 -0
  58. package/treb-calculator/src/index.ts +27 -0
  59. package/treb-calculator/src/notifier-types.ts +59 -0
  60. package/treb-calculator/src/primitives.ts +428 -0
  61. package/treb-calculator/src/utilities.ts +305 -0
  62. package/treb-charts/package.json +5 -0
  63. package/treb-charts/src/chart-functions.ts +156 -0
  64. package/treb-charts/src/chart-types.ts +230 -0
  65. package/treb-charts/src/chart.ts +1288 -0
  66. package/treb-charts/src/index.ts +24 -0
  67. package/treb-charts/src/main.ts +37 -0
  68. package/treb-charts/src/rectangle.ts +52 -0
  69. package/treb-charts/src/renderer.ts +1841 -0
  70. package/treb-charts/src/util.ts +122 -0
  71. package/treb-charts/style/charts.scss +221 -0
  72. package/treb-charts/style/old-charts.scss +250 -0
  73. package/treb-embed/markup/layout.html +137 -0
  74. package/treb-embed/markup/toolbar.html +175 -0
  75. package/treb-embed/modern.tsconfig.json +25 -0
  76. package/treb-embed/src/custom-element/content-types.d.ts +18 -0
  77. package/treb-embed/src/custom-element/global.d.ts +11 -0
  78. package/treb-embed/src/custom-element/spreadsheet-constructor.ts +1228 -0
  79. package/treb-embed/src/custom-element/treb-global.ts +44 -0
  80. package/treb-embed/src/custom-element/treb-spreadsheet-element.ts +52 -0
  81. package/treb-embed/src/embedded-spreadsheet.ts +5358 -0
  82. package/treb-embed/src/index.ts +16 -0
  83. package/treb-embed/src/language-model.ts +41 -0
  84. package/treb-embed/src/options.ts +298 -0
  85. package/treb-embed/src/progress-dialog.ts +228 -0
  86. package/treb-embed/src/selection-state.ts +16 -0
  87. package/treb-embed/src/spinner.ts +42 -0
  88. package/treb-embed/src/toolbar-message.ts +96 -0
  89. package/treb-embed/src/types.ts +167 -0
  90. package/treb-embed/style/autocomplete.scss +103 -0
  91. package/treb-embed/style/dark-theme.scss +114 -0
  92. package/treb-embed/style/defaults.scss +36 -0
  93. package/treb-embed/style/dialog.scss +181 -0
  94. package/treb-embed/style/dropdown-select.scss +101 -0
  95. package/treb-embed/style/formula-bar.scss +193 -0
  96. package/treb-embed/style/grid.scss +374 -0
  97. package/treb-embed/style/layout.scss +424 -0
  98. package/treb-embed/style/mouse-mask.scss +67 -0
  99. package/treb-embed/style/note.scss +92 -0
  100. package/treb-embed/style/overlay-editor.scss +102 -0
  101. package/treb-embed/style/spinner.scss +92 -0
  102. package/treb-embed/style/tab-bar.scss +228 -0
  103. package/treb-embed/style/table.scss +80 -0
  104. package/treb-embed/style/theme-defaults.scss +444 -0
  105. package/treb-embed/style/toolbar.scss +416 -0
  106. package/treb-embed/style/tooltip.scss +68 -0
  107. package/treb-embed/style/treb-icons.scss +130 -0
  108. package/treb-embed/style/treb-spreadsheet-element.scss +20 -0
  109. package/treb-embed/style/z-index.scss +43 -0
  110. package/treb-export/docs/charts.md +68 -0
  111. package/treb-export/modern.tsconfig.json +19 -0
  112. package/treb-export/package.json +4 -0
  113. package/treb-export/src/address-type.ts +77 -0
  114. package/treb-export/src/base-template.ts +22 -0
  115. package/treb-export/src/column-width.ts +85 -0
  116. package/treb-export/src/drawing2/chart-template-components2.ts +389 -0
  117. package/treb-export/src/drawing2/chart2.ts +282 -0
  118. package/treb-export/src/drawing2/column-chart-template2.ts +521 -0
  119. package/treb-export/src/drawing2/donut-chart-template2.ts +296 -0
  120. package/treb-export/src/drawing2/drawing2.ts +355 -0
  121. package/treb-export/src/drawing2/embedded-image.ts +71 -0
  122. package/treb-export/src/drawing2/scatter-chart-template2.ts +555 -0
  123. package/treb-export/src/export-worker/export-worker.ts +99 -0
  124. package/treb-export/src/export-worker/index-modern.ts +22 -0
  125. package/treb-export/src/export2.ts +2204 -0
  126. package/treb-export/src/import2.ts +882 -0
  127. package/treb-export/src/relationship.ts +36 -0
  128. package/treb-export/src/shared-strings2.ts +128 -0
  129. package/treb-export/src/template-2.ts +22 -0
  130. package/treb-export/src/unescape_xml.ts +47 -0
  131. package/treb-export/src/workbook-sheet2.ts +182 -0
  132. package/treb-export/src/workbook-style2.ts +1285 -0
  133. package/treb-export/src/workbook-theme2.ts +88 -0
  134. package/treb-export/src/workbook2.ts +491 -0
  135. package/treb-export/src/xml-utils.ts +201 -0
  136. package/treb-export/template/base/[Content_Types].xml +2 -0
  137. package/treb-export/template/base/_rels/.rels +2 -0
  138. package/treb-export/template/base/docProps/app.xml +2 -0
  139. package/treb-export/template/base/docProps/core.xml +12 -0
  140. package/treb-export/template/base/xl/_rels/workbook.xml.rels +2 -0
  141. package/treb-export/template/base/xl/sharedStrings.xml +2 -0
  142. package/treb-export/template/base/xl/styles.xml +2 -0
  143. package/treb-export/template/base/xl/theme/theme1.xml +2 -0
  144. package/treb-export/template/base/xl/workbook.xml +2 -0
  145. package/treb-export/template/base/xl/worksheets/sheet1.xml +2 -0
  146. package/treb-export/template/base.xlsx +0 -0
  147. package/treb-format/package.json +8 -0
  148. package/treb-format/src/format.test.ts +213 -0
  149. package/treb-format/src/format.ts +942 -0
  150. package/treb-format/src/format_cache.ts +199 -0
  151. package/treb-format/src/format_parser.ts +723 -0
  152. package/treb-format/src/index.ts +25 -0
  153. package/treb-format/src/number_format_section.ts +100 -0
  154. package/treb-format/src/value_parser.ts +337 -0
  155. package/treb-grid/package.json +5 -0
  156. package/treb-grid/src/editors/autocomplete.ts +394 -0
  157. package/treb-grid/src/editors/autocomplete_matcher.ts +260 -0
  158. package/treb-grid/src/editors/formula_bar.ts +473 -0
  159. package/treb-grid/src/editors/formula_editor_base.ts +910 -0
  160. package/treb-grid/src/editors/overlay_editor.ts +511 -0
  161. package/treb-grid/src/index.ts +37 -0
  162. package/treb-grid/src/layout/base_layout.ts +2618 -0
  163. package/treb-grid/src/layout/grid_layout.ts +299 -0
  164. package/treb-grid/src/layout/rectangle_cache.ts +86 -0
  165. package/treb-grid/src/render/selection-renderer.ts +414 -0
  166. package/treb-grid/src/render/svg_header_overlay.ts +93 -0
  167. package/treb-grid/src/render/svg_selection_block.ts +187 -0
  168. package/treb-grid/src/render/tile_renderer.ts +2122 -0
  169. package/treb-grid/src/types/annotation.ts +216 -0
  170. package/treb-grid/src/types/border_constants.ts +34 -0
  171. package/treb-grid/src/types/clipboard_data.ts +31 -0
  172. package/treb-grid/src/types/data_model.ts +334 -0
  173. package/treb-grid/src/types/drag_mask.ts +81 -0
  174. package/treb-grid/src/types/grid.ts +7743 -0
  175. package/treb-grid/src/types/grid_base.ts +3644 -0
  176. package/treb-grid/src/types/grid_command.ts +470 -0
  177. package/treb-grid/src/types/grid_events.ts +124 -0
  178. package/treb-grid/src/types/grid_options.ts +97 -0
  179. package/treb-grid/src/types/grid_selection.ts +60 -0
  180. package/treb-grid/src/types/named_range.ts +369 -0
  181. package/treb-grid/src/types/scale-control.ts +202 -0
  182. package/treb-grid/src/types/serialize_options.ts +72 -0
  183. package/treb-grid/src/types/set_range_options.ts +52 -0
  184. package/treb-grid/src/types/sheet.ts +3099 -0
  185. package/treb-grid/src/types/sheet_types.ts +95 -0
  186. package/treb-grid/src/types/tab_bar.ts +464 -0
  187. package/treb-grid/src/types/tile.ts +59 -0
  188. package/treb-grid/src/types/update_flags.ts +75 -0
  189. package/treb-grid/src/util/dom_utilities.ts +44 -0
  190. package/treb-grid/src/util/fontmetrics2.ts +179 -0
  191. package/treb-grid/src/util/ua.ts +104 -0
  192. package/treb-logo.svg +18 -0
  193. package/treb-parser/package.json +5 -0
  194. package/treb-parser/src/csv-parser.ts +122 -0
  195. package/treb-parser/src/index.ts +25 -0
  196. package/treb-parser/src/md-parser.ts +526 -0
  197. package/treb-parser/src/parser-types.ts +397 -0
  198. package/treb-parser/src/parser.test.ts +298 -0
  199. package/treb-parser/src/parser.ts +2673 -0
  200. package/treb-utils/package.json +5 -0
  201. package/treb-utils/src/dispatch.ts +57 -0
  202. package/treb-utils/src/event_source.ts +147 -0
  203. package/treb-utils/src/ievent_source.ts +33 -0
  204. package/treb-utils/src/index.ts +31 -0
  205. package/treb-utils/src/measurement.ts +174 -0
  206. package/treb-utils/src/resizable.ts +160 -0
  207. package/treb-utils/src/scale.ts +137 -0
  208. package/treb-utils/src/serialize_html.ts +124 -0
  209. package/treb-utils/src/template.ts +70 -0
  210. package/treb-utils/src/validate_uri.ts +61 -0
  211. package/tsconfig.json +10 -0
  212. package/tsproject.json +30 -0
  213. package/util/license-plugin-esbuild.js +86 -0
  214. package/util/list-css-vars.sh +46 -0
  215. package/README-esm.md +0 -37
  216. package/treb-bundle.css +0 -2
  217. 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
+ }