├── .editorconfig ├── .github ├── ISSUE_TEMPLATE │ ├── BUG_REPORT.yaml │ ├── FEATURE_REQUEST.yaml │ └── QUESTION.yaml ├── PULL_REQUEST_TEMPLATE.md └── workflows │ ├── check.yaml │ ├── e2e.yaml │ ├── release.yaml │ ├── stale.yaml │ └── unittest.yaml ├── .gitignore ├── .npmignore ├── .prettierrc ├── .tool-versions ├── HISTORY.md ├── LICENSE ├── README.md ├── e2e ├── basic.spec.ts ├── event.spec.ts ├── formula.spec.ts ├── playwright.config.ts ├── search.spec.ts ├── time.spec.ts └── utils.ts ├── eslint.config.js ├── gridsheet.png ├── package.json ├── packages ├── react-core │ ├── README.md │ ├── components │ │ ├── Cell.tsx │ │ ├── ContextMenu.tsx │ │ ├── Editor.tsx │ │ ├── Emitter.tsx │ │ ├── Fixed.tsx │ │ ├── FormulaBar.tsx │ │ ├── GridSheet.tsx │ │ ├── HeaderCellLeft.tsx │ │ ├── HeaderCellTop.tsx │ │ ├── PluginBase.tsx │ │ ├── Resizer.tsx │ │ ├── SearchBar.tsx │ │ ├── SheetProvider.tsx │ │ ├── StoreInitializer.tsx │ │ ├── Tabular.tsx │ │ ├── Toggle.tsx │ │ ├── hooks.ts │ │ └── svg │ │ │ ├── AddIcon.tsx │ │ │ ├── Base.tsx │ │ │ ├── CloseIcon.tsx │ │ │ └── SearchIcon.tsx │ ├── constants.ts │ ├── formula │ │ ├── evaluator.ts │ │ ├── functions │ │ │ ├── __base.ts │ │ │ ├── __utils.ts │ │ │ ├── abs.spec.ts │ │ │ ├── abs.ts │ │ │ ├── acos.ts │ │ │ ├── add.ts │ │ │ ├── and.ts │ │ │ ├── asin.ts │ │ │ ├── atan.ts │ │ │ ├── atan2.ts │ │ │ ├── average.ts │ │ │ ├── col.spec.ts │ │ │ ├── col.ts │ │ │ ├── concat.ts │ │ │ ├── concatenate.ts │ │ │ ├── cos.ts │ │ │ ├── count.ts │ │ │ ├── counta.ts │ │ │ ├── countif.spec.ts │ │ │ ├── countif.ts │ │ │ ├── divide.ts │ │ │ ├── eq.spec.ts │ │ │ ├── eq.ts │ │ │ ├── exp.ts │ │ │ ├── gt.ts │ │ │ ├── gte.ts │ │ │ ├── hlookup.ts │ │ │ ├── if.ts │ │ │ ├── iferror.spec.ts │ │ │ ├── iferror.ts │ │ │ ├── len.ts │ │ │ ├── lenb.ts │ │ │ ├── ln.ts │ │ │ ├── log.ts │ │ │ ├── log10.ts │ │ │ ├── lt.ts │ │ │ ├── lte.ts │ │ │ ├── max.ts │ │ │ ├── min.ts │ │ │ ├── minus.ts │ │ │ ├── mod.spec.ts │ │ │ ├── mod.ts │ │ │ ├── multiply.ts │ │ │ ├── ne.ts │ │ │ ├── not.ts │ │ │ ├── now.ts │ │ │ ├── or.ts │ │ │ ├── pi.ts │ │ │ ├── power.ts │ │ │ ├── product.ts │ │ │ ├── radians.ts │ │ │ ├── rand.ts │ │ │ ├── round.ts │ │ │ ├── rounddown.ts │ │ │ ├── roundup.ts │ │ │ ├── row.spec.ts │ │ │ ├── row.ts │ │ │ ├── sin.ts │ │ │ ├── sqrt.ts │ │ │ ├── sum.spec.ts │ │ │ ├── sum.ts │ │ │ ├── sumif.ts │ │ │ ├── tan.ts │ │ │ ├── uminus.ts │ │ │ └── vlookup.ts │ │ ├── mapping.ts │ │ └── solver.ts │ ├── generate-style.js │ ├── index.ts │ ├── jest.config.js │ ├── lib │ │ ├── autofill.ts │ │ ├── clipboard.ts │ │ ├── converters.ts │ │ ├── input.ts │ │ ├── palette.ts │ │ ├── prevention.ts │ │ ├── structs.ts │ │ ├── table.ts │ │ ├── time.ts │ │ └── virtualization.ts │ ├── package.json │ ├── parsers │ │ └── core.ts │ ├── renderers │ │ ├── checkbox.tsx │ │ ├── core.ts │ │ └── thousand_separator.ts │ ├── store │ │ ├── actions.ts │ │ ├── helpers.ts │ │ └── index.ts │ ├── styles │ │ ├── cell.less │ │ ├── contextmenu.less │ │ ├── editor.less │ │ ├── embedder.ts │ │ ├── minified.ts │ │ ├── root.less │ │ ├── root.min.css │ │ ├── search.less │ │ ├── tabular.less │ │ ├── theme-dark.less │ │ └── theme-light.less │ ├── tsconfig.json │ ├── types.ts │ ├── utils.ts │ └── vite.config.js ├── react-right-menu │ ├── README.md │ ├── gridsheet-right-menu.png │ ├── index.ts │ ├── package.json │ ├── right-menu.tsx │ ├── style.ts │ ├── tsconfig.json │ └── vite.config.js └── storybook │ ├── .storybook │ ├── main.ts │ ├── preview.js │ └── vitest.setup.js │ ├── package.json │ ├── stories │ ├── basic │ │ ├── labeler.stories.tsx │ │ ├── parser.stories.tsx │ │ ├── renderer.stories.tsx │ │ ├── resize.stories.tsx │ │ ├── sheets.stories.tsx │ │ ├── showAddress.stories.tsx │ │ ├── size.stories.tsx │ │ ├── style.stories.tsx │ │ └── theme.stories.tsx │ ├── demo │ │ ├── fruits.stories.tsx │ │ └── list.stories.tsx │ ├── events │ │ ├── onchange.stories.tsx │ │ ├── replace.stories.tsx │ │ ├── update.stories.tsx │ │ └── write.stories.tsx │ ├── formula │ │ ├── col.stories.tsx │ │ ├── custom.stories.tsx │ │ ├── disabled.stories.tsx │ │ ├── lookup.stories.tsx │ │ ├── no_formula_bar.stories.tsx │ │ ├── row.stories.tsx │ │ └── simple.stories.tsx │ ├── plugin │ │ └── menu.stories.tsx │ └── protection │ │ └── protection.stories.tsx │ ├── tsconfig.json │ └── vitest.config.js ├── pnpm-lock.yaml ├── pnpm-workspace.yaml └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | charset = utf-8 3 | 4 | [*.ts] 5 | indent_style = space 6 | indent_size = 2 7 | 8 | [*.js] 9 | indent_style = space 10 | indent_size = 2 11 | 12 | [*.json] 13 | indent_style = space 14 | indent_size = 2 15 | 16 | [*.yaml,*.yml] 17 | indent_style = space 18 | indent_size = 2 19 | 20 | [*.ts,*.tsx] 21 | indent_style = space 22 | indent_size = 2 23 | 24 | [*.scss,*.css,*.styl] 25 | indent_style = space 26 | indent_size = 2 27 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/BUG_REPORT.yaml: -------------------------------------------------------------------------------- 1 | name: "🐛 Bug Report" 2 | description: Create a new ticket for a bug. 3 | title: "🐛 [BUG] -
15 | {' '}
16 | |
36 |
37 | {' '}
38 | |
57 |
60 | {' '}
61 | |
81 |
82 | {' '}
83 | |
103 |
TSV: (Ctrl+s to update)
94 | 99 |89 | {(() => { 90 | if (history.operation === 'UPDATE') { 91 | return JSON.stringify(table?.getAddressesByIds(history.diffAfter)); 92 | } 93 | })()} 94 |95 |