dash-spread-grid 0.0.1__tar.gz
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.
- dash_spread_grid-0.0.1/LICENSE +0 -0
- dash_spread_grid-0.0.1/MANIFEST.in +11 -0
- dash_spread_grid-0.0.1/PKG-INFO +11 -0
- dash_spread_grid-0.0.1/README.md +98 -0
- dash_spread_grid-0.0.1/dash_spread_grid/DashSpreadGrid.py +44 -0
- dash_spread_grid-0.0.1/dash_spread_grid/__init__.py +87 -0
- dash_spread_grid-0.0.1/dash_spread_grid/_imports_.py +5 -0
- dash_spread_grid-0.0.1/dash_spread_grid/dash_spread_grid.min.js +2 -0
- dash_spread_grid-0.0.1/dash_spread_grid/dash_spread_grid.min.js.map +1 -0
- dash_spread_grid-0.0.1/dash_spread_grid/metadata.json +104 -0
- dash_spread_grid-0.0.1/dash_spread_grid/package-info.json +59 -0
- dash_spread_grid-0.0.1/dash_spread_grid.egg-info/PKG-INFO +11 -0
- dash_spread_grid-0.0.1/dash_spread_grid.egg-info/SOURCES.txt +16 -0
- dash_spread_grid-0.0.1/dash_spread_grid.egg-info/dependency_links.txt +1 -0
- dash_spread_grid-0.0.1/dash_spread_grid.egg-info/top_level.txt +1 -0
- dash_spread_grid-0.0.1/package.json +59 -0
- dash_spread_grid-0.0.1/setup.cfg +4 -0
- dash_spread_grid-0.0.1/setup.py +23 -0
|
File without changes
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
include dash_spread_grid/dash_spread_grid.min.js
|
|
2
|
+
include dash_spread_grid/dash_spread_grid.min.js.map
|
|
3
|
+
include dash_spread_grid/async-*.js
|
|
4
|
+
include dash_spread_grid/async-*.js.map
|
|
5
|
+
include dash_spread_grid/*-shared.js
|
|
6
|
+
include dash_spread_grid/*-shared.js.map
|
|
7
|
+
include dash_spread_grid/metadata.json
|
|
8
|
+
include dash_spread_grid/package-info.json
|
|
9
|
+
include README.md
|
|
10
|
+
include LICENSE
|
|
11
|
+
include package.json
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Metadata-Version: 1.1
|
|
2
|
+
Name: dash_spread_grid
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Fast grid for Dash applications
|
|
5
|
+
Home-page: UNKNOWN
|
|
6
|
+
Author: Tomasz Rewak <tomasz.rewak@gmail.com>
|
|
7
|
+
Author-email: UNKNOWN
|
|
8
|
+
License: MIT
|
|
9
|
+
Description: UNKNOWN
|
|
10
|
+
Platform: UNKNOWN
|
|
11
|
+
Classifier: Framework :: Dash
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# dash spread grid
|
|
2
|
+
|
|
3
|
+
dash spread grid is a Dash component library.
|
|
4
|
+
|
|
5
|
+
Fast grid for Dash applications
|
|
6
|
+
|
|
7
|
+
Get started with:
|
|
8
|
+
1. Install Dash and its dependencies: https://dash.plotly.com/installation
|
|
9
|
+
2. Run `python usage.py`
|
|
10
|
+
3. Visit http://localhost:8050 in your web browser
|
|
11
|
+
|
|
12
|
+
## Contributing
|
|
13
|
+
|
|
14
|
+
See [CONTRIBUTING.md](./CONTRIBUTING.md)
|
|
15
|
+
|
|
16
|
+
### Install dependencies
|
|
17
|
+
|
|
18
|
+
If you have selected install_dependencies during the prompt, you can skip this part.
|
|
19
|
+
|
|
20
|
+
1. Install npm packages
|
|
21
|
+
```
|
|
22
|
+
$ npm install
|
|
23
|
+
```
|
|
24
|
+
2. Create a virtual env and activate.
|
|
25
|
+
```
|
|
26
|
+
$ virtualenv venv
|
|
27
|
+
$ . venv/bin/activate
|
|
28
|
+
```
|
|
29
|
+
_Note: venv\Scripts\activate for windows_
|
|
30
|
+
|
|
31
|
+
3. Install python packages required to build components.
|
|
32
|
+
```
|
|
33
|
+
$ pip install -r requirements.txt
|
|
34
|
+
```
|
|
35
|
+
4. Install the python packages for testing (optional)
|
|
36
|
+
```
|
|
37
|
+
$ pip install -r tests/requirements.txt
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Write your component code in `src/lib/components/DashSpreadGrid.react.js`.
|
|
41
|
+
|
|
42
|
+
- The demo app is in `src/demo` and you will import your example component code into your demo app.
|
|
43
|
+
- Test your code in a Python environment:
|
|
44
|
+
1. Build your code
|
|
45
|
+
```
|
|
46
|
+
$ npm run build
|
|
47
|
+
```
|
|
48
|
+
2. Run and modify the `usage.py` sample dash app:
|
|
49
|
+
```
|
|
50
|
+
$ python usage.py
|
|
51
|
+
```
|
|
52
|
+
- Write tests for your component.
|
|
53
|
+
- A sample test is available in `tests/test_usage.py`, it will load `usage.py` and you can then automate interactions with selenium.
|
|
54
|
+
- Run the tests with `$ pytest tests`.
|
|
55
|
+
- The Dash team uses these types of integration tests extensively. Browse the Dash component code on GitHub for more examples of testing (e.g. https://github.com/plotly/dash-core-components)
|
|
56
|
+
- Add custom styles to your component by putting your custom CSS files into your distribution folder (`dash_spread_grid`).
|
|
57
|
+
- Make sure that they are referenced in `MANIFEST.in` so that they get properly included when you're ready to publish your component.
|
|
58
|
+
- Make sure the stylesheets are added to the `_css_dist` dict in `dash_spread_grid/__init__.py` so dash will serve them automatically when the component suite is requested.
|
|
59
|
+
- [Review your code](./review_checklist.md)
|
|
60
|
+
|
|
61
|
+
### Create a production build and publish:
|
|
62
|
+
|
|
63
|
+
1. Build your code:
|
|
64
|
+
```
|
|
65
|
+
$ npm run build
|
|
66
|
+
```
|
|
67
|
+
2. Create a Python distribution
|
|
68
|
+
```
|
|
69
|
+
$ python setup.py sdist bdist_wheel
|
|
70
|
+
```
|
|
71
|
+
This will create source and wheel distribution in the generated the `dist/` folder.
|
|
72
|
+
See [PyPA](https://packaging.python.org/guides/distributing-packages-using-setuptools/#packaging-your-project)
|
|
73
|
+
for more information.
|
|
74
|
+
|
|
75
|
+
3. Test your tarball by copying it into a new environment and installing it locally:
|
|
76
|
+
```
|
|
77
|
+
$ pip install dash_spread_grid-0.0.1.tar.gz
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
4. If it works, then you can publish the component to NPM and PyPI:
|
|
81
|
+
1. Publish on PyPI
|
|
82
|
+
```
|
|
83
|
+
$ twine upload dist/*
|
|
84
|
+
```
|
|
85
|
+
2. Cleanup the dist folder (optional)
|
|
86
|
+
```
|
|
87
|
+
$ rm -rf dist
|
|
88
|
+
```
|
|
89
|
+
3. Publish on NPM (Optional if chosen False in `publish_on_npm`)
|
|
90
|
+
```
|
|
91
|
+
$ npm publish
|
|
92
|
+
```
|
|
93
|
+
_Publishing your component to NPM will make the JavaScript bundles available on the unpkg CDN. By default, Dash serves the component library's CSS and JS locally, but if you choose to publish the package to NPM you can set `serve_locally` to `False` and you may see faster load times._
|
|
94
|
+
|
|
95
|
+
5. Share your component with the community! https://community.plotly.com/c/dash
|
|
96
|
+
1. Publish this repository to GitHub
|
|
97
|
+
2. Tag your GitHub repository with the plotly-dash tag so that it appears here: https://github.com/topics/plotly-dash
|
|
98
|
+
3. Create a post in the Dash community forum: https://community.plotly.com/c/dash
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# AUTO GENERATED FILE - DO NOT EDIT
|
|
2
|
+
|
|
3
|
+
from dash.development.base_component import Component, _explicitize_args
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class DashSpreadGrid(Component):
|
|
7
|
+
"""A DashSpreadGrid component.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
Keyword arguments:
|
|
11
|
+
|
|
12
|
+
- id (string; optional)
|
|
13
|
+
|
|
14
|
+
- columns (list; optional)
|
|
15
|
+
|
|
16
|
+
- data (list; optional)
|
|
17
|
+
|
|
18
|
+
- formatting (list; optional)
|
|
19
|
+
|
|
20
|
+
- pinnedBottom (number; default 0)
|
|
21
|
+
|
|
22
|
+
- pinnedLeft (number; default 0)
|
|
23
|
+
|
|
24
|
+
- pinnedRight (number; default 0)
|
|
25
|
+
|
|
26
|
+
- pinnedTop (number; default 0)
|
|
27
|
+
|
|
28
|
+
- rows (list; optional)"""
|
|
29
|
+
_children_props = []
|
|
30
|
+
_base_nodes = ['children']
|
|
31
|
+
_namespace = 'dash_spread_grid'
|
|
32
|
+
_type = 'DashSpreadGrid'
|
|
33
|
+
@_explicitize_args
|
|
34
|
+
def __init__(self, id=Component.UNDEFINED, data=Component.UNDEFINED, columns=Component.UNDEFINED, rows=Component.UNDEFINED, formatting=Component.UNDEFINED, pinnedTop=Component.UNDEFINED, pinnedBottom=Component.UNDEFINED, pinnedLeft=Component.UNDEFINED, pinnedRight=Component.UNDEFINED, **kwargs):
|
|
35
|
+
self._prop_names = ['id', 'columns', 'data', 'formatting', 'pinnedBottom', 'pinnedLeft', 'pinnedRight', 'pinnedTop', 'rows']
|
|
36
|
+
self._valid_wildcard_attributes = []
|
|
37
|
+
self.available_properties = ['id', 'columns', 'data', 'formatting', 'pinnedBottom', 'pinnedLeft', 'pinnedRight', 'pinnedTop', 'rows']
|
|
38
|
+
self.available_wildcard_properties = []
|
|
39
|
+
_explicit_args = kwargs.pop('_explicit_args')
|
|
40
|
+
_locals = locals()
|
|
41
|
+
_locals.update(kwargs) # For wildcard attrs and excess named props
|
|
42
|
+
args = {k: _locals[k] for k in _explicit_args}
|
|
43
|
+
|
|
44
|
+
super(DashSpreadGrid, self).__init__(**args)
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
from __future__ import print_function as _
|
|
2
|
+
|
|
3
|
+
import os as _os
|
|
4
|
+
import sys as _sys
|
|
5
|
+
import json
|
|
6
|
+
|
|
7
|
+
import dash as _dash
|
|
8
|
+
|
|
9
|
+
# noinspection PyUnresolvedReferences
|
|
10
|
+
from ._imports_ import *
|
|
11
|
+
from ._imports_ import __all__
|
|
12
|
+
|
|
13
|
+
if not hasattr(_dash, '__plotly_dash') and not hasattr(_dash, 'development'):
|
|
14
|
+
print('Dash was not successfully imported. '
|
|
15
|
+
'Make sure you don\'t have a file '
|
|
16
|
+
'named \n"dash.py" in your current directory.', file=_sys.stderr)
|
|
17
|
+
_sys.exit(1)
|
|
18
|
+
|
|
19
|
+
_basepath = _os.path.dirname(__file__)
|
|
20
|
+
_filepath = _os.path.abspath(_os.path.join(_basepath, 'package-info.json'))
|
|
21
|
+
with open(_filepath) as f:
|
|
22
|
+
package = json.load(f)
|
|
23
|
+
|
|
24
|
+
package_name = package['name'].replace(' ', '_').replace('-', '_')
|
|
25
|
+
__version__ = package['version']
|
|
26
|
+
|
|
27
|
+
_current_path = _os.path.dirname(_os.path.abspath(__file__))
|
|
28
|
+
|
|
29
|
+
_this_module = _sys.modules[__name__]
|
|
30
|
+
|
|
31
|
+
async_resources = []
|
|
32
|
+
|
|
33
|
+
_js_dist = []
|
|
34
|
+
|
|
35
|
+
_js_dist.extend(
|
|
36
|
+
[
|
|
37
|
+
{
|
|
38
|
+
"relative_package_path": "async-{}.js".format(async_resource),
|
|
39
|
+
"external_url": (
|
|
40
|
+
"https://unpkg.com/{0}@{2}"
|
|
41
|
+
"/{1}/async-{3}.js"
|
|
42
|
+
).format(package_name, __name__, __version__, async_resource),
|
|
43
|
+
"namespace": package_name,
|
|
44
|
+
"async": True,
|
|
45
|
+
}
|
|
46
|
+
for async_resource in async_resources
|
|
47
|
+
]
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
# TODO: Figure out if unpkg link works
|
|
51
|
+
_js_dist.extend(
|
|
52
|
+
[
|
|
53
|
+
{
|
|
54
|
+
"relative_package_path": "async-{}.js.map".format(async_resource),
|
|
55
|
+
"external_url": (
|
|
56
|
+
"https://unpkg.com/{0}@{2}"
|
|
57
|
+
"/{1}/async-{3}.js.map"
|
|
58
|
+
).format(package_name, __name__, __version__, async_resource),
|
|
59
|
+
"namespace": package_name,
|
|
60
|
+
"dynamic": True,
|
|
61
|
+
}
|
|
62
|
+
for async_resource in async_resources
|
|
63
|
+
]
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
_js_dist.extend(
|
|
67
|
+
[
|
|
68
|
+
{
|
|
69
|
+
'relative_package_path': 'dash_spread_grid.min.js',
|
|
70
|
+
|
|
71
|
+
'namespace': package_name
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
'relative_package_path': 'dash_spread_grid.min.js.map',
|
|
75
|
+
|
|
76
|
+
'namespace': package_name,
|
|
77
|
+
'dynamic': True
|
|
78
|
+
}
|
|
79
|
+
]
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
_css_dist = []
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
for _component in __all__:
|
|
86
|
+
setattr(locals()[_component], '_js_dist', _js_dist)
|
|
87
|
+
setattr(locals()[_component], '_css_dist', _css_dist)
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(()=>{"use strict";var __webpack_modules__={353:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{__webpack_require__.d(__webpack_exports__,{Z:()=>__WEBPACK_DEFAULT_EXPORT__});var react__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(196),react__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__),prop_types__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(64),prop_types__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__),_lib_components_SpreadGrid__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(422);function isString(e){return"string"==typeof e||e instanceof String}function useResolvedFormatting(formatting){return(0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)((function(){return formatting.map((function(rule){var mappedRule={};return"column"in rule&&(mappedRule.column=rule.column),"row"in rule&&(mappedRule.row=rule.row),"condition"in rule&&(mappedRule.condition=eval("({data, rows, columns, row, column, value, newValue, text}) => (".concat(rule.condition,")"))),"style"in rule&&(mappedRule.style=isString(rule.style)?eval("({data, rows, columns, row, column, value, newValue, text}) => (".concat(rule.style,")")):rule.style),"value"in rule&&(mappedRule.value=eval("({data, rows, columns, row, column, value, newValue, text})=> (".concat(rule.value,")"))),"text"in rule&&(mappedRule.text=eval("({data, rows, columns, row, column, value, newValue, text}) => (".concat(rule.text,")"))),mappedRule}))}),[formatting])}function DashSpreadGrid(e){console.count("render DashSpreadGrid");var t=e.data,r=e.columns,n=e.rows,o=useResolvedFormatting(e.formatting),i=e.pinnedTop,u=e.pinnedBottom,l=e.pinnedLeft,a=e.pinnedRight;return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lib_components_SpreadGrid__WEBPACK_IMPORTED_MODULE_2__.Z,{data:t,columns:r,rows:n,formatting:o,pinnedTop:i,pinnedBottom:u,pinnedLeft:l,pinnedRight:a})}DashSpreadGrid.propTypes={id:prop_types__WEBPACK_IMPORTED_MODULE_1___default().string,data:prop_types__WEBPACK_IMPORTED_MODULE_1___default().array,columns:prop_types__WEBPACK_IMPORTED_MODULE_1___default().array,rows:prop_types__WEBPACK_IMPORTED_MODULE_1___default().array,formatting:prop_types__WEBPACK_IMPORTED_MODULE_1___default().array,pinnedTop:prop_types__WEBPACK_IMPORTED_MODULE_1___default().number,pinnedBottom:prop_types__WEBPACK_IMPORTED_MODULE_1___default().number,pinnedLeft:prop_types__WEBPACK_IMPORTED_MODULE_1___default().number,pinnedRight:prop_types__WEBPACK_IMPORTED_MODULE_1___default().number},DashSpreadGrid.defaultProps={data:[],columns:[],rows:[],formatting:[],pinnedTop:0,pinnedBottom:0,pinnedLeft:0,pinnedRight:0};const __WEBPACK_DEFAULT_EXPORT__=DashSpreadGrid},422:(e,t,r)=>{r.d(t,{Z:()=>fr});var n=r(196),o=r.n(n);function i(e){return function(e){if(Array.isArray(e))return u(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return u(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?u(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function l(e,t){return(0,n.useMemo)((function(){return"function"==typeof e?e.apply(void 0,i(t)):e}),[e].concat(i(t)))}function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function c(e){return null===e?"null":Array.isArray(e)?(t=e.map(c),"[".concat(t.join(","),"]")):"object"===a(e)?function(e){var t=Object.keys(e).sort().map((function(t){return"".concat(t,":").concat(c(e[t]))}));return"{".concat(t.join(","),"}")}(e):JSON.stringify(e);var t}function f(e){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f(e)}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function d(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?s(Object(r),!0).forEach((function(t){var n,o,i,u;n=e,o=t,i=r[t],u=function(e,t){if("object"!=f(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=f(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(o),(o="symbol"==f(u)?u:String(u))in n?Object.defineProperty(n,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[o]=i})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):s(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function y(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function p(e,t){return t?e+"99":e+"33"}function m(e){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},m(e)}function h(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,b(n.key),n)}}function b(e){var t=function(e,t){if("object"!=m(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=m(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==m(t)?t:String(t)}var v=function(){function e(t){var r=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.lookup=new Map,t.forEach((function(e){var t=c(e.rowId),n=c(e.columnId);r.lookup.has(t)||r.lookup.set(t,new Set),r.lookup.get(t).add(n)}))}var t,r;return t=e,(r=[{key:"isKeySelected",value:function(e,t){return this.lookup.has(e)&&this.lookup.get(e).has(t)}},{key:"isIdSelected",value:function(e,t){return this.isKeySelected(c(e),c(t))}}])&&h(t.prototype,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();function g(e,t,r){var o=(0,n.useRef)({});return o.current.value=e,o.current.callback=t,(0,n.useCallback)((function(e){var t="function"==typeof e?e(o.current.value):e;o.current.value===t||r&&r(o.current.value,t)||(o.current.value=t,o.current.callback(t))}),[r])}function w(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function _(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function S(e,t){return Math.round(e*t)/t}function O(){var e,t,r=(e=(0,n.useState)(window.devicePixelRatio),t=2,function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,u,l=[],a=!0,c=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;a=!1}else for(;!(a=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);a=!0);}catch(e){c=!0,o=e}finally{try{if(!a&&null!=r.return&&(u=r.return(),Object(u)!==u))return}finally{if(c)throw o}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return _(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=r[0],i=r[1];return(0,n.useEffect)((function(){var e=matchMedia("(resolution: ".concat(o,"dppx)")),t=function(){console.log("Device pixel ratio changed"),i(window.devicePixelRatio)};return e.addEventListener("change",t,{once:!0}),function(){return e.removeEventListener("change",t)}}),[o]),o}function x(e){return x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},x(e)}function E(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,C(n.key),n)}}function C(e){var t=function(e,t){if("object"!=x(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=x(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==x(t)?t:String(t)}var A=function(){function e(t){var r=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.lookup=new Map,t.forEach((function(e){var t=c(e.rowId),n=c(e.columnId);r.lookup.has(t)||r.lookup.set(t,new Map),r.lookup.get(t).set(n,e.value)}))}var t,r;return t=e,(r=[{key:"hasValueByKey",value:function(e,t){return this.lookup.has(e)&&this.lookup.get(e).has(t)}},{key:"getValueByKey",value:function(e,t){if(this.hasValueByKey(e,t))return this.lookup.get(e).get(t)}},{key:"hasValueById",value:function(e,t){return this.hasValueByKey(c(e),c(t))}},{key:"getValueById",value:function(e,t){return this.getValueByKey(c(e),c(t))}}])&&E(t.prototype,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();function j(e){return j="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},j(e)}function k(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(e){if("string"==typeof e)return I(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?I(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,u=!0,l=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return u=e.done,e},e:function(e){l=!0,i=e},f:function(){try{u||null==r.return||r.return()}finally{if(l)throw i}}}}function I(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function P(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,L(n.key),n)}}function M(e,t,r){return t&&P(e.prototype,t),r&&P(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function R(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function T(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function B(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?T(Object(r),!0).forEach((function(t){D(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):T(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function D(e,t,r){return(t=L(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function L(e){var t=function(e,t){if("object"!=j(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=j(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==j(t)?t:String(t)}var K=["borderTop","borderRight","borderBottom","borderLeft"],F=M((function e(){R(this,e),D(this,"byKey",new Map),D(this,"byIndex",new Map),D(this,"byMatch",new Map)})),V={HEADER:["HEADER"],FILTER:["FILTER"],DATA:["DATA"],ANY:["HEADER","DATA","FILTER"],undefined:[]},W=function(){function e(t){R(this,e),this.columnLookup=new F,this.rulesCount=0;var r,n=k(t);try{for(n.s();!(r=n.n()).done;){var o=r.value;this.addRule(o)}}catch(e){n.e(e)}finally{n.f()}}return M(e,[{key:"addRule",value:function(e){var t,r=this.columnLookup,n=this.rulesCount++,o="column"in e?"id"in e.column?{key:c(e.column.id)}:e.column:{match:"DATA"},i="row"in e?"id"in e.row?{key:c(e.row.id)}:e.row:{match:"DATA"},u={};function l(e,t){e.has(t)||e.set(t,[]),e.get(t).push(B({index:n},u))}function a(e,t){e.has(t)||e.set(t,new F),"key"in i&&l(e.get(t).byKey,i.key),"index"in i&&l(e.get(t).byIndex,i.index);var r,n=k(V[i.match]);try{for(n.s();!(r=n.n()).done;){var o=r.value;l(e.get(t).byMatch,o)}}catch(e){n.e(e)}finally{n.f()}}"condition"in e&&(u.condition=e.condition),"style"in e&&(u.style="function"==typeof e.style?e.style:function(){return e.style}),"value"in e&&(u.value="function"==typeof e.value?e.value:function(){return e.value}),"text"in e&&(u.text="function"==typeof e.text?e.text:function(){return e.text}),"edit"in e&&(u.edit=e.edit),"draw"in e&&(u.draw=e.draw),"filter"in e&&(u.filter={by:{type:(t=e.filter).by.type,key:c(t.by.id)},condition:t.condition}),"key"in o&&a(r.byKey,o.key),"index"in o&&a(r.byIndex,o.index);var f,s=k(V[o.match]);try{for(s.s();!(f=s.n()).done;){var d=f.value;a(r.byMatch,d)}}catch(e){s.e(e)}finally{s.f()}}},{key:"resolve",value:function(e,t,r,n,o,i,u){var l=this.columnLookup,a=[];function c(e){var t,r=k(e);try{for(r.s();!(t=r.n()).done;){var n=t.value;a.push(n)}}catch(e){r.e(e)}finally{r.f()}}function f(e){e.byKey.has(n.key)&&c(e.byKey.get(n.key)),e.byIndex.has(n.index)&&c(e.byIndex.get(n.index)),e.byMatch.has(n.type)&&c(e.byMatch.get(n.type))}l.byKey.has(o.key)&&f(l.byKey.get(o.key)),l.byIndex.has(o.index)&&f(l.byIndex.get(o.index)),l.byMatch.has(o.type)&&f(l.byMatch.get(o.type)),a.sort((function(e,t){return e.index-t.index}));var s={data:e,rows:t,columns:r,row:n,column:o},d={},y=void 0,p=!0;i.hasValueByKey(n.key,o.key)&&(s=B(B({},s),{},{newValue:i.getValueByKey(n.key,o.key)}));for(var m=function(){var e=b[h];if("condition"in e&&!e.condition(s))return 1;if("value"in e&&(s=B(B({},s),{},{value:e.value(s)})),"style"in e&&(d=B(B({},d),function(e,t){var r=B({},e);if("border"in r){for(var n=0,o=K;n<o.length;n++)r[o[n]]=r.border;delete r.border}for(var i=0,u=K;i<u.length;i++){var l=u[i];l in r&&(r[l]=B(B({},r[l]),{},{index:t}))}return r}(e.style(s),e.index))),"text"in e&&(s=B(B({},s),{},{text:e.text(s)})),"edit"in e&&(s=B(B({},s),{},{edit:e.edit})),"draw"in e){var t=s;y=function(r){return e.draw(B(B({},t),{},{ctx:r}))}}if("filter"in e&&u.hasValueByKeyAndSelector(n.key,o.key,e.filter.by)){var r=B(B({},s),{},{expression:u.getValueByKeyAndSelector(n.key,o.key,e.filter.by)});p=p&&e.filter.condition(r)}},h=0,b=a;h<b.length;h++)m();var v={style:d,visible:p};return"value"in s&&(v.value=s.value),"edit"in s&&(v.edit=s.edit),void 0!==y&&(v.draw=y),"text"in s&&(v.text=s.text),v}}]),e}();function U(e){return U="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},U(e)}function N(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,z(n.key),n)}}function z(e){var t=function(e,t){if("object"!=U(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=U(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==U(t)?t:String(t)}var q=function(){function e(t){var r=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.lookup=new Map,this.filteredColumns=new Set,this.filteredRows=new Set,t.forEach((function(e){var t=c(e.rowId),n=c(e.columnId);r.lookup.has(t)||r.lookup.set(t,new Map),r.lookup.get(t).set(n,e.expression),r.filteredColumns.add(n),r.filteredRows.add(t)}))}var t,r;return t=e,(r=[{key:"hasRowFilters",value:function(){return this.filteredRows.size>0}},{key:"hasColumnFilters",value:function(){return this.filteredColumns.size>0}},{key:"hasRowFiltersByKey",value:function(e){return this.filteredRows.has(e)}},{key:"hasColumnFiltersByKey",value:function(e){return this.filteredColumns.has(e)}},{key:"hasValueByKey",value:function(e,t){return this.lookup.has(e)&&this.lookup.get(e).has(t)}},{key:"getValueByKey",value:function(e,t){if(this.hasValueByKey(e,t))return this.lookup.get(e).get(t)}},{key:"hasValueById",value:function(e,t){return this.hasValueByKey(c(e),c(t))}},{key:"getValueById",value:function(e,t){return this.getValueByKey(c(e),c(t))}},{key:"hasValueByKeyAndSelector",value:function(e,t,r){return"ROW"===r.type?this.hasValueByKey(r.key,t):"COLUMN"===r.type&&this.hasValueByKey(e,r.key)}},{key:"getValueByKeyAndSelector",value:function(e,t,r){return"ROW"===r.type?this.getValueByKey(r.key,t):"COLUMN"===r.type?this.getValueByKey(e,r.key):void 0}}])&&N(t.prototype,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();function Y(e){return Y="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Y(e)}function H(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,G(n.key),n)}}function G(e){var t=function(e,t){if("object"!=Y(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=Y(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==Y(t)?t:String(t)}var $=function(){function e(t,r,n,o,i){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.formattingRules=t,this.data=r,this.rows=n,this.columns=o,this.edition=i,this.filtering=new q([])}var t,r;return t=e,(r=[{key:"resolve",value:function(e,t){return this.formattingRules.resolve(this.data,this.rows,this.columns,e,t,this.edition,this.filtering)}}])&&H(t.prototype,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();function X(e){return X="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},X(e)}function Z(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,J(n.key),n)}}function J(e){var t=function(e,t){if("object"!=X(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=X(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==X(t)?t:String(t)}var Q=function(){function e(t,r,n,o,i){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.formattingRules=t,this.data=r,this.rows=n,this.columns=o,this.edition=new A([]),this.filtering=i}var t,r;return t=e,(r=[{key:"findVisibleColumns",value:function(){var e=this;return this.filtering.hasRowFilters()?this.columns.filter((function(t){return e.rows.every((function(r){return!e.filtering.hasRowFiltersByKey(r.key)||e.formattingRules.resolve(e.data,e.rows,e.columns,r,t,e.edition,e.filtering).visible}))})):this.columns}},{key:"findVisibleRows",value:function(){var e=this;return this.filtering.hasColumnFilters()?this.rows.filter((function(t){return e.columns.every((function(r){return!e.filtering.hasColumnFiltersByKey(r.key)||e.formattingRules.resolve(e.data,e.rows,e.columns,t,r,e.edition,e.filtering).visible}))})):this.rows}}])&&Z(t.prototype,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();function ee(e){return ee="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ee(e)}function te(e){return function(e){if(Array.isArray(e))return ne(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||re(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function re(e,t){if(e){if("string"==typeof e)return ne(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?ne(e,t):void 0}}function ne(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function oe(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ie(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?oe(Object(r),!0).forEach((function(t){var n,o,i,u;n=e,o=t,i=r[t],u=function(e,t){if("object"!=ee(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=ee(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(o),(o="symbol"==ee(u)?u:String(u))in n?Object.defineProperty(n,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[o]=i})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):oe(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function ue(e,t){return c(e)===c(t)}function le(e,t){if(e.length!==t.length)return!1;var r=new v(e);return t.every((function(e){return r.isIdSelected(e.rowId,e.columnId)}))}function ae(e,t){if(e.length!==t.length)return!1;var r=new A(e);return t.every((function(e){return r.getValueById(e.rowId,e.columnId)===e.value}))}function ce(e,t){if(e.length!==t.length)return!1;var r=new q(e);return t.every((function(e){return r.getValueById(e.rowId,e.columnId)===e.value}))}function fe(e,t,r,n){return e<r?"BEGIN":e>=t-n?"END":void 0}function se(e,t,r){return(0,n.useMemo)((function(){return e.map((function(n,o){return ie(ie({},n),{},{type:n.type||"DATA",index:o,key:c(n.id),pinned:fe(o,e.length,t,r)})}))}),[e,t,r])}function de(e,t,r,o,i){var u=(0,n.useMemo)((function(){return new W(e)}),[e]);return(0,n.useMemo)((function(){return new $(u,t,r,o,i)}),[u,t,o,r,i])}var ye=(0,n.createContext)(),pe=(0,n.createContext)(),me=(0,n.createContext)(),he=(0,n.createContext)(),be=(0,n.createContext)();function ve(e){var t=O(),r=e.borderWidth/t,i=e.data,u=(0,n.useMemo)((function(){return r=e.formatting,[{column:{match:"ANY"},row:{match:"HEADER"},value:function(e){return e.column.header}},{column:{match:"ANY"},row:{match:"FILTER"},value:function(e){return e.newValue||""},text:function(e){return e.newValue||"Search..."},edit:{validate:function(){return!0},parse:function(e){return e.string}}},{column:{match:"DATA"},row:{match:"DATA"},value:e.dataSelector}].concat(function(e){if(Array.isArray(e))return w(e)}(t=r)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(t)||function(e,t){if(e){if("string"==typeof e)return w(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?w(e,t):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}());var t,r}),[e.formatting,e.dataSelector]),a=(0,n.useMemo)((function(){return[].concat(te(e.editedCells),te(e.filters.map((function(e){return{columnId:e.columnId,rowId:e.rowId,value:e.expression}}))))}),[e.editedCells,e.filters]),f=(0,n.useMemo)((function(){return new A(a)}),[a]),s=(0,n.useMemo)((function(){return new q(e.filters)}),[e.filters]),m=se(l(e.columns,[i]),e.pinnedLeft,e.pinnedRight),h=se(l(e.rows,[i]),e.pinnedTop,e.pinnedBottom),b=function(e,t,r,o,i){var u=(0,n.useMemo)((function(){return new W(e)}),[e]);return(0,n.useMemo)((function(){return new Q(u,t,r,o,i)}),[u,t,o,r,i])}((0,n.useMemo)((function(){return u}),[u]),i,h,m,s),_=(0,n.useMemo)((function(){return b.findVisibleColumns()}),[b]),x=(0,n.useMemo)((function(){return b.findVisibleRows()}),[b]),E=function(e,t,r){return(0,n.useMemo)((function(){var n=r;return e.map((function(e,o){var i=S(e.width,t),u=ie(ie({},e),{},{index:o,width:i,leftWithBorder:n-r,left:n,right:n+i,rightWithBorder:n+i+r});return n+=u.width+r,u}))}),[r,e,t])}(_,t,r),C=function(e,t,r){return(0,n.useMemo)((function(){var n=r;return e.map((function(e,o){var i=S(e.height,t),u=ie(ie({},e),{},{index:o,height:i,topWithBorder:n-r,top:n,bottom:n+i,bottomWithBorder:n+i+r});return n+=u.height+r,u}))}),[r,e,t])}(x,t,r),j=(0,n.useMemo)((function(){return function(e,t){var r=t.filter((function(e){return"BEGIN"===e.pinned})).length,n=t.filter((function(e){return"END"===e.pinned})).length,o=t.length-r-n,i=e.filter((function(e){return"BEGIN"===e.pinned})).length,u=e.filter((function(e){return"END"===e.pinned})).length,l=e.length-i-u,a=t.slice(0,r),c=t.slice(t.length-n,t.length),f=t.slice(r,t.length-n),s=e.slice(0,i),d=e.slice(e.length-u,e.length),y=e.slice(i,e.length-u),p=r>0,m=i>0,h=o>0||!p,b=!p,v=!(n>0),g=l>0||!m,w=!m,_=!(u>0),S=function(e,t,r){if(0===e.length)return 0;var n=t?e.at(0).topWithBorder:e.at(0).top;return(r?e.at(-1).bottomWithBorder:e.at(-1).bottom)-n},O=function(e,t,r){if(0===e.length)return 0;var n=t?e.at(0).leftWithBorder:e.at(0).left;return(r?e.at(-1).rightWithBorder:e.at(-1).right)-n};return{top:{rows:a,showTopBorder:!0,showBottomBorder:!0,height:S(a,!0,!0)},bottom:{rows:c,showTopBorder:h,showBottomBorder:!0,height:S(c,h,!0)},middle:{rows:f,showTopBorder:b,showBottomBorder:v,height:S(f,b,v)},left:{columns:s,showLeftBorder:!0,showRightBorder:!0,width:O(s,!0,!0)},right:{columns:d,showLeftBorder:g,showRightBorder:!0,width:O(d,g,!0)},center:{columns:y,showLeftBorder:w,showRightBorder:_,width:O(y,w,_)}}}(E,C)}),[E,C]),k=e.selectedCells,I=(0,n.useMemo)((function(){return new v(e.selectedCells)}),[e.selectedCells]),P=(0,n.useMemo)((function(){return new v(e.highlightedCells)}),[e.highlightedCells]),M=e.hoveredCell,R=e.focusedCell,T=(0,n.useMemo)((function(){return function(e,t,r,n,o,i){var u,l=t?c(t.columnId):null,a=t?c(t.rowId):null,f=r?c(r.columnId):null,s=r?c(r.rowId):null,m=function(e,t,r,o){if(r<0||r>=e.length)return!1;if(o<0||o>=t.length)return!1;var i=e[r].key,u=t[o].key;return n.isKeySelected(i,u)};return[{column:{match:"ANY"},row:{match:"FILTER"},style:function(e){return{background:"#FBFBFB",foreground:e.newValue?"black":"#cccccc",border:{width:1,color:"gray"}}}},{column:{match:"ANY"},row:{match:"HEADER"},style:{background:"#F5F5F5",border:{width:1,color:"gray"}}}].concat(function(e){if(Array.isArray(e))return y(e)}(u=e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(u)||function(e,t){if(e){if("string"==typeof e)return y(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?y(e,t):void 0}}(u)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),[{column:{match:"ANY"},row:{match:"ANY"},condition:function(e){var t=e.row,r=e.column;return l===r.key||a===t.key},style:{highlight:"#81948133"}},{column:{match:"ANY"},row:{match:"ANY"},condition:function(e){var t=e.row,r=e.column;return l===r.key&&a===t.key},style:{highlight:"#81948188"}},{column:{match:"ANY"},row:{match:"ANY"},condition:function(e){var t=e.rows,r=e.columns,n=e.row,o=e.column;return m(t,r,n.index,o.index)},style:function(e){var t=e.rows,r=e.columns,n=e.row,o=e.column,i=e.edit;return d(d(d(d(d({},m(t,r,n.index-1,o.index)?{}:{borderTop:{width:3,color:"#596959",index:Number.MAX_SAFE_INTEGER}}),m(t,r,n.index+1,o.index)?{}:{borderBottom:{width:3,color:"#596959",index:Number.MAX_SAFE_INTEGER}}),m(t,r,n.index,o.index-1)?{}:{borderLeft:{width:3,color:"#596959",index:Number.MAX_SAFE_INTEGER}}),m(t,r,n.index,o.index+1)?{}:{borderRight:{width:3,color:"#596959",index:Number.MAX_SAFE_INTEGER}}),{},{highlight:p(i?"#798d9c":"#819481",f!==o.key||s!==n.key)})}},{column:{match:"ANY"},row:{match:"ANY"},condition:function(e){var t=e.row,r=e.column;return o.isKeySelected(t.key,r.key)},style:function(e){var t=e.row,r=e.column;return{highlight:p("#798d9c",f!==r.key||s!==t.key)}}},{column:{match:"ANY"},row:{match:"ANY"},condition:function(e){var t=e.row,r=e.column;return f===r.key&&s===t.key},style:{background:"white"}},{column:{match:"ANY"},row:{match:"ANY"},condition:function(e){return e.edit},style:{corner:"#77777720"}},{column:{match:"ANY"},row:{match:"ANY"},condition:function(e){var t=e.row,r=e.column;return i.hasValueByKey(t.key,r.key)},style:{corner:"darkgreen"}}])}(u,M,R,I,P,f)}),[u,M,R,I,P,f]),B=de(T,i,C,E,f),D=de((0,n.useMemo)((function(){return u}),[u]),i,C,E,f),L=(0,n.useMemo)((function(){return{top:j.top.height,bottom:j.bottom.height,left:j.left.width,right:j.right.width}}),[j.top.height,j.bottom.height,j.left.width,j.right.width]),K=(0,n.useMemo)((function(){return{width:E.length?E.at(-1).rightWithBorder:0,height:C.length?C.at(-1).bottomWithBorder:0}}),[E,C]),F=g(e.selectedCells,e.onSelectedCellsChange,le),V=g(e.highlightedCells,e.onHighlightedCellsChange,le),U=g(e.editedCells,e.onEditedCellsChange,ae),N=g(e.hoveredCell,e.onHoveredCellChange,ue),z=g(e.focusedCell,e.onFocusedCellChange,ue),Y=g(e.filters,e.onFiltersChange,ce),H=(0,n.useCallback)((function(e){return F((function(t){var r=new v(e);return[].concat(te(e),te(t.filter((function(e){return!r.isIdSelected(e.rowId,e.columnId)}))))}))}),[F]),G=(0,n.useCallback)((function(e){return U((function(t){var r=new A(e);return[].concat(te(e),te(t.filter((function(e){return!r.hasValueById(e.rowId,e.columnId)}))))}))}),[U]),$=(0,n.useCallback)((function(e){return Y((function(t){var r=new q(e);return[].concat(te(e),te(t.filter((function(e){return!r.hasValueById(e.rowId,e.columnId)}))))}))}),[Y]),X=(0,n.useCallback)((function(e){return U((function(t){var r=new v(e);return t.filter((function(e){return!r.isIdSelected(e.rowId,e.columnId)}))}))}),[U]),Z=(0,n.useCallback)((function(e){return Y((function(t){var r=new v(e);return t.filter((function(e){return!r.isIdSelected(e.rowId,e.columnId)}))}))}),[Y]);return(0,n.useEffect)((function(){console.log(e.selectedCells)}),[e.selectedCells]),[[ye,(0,n.useMemo)((function(){return{data:i}}),[i])],[pe,(0,n.useMemo)((function(){return{columns:E,rows:C,sections:j}}),[E,C,j])],[me,(0,n.useMemo)((function(){return{selectedCells:k,selection:I,hoveredCell:M,focusedCell:R,inputFormatResolver:D,setSelectedCells:F,setHighlightedCells:V,setHoveredCell:N,setEditedCells:U,setFocusedCell:z,addSelectedCells:H,addEditedCells:G,addFilters:$,removeEditedCells:X,removeFilters:Z}}),[k,I,M,R,D,F,V,N,U,z,H,G,$,X,Z])],[he,(0,n.useMemo)((function(){return{renderFormatResolver:B}}),[B])],[be,(0,n.useMemo)((function(){return{fixedSize:L,totalSize:K,borderWidth:r}}),[L,K,r])]].reduce((function(e,t){var r,n,i=(n=2,function(e){if(Array.isArray(e))return e}(r=t)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,u,l=[],a=!0,c=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;a=!1}else for(;!(a=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);a=!0);}catch(e){c=!0,o=e}finally{try{if(!a&&null!=r.return&&(u=r.return(),Object(u)!==u))return}finally{if(c)throw o}}return l}}(r,n)||re(r,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),u=i[0],l=i[1];return o().createElement(u.Provider,{value:l},e)}),e.children)}var ge=function(){return o().useContext(pe).columns},we=function(){return o().useContext(pe).rows},_e=function(){return o().useContext(pe).sections},Se=function(){return o().useContext(me).selectedCells},Oe=function(){return o().useContext(me).hoveredCell},xe=function(){return o().useContext(me).focusedCell},Ee=function(){return o().useContext(he).renderFormatResolver},Ce=function(){return o().useContext(me).inputFormatResolver},Ae=function(){return o().useContext(me).setSelectedCells},je=function(){return o().useContext(me).setHighlightedCells},ke=function(){return o().useContext(me).setEditedCells},Ie=function(){return o().useContext(me).setHoveredCell},Pe=function(){return o().useContext(me).setFocusedCell},Me=function(){return o().useContext(me).addSelectedCells},Re=function(){return o().useContext(me).addEditedCells},Te=function(){return o().useContext(me).addFilters},Be=function(){return o().useContext(me).removeEditedCells},De=function(){return o().useContext(me).removeFilters},Le=function(){return o().useContext(be).fixedSize},Ke=function(){return o().useContext(be).totalSize},Fe=function(){return o().useContext(be).borderWidth};function Ve(e){return Ve="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ve(e)}function We(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,Ue(n.key),n)}}function Ue(e){var t=function(e,t){if("object"!=Ve(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=Ve(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==Ve(t)?t:String(t)}var Ne=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),this.fontMetrics=new Map}var t,r;return t=e,(r=[{key:"getFontMetrics",value:function(e){var t=e;if(this.fontMetrics.has(t))return this.fontMetrics.get(t);var r=this.context;r.font=e;var n=r.measureText("X"),o=(n.actualBoundingBoxDescent-n.actualBoundingBoxAscent)/2,i={topOffset:o+n.fontBoundingBoxAscent,middle:-o,bottomOffset:n.fontBoundingBoxDescent-o};return this.fontMetrics.set(t,i),i}}])&&We(t.prototype,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();function ze(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function qe(e,t){var r,o,i=(r=(0,n.useState)(e),o=2,function(e){if(Array.isArray(e))return e}(r)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,u,l=[],a=!0,c=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;a=!1}else for(;!(a=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);a=!0);}catch(e){c=!0,o=e}finally{try{if(!a&&null!=r.return&&(u=r.return(),Object(u)!==u))return}finally{if(c)throw o}}return l}}(r,o)||function(e,t){if(e){if("string"==typeof e)return ze(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?ze(e,t):void 0}}(r,o)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),u=i[0],l=i[1];return[u,(0,n.useMemo)((function(){return t?function(e){l((function(r){return t(r,e)?r:e}))}:l}),[t])]}function Ye(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function He(e,t,r,o){var i;(0,n.useEffect)((function(){return e?(e.addEventListener(t,r),function(){return e.removeEventListener(t,r)}):function(){}}),[e,t].concat(function(e){if(Array.isArray(e))return Ye(e)}(i=o)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(i)||function(e,t){if(e){if("string"==typeof e)return Ye(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Ye(e,t):void 0}}(i)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()))}function Ge(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function $e(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,u,l=[],a=!0,c=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;a=!1}else for(;!(a=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);a=!0);}catch(e){c=!0,o=e}finally{try{if(!a&&null!=r.return&&(u=r.return(),Object(u)!==u))return}finally{if(c)throw o}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return Xe(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Xe(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Xe(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var Ze=(0,n.createContext)();function Je(e,t){return e.left===t.left&&e.top===t.top}function Qe(e,t){return e.width===t.width&&e.height===t.height}function et(e){var t=e.element,r=e.children,i=$e(qe({left:0,top:0},Je),2),u=i[0],l=i[1],a=$e(qe({width:0,height:0},Qe),2),c=a[0],f=a[1],s=$e(qe({width:0,height:0},Qe),2),d=s[0],y=s[1];He(t,"scroll",(function(){l({left:t.scrollLeft,top:t.scrollTop})}),[l]),function(e,t,r,o){var i;(0,n.useEffect)((function(){if(console.count("useDomObserver"),!e)return function(){};var n=new t(r);return n.observe(e),function(){return n.disconnect()}}),[e,t].concat(function(e){if(Array.isArray(e))return Ge(e)}(i=o)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(i)||function(e,t){if(e){if("string"==typeof e)return Ge(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Ge(e,t):void 0}}(i)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()))}(t,ResizeObserver,(function(){f({width:t.getBoundingClientRect().width,height:t.getBoundingClientRect().height}),y({width:t.clientWidth,height:t.clientHeight})}),[f]);var p=(0,n.useMemo)((function(){return{scrollOffset:u,size:c,clientSize:d}}),[u,c,d]);return o().createElement(Ze.Provider,{value:p},r)}var tt=function(){return(0,n.useContext)(Ze).scrollOffset},rt=function(){return(0,n.useContext)(Ze).size},nt=function(){return(0,n.useContext)(Ze).clientSize};function ot(e,t){return t.top>=e.top&&t.left>=e.left&&t.top+t.height<=e.top+e.height&&t.left+t.width<=e.left+e.width}function it(e,t){var r={top:Math.max(e.top,t.top),left:Math.max(e.left,t.left),width:Math.min(e.left+e.width,t.left+t.width)-Math.max(e.left,t.left),height:Math.min(e.top+e.height,t.top+t.height)-Math.max(e.top,t.top)};return r.width>=0&&r.height>=0?r:{top:e.top,left:e.left,width:0,height:0}}function ut(e,t){return{top:e.top-t,left:e.left-t,width:e.width+2*t,height:e.height+2*t}}function lt(e){return e.width*e.height}function at(e,t){return{top:e.top,left:e.left,width:Math.max(0,e.width-t.left-t.right),height:Math.max(0,e.height-t.top-t.bottom)}}function ct(e){return ct="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ct(e)}function ft(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function st(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ft(Object(r),!0).forEach((function(t){var n,o,i,u;n=e,o=t,i=r[t],u=function(e,t){if("object"!=ct(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=ct(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(o),(o="symbol"==ct(u)?u:String(u))in n?Object.defineProperty(n,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[o]=i})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ft(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}var dt=(0,n.createContext)(),yt=200,pt=400,mt={left:0,top:0,width:0,height:0};function ht(e){var t,r,o,i=e.children,u=Ke(),l=Le(),a=rt(),c=tt(),f=(t=function(e){var t=e||mt,r=at(st({left:0,top:0},u),l),n=at(st(st({},c),a),l),o=it(r,ut(n,yt)),i=it(r,ut(n,pt));return ot(r,t)&&ot(t,o)?lt(t)>2*lt(i)?i:t:i},r=[l,a,c],o=(0,n.useRef)(void 0),(0,n.useMemo)((function(){return o.current=t(o.current),o.current}),r));return React.createElement(dt.Provider,{value:f},i)}var bt=function(){return(0,n.useContext)(dt)},vt=(0,n.createContext)();function gt(e){var t=e.children,r=e.horizontal,o=e.vertical,i=bt(),u=_e(),l=u[o],a=l.rows,c=l.height,f=l.showTopBorder,s=l.showBottomBorder,d=u[r],y=d.columns,p=d.width,m=d.showLeftBorder,h=d.showRightBorder,b="middle"===o?i.top:0,v="center"===r?i.left:0,g="middle"===o?i.height:c,w="center"===r?i.width:p,_=(0,n.useMemo)((function(){return{left:v,top:b,width:w,height:g}}),[v,b,w,g]),S=(0,n.useMemo)((function(){return{top:f,bottom:s,left:m,right:h}}),[f,s,m,h]),O=(0,n.useMemo)((function(){return{columns:y,rows:a,rect:_,borders:S}}),[y,a,_,S]);return 0===y.length||0===a.length?null:React.createElement(vt.Provider,{value:O},t)}var wt=function(){return(0,n.useContext)(vt).columns},_t=function(){return(0,n.useContext)(vt).rows},St=function(){return(0,n.useContext)(vt).rect},Ot=function(){return(0,n.useContext)(vt).borders};function xt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function Et(e){var t,r,i=e.style,u=e.devicePixelRatio,l=(t=(0,n.useState)(null),r=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,u,l=[],a=!0,c=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;a=!1}else for(;!(a=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);a=!0);}catch(e){c=!0,o=e}finally{try{if(!a&&null!=r.return&&(u=r.return(),Object(u)!==u))return}finally{if(c)throw o}}return l}}(t,r)||function(e,t){if(e){if("string"==typeof e)return xt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?xt(e,t):void 0}}(t,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),a=l[0],c=l[1],f=(0,n.useMemo)((function(){return new Ne}),[]),s=Ee(),d=wt(),y=_t(),p=Fe(),m=St(),h=Ot();return(0,n.useEffect)((function(){var e=requestAnimationFrame((function(){if(a){console.log("draw");var e=a.getContext("2d"),t=p/2,r=y.length,n=d.length,o=r-1+(h.top?1:0)+(h.bottom?1:0),i=n-1+(h.left?1:0)+(h.right?1:0),l=y.map((function(e){return e.height})),c=d.map((function(e){return e.width})),b=c.reduce((function(e,t){return e+t}),0)+i*p,v=l.reduce((function(e,t){return e+t}),0)+o*p,g=m.left,w=m.top,_=m.width,O=m.height,x=c.reduce((function(e,t,r){var n=e[r]+t+p;return e.push(n),e}),[h.left?p:0]),E=l.reduce((function(e,t,r){var n=e[r]+t+p;return e.push(n),e}),[h.top?p:0]),C=x.slice(0,-1),A=E.slice(0,-1),j=Math.max(C.findLastIndex((function(e){return e<=g})),0),k=C.findLastIndex((function(e){return e<=g+_})),I=Math.max(A.findLastIndex((function(e){return e<=w})),0),P=A.findLastIndex((function(e){return e<=w+O})),M=Math.max(j,h.left?0:1),R=k+(h.right?1:0),T=Math.max(I,h.top?0:1),B=P+(h.bottom?1:0),D=Array.from({length:P-I+1},(function(e,t){var r=y[t+I];return Array.from({length:k-j+1},(function(e,t){var n=d[t+j];return s.resolve(r,n)}))})),L=function(e,t){return D[e-I][t-j]};a.width=Math.round(_*u),a.height=Math.round(O*u),a.style.width="".concat(_,"px"),a.style.height="".concat(O,"px"),a.style.marginLeft="".concat(g,"px"),a.style.marginTop="".concat(w,"px"),a.style.marginRight="".concat(b-_-g,"px"),a.style.marginBottom="".concat(v-O-w,"px"),e.fillStyle="#E9E9E9",e.fillRect(0,0,a.width,a.height);for(var K=function(t,r){e.setTransform(u,0,0,u,(t-g)*u,(r-w)*u)},F=function(t,r,n,o){e.beginPath(),e.rect(t,r,n,o),e.clip()},V=j;V<=k;V++){e.save(),K(x[V],0),F(0,0,c[V],v);for(var W=I;W<=P;W++){var U=L(W,V),N=U.style,z=E[W],q=x[V],Y=c[V],H=l[W],G="text"in U?U.text:U.value,$=N.textAlign||"left",X=N.textBaseline||"middle",Z="paddingLeft"in N?N.paddingLeft:5,J="paddingRight"in N?N.paddingRight:5,Q="paddingTop"in N?N.paddingTop:2,ee="paddingBottom"in N?N.paddingBottom:2;K(q,z),e.fillStyle=N.background||"white",e.fillRect(0,0,Y,H),"draw"in U&&U.draw(e),N.highlight&&(e.fillStyle=N.highlight,e.fillRect(0,0,Y,H)),N.corner&&(e.fillStyle=N.corner,e.beginPath(),e.moveTo(Y-7,H),e.lineTo(Y,H),e.lineTo(Y,H-7),e.fill()),e.fillStyle=N.foreground||"black",e.font=N.font||"12px Calibri",e.textAlign=$;var te=f.getFontMetrics(e.font),re=S("left"===$?Z:"center"===$?Y/2:"right"===$?Y-J:0,u),ne=S("top"===X?te.middle+te.topOffset+Q:"middle"===X?H/2+te.middle:"bottom"===X?H+te.middle-te.bottomOffset-ee:0,u);ne-te.middle-te.topOffset>=0&&ne-te.middle+te.bottomOffset<=H?e.fillText(G,re,ne):(e.strokeStyle="#E9E9E9",e.lineWidth=p,e.beginPath(),e.moveTo(0,p+t),e.lineTo(Y,p+t),e.moveTo(0,H-p-t),e.lineTo(Y,H-p-t),e.stroke(),e.save(),F(0,2*p,Y,H-4*p),e.fillText(G,re,ne),e.restore())}e.restore()}K(0,0);for(var oe=function(t,r,n,o,i){if(i){var l=i.width*p,a=r===o,c=t-(a?l/2:0),f=r-(a?0:l/2),s=n+(a?l/2:0),d=o+(a?0:l/2);e.strokeStyle=i.color||"black",e.lineWidth=l,i.dash?(e.setLineDash(i.dash.map((function(e){return e/u}))),e.lineDashOffset=a?c:f):e.setLineDash([]),e.beginPath(),e.moveTo(c,f),e.lineTo(s,d),e.stroke()}},ie=function(e,t){return e?t?e.index>t.index?e:t:e:t},ue=T;ue<=B;ue++)for(var le=ue-1,ae=ue,ce=j;ce<=k;ce++){var fe=ie(le>=I?L(le,ce).style.borderBottom:null,ae<=P?L(ae,ce).style.borderTop:null);oe(x[ce]-t,E[ae]-t,x[ce+1]-t,E[ae]-t,fe)}for(var se=M;se<=R;se++)for(var de=se-1,ye=se,pe=I;pe<=P;pe++){var me=ie(de>=j?L(pe,de).style.borderRight:null,ye<=k?L(pe,ye).style.borderLeft:null);oe(x[ye]-t,E[pe]-t,x[ye]-t,E[pe+1]-t,me)}}}));return function(){return cancelAnimationFrame(e)}}),[a,u,y,d,m,p,s,f,h]),o().createElement("canvas",{ref:c,style:i})}function Ct(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,u,l=[],a=!0,c=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;a=!1}else for(;!(a=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);a=!0);}catch(e){c=!0,o=e}finally{try{if(!a&&null!=r.return&&(u=r.return(),Object(u)!==u))return}finally{if(c)throw o}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return At(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?At(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function At(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var jt=(0,n.createContext)();function kt(e,t){return(null==e?void 0:e.x)===(null==t?void 0:t.x)&&(null==e?void 0:e.y)===(null==t?void 0:t.y)}function It(e){var t=e.element,r=e.children,i=(0,n.useRef)({}),u=Ct(qe(null,kt),2),l=u[0],a=u[1],c=Ct(qe(!1),2),f=c[0],s=c[1];He(t,"mouseenter",(function(e){a({x:e.clientX-t.offsetLeft,y:e.clientY-t.offsetTop})}),[a]),He(t,"mousemove",(function(e){a({x:e.clientX-t.offsetLeft,y:e.clientY-t.offsetTop})}),[a]),He(t,"mouseleave",(function(){a(null)}),[a]),He(t,"mousedown",(function(e){s(!0),i.current.mousedown&&i.current.mousedown(e)}),[]),He(t,"mouseup",(function(e){s(!1),i.current.mouseup&&i.current.mouseup(e)}),[]),He(t,"keydown",(function(e){i.current.keydown&&i.current.keydown(e)}),[]),He(t,"click",(function(e){i.current.click&&i.current.click(e)}),[]),He(t,"dblclick",(function(e){i.current.dblclick&&i.current.dblclick(e)}),[]),He(t,"focus",(function(e){i.current.focus&&i.current.focus(e)}),[]);var d=(0,n.useCallback)((function(){null==t||t.focus()}),[t]),y=(0,n.useMemo)((function(){return{mousePosition:l,isMouseDown:f,focus:d,interactions:i}}),[l,f,d]);return o().createElement(jt.Provider,{value:y},r)}function Pt(e,t){(0,n.useContext)(jt).interactions.current[e]=t}var Mt=function(){return(0,n.useContext)(jt).mousePosition},Rt=function(){return(0,n.useContext)(jt).isMouseDown},Tt=function(){return(0,n.useContext)(jt).focus};function Bt(e){return Bt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Bt(e)}function Dt(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Lt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?Dt(Object(r),!0).forEach((function(t){var n,o,i,u;n=e,o=t,i=r[t],u=function(e,t){if("object"!=Bt(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=Bt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(o),(o="symbol"==Bt(u)?u:String(u))in n?Object.defineProperty(n,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[o]=i})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Dt(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Kt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}const Ft=(0,n.forwardRef)((function(e,t){var r,o,i=e.text,u=e.onTextChange,l=e.placement,a=e.isValid,c=(r=(0,n.useState)(null),o=2,function(e){if(Array.isArray(e))return e}(r)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,u,l=[],a=!0,c=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;a=!1}else for(;!(a=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);a=!0);}catch(e){c=!0,o=e}finally{try{if(!a&&null!=r.return&&(u=r.return(),Object(u)!==u))return}finally{if(c)throw o}}return l}}(r,o)||function(e,t){if(e){if("string"==typeof e)return Kt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Kt(e,t):void 0}}(r,o)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),f=c[0],s=c[1],d=(0,n.useRef)("");He(f,"mousedown",(function(e){e.stopPropagation()}),[]),He(f,"keydown",(function(e){switch(e.key){case"Enter":case"Escape":break;case"Delete":case"Backspace":""!==d.current&&e.stopPropagation();break;default:e.stopPropagation()}}),[]),He(f,"click",(function(e){e.stopPropagation()}),[]),He(f,"dblclick",(function(e){e.stopPropagation()}),[]);var y=(0,n.useCallback)((function(e){s(e),null==t||t(e)}),[t]),p=(0,n.useCallback)((function(e){d.current=e.target.value,u(e.target.value)}),[u]);return(0,n.useEffect)((function(){i!==d.current&&(d.current=i,null==f||f.select())}),[i,f]),l?React.createElement("input",{ref:y,autoFocus:!0,style:Lt(Lt({position:"absolute",zIndex:3},l),{},{opacity:i?1:0,pointerEvents:i?"auto":"none",outline:"none",border:"none",boxShadow:"none",padding:"0 5px",fontSize:"12px",fontFamily:"Calibri",backgroundColor:a?"white":"#eb3434"}),placeholder:"placeholder",value:i,onChange:p,opacity:""===i?1:0}):React.createElement(React.Fragment,null)}));function Vt(e){return Vt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Vt(e)}function Wt(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Ut(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?Wt(Object(r),!0).forEach((function(t){var n,o,i,u;n=e,o=t,i=r[t],u=function(e,t){if("object"!=Vt(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=Vt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(o),(o="symbol"==Vt(u)?u:String(u))in n?Object.defineProperty(n,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[o]=i})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Wt(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Nt(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,u,l=[],a=!0,c=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;a=!1}else for(;!(a=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);a=!0);}catch(e){c=!0,o=e}finally{try{if(!a&&null!=r.return&&(u=r.return(),Object(u)!==u))return}finally{if(c)throw o}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return zt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?zt(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function zt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function qt(e,t,r,n,o,i){if(!t)return[];if(!e)return[];var u=c(e.columnId),l=c(e.rowId),a=c(t.columnId),f=c(t.rowId);if(!o.has(u))return[];if(!i.has(l))return[];if(!o.has(a))return[];if(!i.has(f))return[];var s=Math.min(o.get(u).index,o.get(a).index),d=Math.max(o.get(u).index,o.get(a).index),y=Math.min(i.get(l).index,i.get(f).index),p=Math.max(i.get(l).index,i.get(f).index);return r.slice(s,d+1).flatMap((function(e){return n.slice(y,p+1).map((function(t){return{rowId:t.id,columnId:e.id}}))}))}function Yt(e,t){return"FILTER"===e.type^"FILTER"===t.type?"FILTER":"DATA"===e.type&&"DATA"===t.type?"DATA":"OTHER"}function Ht(e,t,r,n){return e.map((function(e){var o=c(e.columnId),i=c(e.rowId);if(!r.has(o))return null;if(!n.has(i))return null;var u=r.get(o),l=n.get(i);return{edit:t.resolve(l,u).edit,cell:e,type:Yt(u,l)}})).filter((function(e){return null==e?void 0:e.edit}))}function Gt(){var e=Nt((0,n.useState)(""),2),t=e[0],r=e[1],i=Nt((0,n.useState)(null),2),u=i[0],l=i[1],a=nt(),f=Mt(),s=Rt(),d=Tt(),y=tt(),p=Oe(),m=xe(),h=Fe(),b=Se(),v=Ae(),g=je(),w=ke(),_=Ie(),S=Pe(),O=Me(),x=Re(),E=Te(),C=Be(),A=De(),j=ge(),k=we(),I=function(e,t){return(0,n.useMemo)((function(){var r=[];return e.reduce((function(e,n){return r.push({left:e,right:e+n.width+t,id:n.id}),e+n.width+t}),0),r}),[e,t])}(j,h),P=function(e,t){return(0,n.useMemo)((function(){var r=[];return e.reduce((function(e,n){return r.push({top:e,bottom:e+n.height+t,id:n.id}),e+n.height+t}),0),r}),[e,t])}(k,h),M=Le(),R=Ke(),T=Ce(),B=(0,n.useMemo)((function(){return j.reduce((function(e,t){return e.set(t.key,t)}),new Map)}),[j]),D=(0,n.useMemo)((function(){return k.reduce((function(e,t){return e.set(t.key,t)}),new Map)}),[k]),L=(0,n.useMemo)((function(){return Ht(b,T,B,D).every((function(e){return e.edit.validate({string:t})}))}),[b,T,B,D,t]);(0,n.useEffect)((function(){if(f){var e=f.x<=M.left?f.x:f.x>=a.width-M.right?R.width-a.width+f.x:f.x+y.left,t=f.y<=M.top?f.y:f.y>=a.height-M.bottom?R.height-a.height+f.y:f.y+y.top,r=function(e,t){if(0===e.length)return-1;if(t<e[0].top)return-1;if(t>e[e.length-1].bottom)return-1;for(var r=0,n=e.length-1;r<=n;){var o=Math.floor((r+n)/2);if(t<e[o].top)n=o-1;else{if(!(t>e[o].bottom))return o;r=o+1}}return-1}(P,t),n=function(e,t){if(0===e.length)return-1;if(t<e[0].left)return-1;if(t>e[e.length-1].right)return-1;for(var r=0,n=e.length-1;r<=n;){var o=Math.floor((r+n)/2);if(t<e[o].left)n=o-1;else{if(!(t>e[o].right))return o;r=o+1}}return-1}(I,e);_(-1!==r&&-1!==n?{rowId:k[r].id,columnId:j[n].id}:null)}else _(null)}),[I,j,f,P,k,y,_,a,M,R]),(0,n.useEffect)((function(){s&&g(qt(m,p,j,k,B,D))}),[s,p,m,j,k,B,D,g]),Pt("mousedown",(function(e){p&&(r(""),S(p),e.ctrlKey||v([]))})),Pt("mouseup",(function(){m&&(O(qt(m,p,j,k,B,D)),g([]))})),Pt("keydown",(function(e){console.log("onKeyDown",e.key);var n=function(e,t){S(e),t.shiftKey?O([e]):v([e])},o=function(e,t){if(m){var r=c(m.columnId);if(B.has(r)){var o=B.get(r).index,i=Math.max(0,Math.min(j.length-1,o+e));if(i!==o){var u={rowId:m.rowId,columnId:j[i].id};n(u,t)}}}},i=function(e,t){if(m){var r=c(m.rowId);if(D.has(r)){var o=D.get(r).index,i=Math.max(0,Math.min(k.length-1,o+e));if(i!==o){var u={rowId:k[i].id,columnId:m.columnId};n(u,t)}}}},u=function(){e.preventDefault(),e.stopPropagation()};switch(e.key){case"Escape":""!==t?r(""):m?(S(null),v([])):w([]);break;case"Enter":!function(){var e=Ht(b,T,B,D);if(""!==t&&e.every((function(e){return e.edit.validate({string:t})}))){var n=e.filter((function(e){return"DATA"===e.type})),o=e.filter((function(e){return"FILTER"===e.type}));x(n.map((function(e){return Ut(Ut({},e.cell),{},{value:e.edit.parse({string:t})})}))),E(o.map((function(e){return Ut(Ut({},e.cell),{},{expression:e.edit.parse({string:t})})}))),r("")}}();break;case"ArrowUp":u(),i(e.ctrlKey?-k.length:-1,e);break;case"ArrowDown":u(),i(e.ctrlKey?k.length:1,e);break;case"ArrowLeft":u(),o(e.ctrlKey?-j.length:-1,e);break;case"ArrowRight":u(),o(e.ctrlKey?j.length:1,e);break;case"Delete":case"Backspace":console.log("delete"),C(b),A(b);break;default:return}})),Pt("dblclick",(function(){if(m){var e=c(m.columnId),t=c(m.rowId);if(B.has(e)&&D.has(t)){var n=B.get(e),o=D.get(t),i=T.resolve(o,n),u="".concat(i.value);r(u)}}})),Pt("focus",(function(){console.log("refocusing on input"),null==u||u.focus()}));var K=(0,n.useMemo)((function(){if(!m)return null;var e=c(m.columnId),t=c(m.rowId);if(!B.has(e))return null;if(!D.has(t))return null;var r=B.get(e),n=D.get(t);return 0===Ht(b,T,B,D).length?null:{left:r.left,top:n.top,width:r.width,height:n.height,boxSizing:"border-box"}}),[m,B,D,b,T]),F=u&&document.activeElement===u;return(0,n.useEffect)((function(){F&&!K&&d()}),[K,F,d]),o().createElement(o().Fragment,null,o().createElement(Ft,{ref:l,text:t,onTextChange:r,placement:K,isValid:L}))}function $t(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function Xt(){console.count("render Grid");var e,t,r=(e=(0,n.useState)(null),t=2,function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,u,l=[],a=!0,c=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;a=!1}else for(;!(a=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);a=!0);}catch(e){c=!0,o=e}finally{try{if(!a&&null!=r.return&&(u=r.return(),Object(u)!==u))return}finally{if(c)throw o}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return $t(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?$t(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),i=r[0],u=r[1],l=O();return o().createElement("div",{className:"spread-grid",ref:u,tabIndex:0,style:{maxWidth:"fit-content",maxHeight:"fit-content",overflow:"auto",display:"grid",position:"relative",gridTemplateColumns:"auto auto auto",gridTemplateRows:"auto auto auto",outline:"none"}},o().createElement(et,{element:i},o().createElement(ht,null,o().createElement(gt,{horizontal:"left",vertical:"top"},o().createElement(Et,{style:{position:"sticky",left:0,top:0,zIndex:2,gridRow:"1",gridColumn:"1"},devicePixelRatio:l})),o().createElement(gt,{horizontal:"center",vertical:"top"},o().createElement(Et,{style:{position:"sticky",top:0,zIndex:1,gridRow:"1",gridColumn:"2"},devicePixelRatio:l})),o().createElement(gt,{horizontal:"right",vertical:"top"},o().createElement(Et,{style:{position:"sticky",right:0,top:0,zIndex:2,gridRow:"1",gridColumn:"3"},devicePixelRatio:l})),o().createElement(gt,{horizontal:"left",vertical:"middle"},o().createElement(Et,{style:{position:"sticky",left:0,zIndex:1,gridRow:"2",gridColumn:"1"},devicePixelRatio:l})),o().createElement(gt,{horizontal:"center",vertical:"middle"},o().createElement(Et,{style:{gridRow:"2",gridColumn:"2"},devicePixelRatio:l})),o().createElement(gt,{horizontal:"right",vertical:"middle"},o().createElement(Et,{style:{position:"sticky",right:0,zIndex:1,gridRow:"2",gridColumn:"3"},devicePixelRatio:l})),o().createElement(gt,{horizontal:"left",vertical:"bottom"},o().createElement(Et,{style:{position:"sticky",left:0,bottom:0,zIndex:2,gridRow:"3",gridColumn:"1"},devicePixelRatio:l})),o().createElement(gt,{horizontal:"center",vertical:"bottom"},o().createElement(Et,{style:{position:"sticky",bottom:0,zIndex:1,gridRow:"3",gridColumn:"2"},devicePixelRatio:l})),o().createElement(gt,{horizontal:"right",vertical:"bottom"},o().createElement(Et,{style:{position:"sticky",right:0,bottom:0,zIndex:2,gridRow:"3",gridColumn:"3"},devicePixelRatio:l}))),o().createElement(It,{element:i},o().createElement(Gt,null))))}function Zt(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,u,l=[],a=!0,c=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;a=!1}else for(;!(a=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);a=!0);}catch(e){c=!0,o=e}finally{try{if(!a&&null!=r.return&&(u=r.return(),Object(u)!==u))return}finally{if(c)throw o}}return l}}(e,t)||Jt(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Jt(e,t){if(e){if("string"==typeof e)return Qt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Qt(e,t):void 0}}function Qt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var er=[],tr=function(e){return e.length>0?Object.keys(e[0]).map((function(e){return{id:e,width:100}})):[]},rr=function(e){return[{id:"top-header",type:"HEADER",height:20}].concat(function(e){if(Array.isArray(e))return Qt(e)}(t=e.map((function(e,t){return{id:t,height:20}})))||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(t)||Jt(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}());var t},nr=[],or=function(e){var t=e.data,r=e.row,n=e.column;return t[r.id][n.id]},ir=0,ur=0,lr=0,ar=0,cr=1;function fr(e){var t=Zt((0,n.useState)([]),2),r=t[0],i=t[1],u=Zt((0,n.useState)([]),2),l=u[0],a=u[1],c=Zt((0,n.useState)([]),2),f=c[0],s=c[1],d=Zt((0,n.useState)([]),2),y=d[0],p=d[1],m=Zt((0,n.useState)(null),2),h=m[0],b=m[1],v=Zt((0,n.useState)(null),2),g=v[0],w=v[1],_="data"in e?e.data:er,S="columns"in e?e.columns:tr,O="rows"in e?e.rows:rr,x="formatting"in e?e.formatting:nr,E="dataSelector"in e?e.dataSelector:or,C="pinnedTop"in e?e.pinnedTop:ir,A="pinnedBottom"in e?e.pinnedBottom:ur,j="pinnedLeft"in e?e.pinnedLeft:lr,k="pinnedRight"in e?e.pinnedRight:ar,I="selectedCells"in e?e.selectedCells:r,P="highlightedCells"in e?e.highlightedCells:l,M="editedCells"in e?e.editedCells:f,R="filters"in e?e.filters:y,T="hoveredCell"in e?e.hoveredCell:h,B="focusedCell"in e?e.focusedCell:g,D="borderWidth"in e?e.borderWidth:cr;return o().createElement(ve,{data:_,columns:S,rows:O,pinnedTop:C,pinnedBottom:A,pinnedLeft:j,pinnedRight:k,formatting:x,dataSelector:E,selectedCells:I,highlightedCells:P,editedCells:M,filters:R,hoveredCell:T,focusedCell:B,borderWidth:D,onSelectedCellsChange:function(t){var r;i(t),null===(r=e.onSelectedCellsChange)||void 0===r||r.call(e,t)},onHighlightedCellsChange:function(t){var r;a(t),null===(r=e.onHighlightedCellsChange)||void 0===r||r.call(e,t)},onEditedCellsChange:function(t){var r;s(t),null===(r=e.onEditedCellsChange)||void 0===r||r.call(e,t)},onFiltersChange:function(t){var r;p(t),null===(r=e.onFiltersChange)||void 0===r||r.call(e,t)},onHoveredCellChange:function(t){var r;b(t),null===(r=e.onHoveredCellChange)||void 0===r||r.call(e,t)},onFocusedCellChange:function(t){var r;w(t),null===(r=e.onFocusedCellChange)||void 0===r||r.call(e,t)}},o().createElement(Xt,null))}},64:e=>{e.exports=window.PropTypes},196:e=>{e.exports=window.React}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var r=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](r,r.exports,__webpack_require__),r.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var r in t)__webpack_require__.o(t,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var getCurrentScript=function(){var e=document.currentScript;if(!e){for(var t=document.getElementsByTagName("script"),r=[],n=0;n<t.length;n++)r.push(t[n]);e=(r=r.filter((function(e){return!e.async&&!e.text&&!e.textContent}))).slice(-1)[0]}return e},isLocalScript=function(e){return/\/_dash-component-suites\//.test(e.src)},url;if(Object.defineProperty(__webpack_require__,"p",{get:(url=getCurrentScript().src.split("/").slice(0,-1).join("/")+"/",function(){return url})}),"undefined"!=typeof jsonpScriptSrc){var __jsonpScriptSrc__=jsonpScriptSrc;jsonpScriptSrc=function(e){var t=getCurrentScript(),r=isLocalScript(t),n=__jsonpScriptSrc__(e);if(!r)return n;var o=n.split("/"),i=o.slice(-1)[0].split(".");return i.splice(1,0,"v0_0_1m1705586879"),o.splice(-1,1,i.join(".")),o.join("/")}}var __webpack_exports__={};(()=>{__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{DashSpreadGrid:()=>e.Z});var e=__webpack_require__(353)})(),window.dash_spread_grid=__webpack_exports__})();
|
|
2
|
+
//# sourceMappingURL=dash_spread_grid.min.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dash_spread_grid.min.js","mappings":"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","sources":["webpack:///./src/lib/components/DashSpreadGrid.jsx","webpack:///./src/lib/lib/hooks/useInvoked.js","webpack:///./src/lib/lib/utils/stringifyId.js","webpack:///./src/lib/lib/utils/getRenderFormattingRules.js","webpack:///./src/lib/lib/utils/Selection.js","webpack:///./src/lib/lib/hooks/useChangeCallback.js","webpack:///./src/lib/lib/hooks/useDevicePixelRatio.js","webpack:///./src/lib/lib/utils/Edition.js","webpack:///./src/lib/lib/utils/FormattingRules.js","webpack:///./src/lib/lib/utils/Filtering.js","webpack:///./src/lib/lib/utils/FormatResolver.js","webpack:///./src/lib/lib/utils/VisibilityResolver.js","webpack:///./src/lib/lib/contexts/StateContext.jsx","webpack:///./src/lib/lib/utils/getDataFormattingRules.js","webpack:///./src/lib/lib/utils/getSections.js","webpack:///./src/lib/lib/utils/TextResolver.js","webpack:///./src/lib/lib/hooks/useDeepState.js","webpack:///./src/lib/lib/hooks/useEventListener.js","webpack:///./src/lib/lib/contexts/SizeAndScrollContext.jsx","webpack:///./src/lib/lib/hooks/useDomObserver.js","webpack:///./src/lib/lib/utils/rect.js","webpack:///./src/lib/lib/contexts/ScrollRectContext.jsx","webpack:///./src/lib/lib/hooks/useRefMemo.js","webpack:///./src/lib/lib/contexts/GridSectionContext.jsx","webpack:///./src/lib/lib/fragments/GridCanvas.jsx","webpack:///./src/lib/lib/contexts/MouseAndKeyboardContext.jsx","webpack:///./src/lib/lib/fragments/GridInput.jsx","webpack:///./src/lib/lib/fragments/GridInteractions.jsx","webpack:///./src/lib/lib/fragments/Grid.jsx","webpack:///./src/lib/lib/components/SpreadGrid.jsx","webpack:///external window \"PropTypes\"","webpack:///external window \"React\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/compat"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\n\nimport React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport SpreadGrid from './../lib/components/SpreadGrid';\n\nfunction isString(value) {\n return typeof value === 'string' || value instanceof String;\n}\n\nfunction useResolvedFormatting(formatting) {\n return useMemo(() => {\n return formatting.map(rule => {\n const mappedRule = {};\n\n if ('column' in rule)\n mappedRule.column = rule.column;\n if ('row' in rule)\n mappedRule.row = rule.row;\n if ('condition' in rule)\n mappedRule.condition = eval(`({data, rows, columns, row, column, value, newValue, text}) => (${rule.condition})`);\n if ('style' in rule)\n mappedRule.style = isString(rule.style) ? eval(`({data, rows, columns, row, column, value, newValue, text}) => (${rule.style})`) : rule.style;\n if ('value' in rule)\n mappedRule.value = eval(`({data, rows, columns, row, column, value, newValue, text})=> (${rule.value})`);\n if ('text' in rule)\n mappedRule.text = eval(`({data, rows, columns, row, column, value, newValue, text}) => (${rule.text})`);\n\n return mappedRule;\n });\n }, [formatting]);\n}\n\n// TODO: Write description\n// TODO: Rename to DashSpreadGrid\nfunction DashSpreadGrid(props) {\n console.count('render DashSpreadGrid');\n\n const data = props.data;\n const columns = props.columns;\n const rows = props.rows;\n const formatting = useResolvedFormatting(props.formatting);\n const pinnedTop = props.pinnedTop;\n const pinnedBottom = props.pinnedBottom;\n const pinnedLeft = props.pinnedLeft;\n const pinnedRight = props.pinnedRight;\n\n // eslint-disable-next-line react/prop-types\n // const setProps = props.setProps;\n\n // const setSelectedCells = useCallback(selectedCells => setProps({ selectedCells }), [setProps]);\n // const setHoveredCell = useCallback(hoveredCell => setProps({ hoveredCell }), [setProps]);\n // const setFocusedCell = useCallback(focusedCell => setProps({ focusedCell }), [setProps]);\n\n return (\n <SpreadGrid\n data={data}\n columns={columns}\n rows={rows}\n formatting={formatting}\n pinnedTop={pinnedTop}\n pinnedBottom={pinnedBottom}\n pinnedLeft={pinnedLeft}\n pinnedRight={pinnedRight}\n />\n );\n};\n\n// TODO: add descriptions\n// TODO: Fix types\nDashSpreadGrid.propTypes = {\n // _\n id: PropTypes.string,\n // _\n data: PropTypes.array,\n // _\n columns: PropTypes.array,\n // _\n rows: PropTypes.array,\n // _\n formatting: PropTypes.array,\n // _\n pinnedTop: PropTypes.number,\n // _\n pinnedBottom: PropTypes.number,\n // _\n pinnedLeft: PropTypes.number,\n // _\n pinnedRight: PropTypes.number,\n};\n\nDashSpreadGrid.defaultProps = {\n data: [],\n columns: [],\n rows: [],\n formatting: [],\n pinnedTop: 0,\n pinnedBottom: 0,\n pinnedLeft: 0,\n pinnedRight: 0,\n};\n\nexport default DashSpreadGrid;\n","/* eslint-disable react-hooks/exhaustive-deps */\n\nimport { useMemo } from \"react\";\n\nexport default function useInvoked(expression, args) {\n return useMemo(() => {\n if (typeof expression === 'function')\n return expression(...args);\n\n return expression;\n }, [expression, ...args]);\n}","function stringifyObject(object) {\n const keys = Object.keys(object).sort();\n const stringified = keys.map(key => {\n return `${key}:${stringifyId(object[key])}`\n });\n\n return `{${stringified.join(',')}}`;\n}\n\nfunction stringifyArray(array) {\n const stringified = array.map(stringifyId);\n\n return `[${stringified.join(',')}]`;\n}\n\nexport default function stringifyId(key) {\n if (key === null)\n return 'null'\n\n if (Array.isArray(key))\n return stringifyArray(key)\n\n if (typeof key === 'object')\n return stringifyObject(key)\n\n return JSON.stringify(key)\n}","import stringifyId from './stringifyId';\n\nfunction getHighlightColor(baseColor, isStrong) {\n if (isStrong)\n return baseColor + '99';\n else\n return baseColor + '33';\n}\n\nexport default function getRenderFormattingRules(formatting, hoveredCell, focusedCell, selection, highlight, edition) {\n const hoveredColumnKey = hoveredCell ? stringifyId(hoveredCell.columnId) : null;\n const hoveredRowKey = hoveredCell ? stringifyId(hoveredCell.rowId) : null;\n\n const focusedColumnKey = focusedCell ? stringifyId(focusedCell.columnId) : null;\n const focusedRowKey = focusedCell ? stringifyId(focusedCell.rowId) : null;\n\n const isSelected = (rows, columns, rowIndex, columnIndex) => {\n if (rowIndex < 0 || rowIndex >= rows.length)\n return false;\n if (columnIndex < 0 || columnIndex >= columns.length)\n return false;\n\n const rowKey = rows[rowIndex].key;\n const columnKey = columns[columnIndex].key;\n\n return selection.isKeySelected(rowKey, columnKey);\n };\n\n return [\n {\n column: { match: 'ANY' },\n row: { match: 'FILTER' },\n style: ({ newValue }) => ({ background: '#FBFBFB', foreground: newValue ? 'black' : '#cccccc', border: { width: 1, color: 'gray' } })\n },\n {\n column: { match: 'ANY' },\n row: { match: 'HEADER' },\n style: { background: '#F5F5F5', border: { width: 1, color: 'gray' } }\n },\n ...formatting,\n {\n column: { match: 'ANY' },\n row: { match: 'ANY' },\n condition: ({ row, column }) => hoveredColumnKey === column.key || hoveredRowKey === row.key,\n style: { highlight: '#81948133' },\n },\n {\n column: { match: 'ANY' },\n row: { match: 'ANY' },\n condition: ({ row, column }) => hoveredColumnKey === column.key && hoveredRowKey === row.key,\n style: { highlight: '#81948188' },\n },\n {\n column: { match: 'ANY' },\n row: { match: 'ANY' },\n condition: ({ rows, columns, row, column }) => isSelected(rows, columns, row.index, column.index),\n style: ({ rows, columns, row, column, edit }) => ({\n ...(!isSelected(rows, columns, row.index - 1, column.index) ? { borderTop: { width: 3, color: '#596959', index: Number.MAX_SAFE_INTEGER } } : {}),\n ...(!isSelected(rows, columns, row.index + 1, column.index) ? { borderBottom: { width: 3, color: '#596959', index: Number.MAX_SAFE_INTEGER } } : {}),\n ...(!isSelected(rows, columns, row.index, column.index - 1) ? { borderLeft: { width: 3, color: '#596959', index: Number.MAX_SAFE_INTEGER } } : {}),\n ...(!isSelected(rows, columns, row.index, column.index + 1) ? { borderRight: { width: 3, color: '#596959', index: Number.MAX_SAFE_INTEGER } } : {}),\n highlight: getHighlightColor(edit ? '#798d9c' : '#819481', focusedColumnKey !== column.key || focusedRowKey !== row.key)\n }),\n },\n {\n column: { match: 'ANY' },\n row: { match: 'ANY' },\n condition: ({ row, column }) => highlight.isKeySelected(row.key, column.key),\n style: ({ row, column }) => ({\n highlight: getHighlightColor('#798d9c', focusedColumnKey !== column.key || focusedRowKey !== row.key)\n })\n },\n {\n column: { match: 'ANY' },\n row: { match: 'ANY' },\n condition: ({ row, column }) => focusedColumnKey === column.key && focusedRowKey === row.key,\n style: { background: 'white' },\n },\n {\n column: { match: 'ANY' },\n row: { match: 'ANY' },\n condition: ({ edit }) => edit,\n style: { corner: '#77777720' },\n },\n {\n column: { match: 'ANY' },\n row: { match: 'ANY' },\n condition: ({ row, column }) => edition.hasValueByKey(row.key, column.key),\n style: { corner: 'darkgreen' },\n },\n ];\n}","import stringifyId from \"./stringifyId\";\n\nexport default class Selection {\n constructor(selectedCells) {\n this.lookup = new Map();\n\n selectedCells.forEach(cell => {\n const rowKey = stringifyId(cell.rowId);\n const columnKey = stringifyId(cell.columnId);\n\n if (!this.lookup.has(rowKey))\n this.lookup.set(rowKey, new Set());\n\n this.lookup.get(rowKey).add(columnKey);\n });\n }\n\n isKeySelected(rowKey, columnKey) {\n return this.lookup.has(rowKey) && this.lookup.get(rowKey).has(columnKey);\n }\n\n isIdSelected(rowId, columnId) {\n return this.isKeySelected(stringifyId(rowId), stringifyId(columnId));\n }\n}","import { useCallback, useRef } from \"react\";\n\nexport default function useChangeCallback(currentValue, callback, comparator) {\n const ref = useRef({});\n\n ref.current.value = currentValue;\n ref.current.callback = callback;\n\n return useCallback((value) => {\n const newValue = typeof value === 'function'\n ? value(ref.current.value) \n : value;\n\n const comparatorResult = ref.current.value === newValue || (comparator && comparator(ref.current.value, newValue));\n\n if (!comparatorResult)\n {\n ref.current.value = newValue;\n ref.current.callback(newValue);\n }\n }, [comparator]);\n}","import { useState, useEffect } from 'react';\n\nexport function roundToPixels(value, devicePixelRatio) {\n return Math.round(value * devicePixelRatio) / devicePixelRatio;\n}\n\n// TODO: Test this hook\nexport default function useDevicePixelRatio() {\n const [devicePixelRatio, setDevicePixelRatio] = useState(window.devicePixelRatio);\n\n useEffect(() => {\n const media = matchMedia(`(resolution: ${devicePixelRatio}dppx)`);\n const updateDevicePixelRatio = () => {\n console.log('Device pixel ratio changed');\n setDevicePixelRatio(window.devicePixelRatio);\n };\n\n media.addEventListener('change', updateDevicePixelRatio, { once: true });\n\n return () => media.removeEventListener('change', updateDevicePixelRatio);\n }, [devicePixelRatio]);\n\n return devicePixelRatio;\n}\n","import stringifyId from \"./stringifyId\";\n\n// TODO: write unit tests\nexport default class Edition {\n constructor(editedCells) {\n this.lookup = new Map();\n\n editedCells.forEach(cell => {\n const rowKey = stringifyId(cell.rowId);\n const columnKey = stringifyId(cell.columnId);\n\n if (!this.lookup.has(rowKey))\n this.lookup.set(rowKey, new Map());\n\n this.lookup.get(rowKey).set(columnKey, cell.value);\n });\n }\n\n hasValueByKey(rowKey, columnKey) {\n return this.lookup.has(rowKey) && this.lookup.get(rowKey).has(columnKey);\n }\n\n getValueByKey(rowKey, columnKey) {\n if (!this.hasValueByKey(rowKey, columnKey))\n return undefined;\n\n return this.lookup.get(rowKey).get(columnKey);\n }\n\n hasValueById(rowId, columnId) {\n return this.hasValueByKey(stringifyId(rowId), stringifyId(columnId));\n }\n\n getValueById(rowId, columnId) {\n return this.getValueByKey(stringifyId(rowId), stringifyId(columnId));\n }\n}","import stringifyId from \"./stringifyId\";\n\nconst borderTypes = ['borderTop', 'borderRight', 'borderBottom', 'borderLeft'];\n\n// TODO: Don't recreate styles if they haven't changed\nfunction indexBorders(style, index) {\n const newStyle = { ...style };\n\n if ('border' in newStyle) {\n for (const borderType of borderTypes)\n newStyle[borderType] = newStyle.border;\n delete newStyle.border;\n }\n\n for (const borderType of borderTypes)\n if (borderType in newStyle)\n newStyle[borderType] = { ...newStyle[borderType], index };\n\n return newStyle;\n}\n\nfunction mapFilter(filter) {\n return {\n by: {\n type: filter.by.type,\n key: stringifyId(filter.by.id)\n },\n condition: filter.condition\n };\n}\n\nclass StyleGroup {\n byKey = new Map();\n byIndex = new Map(); // TODO: Should this be removed?\n byMatch = new Map();\n};\n\nconst matchMapping = {\n 'HEADER': ['HEADER'],\n 'FILTER': ['FILTER'],\n 'DATA': ['DATA'],\n 'ANY': ['HEADER', 'DATA', 'FILTER'],\n undefined: []\n};\n\n// TODO: Rename to FormatResolver\n// TODO: Optimize by not searching using keys that don't have correlated match rules\n// TODO: Accept both a function and an object as a style (where the object is a resolved style)\n// TODO: Consider removing index from the lookup\nexport default class FormattingRules {\n constructor(rules) {\n this.columnLookup = new StyleGroup();\n this.rulesCount = 0;\n\n for (const rule of rules)\n this.addRule(rule);\n }\n\n addRule(rule) {\n const columnLookup = this.columnLookup;\n const index = this.rulesCount++;\n\n const column = 'column' in rule\n ? 'id' in rule.column\n ? { key: stringifyId(rule.column.id) }\n : rule.column\n : { match: 'DATA' };\n const row = 'row' in rule\n ? 'id' in rule.row\n ? { key: stringifyId(rule.row.id) }\n : rule.row\n : { match: 'DATA' };\n\n const entry = {};\n if ('condition' in rule)\n entry.condition = rule.condition;\n if ('style' in rule)\n entry.style = typeof rule.style === 'function' ? rule.style : () => rule.style;\n if ('value' in rule)\n entry.value = typeof rule.value === 'function' ? rule.value : () => rule.value;\n if ('text' in rule)\n entry.text = typeof rule.text === 'function' ? rule.text : () => rule.text;\n if ('edit' in rule)\n entry.edit = rule.edit;\n if ('draw' in rule)\n entry.draw = rule.draw;\n if ('filter' in rule)\n entry.filter = mapFilter(rule.filter);\n\n function addRowRule(lookup, key) {\n if (!lookup.has(key))\n lookup.set(key, []);\n\n lookup.get(key).push({\n index: index,\n ...entry\n });\n }\n\n function addColumnRule(lookup, key) {\n if (!lookup.has(key))\n lookup.set(key, new StyleGroup());\n\n if ('key' in row)\n addRowRule(lookup.get(key).byKey, row.key);\n if ('index' in row)\n addRowRule(lookup.get(key).byIndex, row.index);\n for (const match of matchMapping[row.match])\n addRowRule(lookup.get(key).byMatch, match);\n }\n\n if ('key' in column)\n addColumnRule(columnLookup.byKey, column.key);\n if ('index' in column)\n addColumnRule(columnLookup.byIndex, column.index);\n for (const match of matchMapping[column.match])\n addColumnRule(columnLookup.byMatch, match);\n }\n\n resolve(data, rows, columns, row, column, edition, filtering) {\n const columnLookup = this.columnLookup;\n\n const rules = [];\n\n function gatherRules(newRules) {\n for (const rule of newRules)\n rules.push(rule);\n }\n\n function gatherRowRules(lookup) {\n if (lookup.byKey.has(row.key))\n gatherRules(lookup.byKey.get(row.key));\n if (lookup.byIndex.has(row.index))\n gatherRules(lookup.byIndex.get(row.index));\n if (lookup.byMatch.has(row.type))\n gatherRules(lookup.byMatch.get(row.type));\n }\n\n if (columnLookup.byKey.has(column.key))\n gatherRowRules(columnLookup.byKey.get(column.key));\n if (columnLookup.byIndex.has(column.index))\n gatherRowRules(columnLookup.byIndex.get(column.index));\n if (columnLookup.byMatch.has(column.type))\n gatherRowRules(columnLookup.byMatch.get(column.type));\n\n rules.sort((a, b) => a.index - b.index);\n\n let context = { data, rows, columns, row, column };\n let style = {};\n let draw = undefined;\n let visible = true;\n\n if (edition.hasValueByKey(row.key, column.key))\n context = { ...context, newValue: edition.getValueByKey(row.key, column.key) };\n\n for (const rule of rules) {\n if ('condition' in rule && !rule.condition(context))\n continue;\n\n if ('value' in rule)\n context = { ...context, value: rule.value(context) };\n if ('style' in rule)\n style = { ...style, ...indexBorders(rule.style(context), rule.index) };\n if ('text' in rule)\n context = { ...context, text: rule.text(context) };\n if ('edit' in rule)\n context = { ...context, edit: rule.edit };\n if ('draw' in rule) {\n const currentContext = context;\n draw = (ctx) => rule.draw({ ...currentContext, ctx });\n }\n if ('filter' in rule && filtering.hasValueByKeyAndSelector(row.key, column.key, rule.filter.by)) {\n const filterContext = { ...context, expression: filtering.getValueByKeyAndSelector(row.key, column.key, rule.filter.by) };\n visible = visible && rule.filter.condition(filterContext);\n }\n }\n\n const result = {\n style,\n visible\n };\n\n if ('value' in context)\n result.value = context.value;\n if ('edit' in context)\n result.edit = context.edit;\n if (draw !== undefined)\n result.draw = draw;\n if ('text' in context)\n result.text = context.text;\n\n return result;\n }\n}","import stringifyId from \"./stringifyId\";\n\n// TODO: Extract the Edition class to a common base class\nexport default class Filtering {\n constructor(filters) {\n this.lookup = new Map();\n this.filteredColumns = new Set();\n this.filteredRows = new Set();\n\n filters.forEach(cell => {\n const rowKey = stringifyId(cell.rowId);\n const columnKey = stringifyId(cell.columnId);\n\n if (!this.lookup.has(rowKey))\n this.lookup.set(rowKey, new Map());\n\n this.lookup.get(rowKey).set(columnKey, cell.expression);\n this.filteredColumns.add(columnKey);\n this.filteredRows.add(rowKey);\n });\n }\n\n hasRowFilters() {\n return this.filteredRows.size > 0;\n }\n\n hasColumnFilters() {\n return this.filteredColumns.size > 0;\n }\n\n hasRowFiltersByKey(rowKey) {\n return this.filteredRows.has(rowKey);\n }\n\n hasColumnFiltersByKey(columnKey) {\n return this.filteredColumns.has(columnKey);\n }\n\n hasValueByKey(rowKey, columnKey) {\n return this.lookup.has(rowKey) && this.lookup.get(rowKey).has(columnKey);\n }\n\n getValueByKey(rowKey, columnKey) {\n if (!this.hasValueByKey(rowKey, columnKey))\n return undefined;\n\n return this.lookup.get(rowKey).get(columnKey);\n }\n\n hasValueById(rowId, columnId) {\n return this.hasValueByKey(stringifyId(rowId), stringifyId(columnId));\n }\n\n getValueById(rowId, columnId) {\n return this.getValueByKey(stringifyId(rowId), stringifyId(columnId));\n }\n\n hasValueByKeyAndSelector(rowKey, columnKey, selector) {\n if (selector.type === 'ROW')\n return this.hasValueByKey(selector.key, columnKey);\n if (selector.type === 'COLUMN')\n return this.hasValueByKey(rowKey, selector.key);\n return false;\n }\n\n getValueByKeyAndSelector(rowKey, columnKey, selector) {\n if (selector.type === 'ROW')\n return this.getValueByKey(selector.key, columnKey);\n if (selector.type === 'COLUMN')\n return this.getValueByKey(rowKey, selector.key);\n return undefined;\n }\n};","import Filtering from \"./Filtering\";\n\nexport default class FormatResolver {\n constructor(formattingRules, data, rows, columns, edition) {\n this.formattingRules = formattingRules;\n this.data = data;\n this.rows = rows;\n this.columns = columns;\n this.edition = edition;\n this.filtering = new Filtering([]);\n }\n\n resolve(row, column) {\n return this.formattingRules.resolve(\n this.data,\n this.rows,\n this.columns,\n row,\n column,\n this.edition,\n this.filtering);\n }\n}","import Edition from \"./Edition\";\n\nexport default class VisibilityResolver {\n constructor(formattingRules, data, rows, columns, filtering) {\n this.formattingRules = formattingRules;\n this.data = data;\n this.rows = rows;\n this.columns = columns;\n this.edition = new Edition([]);\n this.filtering = filtering;\n }\n\n findVisibleColumns() {\n if (!this.filtering.hasRowFilters())\n return this.columns;\n\n return this.columns.filter(column => {\n return this.rows.every(row => {\n if (!this.filtering.hasRowFiltersByKey(row.key))\n return true;\n\n const cell = this.formattingRules.resolve(\n this.data,\n this.rows,\n this.columns,\n row,\n column,\n this.edition,\n this.filtering);\n\n return cell.visible;\n });\n });\n }\n\n findVisibleRows() {\n // TODO: don't include search columns in that check\n if (!this.filtering.hasColumnFilters())\n return this.rows;\n\n return this.rows.filter(row => {\n return this.columns.every(column => {\n if (!this.filtering.hasColumnFiltersByKey(column.key))\n return true;\n\n const cell = this.formattingRules.resolve(\n this.data,\n this.rows,\n this.columns,\n row,\n column,\n this.edition,\n this.filtering);\n\n return cell.visible;\n });\n });\n }\n}","import React, { createContext, useCallback, useEffect, useMemo } from \"react\";\nimport useInvoked from \"../hooks/useInvoked\";\nimport getRenderFormattingRules from \"../utils/getRenderFormattingRules\";\nimport Selection from \"../utils/Selection\";\nimport useChangeCallback from \"../hooks/useChangeCallback\";\nimport stringifyId from \"../utils/stringifyId\";\nimport getDataFormattingRules from \"../utils/getDataFormattingRules\";\nimport useDevicePixelRatio, { roundToPixels } from \"../hooks/useDevicePixelRatio\";\nimport getSections from \"../utils/getSections\";\nimport getInputFormattingRules from \"../utils/getInputFormattingRules\";\nimport Edition from \"../utils/Edition\";\nimport FormattingRules from \"../utils/FormattingRules\";\nimport FormatResolver from \"../utils/FormatResolver\";\nimport getVisibilityFormattingRules from \"../utils/getVisibilityFormattingRules\";\nimport Filtering from \"../utils/Filtering\";\nimport VisibilityResolver from \"../utils/VisibilityResolver\";\n\nfunction compareCells(oldCell, newCell) {\n return stringifyId(oldCell) === stringifyId(newCell);\n}\n\nfunction compareSelectedCells(oldCells, newCells) {\n if (oldCells.length !== newCells.length)\n return false;\n\n const selection = new Selection(oldCells);\n return newCells.every(cell => selection.isIdSelected(cell.rowId, cell.columnId));\n}\n\nfunction compareEditedCells(oldCells, newCells) {\n if (oldCells.length !== newCells.length)\n return false;\n\n const edition = new Edition(oldCells);\n return newCells.every(cell => edition.getValueById(cell.rowId, cell.columnId) === cell.value);\n}\n\nfunction compareFilters(oldFilters, newFilters) {\n if (oldFilters.length !== newFilters.length)\n return false;\n\n const filtering = new Filtering(oldFilters);\n return newFilters.every(filter => filtering.getValueById(filter.rowId, filter.columnId) === filter.value);\n\n}\n\nfunction getPinned(index, length, pinnedBegin, pinnedEnd) {\n if (index < pinnedBegin)\n return \"BEGIN\";\n if (index >= length - pinnedEnd)\n return \"END\";\n return undefined;\n}\n\nfunction useResolvedColumnsOrRows(elements, pinnedBegin, pinnedEnd) {\n return useMemo(() => {\n return elements.map((element, index) => {\n return {\n ...element,\n type: element.type || \"DATA\",\n index: index,\n key: stringifyId(element.id),\n pinned: getPinned(index, elements.length, pinnedBegin, pinnedEnd)\n }\n });\n }, [elements, pinnedBegin, pinnedEnd]);\n}\n\nfunction usePlacedColumns(columns, devicePixelRatio, borderWidth) {\n return useMemo(() => {\n let left = borderWidth;\n\n return columns.map((column, index) => {\n const width = roundToPixels(column.width, devicePixelRatio);\n const newColumn = {\n ...column,\n index: index,\n width: width,\n leftWithBorder: left - borderWidth,\n left: left,\n right: left + width,\n rightWithBorder: left + width + borderWidth\n }\n\n left += newColumn.width + borderWidth;\n\n return newColumn;\n });\n }, [borderWidth, columns, devicePixelRatio]);\n}\n\nfunction usePlacedRows(rows, devicePixelRatio, borderWidth) {\n return useMemo(() => {\n let top = borderWidth;\n\n return rows.map((row, index) => {\n const height = roundToPixels(row.height, devicePixelRatio);\n const newRow = {\n ...row,\n index: index,\n height: height,\n topWithBorder: top - borderWidth,\n top: top,\n bottom: top + height,\n bottomWithBorder: top + height + borderWidth\n }\n\n top += newRow.height + borderWidth;\n\n return newRow;\n });\n }, [borderWidth, rows, devicePixelRatio]);\n}\n\nfunction useFormatResolver(dataFormatting, data, rows, columns, edition) {\n const formattingRules = useMemo(() => new FormattingRules(dataFormatting), [dataFormatting]);\n const formatResolver = useMemo(() => new FormatResolver(formattingRules, data, rows, columns, edition), [formattingRules, data, columns, rows, edition]);\n\n return formatResolver;\n}\n\nfunction useVisibilityResolver(dataFormatting, data, rows, columns, filters) {\n const formattingRules = useMemo(() => new FormattingRules(dataFormatting), [dataFormatting]);\n const formatResolver = useMemo(() => new VisibilityResolver(formattingRules, data, rows, columns, filters), [formattingRules, data, columns, rows, filters]);\n\n return formatResolver;\n}\n\nconst DataContext = createContext();\nconst ColumnsAndRowsContext = createContext();\nconst InteractionsContext = createContext();\nconst RenderingContext = createContext();\nconst SizeContext = createContext();\n\nexport function StateProvider(props) {\n const devicePixelRatio = useDevicePixelRatio();\n const borderWidth = props.borderWidth / devicePixelRatio;\n const data = props.data;\n const dataFormatting = useMemo(() => getDataFormattingRules(props.formatting, props.dataSelector), [props.formatting, props.dataSelector]);\n const editedCellsAndFilters = useMemo(() => [...props.editedCells, ...props.filters.map(filter => ({ columnId: filter.columnId, rowId: filter.rowId, value: filter.expression }))], [props.editedCells, props.filters]);\n const edition = useMemo(() => new Edition(editedCellsAndFilters), [editedCellsAndFilters]);\n const filters = useMemo(() => new Filtering(props.filters), [props.filters]);\n const unfilteredColumns = useResolvedColumnsOrRows(useInvoked(props.columns, [data]), props.pinnedLeft, props.pinnedRight); // TODO: Throw on duplicate ids\n const unfilteredRows = useResolvedColumnsOrRows(useInvoked(props.rows, [data]), props.pinnedTop, props.pinnedBottom);\n const visibilityFormatting = useMemo(() => getVisibilityFormattingRules(dataFormatting), [dataFormatting]);\n const visibilityResolver = useVisibilityResolver(visibilityFormatting, data, unfilteredRows, unfilteredColumns, filters);\n const filteredColumns = useMemo(() => visibilityResolver.findVisibleColumns(), [visibilityResolver]);\n const filteredRows = useMemo(() => visibilityResolver.findVisibleRows(), [visibilityResolver]);\n const columns = usePlacedColumns(filteredColumns, devicePixelRatio, borderWidth);\n const rows = usePlacedRows(filteredRows, devicePixelRatio, borderWidth);\n const sections = useMemo(() => getSections(columns, rows), [columns, rows]);\n const selectedCells = props.selectedCells;\n const selection = useMemo(() => new Selection(props.selectedCells), [props.selectedCells]);\n const highlight = useMemo(() => new Selection(props.highlightedCells), [props.highlightedCells]);\n const hoveredCell = props.hoveredCell;\n const focusedCell = props.focusedCell;\n // TODO: addDataFormattingRules and addRenderFormattingRules should remove unnecessary rules\n const renderFormatting = useMemo(() => getRenderFormattingRules(dataFormatting, hoveredCell, focusedCell, selection, highlight, edition), [dataFormatting, hoveredCell, focusedCell, selection, highlight, edition]);\n const renderFormatResolver = useFormatResolver(renderFormatting, data, rows, columns, edition);\n const inputFormatting = useMemo(() => getInputFormattingRules(dataFormatting), [dataFormatting]);\n const inputFormatResolver = useFormatResolver(inputFormatting, data, rows, columns, edition);\n const fixedSize = useMemo(() => ({\n top: sections.top.height,\n bottom: sections.bottom.height,\n left: sections.left.width,\n right: sections.right.width\n }), [sections.top.height, sections.bottom.height, sections.left.width, sections.right.width]);\n const totalSize = useMemo(() => ({\n width: columns.length ? columns.at(-1).rightWithBorder : 0,\n height: rows.length ? rows.at(-1).bottomWithBorder : 0\n }), [columns, rows]);\n\n const setSelectedCells = useChangeCallback(props.selectedCells, props.onSelectedCellsChange, compareSelectedCells);\n const setHighlightedCells = useChangeCallback(props.highlightedCells, props.onHighlightedCellsChange, compareSelectedCells);\n const setEditedCells = useChangeCallback(props.editedCells, props.onEditedCellsChange, compareEditedCells);\n const setHoveredCell = useChangeCallback(props.hoveredCell, props.onHoveredCellChange, compareCells);\n const setFocusedCell = useChangeCallback(props.focusedCell, props.onFocusedCellChange, compareCells);\n const setFilters = useChangeCallback(props.filters, props.onFiltersChange, compareFilters);\n const addSelectedCells = useCallback(cells => setSelectedCells(oldSelectedCells => { // TODO: Should the selected cells include info about the section?\n const selection = new Selection(cells);\n return [...cells, ...oldSelectedCells.filter(cell => !selection.isIdSelected(cell.rowId, cell.columnId))];\n }), [setSelectedCells]);\n const addEditedCells = useCallback(cells => setEditedCells(oldEditedCells => {\n const edition = new Edition(cells);\n return [...cells, ...oldEditedCells.filter(cell => !edition.hasValueById(cell.rowId, cell.columnId))];\n }), [setEditedCells]);\n const addFilters = useCallback(filters => setFilters(oldFilters => {\n const filtering = new Filtering(filters);\n return [...filters, ...oldFilters.filter(filter => !filtering.hasValueById(filter.rowId, filter.columnId))];\n }), [setFilters]);\n const removeEditedCells = useCallback(cells => setEditedCells(oldEditedCells => {\n const selection = new Selection(cells);\n return oldEditedCells.filter(cell => !selection.isIdSelected(cell.rowId, cell.columnId));\n }), [setEditedCells]);\n const removeFilters = useCallback(cells => setFilters(oldFilters => {\n const selection = new Selection(cells);\n return oldFilters.filter(filter => !selection.isIdSelected(filter.rowId, filter.columnId));\n }), [setFilters]);\n\n useEffect(() => { console.log(props.selectedCells) }, [props.selectedCells]);\n\n const contexts = [\n [DataContext, useMemo(() => ({\n data\n }), [data])],\n [ColumnsAndRowsContext, useMemo(() => ({\n columns, rows, sections\n }), [columns, rows, sections])],\n [InteractionsContext, useMemo(() => ({\n selectedCells, selection, hoveredCell, focusedCell, inputFormatResolver, setSelectedCells, setHighlightedCells, setHoveredCell, setEditedCells, setFocusedCell, addSelectedCells, addEditedCells, addFilters, removeEditedCells, removeFilters\n }), [selectedCells, selection, hoveredCell, focusedCell, inputFormatResolver, setSelectedCells, setHighlightedCells, setHoveredCell, setEditedCells, setFocusedCell, addSelectedCells, addEditedCells, addFilters, removeEditedCells, removeFilters])],\n [RenderingContext, useMemo(() => ({\n renderFormatResolver\n }), [renderFormatResolver])],\n [SizeContext, useMemo(() => ({\n fixedSize, totalSize, borderWidth\n }), [fixedSize, totalSize, borderWidth])]\n ];\n\n return contexts.reduce((children, [Context, value]) => (\n <Context.Provider value={value}>\n {children}\n </Context.Provider>\n ), props.children);\n}\n\n// TODO: see if calling the useContext hook multiple times is a performance issue\nexport const useData = () => React.useContext(DataContext).data;\nexport const useColumns = () => React.useContext(ColumnsAndRowsContext).columns;\nexport const useRows = () => React.useContext(ColumnsAndRowsContext).rows;\nexport const useSections = () => React.useContext(ColumnsAndRowsContext).sections;\nexport const useSelectedCells = () => React.useContext(InteractionsContext).selectedCells;\nexport const useSelection = () => React.useContext(InteractionsContext).selection;\nexport const useHoveredCell = () => React.useContext(InteractionsContext).hoveredCell;\nexport const useFocusedCell = () => React.useContext(InteractionsContext).focusedCell;\nexport const useRenderFormatResolver = () => React.useContext(RenderingContext).renderFormatResolver;\nexport const useInputFormatResolver = () => React.useContext(InteractionsContext).inputFormatResolver;\nexport const useSetSelectedCells = () => React.useContext(InteractionsContext).setSelectedCells;\nexport const useSetHighlightedCells = () => React.useContext(InteractionsContext).setHighlightedCells;\nexport const useSetEditedCells = () => React.useContext(InteractionsContext).setEditedCells;\nexport const useSetHoveredCell = () => React.useContext(InteractionsContext).setHoveredCell;\nexport const useSetFocusedCell = () => React.useContext(InteractionsContext).setFocusedCell;\nexport const useAddSelectedCells = () => React.useContext(InteractionsContext).addSelectedCells;\nexport const useAddEditedCells = () => React.useContext(InteractionsContext).addEditedCells;\nexport const useAddFilters = () => React.useContext(InteractionsContext).addFilters;\nexport const useRemoveEditedCells = () => React.useContext(InteractionsContext).removeEditedCells;\nexport const useRemoveFilters = () => React.useContext(InteractionsContext).removeFilters;\nexport const useFixedSize = () => React.useContext(SizeContext).fixedSize;\nexport const useTotalSize = () => React.useContext(SizeContext).totalSize;\nexport const useBorderWidth = () => React.useContext(SizeContext).borderWidth;","export default function getDataFormattingRules(formatting, dataSelector) {\n return [\n {\n column: { match: 'ANY' },\n row: { match: 'HEADER' },\n value: ({column}) => column.header\n },\n {\n column: { match: 'ANY' },\n row: { match: 'FILTER' },\n value: ({newValue}) => newValue || '',\n text: ({newValue}) => newValue || 'Search...',\n edit: {\n validate: () => true,\n parse: ({ string }) => string,\n },\n },\n {\n column: { match: 'DATA' },\n row: { match: 'DATA' },\n value: dataSelector\n },\n ...formatting\n ];\n}","export default function getSections(columns, rows) {\n const topLength = rows.filter(row => row.pinned === 'BEGIN').length; // TODO: optimize\n const bottomLength = rows.filter(row => row.pinned === 'END').length;\n const middleLength = rows.length - topLength - bottomLength;\n const leftLength = columns.filter(column => column.pinned === 'BEGIN').length;\n const rightLength = columns.filter(column => column.pinned === 'END').length;\n const centerLength = columns.length - leftLength - rightLength;\n\n const topRows = rows.slice(0, topLength);\n const bottomRows = rows.slice(rows.length - bottomLength, rows.length);\n const middleRows = rows.slice(topLength, rows.length - bottomLength);\n const leftColumns = columns.slice(0, leftLength);\n const rightColumns = columns.slice(columns.length - rightLength, columns.length);\n const centerColumns = columns.slice(leftLength, columns.length - rightLength);\n\n const hasTopRows = topLength > 0;\n const hasBottomRows = bottomLength > 0;\n const hasMiddleRows = middleLength > 0;\n const hasLeftColumns = leftLength > 0;\n const hasRightColumns = rightLength > 0;\n const hasCenterColumns = centerLength > 0;\n\n const topShowTopBorder = true;\n const topShowBottomBorder = true;\n const bottomShowTopBorder = hasMiddleRows || !hasTopRows;\n const bottomShowBottomBorder = true;\n const middleShowTopBorder = !hasTopRows;\n const middleShowBottomBorder = !hasBottomRows;\n const leftShowLeftBorder = true;\n const leftShowRightBorder = true;\n const rightShowLeftBorder = hasCenterColumns || !hasLeftColumns;\n const rightShowRightBorder = true;\n const centerShowLeftBorder = !hasLeftColumns;\n const centerShowRightBorder = !hasRightColumns;\n\n const getHeight = (rows, showTopBorder, showBottomBorder) => {\n if (rows.length === 0)\n return 0;\n\n const top = showTopBorder ? rows.at(0).topWithBorder : rows.at(0).top;\n const bottom = showBottomBorder ? rows.at(-1).bottomWithBorder : rows.at(-1).bottom;\n\n return bottom - top;\n }\n\n const getWidth = (columns, showLeftBorder, showRightBorder) => {\n if (columns.length === 0)\n return 0;\n\n const left = showLeftBorder ? columns.at(0).leftWithBorder : columns.at(0).left;\n const right = showRightBorder ? columns.at(-1).rightWithBorder : columns.at(-1).right;\n\n return right - left;\n }\n\n const topHeight = getHeight(topRows, topShowTopBorder, topShowBottomBorder);\n const bottomHeight = getHeight(bottomRows, bottomShowTopBorder, bottomShowBottomBorder);\n const middleHeight = getHeight(middleRows, middleShowTopBorder, middleShowBottomBorder);\n const leftWidth = getWidth(leftColumns, leftShowLeftBorder, leftShowRightBorder);\n const rightWidth = getWidth(rightColumns, rightShowLeftBorder, rightShowRightBorder);\n const centerWidth = getWidth(centerColumns, centerShowLeftBorder, centerShowRightBorder);\n\n return {\n top: {\n rows: topRows,\n showTopBorder: topShowTopBorder,\n showBottomBorder: topShowBottomBorder,\n height: topHeight\n },\n bottom: {\n rows: bottomRows,\n showTopBorder: bottomShowTopBorder,\n showBottomBorder: bottomShowBottomBorder,\n height: bottomHeight\n },\n middle: {\n rows: middleRows,\n showTopBorder: middleShowTopBorder,\n showBottomBorder: middleShowBottomBorder,\n height: middleHeight\n },\n left: {\n columns: leftColumns,\n showLeftBorder: leftShowLeftBorder,\n showRightBorder: leftShowRightBorder,\n width: leftWidth\n },\n right: {\n columns: rightColumns,\n showLeftBorder: rightShowLeftBorder,\n showRightBorder: rightShowRightBorder,\n width: rightWidth\n },\n center: {\n columns: centerColumns,\n showLeftBorder: centerShowLeftBorder,\n showRightBorder: centerShowRightBorder,\n width: centerWidth\n }\n };\n}","export default class TextResolver\n{\n constructor() {\n this.canvas = document.createElement('canvas');\n this.context = this.canvas.getContext('2d');\n this.fontMetrics = new Map();\n }\n\n getFontMetrics(font) {\n const key = font;\n\n if (this.fontMetrics.has(key))\n return this.fontMetrics.get(key);\n\n const ctx = this.context;\n\n // TODO: Set other font properties\n ctx.font = font;\n\n const textMetrics = ctx.measureText('X');\n\n const middle = (textMetrics.actualBoundingBoxDescent - textMetrics.actualBoundingBoxAscent) / 2;\n const topOffset = middle + textMetrics.fontBoundingBoxAscent;\n const bottomOffset = textMetrics.fontBoundingBoxDescent - middle;\n\n const fontMetrics = {\n topOffset: topOffset,\n middle: -middle,\n bottomOffset: bottomOffset\n };\n\n this.fontMetrics.set(key, fontMetrics);\n\n return fontMetrics;\n }\n}","import { useMemo, useState } from \"react\";\n\nexport default function useDeepState(initialState, comparator) {\n const [state, setState] = useState(initialState);\n\n const setDeepState = useMemo(() => {\n if (!comparator)\n return setState;\n\n return (newState) => {\n setState(oldState => {\n if (comparator(oldState, newState))\n return oldState;\n\n return newState;\n });\n };\n }, [comparator]);\n\n return [state, setDeepState];\n}","/* eslint-disable react-hooks/exhaustive-deps */\n\nimport { useEffect } from \"react\";\n\n// TODO: add unit tests\nexport default function useEventListener(element, eventName, handler, deps) {\n useEffect(() => {\n if (!element)\n return () => { };\n\n element.addEventListener(eventName, handler);\n\n return () => element.removeEventListener(eventName, handler);\n }, [element, eventName, ...deps]);\n}","import React, { createContext, useContext, useMemo } from \"react\";\nimport useDeepState from \"../hooks/useDeepState\";\nimport useEventListener from \"../hooks/useEventListener\";\nimport useDomObserver from \"../hooks/useDomObserver\";\n\nconst SizeAndScrollContext = createContext();\n\nfunction compareScrollOffsets(oldScrollOffset, newScrollOffset) {\n return oldScrollOffset.left === newScrollOffset.left && oldScrollOffset.top === newScrollOffset.top;\n}\n\nfunction compareSizes(oldSize, newSize) {\n return oldSize.width === newSize.width && oldSize.height === newSize.height;\n}\n\nexport function SizeAndScrollProvider({ element, children }) {\n const [scrollOffset, setScrollOffset] = useDeepState({ left: 0, top: 0 }, compareScrollOffsets);\n const [size, setSize] = useDeepState({ width: 0, height: 0 }, compareSizes);\n const [clientSize, setClientSize] = useDeepState({ width: 0, height: 0 }, compareSizes);\n\n useEventListener(element, 'scroll', () => {\n setScrollOffset({\n left: element.scrollLeft,\n top: element.scrollTop\n });\n }, [setScrollOffset]);\n\n useDomObserver(element, ResizeObserver, () => {\n setSize({\n width: element.getBoundingClientRect().width,\n height: element.getBoundingClientRect().height\n });\n setClientSize({\n width: element.clientWidth,\n height: element.clientHeight\n });\n }, [setSize]);\n\n const value = useMemo(() => ({\n scrollOffset,\n size,\n clientSize\n }), [scrollOffset, size, clientSize]);\n\n return (\n <SizeAndScrollContext.Provider value={value}>\n {children}\n </SizeAndScrollContext.Provider>\n );\n}\n\nexport const useScrollOffset = () => useContext(SizeAndScrollContext).scrollOffset;\nexport const useSize = () => useContext(SizeAndScrollContext).size;\nexport const useClientSize = () => useContext(SizeAndScrollContext).clientSize;","/* eslint-disable react-hooks/exhaustive-deps */\n\nimport { useEffect } from \"react\";\n\n// TODO: add unit tests is possible\nexport default function useDomObserver(element, ObserverClass, handler, deps) {\n useEffect(() => {\n console.count('useDomObserver');\n\n if (!element)\n return () => { };\n\n const observer = new ObserverClass(handler);\n observer.observe(element);\n\n return () => observer.disconnect();\n }, [element, ObserverClass, ...deps]);\n}","export function contains(bounds, rect) {\n return (\n rect.top >= bounds.top &&\n rect.left >= bounds.left &&\n rect.top + rect.height <= bounds.top + bounds.height &&\n rect.left + rect.width <= bounds.left + bounds.width\n );\n}\n\nexport function clip(bounds, rect) {\n const newRect = {\n top: Math.max(bounds.top, rect.top),\n left: Math.max(bounds.left, rect.left),\n width: Math.min(bounds.left + bounds.width, rect.left + rect.width) - Math.max(bounds.left, rect.left),\n height: Math.min(bounds.top + bounds.height, rect.top + rect.height) - Math.max(bounds.top, rect.top)\n };\n\n if (newRect.width >= 0 && newRect.height >= 0)\n return newRect;\n\n return {\n top: bounds.top,\n left: bounds.left,\n width: 0,\n height: 0\n }\n}\n\nexport function expand(rect, margin) {\n return {\n top: rect.top - margin,\n left: rect.left - margin,\n width: rect.width + margin * 2,\n height: rect.height + margin * 2\n };\n}\n\nexport function area(rect) {\n return rect.width * rect.height;\n}\n\nexport function subtract(rect, margin) {\n return {\n top: rect.top,\n left: rect.left,\n width: Math.max(0, rect.width - margin.left - margin.right),\n height: Math.max(0, rect.height - margin.top - margin.bottom)\n };\n}","import { createContext, useContext } from \"react\";\nimport { useFixedSize, useTotalSize } from \"./StateContext\";\nimport { useScrollOffset, useSize } from \"./SizeAndScrollContext\";\nimport useRefMemo from \"../hooks/useRefMemo\";\nimport { area, clip, contains, expand, subtract } from \"../utils/rect\";\n\nconst ScrollRectContext = createContext();\n\nconst requiredMargin = 200;\nconst preloadedMargin = 400;\nconst emptyRect = {\n left: 0,\n top: 0,\n width: 0,\n height: 0\n};\n\nexport function ScrollRectProvider({ children }) {\n const totalSize = useTotalSize();\n const fixedSize = useFixedSize();\n const size = useSize();\n const scrollOffset = useScrollOffset();\n\n const scrollRect = useRefMemo(previous => {\n const prevScrollRect = previous || emptyRect;\n\n const totalRect = { left: 0, top: 0, ...totalSize };\n const bounds = subtract(totalRect, fixedSize);\n const scrollRect = subtract({ ...scrollOffset, ...size }, fixedSize);\n const requiredScrollRect = clip(bounds, expand(scrollRect, requiredMargin));\n const preloadedScrollRect = clip(bounds, expand(scrollRect, preloadedMargin));\n\n if (!contains(bounds, prevScrollRect))\n return preloadedScrollRect;\n\n if (!contains(prevScrollRect, requiredScrollRect))\n return preloadedScrollRect;\n\n if (area(prevScrollRect) > 2 * area(preloadedScrollRect))\n return preloadedScrollRect;\n\n return prevScrollRect;\n }, [fixedSize, size, scrollOffset]);\n\n return (\n <ScrollRectContext.Provider value={scrollRect}>\n {children}\n </ScrollRectContext.Provider>\n )\n}\n\nexport const useScrollRect = () => useContext(ScrollRectContext);","import { useMemo, useRef } from \"react\";\n\nexport default function useRefMemo(factory, deps)\n{\n const ref = useRef(undefined);\n\n return useMemo(() => {\n ref.current = factory(ref.current);\n return ref.current;\n }, deps);\n}","import { createContext, useContext, useMemo } from \"react\";\nimport { useSections } from \"./StateContext\";\nimport { useScrollRect } from \"./ScrollRectContext\";\n\nconst GridSectionContext = createContext();\n\nexport function GridSectionProvider({ children, horizontal, vertical }) {\n const scrollRect = useScrollRect();\n const sections = useSections();\n\n const { rows, height, showTopBorder, showBottomBorder } = sections[vertical];\n const { columns, width, showLeftBorder, showRightBorder } = sections[horizontal];\n\n const top = vertical === 'middle'\n ? scrollRect.top\n : 0;\n const left = horizontal === 'center'\n ? scrollRect.left\n : 0;\n\n const actualHeight = vertical === 'middle'\n ? scrollRect.height\n : height;\n const actualWidth = horizontal === 'center'\n ? scrollRect.width\n : width;\n\n const sectionRect = useMemo(() => ({\n left: left,\n top: top,\n width: actualWidth,\n height: actualHeight\n }), [left, top, actualWidth, actualHeight]);\n\n const sectionBorders = useMemo(() => ({\n top: showTopBorder,\n bottom: showBottomBorder,\n left: showLeftBorder,\n right: showRightBorder\n }), [showTopBorder, showBottomBorder, showLeftBorder, showRightBorder]);\n\n const value = useMemo(() => ({\n columns: columns,\n rows: rows,\n rect: sectionRect,\n borders: sectionBorders\n }), [columns, rows, sectionRect, sectionBorders]);\n\n if (columns.length === 0 || rows.length === 0)\n return null;\n\n return (\n <GridSectionContext.Provider value={value}>\n {children}\n </GridSectionContext.Provider>\n );\n}\n\nexport const useSectionColumns = () => useContext(GridSectionContext).columns;\nexport const useSectionRows = () => useContext(GridSectionContext).rows;\nexport const useSectionRect = () => useContext(GridSectionContext).rect;\nexport const useSectionBorders = () => useContext(GridSectionContext).borders;\n","import React, { useEffect, useMemo, useState } from \"react\"\nimport TextResolver from \"../utils/TextResolver\";\nimport { roundToPixels } from \"../hooks/useDevicePixelRatio\";\nimport { useBorderWidth, useRenderFormatResolver } from \"../contexts/StateContext\";\nimport { useSectionBorders, useSectionColumns, useSectionRect, useSectionRows } from \"../contexts/GridSectionContext\";\n\n// TODO: Upgrade to react 18 for better performance\n/** TODO: update the arguments to reflect the real props\n * @param {{\n * cells: {\n * value: string\n * }[][]\n * rowHeight: number\n * columnWidths: number[]\n * showLeftBorder: bool // TODO: check if it's bool or boolean\n * showTopBorder: bool\n * }} props\n */\nexport default function GridCanvas({\n style,\n devicePixelRatio\n}) {\n const [canvas, setCanvas] = useState(null);\n const textResolver = useMemo(() => new TextResolver(), []);\n // TODO: Make sure those formatters are split based on the rule areas\n const formatResolver = useRenderFormatResolver();\n const columns = useSectionColumns();\n const rows = useSectionRows();\n const borderWidth = useBorderWidth();\n const sectionRect = useSectionRect();\n const sectionBorders = useSectionBorders();\n\n // TODO: Read and apply: https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Optimizing_canvas?retiredLocale=pl\n // TODO: Redraw only the cells that have actually changed\n useEffect(() => {\n const draw = () => {\n if (!canvas)\n return;\n\n // Checking how often this is called\n console.log('draw');\n\n // TODO: Borders are still blurry after scrolling at high zoom-out levels\n\n const ctx = canvas.getContext(\"2d\");\n // TODO: Make that \"1\" configurable as cell spacing\n const borderOffset = borderWidth / 2;\n const rowCount = rows.length;\n const columnCount = columns.length;\n const horizontalBorderCount = rowCount - 1 + (sectionBorders.top ? 1 : 0) + (sectionBorders.bottom ? 1 : 0);\n const verticalBorderCount = columnCount - 1 + (sectionBorders.left ? 1 : 0) + (sectionBorders.right ? 1 : 0);\n const rowHeights = rows.map(row => row.height);\n const columnWidths = columns.map(column => column.width);\n const totalWidth = columnWidths.reduce((a, b) => a + b, 0) + verticalBorderCount * borderWidth;\n const totalHeight = rowHeights.reduce((a, b) => a + b, 0) + horizontalBorderCount * borderWidth;\n const left = sectionRect.left;\n const top = sectionRect.top;\n const width = sectionRect.width;\n const height = sectionRect.height;\n\n // TODO: Move somewhere else\n const horizontalOffsets = columnWidths.reduce((acc, width, index) => {\n const prevOffset = acc[index];\n const offset = prevOffset + width + borderWidth;\n acc.push(offset);\n return acc;\n }, [sectionBorders.left ? borderWidth : 0]);\n const verticalOffsets = rowHeights.reduce((acc, height, index) => {\n const prevOffset = acc[index];\n const offset = prevOffset + height + borderWidth;\n acc.push(offset);\n return acc;\n }, [sectionBorders.top ? borderWidth : 0]);\n\n const columnOffsets = horizontalOffsets.slice(0, -1);\n const rowOffsets = verticalOffsets.slice(0, -1);\n\n const minVisibleColumnIndex = Math.max(columnOffsets.findLastIndex(offset => offset <= left), 0);\n const maxVisibleColumnIndex = columnOffsets.findLastIndex(offset => offset <= left + width);\n const minVisibleRowIndex = Math.max(rowOffsets.findLastIndex(offset => offset <= top), 0);\n const maxVisibleRowIndex = rowOffsets.findLastIndex(offset => offset <= top + height);\n\n const minVisibleVerticalBorderIndex = Math.max(minVisibleColumnIndex, sectionBorders.left ? 0 : 1);\n const maxVisibleVerticalBorderIndex = maxVisibleColumnIndex + (sectionBorders.right ? 1 : 0);\n const minVisibleHorizontalBorderIndex = Math.max(minVisibleRowIndex, sectionBorders.top ? 0 : 1);\n const maxVisibleHorizontalBorderIndex = maxVisibleRowIndex + (sectionBorders.bottom ? 1 : 0);\n\n const cells = Array.from({ length: maxVisibleRowIndex - minVisibleRowIndex + 1 }, (_, rowIndex) => {\n const row = rows[rowIndex + minVisibleRowIndex];\n return Array.from({ length: maxVisibleColumnIndex - minVisibleColumnIndex + 1 }, (_, columnIndex) => {\n const column = columns[columnIndex + minVisibleColumnIndex];\n return formatResolver.resolve(row, column);\n });\n });\n const getCell = (rowIndex, columnIndex) => cells[rowIndex - minVisibleRowIndex][columnIndex - minVisibleColumnIndex];\n\n canvas.width = Math.round(width * devicePixelRatio);\n canvas.height = Math.round(height * devicePixelRatio);\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n canvas.style.marginLeft = `${left}px`;\n canvas.style.marginTop = `${top}px`;\n canvas.style.marginRight = `${totalWidth - width - left}px`;\n canvas.style.marginBottom = `${totalHeight - height - top}px`;;\n\n ctx.fillStyle = \"#E9E9E9\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n const setTransform = (x, y) => {\n ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, (x - left) * devicePixelRatio, (y - top) * devicePixelRatio);\n };\n const setClip = (x, y, width, height) => {\n ctx.beginPath();\n ctx.rect(x, y, width, height);\n ctx.clip();\n };\n\n // Draw cells\n for (let columnIndex = minVisibleColumnIndex; columnIndex <= maxVisibleColumnIndex; columnIndex++) {\n ctx.save();\n setTransform(horizontalOffsets[columnIndex], 0);\n setClip(0, 0, columnWidths[columnIndex], totalHeight);\n\n for (let rowIndex = minVisibleRowIndex; rowIndex <= maxVisibleRowIndex; rowIndex++) {\n const cell = getCell(rowIndex, columnIndex);\n const style = cell.style;\n const cellTop = verticalOffsets[rowIndex];\n const cellLeft = horizontalOffsets[columnIndex];\n const cellWidth = columnWidths[columnIndex];\n const cellHeight = rowHeights[rowIndex];\n const text = 'text' in cell ? cell.text : cell.value;\n const textAlign = style.textAlign || 'left';\n const textBaseline = style.textBaseline || 'middle';\n const paddingLeft = 'paddingLeft' in style ? style.paddingLeft : 5;\n const paddingRight = 'paddingRight' in style ? style.paddingRight : 5;\n const paddingTop = 'paddingTop' in style ? style.paddingTop : 2;\n const paddingBottom = 'paddingBottom' in style ? style.paddingBottom : 2;\n\n setTransform(cellLeft, cellTop);\n\n ctx.fillStyle = style.background || 'white';\n ctx.fillRect(0, 0, cellWidth, cellHeight);\n\n if ('draw' in cell) \n cell.draw(ctx);\n\n if (style.highlight) {\n ctx.fillStyle = style.highlight;\n ctx.fillRect(0, 0, cellWidth, cellHeight);\n }\n\n if (style.corner) {\n ctx.fillStyle = style.corner;\n ctx.beginPath();\n ctx.moveTo(cellWidth - 7, cellHeight);\n ctx.lineTo(cellWidth, cellHeight);\n ctx.lineTo(cellWidth, cellHeight - 7);\n ctx.fill();\n }\n\n ctx.fillStyle = style.foreground || 'black';\n ctx.font = style.font || '12px Calibri';\n ctx.textAlign = textAlign;\n\n const fontMetrics = textResolver.getFontMetrics(ctx.font);\n\n // TODO: Make sure that values are rounded using devicePixelRatio\n const textX = roundToPixels(\n textAlign === 'left' ? paddingLeft :\n textAlign === 'center' ? cellWidth / 2 :\n textAlign === 'right' ? cellWidth - paddingRight :\n 0,\n devicePixelRatio\n );\n\n const textY = roundToPixels(\n textBaseline === 'top' ? fontMetrics.middle + fontMetrics.topOffset + paddingTop :\n textBaseline === 'middle' ? cellHeight / 2 + fontMetrics.middle :\n textBaseline === 'bottom' ? cellHeight + fontMetrics.middle - fontMetrics.bottomOffset - paddingBottom :\n 0,\n devicePixelRatio\n );\n\n const fitsVertically = textY - fontMetrics.middle - fontMetrics.topOffset >= 0 && textY - fontMetrics.middle + fontMetrics.bottomOffset <= cellHeight;\n\n if (fitsVertically) {\n ctx.fillText(text, textX, textY);\n }\n else {\n // TODO: Clip if the text is too high (and draw some indicator if you do)\n ctx.strokeStyle = '#E9E9E9';\n ctx.lineWidth = borderWidth;\n\n ctx.beginPath();\n ctx.moveTo(0, borderWidth + borderOffset);\n ctx.lineTo(cellWidth, borderWidth + borderOffset);\n ctx.moveTo(0, cellHeight - borderWidth - borderOffset);\n ctx.lineTo(cellWidth, cellHeight - borderWidth - borderOffset);\n ctx.stroke();\n\n ctx.save();\n setClip(0, 2 * borderWidth, cellWidth, cellHeight - 4 * borderWidth);\n\n ctx.fillText(text, textX, textY);\n\n ctx.restore();\n }\n }\n\n ctx.restore();\n }\n\n setTransform(0, 0);\n\n // Draw borders\n\n // TODO: clip drawing area to the middle of neighboring columns/rows (might be useful for redrawing only the changed cells)\n // TODO: move somewhere (?)\n const drawBorder = (x1, y1, x2, y2, style) => {\n if (!style)\n return;\n\n const width = style.width * borderWidth;\n\n const isHorizontal = y1 === y2;\n\n // TODO: Don't add offset if the border is not continued\n const xa = x1 - (isHorizontal ? width / 2 : 0);\n const ya = y1 - (!isHorizontal ? width / 2 : 0);\n const xb = x2 + (isHorizontal ? width / 2 : 0);\n const yb = y2 + (!isHorizontal ? width / 2 : 0);\n\n ctx.strokeStyle = style.color || 'black'; // TODO: resolve this color earlier\n ctx.lineWidth = width;\n\n if (style.dash) {\n ctx.setLineDash(style.dash.map(value => value / devicePixelRatio));\n ctx.lineDashOffset = (isHorizontal ? xa : ya);\n }\n else {\n ctx.setLineDash([]);\n }\n\n ctx.beginPath();\n ctx.moveTo(xa, ya);\n ctx.lineTo(xb, yb);\n ctx.stroke();\n }\n\n const selectBorder = (borderStyleA, borderStyleB) => {\n if (!borderStyleA)\n return borderStyleB;\n\n if (!borderStyleB)\n return borderStyleA;\n\n if (borderStyleA.index > borderStyleB.index)\n return borderStyleA;\n\n return borderStyleB;\n }\n\n // TODO: Move somewhere else (?)\n for (let horizontalBorderIndex = minVisibleHorizontalBorderIndex; horizontalBorderIndex <= maxVisibleHorizontalBorderIndex; horizontalBorderIndex++) {\n const topRowIndex = horizontalBorderIndex - 1;\n const bottomRowIndex = horizontalBorderIndex;\n\n for (let columnIndex = minVisibleColumnIndex; columnIndex <= maxVisibleColumnIndex; columnIndex++) {\n const topBorderStyle = topRowIndex >= minVisibleRowIndex ? getCell(topRowIndex, columnIndex).style.borderBottom : null;\n const bottomBorderStyle = bottomRowIndex <= maxVisibleRowIndex ? getCell(bottomRowIndex, columnIndex).style.borderTop : null;\n\n const borderStyle = selectBorder(topBorderStyle, bottomBorderStyle);\n\n drawBorder(\n horizontalOffsets[columnIndex] - borderOffset,\n verticalOffsets[bottomRowIndex] - borderOffset,\n horizontalOffsets[columnIndex + 1] - borderOffset,\n verticalOffsets[bottomRowIndex] - borderOffset,\n borderStyle);\n }\n }\n\n for (let verticalBorderIndex = minVisibleVerticalBorderIndex; verticalBorderIndex <= maxVisibleVerticalBorderIndex; verticalBorderIndex++) {\n const leftColumnIndex = verticalBorderIndex - 1;\n const rightColumnIndex = verticalBorderIndex;\n\n for (let rowIndex = minVisibleRowIndex; rowIndex <= maxVisibleRowIndex; rowIndex++) {\n const leftBorderStyle = leftColumnIndex >= minVisibleColumnIndex ? getCell(rowIndex, leftColumnIndex).style.borderRight : null;\n const rightBorderStyle = rightColumnIndex <= maxVisibleColumnIndex ? getCell(rowIndex, rightColumnIndex).style.borderLeft : null;\n\n const borderStyle = selectBorder(leftBorderStyle, rightBorderStyle);\n\n drawBorder(\n horizontalOffsets[rightColumnIndex] - borderOffset,\n verticalOffsets[rowIndex] - borderOffset,\n horizontalOffsets[rightColumnIndex] - borderOffset,\n verticalOffsets[rowIndex + 1] - borderOffset,\n borderStyle);\n }\n }\n };\n\n const nextFrame = requestAnimationFrame(draw);\n\n // Can this ever be starved out?\n return () => cancelAnimationFrame(nextFrame);\n }, [canvas, devicePixelRatio, rows, columns, sectionRect, borderWidth, formatResolver, textResolver, sectionBorders]);\n\n // TODO: style={{imageRendering: 'pixelated'}} - is this even needed, though?\n // TODO: memoize style\n return (\n <canvas ref={setCanvas} style={style} />\n );\n}","import React, { createContext, useCallback, useContext, useMemo, useRef } from \"react\";\nimport useDeepState from \"../hooks/useDeepState\";\nimport useEventListener from \"../hooks/useEventListener\";\n\nconst MouseAndKeyboardContext = createContext();\n\nfunction compareMousePositions(oldMousePosition, newMousePosition) {\n return oldMousePosition?.x === newMousePosition?.x && oldMousePosition?.y === newMousePosition?.y;\n}\n\nexport function MouseAndKeyboardProvider({ element, children }) {\n const interactions = useRef({});\n const [mousePosition, setMousePosition] = useDeepState(null, compareMousePositions);\n const [isMouseDown, setIsMouseDown] = useDeepState(false);\n\n useEventListener(element, 'mouseenter', (event) => {\n setMousePosition({\n x: event.clientX - element.offsetLeft,\n y: event.clientY - element.offsetTop\n });\n }, [setMousePosition]);\n\n useEventListener(element, 'mousemove', (event) => {\n setMousePosition({\n x: event.clientX - element.offsetLeft,\n y: event.clientY - element.offsetTop\n });\n }, [setMousePosition]);\n\n useEventListener(element, 'mouseleave', () => {\n setMousePosition(null);\n }, [setMousePosition]);\n\n useEventListener(element, 'mousedown', (event) => {\n setIsMouseDown(true);\n\n if (interactions.current.mousedown)\n interactions.current.mousedown(event);\n }, []);\n\n useEventListener(element, 'mouseup', (event) => {\n setIsMouseDown(false);\n\n if (interactions.current.mouseup)\n interactions.current.mouseup(event);\n }, []);\n\n useEventListener(element, 'keydown', (event) => {\n if (interactions.current.keydown)\n interactions.current.keydown(event);\n }, []);\n\n useEventListener(element, 'click', (event) => {\n if (interactions.current.click)\n interactions.current.click(event);\n }, []);\n\n useEventListener(element, 'dblclick', (event) => {\n if (interactions.current.dblclick)\n interactions.current.dblclick(event);\n }, []);\n\n useEventListener(element, 'focus', (event) => {\n if (interactions.current.focus)\n interactions.current.focus(event);\n }, []);\n\n const focus = useCallback(() => {\n element?.focus();\n }, [element]);\n\n const value = useMemo(() => ({\n mousePosition,\n isMouseDown,\n focus,\n interactions\n }), [mousePosition, isMouseDown, focus]);\n\n return (\n <MouseAndKeyboardContext.Provider value={value}>\n {children}\n </MouseAndKeyboardContext.Provider>\n );\n}\n\nexport function useInteraction(name, handler) {\n useContext(MouseAndKeyboardContext).interactions.current[name] = handler;\n}\n\nexport const useMousePosition = () => useContext(MouseAndKeyboardContext).mousePosition;\nexport const useIsMouseDown = () => useContext(MouseAndKeyboardContext).isMouseDown;\nexport const useFocus = () => useContext(MouseAndKeyboardContext).focus;","import { forwardRef, useCallback, useEffect, useRef, useState } from \"react\";\nimport useEventListener from \"../hooks/useEventListener\";\n\nconst GridInput = forwardRef(({ text, onTextChange, placement, isValid }, ref) => {\n const [element, setElement] = useState(null);\n const internalText = useRef('');\n\n useEventListener(element, 'mousedown', event => {\n event.stopPropagation();\n }, []);\n\n useEventListener(element, 'keydown', event => {\n switch (event.key) {\n case 'Enter':\n case 'Escape':\n break;\n case 'Delete':\n case 'Backspace':\n if (internalText.current !== '')\n event.stopPropagation();\n break;\n default:\n event.stopPropagation();\n break;\n }\n }, []);\n\n useEventListener(element, 'click', event => {\n event.stopPropagation();\n }, []);\n\n useEventListener(element, 'dblclick', event => {\n event.stopPropagation();\n }, []);\n\n const setElementAndRef = useCallback(element => {\n setElement(element);\n ref?.(element);\n }, [ref]);\n\n const onChange = useCallback(event => {\n internalText.current = event.target.value;\n onTextChange(event.target.value);\n }, [onTextChange]);\n\n useEffect(() => {\n if (text === internalText.current)\n return;\n\n internalText.current = text;\n element?.select();\n }, [text, element]);\n\n if (!placement)\n return <></>;\n\n // TODO: It's currently not possible to clear the text as the input hides before the text is cleared.\n return <input\n ref={setElementAndRef}\n autoFocus\n style={{\n position: 'absolute',\n zIndex: 3, ...placement,\n opacity: (text ? 1 : 0),\n pointerEvents: text ? 'auto' : 'none',\n outline: 'none',\n border: 'none',\n boxShadow: 'none',\n padding: '0 5px',\n fontSize: '12px',\n fontFamily: 'Calibri',\n backgroundColor: isValid ? 'white' : '#eb3434'\n }}\n placeholder='placeholder'\n value={text}\n onChange={onChange}\n opacity={text === '' ? 1 : 0}\n />\n});\n\nexport default GridInput;","import React, { useEffect, useMemo } from 'react';\nimport stringifyId from '../utils/stringifyId';\nimport { useFocus, useInteraction, useIsMouseDown, useMousePosition } from '../contexts/MouseAndKeyboardContext';\nimport { useAddEditedCells, useAddFilters, useAddSelectedCells, useBorderWidth, useColumns, useFixedSize, useFocusedCell, useHoveredCell, useInputFormatResolver, useRemoveEditedCells, useRemoveFilters, useRows, useSelectedCells, useSetEditedCells, useSetFilters, useSetFocusedCell, useSetHighlightedCells, useSetHoveredCell, useSetSelectedCells, useTotalSize } from '../contexts/StateContext';\nimport { useClientSize, useScrollOffset } from '../contexts/SizeAndScrollContext';\nimport { useState } from 'react';\nimport GridInput from './GridInput';\n\nfunction useColumnPlacement(columns, borderWidth) {\n return useMemo(() => {\n const placement = [];\n\n columns.reduce((offset, column) => {\n placement.push({\n left: offset,\n right: offset + column.width + borderWidth,\n id: column.id\n });\n\n return offset + column.width + borderWidth;\n }, 0);\n\n return placement;\n }, [columns, borderWidth]);\n}\n\nfunction useRowPlacement(rows, borderWidth) {\n return useMemo(() => {\n const placement = [];\n\n rows.reduce((offset, row) => {\n placement.push({\n top: offset,\n bottom: offset + row.height + borderWidth,\n id: row.id\n });\n\n return offset + row.height + borderWidth;\n }, 0);\n\n return placement;\n }, [rows, borderWidth]);\n}\n\nfunction findColumnIndex(placement, x) {\n if (placement.length === 0)\n return -1;\n if (x < placement[0].left)\n return -1;\n if (x > placement[placement.length - 1].right)\n return -1;\n\n let iterA = 0;\n let iterC = placement.length - 1;\n\n while (iterA <= iterC) {\n const iterB = Math.floor((iterA + iterC) / 2);\n\n if (x < placement[iterB].left)\n iterC = iterB - 1;\n else if (x > placement[iterB].right)\n iterA = iterB + 1;\n else\n return iterB;\n }\n\n return -1;\n}\n\nfunction findRowIndex(placement, y) {\n if (placement.length === 0)\n return -1;\n if (y < placement[0].top)\n return -1;\n if (y > placement[placement.length - 1].bottom)\n return -1;\n\n let iterA = 0;\n let iterC = placement.length - 1;\n\n while (iterA <= iterC) {\n const iterB = Math.floor((iterA + iterC) / 2);\n\n if (y < placement[iterB].top)\n iterC = iterB - 1;\n else if (y > placement[iterB].bottom)\n iterA = iterB + 1;\n else\n return iterB;\n }\n\n return -1;\n}\n\nfunction findHighlightedCells(focusedCell, hoveredCell, columns, rows, columnLookup, rowLookup) {\n if (!hoveredCell)\n return [];\n if (!focusedCell)\n return [];\n\n const focusedColumnKey = stringifyId(focusedCell.columnId);\n const focusedRowKey = stringifyId(focusedCell.rowId);\n const hoveredColumnKey = stringifyId(hoveredCell.columnId);\n const hoveredRowKey = stringifyId(hoveredCell.rowId);\n\n if (!columnLookup.has(focusedColumnKey))\n return [];\n if (!rowLookup.has(focusedRowKey))\n return [];\n if (!columnLookup.has(hoveredColumnKey))\n return [];\n if (!rowLookup.has(hoveredRowKey))\n return [];\n\n const minColumnIndex = Math.min(columnLookup.get(focusedColumnKey).index, columnLookup.get(hoveredColumnKey).index);\n const maxColumnIndex = Math.max(columnLookup.get(focusedColumnKey).index, columnLookup.get(hoveredColumnKey).index);\n const minRowIndex = Math.min(rowLookup.get(focusedRowKey).index, rowLookup.get(hoveredRowKey).index);\n const maxRowIndex = Math.max(rowLookup.get(focusedRowKey).index, rowLookup.get(hoveredRowKey).index);\n\n return columns.slice(minColumnIndex, maxColumnIndex + 1).flatMap(column => {\n return rows.slice(minRowIndex, maxRowIndex + 1).map(row => {\n return {\n rowId: row.id,\n columnId: column.id\n };\n });\n });\n}\n\nfunction getCellType(column, row) {\n if (column.type === 'FILTER' ^ row.type === 'FILTER')\n return 'FILTER';\n if (column.type === 'DATA' && row.type === 'DATA')\n return 'DATA';\n return 'OTHER';\n}\n\nfunction getEditableCells(selectedCells, formatResolver, columnLookup, rowLookup) {\n return selectedCells.map(cell => {\n const columnKey = stringifyId(cell.columnId);\n const rowKey = stringifyId(cell.rowId);\n\n if (!columnLookup.has(columnKey))\n return null;\n if (!rowLookup.has(rowKey))\n return null;\n\n const column = columnLookup.get(columnKey);\n const row = rowLookup.get(rowKey);\n\n return {\n edit: formatResolver.resolve(row, column).edit,\n cell: cell,\n type: getCellType(column, row)\n }\n }).filter(cell => cell?.edit);\n}\n\nexport default function GridInteractions() {\n // console.count('render GridInteractions');\n const [text, setText] = useState('');\n const [input, setInput] = useState(null);\n\n const size = useClientSize();\n const mousePosition = useMousePosition();\n const isMouseDown = useIsMouseDown();\n const focus = useFocus();\n const scrollOffset = useScrollOffset();\n const hoveredCell = useHoveredCell();\n const focusedCell = useFocusedCell();\n const borderWidth = useBorderWidth();\n\n const selectedCells = useSelectedCells();\n const setSelectedCells = useSetSelectedCells();\n const setHighlightedCells = useSetHighlightedCells();\n const setEditedCells = useSetEditedCells();\n const setHoveredCell = useSetHoveredCell();\n const setFocusedCell = useSetFocusedCell();\n const addSelectedCells = useAddSelectedCells();\n const addEditedCells = useAddEditedCells();\n const addFilters = useAddFilters();\n const removeEditedCells = useRemoveEditedCells();\n const removeFilters = useRemoveFilters();\n\n const columns = useColumns();\n const rows = useRows();\n\n const columnPlacement = useColumnPlacement(columns, borderWidth);\n const rowPlacement = useRowPlacement(rows, borderWidth);\n\n const fixedSize = useFixedSize();\n const totalSize = useTotalSize();\n\n const formatResolver = useInputFormatResolver();\n\n const columnLookup = useMemo(() => columns.reduce((map, column) => map.set(column.key, column), new Map()), [columns]);\n const rowLookup = useMemo(() => rows.reduce((map, row) => map.set(row.key, row), new Map()), [rows]);\n\n const isTextValid = useMemo(() => {\n const editableCells = getEditableCells(selectedCells, formatResolver, columnLookup, rowLookup);\n return editableCells.every(cell => cell.edit.validate({ string: text }));\n }, [selectedCells, formatResolver, columnLookup, rowLookup, text]);\n\n // TODO: Invoke this function also directly on the mousemove event. Though leave it as a effect as well, so that it is invoked when the scrollOffset changes.\n useEffect(() => {\n if (!mousePosition) {\n setHoveredCell(null);\n return;\n }\n\n const x = mousePosition.x <= fixedSize.left\n ? mousePosition.x\n : mousePosition.x >= size.width - fixedSize.right\n ? totalSize.width - size.width + mousePosition.x\n : mousePosition.x + scrollOffset.left;\n const y = mousePosition.y <= fixedSize.top\n ? mousePosition.y\n : mousePosition.y >= size.height - fixedSize.bottom\n ? totalSize.height - size.height + mousePosition.y\n : mousePosition.y + scrollOffset.top;\n\n const hoverRowIndex = findRowIndex(rowPlacement, y);\n const hoverColumnIndex = findColumnIndex(columnPlacement, x);\n\n if (hoverRowIndex === -1 || hoverColumnIndex === -1) {\n setHoveredCell(null);\n return;\n }\n\n setHoveredCell({\n rowId: rows[hoverRowIndex].id,\n columnId: columns[hoverColumnIndex].id\n });\n }, [columnPlacement, columns, mousePosition, rowPlacement, rows, scrollOffset, setHoveredCell, size, fixedSize, totalSize]);\n\n useEffect(() => {\n // TODO: Make sure it behaves correctly when the mouse is moved outside the grid while the mouse button is down\n if (!isMouseDown)\n return;\n\n setHighlightedCells(findHighlightedCells(focusedCell, hoveredCell, columns, rows, columnLookup, rowLookup));\n }, [isMouseDown, hoveredCell, focusedCell, columns, rows, columnLookup, rowLookup, setHighlightedCells]);\n\n useInteraction('mousedown', event => {\n if (!hoveredCell)\n return;\n\n setText('');\n setFocusedCell(hoveredCell);\n\n if (!event.ctrlKey)\n setSelectedCells([]);\n });\n\n useInteraction('mouseup', () => {\n if (!focusedCell)\n return;\n\n addSelectedCells(findHighlightedCells(focusedCell, hoveredCell, columns, rows, columnLookup, rowLookup));\n setHighlightedCells([]);\n });\n\n useInteraction('keydown', event => {\n console.log('onKeyDown', event.key);\n\n const arrowTo = (cell, event) => {\n setFocusedCell(cell);\n\n if (event.shiftKey)\n addSelectedCells([cell]);\n else\n setSelectedCells([cell]);\n };\n\n const arrowHorizontally = (offset, event) => {\n if (!focusedCell)\n return;\n\n const focusedColumnKey = stringifyId(focusedCell.columnId);\n if (!columnLookup.has(focusedColumnKey))\n return;\n\n const focusedColumnIndex = columnLookup.get(focusedColumnKey).index;\n const newColumnIndex = Math.max(0, Math.min(columns.length - 1, focusedColumnIndex + offset));\n if (newColumnIndex === focusedColumnIndex)\n return;\n\n const newFocusedCell = { rowId: focusedCell.rowId, columnId: columns[newColumnIndex].id };\n\n arrowTo(newFocusedCell, event);\n }\n\n const arrowVertically = (offset, event) => {\n if (!focusedCell)\n return;\n\n const focusedRowKey = stringifyId(focusedCell.rowId);\n if (!rowLookup.has(focusedRowKey))\n return;\n\n const focusedRowIndex = rowLookup.get(focusedRowKey).index;\n const newRowIndex = Math.max(0, Math.min(rows.length - 1, focusedRowIndex + offset));\n if (newRowIndex === focusedRowIndex)\n return;\n\n const newFocusedCell = { rowId: rows[newRowIndex].id, columnId: focusedCell.columnId };\n\n arrowTo(newFocusedCell, event);\n }\n\n const preventDefault = () => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n const cancel = () => {\n if (text !== '') {\n setText('');\n }\n else if (focusedCell) {\n setFocusedCell(null);\n setSelectedCells([]);\n }\n else {\n setEditedCells([]);\n }\n };\n\n const accept = () => {\n const editableCells = getEditableCells(selectedCells, formatResolver, columnLookup, rowLookup);\n\n if (text === '')\n return;\n if (!editableCells.every(cell => cell.edit.validate({ string: text })))\n return;\n\n const dataCells = editableCells.filter(cell => cell.type === 'DATA');\n const filterCells = editableCells.filter(cell => cell.type === 'FILTER');\n\n addEditedCells(dataCells.map(cell => ({ ...cell.cell, value: cell.edit.parse({ string: text }) })));\n addFilters(filterCells.map(cell => ({ ...cell.cell, expression: cell.edit.parse({ string: text }) })));\n\n setText('');\n };\n\n const clear = () => {\n removeEditedCells(selectedCells);\n removeFilters(selectedCells);\n }\n\n switch (event.key) {\n case 'Escape':\n cancel();\n break;\n case 'Enter':\n accept();\n break;\n case 'ArrowUp':\n // TODO: When ctrl and shift are pressed together, select all cells between the focused cell and the new cell\n // TODO: When shift is pressed, expand the current rect selection instead of moving the focused cell\n preventDefault();\n arrowVertically(event.ctrlKey ? -rows.length : -1, event);\n break;\n case 'ArrowDown':\n preventDefault();\n arrowVertically(event.ctrlKey ? rows.length : 1, event);\n break;\n case 'ArrowLeft':\n preventDefault();\n arrowHorizontally(event.ctrlKey ? -columns.length : -1, event);\n break;\n case 'ArrowRight':\n preventDefault();\n arrowHorizontally(event.ctrlKey ? columns.length : 1, event);\n break;\n case 'Delete':\n case 'Backspace':\n console.log('delete');\n clear();\n break;\n default:\n return;\n }\n });\n\n useInteraction('dblclick', () => {\n if (!focusedCell)\n return;\n\n const focusedColumnKey = stringifyId(focusedCell.columnId);\n const focusedRowKey = stringifyId(focusedCell.rowId);\n\n if (!columnLookup.has(focusedColumnKey))\n return;\n if (!rowLookup.has(focusedRowKey))\n return;\n\n const column = columnLookup.get(focusedColumnKey);\n const row = rowLookup.get(focusedRowKey);\n const cell = formatResolver.resolve(row, column);\n const text = `${cell.value}` // TODO: Use the text, not value (???)\n\n setText(text);\n });\n\n useInteraction('focus', () => {\n console.log('refocusing on input');\n input?.focus();\n });\n\n // TODO: Fix placement for fixed rows/columns\n const inputPlacement = useMemo(() => {\n if (!focusedCell)\n return null;\n\n const focusedColumnKey = stringifyId(focusedCell.columnId);\n const focusedRowKey = stringifyId(focusedCell.rowId);\n\n if (!columnLookup.has(focusedColumnKey))\n return null;\n if (!rowLookup.has(focusedRowKey))\n return null;\n\n const column = columnLookup.get(focusedColumnKey);\n const row = rowLookup.get(focusedRowKey);\n const editableCells = getEditableCells(selectedCells, formatResolver, columnLookup, rowLookup);\n\n if (editableCells.length === 0)\n return null;\n\n return {\n left: column.left,\n top: row.top,\n width: column.width,\n height: row.height,\n boxSizing: 'border-box',\n };\n }, [focusedCell, columnLookup, rowLookup, selectedCells, formatResolver]);\n\n const inputHasFocus = input && document.activeElement === input;\n\n useEffect(() => {\n if (inputHasFocus && !inputPlacement)\n focus();\n }, [inputPlacement, inputHasFocus, focus]);\n\n return (\n <>\n <GridInput ref={setInput} text={text} onTextChange={setText} placement={inputPlacement} isValid={isTextValid} />\n </>\n );\n}","/* eslint-disable import/prefer-default-export */\nimport React, { useState } from 'react';\nimport GridCanvas from './GridCanvas';\nimport GridInteractions from './GridInteractions';\nimport useDevicePixelRatio from '../hooks/useDevicePixelRatio';\nimport { MouseAndKeyboardProvider } from '../contexts/MouseAndKeyboardContext';\nimport { SizeAndScrollProvider } from '../contexts/SizeAndScrollContext';\nimport { ScrollRectProvider } from '../contexts/ScrollRectContext';\nimport { GridSectionProvider } from '../contexts/GridSectionContext';\n\n// TODO: Write description\nexport default function Grid() {\n // TODO: Use intersection observer to only render the grid if it is in view\n // TODO: Selected columns (selected rows): [{columnId: 'col1', headerId: 'default'}]\n // TODO: Selected cells: [{rowId: 'row1', columnId: 'col1'}]\n // TODO: Sorting: [{columnId: 'col1', headerId: 'default' , direction: 'ASC'}]\n // TODO: Use headers (as well as fixed area boundaries) as separators and sort data only in between them\n // TODO: Allow rows/columns to have parentId (or groupId?) to group them together and filter/sort them as a group\n // TODO: wrap props into a function so that you can do setProps(prevProps => ...)\n\n console.count('render Grid');\n\n const [container, setContainer] = useState(null);\n\n // TODO: Borders still seem to be blurry for large number of rows/columns\n // TODO: Canvases should get this from the state context\n const devicePixelRatio = useDevicePixelRatio();\n\n // TODO: Display left/right/top/bottom borders for all fixed rows and display them for middle cells if no fixed rows/columns are present\n // TODO: Memoize styles\n // TODO: Remove hardcoded width/height\n // TODO: Wrap the grid in another grid and set that grid's max width/height to the 100 vw/vh\n return (\n <div\n className='spread-grid'\n ref={setContainer}\n tabIndex={0}\n style={{ maxWidth: 'fit-content', maxHeight: 'fit-content', overflow: 'auto', display: 'grid', position: 'relative', gridTemplateColumns: 'auto auto auto', gridTemplateRows: 'auto auto auto', outline: 'none' }}\n >\n <SizeAndScrollProvider element={container}>\n <ScrollRectProvider>\n <GridSectionProvider horizontal='left' vertical='top'>\n <GridCanvas\n style={{ position: 'sticky', left: 0, top: 0, zIndex: 2, gridRow: '1', gridColumn: '1' }}\n devicePixelRatio={devicePixelRatio}\n />\n </GridSectionProvider>\n\n <GridSectionProvider horizontal='center' vertical='top'>\n <GridCanvas\n style={{ position: 'sticky', top: 0, zIndex: 1, gridRow: '1', gridColumn: '2' }}\n devicePixelRatio={devicePixelRatio}\n />\n </GridSectionProvider>\n\n <GridSectionProvider horizontal='right' vertical='top'>\n <GridCanvas\n style={{ position: 'sticky', right: 0, top: 0, zIndex: 2, gridRow: '1', gridColumn: '3' }}\n devicePixelRatio={devicePixelRatio}\n />\n </GridSectionProvider>\n\n <GridSectionProvider horizontal='left' vertical='middle'>\n <GridCanvas\n style={{ position: 'sticky', left: 0, zIndex: 1, gridRow: '2', gridColumn: '1' }}\n devicePixelRatio={devicePixelRatio}\n />\n </GridSectionProvider>\n\n <GridSectionProvider horizontal='center' vertical='middle'>\n <GridCanvas\n style={{ gridRow: '2', gridColumn: '2' }}\n devicePixelRatio={devicePixelRatio}\n />\n </GridSectionProvider>\n\n <GridSectionProvider horizontal='right' vertical='middle'>\n <GridCanvas\n style={{ position: 'sticky', right: 0, zIndex: 1, gridRow: '2', gridColumn: '3' }}\n devicePixelRatio={devicePixelRatio}\n />\n </GridSectionProvider>\n\n <GridSectionProvider horizontal='left' vertical='bottom'>\n <GridCanvas\n style={{ position: 'sticky', left: 0, bottom: 0, zIndex: 2, gridRow: '3', gridColumn: '1' }}\n devicePixelRatio={devicePixelRatio}\n />\n </GridSectionProvider>\n\n <GridSectionProvider horizontal='center' vertical='bottom'>\n <GridCanvas\n style={{ position: 'sticky', bottom: 0, zIndex: 1, gridRow: '3', gridColumn: '2' }}\n devicePixelRatio={devicePixelRatio}\n />\n </GridSectionProvider>\n\n <GridSectionProvider horizontal='right' vertical='bottom'>\n <GridCanvas\n style={{ position: 'sticky', right: 0, bottom: 0, zIndex: 2, gridRow: '3', gridColumn: '3' }}\n devicePixelRatio={devicePixelRatio}\n />\n </GridSectionProvider>\n </ScrollRectProvider>\n\n <MouseAndKeyboardProvider element={container}>\n <GridInteractions />\n </MouseAndKeyboardProvider>\n </SizeAndScrollProvider>\n </div>\n );\n};\n","import React, { useState } from \"react\";\nimport { StateProvider } from \"../contexts/StateContext\";\nimport Grid from \"../fragments/Grid\";\n\nconst defaultData = [];\nconst defaultColumns = data => data.length > 0 ? Object.keys(data[0]).map(key => ({ id: key, width: 100 })) : [];\nconst defaultRows = data => [{ id: 'top-header', type: 'HEADER', height: 20 }, ...data.map((_, index) => ({ id: index, height: 20 }))];\nconst defaultFormatting = [];\nconst defaultDataSelector = ({data, row, column}) => data[row.id][column.id];\nconst defaultPinnedTop = 0;\nconst defaultPinnedBottom = 0;\nconst defaultPinnedLeft = 0;\nconst defaultPinnedRight = 0;\nconst defaultBorderWidth = 1;\n\nexport default function SpreadGrid(props) {\n const [localSelectedCells, setLocalSelectedCells] = useState([]);\n const [localHighlightedCells, setLocalHighlightedCells] = useState([]);\n const [localEditedCells, setLocalEditedCells] = useState([]);\n const [localFilters, setLocalFilters] = useState([]);\n const [localHoveredCell, setLocalHoveredCell] = useState(null);\n const [localFocusedCell, setLocalFocusedCell] = useState(null);\n\n const data = 'data' in props ? props.data : defaultData;\n const columns = 'columns' in props ? props.columns : defaultColumns;\n const rows = 'rows' in props ? props.rows : defaultRows;\n const formatting = 'formatting' in props ? props.formatting : defaultFormatting;\n const dataSelector = 'dataSelector' in props ? props.dataSelector : defaultDataSelector;\n const pinnedTop = 'pinnedTop' in props ? props.pinnedTop : defaultPinnedTop; // TODO: Throw error if pinnedTop + pinnedBottom > rows.length (and same for columns)\n const pinnedBottom = 'pinnedBottom' in props ? props.pinnedBottom : defaultPinnedBottom;\n const pinnedLeft = 'pinnedLeft' in props ? props.pinnedLeft : defaultPinnedLeft;\n const pinnedRight = 'pinnedRight' in props ? props.pinnedRight : defaultPinnedRight;\n const selectedCells = 'selectedCells' in props ? props.selectedCells : localSelectedCells;\n const highlightedCells = 'highlightedCells' in props ? props.highlightedCells : localHighlightedCells;\n const editedCells = 'editedCells' in props ? props.editedCells : localEditedCells;\n const filters = 'filters' in props ? props.filters : localFilters;\n const hoveredCell = 'hoveredCell' in props ? props.hoveredCell : localHoveredCell;\n const focusedCell = 'focusedCell' in props ? props.focusedCell : localFocusedCell;\n const borderWidth = 'borderWidth' in props ? props.borderWidth : defaultBorderWidth;\n\n const onSelectedCellsChange = selectedCells => {\n setLocalSelectedCells(selectedCells);\n props.onSelectedCellsChange?.(selectedCells);\n };\n const onHighlightedCellsChange = highlightedCells => {\n setLocalHighlightedCells(highlightedCells);\n props.onHighlightedCellsChange?.(highlightedCells);\n }\n const onEditedCellsChange = editedCells => {\n setLocalEditedCells(editedCells);\n props.onEditedCellsChange?.(editedCells);\n }\n const onFiltersChange = filters => {\n setLocalFilters(filters);\n props.onFiltersChange?.(filters);\n }\n const onHoveredCellChange = hoveredCell => {\n setLocalHoveredCell(hoveredCell);\n props.onHoveredCellChange?.(hoveredCell);\n }\n const onFocusedCellChange = focusedCell => {\n setLocalFocusedCell(focusedCell);\n props.onFocusedCellChange?.(focusedCell);\n }\n\n return (\n <StateProvider\n data={data}\n columns={columns}\n rows={rows}\n pinnedTop={pinnedTop}\n pinnedBottom={pinnedBottom}\n pinnedLeft={pinnedLeft}\n pinnedRight={pinnedRight}\n formatting={formatting}\n dataSelector={dataSelector}\n selectedCells={selectedCells}\n highlightedCells={highlightedCells}\n editedCells={editedCells}\n filters={filters}\n hoveredCell={hoveredCell}\n focusedCell={focusedCell}\n borderWidth={borderWidth}\n onSelectedCellsChange={onSelectedCellsChange}\n onHighlightedCellsChange={onHighlightedCellsChange}\n onEditedCellsChange={onEditedCellsChange}\n onFiltersChange={onFiltersChange}\n onHoveredCellChange={onHoveredCellChange}\n onFocusedCellChange={onFocusedCellChange}\n >\n <Grid />\n </StateProvider>\n );\n}","module.exports = window[\"PropTypes\"];","module.exports = window[\"React\"];","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var getCurrentScript = function() {\n var script = document.currentScript;\n if (!script) {\n /* Shim for IE11 and below */\n /* Do not take into account async scripts and inline scripts */\n\n var doc_scripts = document.getElementsByTagName('script');\n var scripts = [];\n\n for (var i = 0; i < doc_scripts.length; i++) {\n scripts.push(doc_scripts[i]);\n }\n\n scripts = scripts.filter(function(s) { return !s.async && !s.text && !s.textContent; });\n script = scripts.slice(-1)[0];\n }\n\n return script;\n};\n\nvar isLocalScript = function(script) {\n return /\\/_dash-component-suites\\//.test(script.src);\n};\n\nObject.defineProperty(__webpack_require__, 'p', {\n get: (function () {\n var script = getCurrentScript();\n\n var url = script.src.split('/').slice(0, -1).join('/') + '/';\n\n return function() {\n return url;\n };\n })()\n});\n\nif (typeof jsonpScriptSrc !== 'undefined') {\n var __jsonpScriptSrc__ = jsonpScriptSrc;\n jsonpScriptSrc = function(chunkId) {\n var script = getCurrentScript();\n var isLocal = isLocalScript(script);\n\n var src = __jsonpScriptSrc__(chunkId);\n\n if(!isLocal) {\n return src;\n }\n\n var srcFragments = src.split('/');\n var fileFragments = srcFragments.slice(-1)[0].split('.');\n\n fileFragments.splice(1, 0, \"v0_0_1m1705586879\");\n srcFragments.splice(-1, 1, fileFragments.join('.'))\n\n return srcFragments.join('/');\n };\n}\n"],"names":["isString","value","String","useResolvedFormatting","formatting","useMemo","map","rule","mappedRule","column","row","condition","eval","concat","style","text","DashSpreadGrid","props","console","count","data","columns","rows","pinnedTop","pinnedBottom","pinnedLeft","pinnedRight","React","SpreadGrid","propTypes","id","PropTypes","defaultProps","useInvoked","expression","args","apply","_toConsumableArray","stringifyId","key","Array","isArray","stringified","join","_typeof","object","Object","keys","sort","stringifyObject","JSON","stringify","getHighlightColor","baseColor","isStrong","Selection","selectedCells","_this","_classCallCheck","this","lookup","Map","forEach","cell","rowKey","rowId","columnKey","columnId","has","set","Set","get","add","isKeySelected","useChangeCallback","currentValue","callback","comparator","ref","useRef","current","useCallback","newValue","roundToPixels","devicePixelRatio","Math","round","useDevicePixelRatio","_useState2","useState","window","setDevicePixelRatio","useEffect","media","matchMedia","updateDevicePixelRatio","log","addEventListener","once","removeEventListener","Edition","editedCells","hasValueByKey","getValueByKey","borderTypes","StyleGroup","_createClass","_defineProperty","matchMapping","undefined","FormattingRules","rules","columnLookup","rulesCount","_step","_iterator","_createForOfIteratorHelper","s","n","done","addRule","err","e","f","filter","index","match","entry","addRowRule","push","_objectSpread","addColumnRule","byKey","byIndex","_step2","_iterator2","byMatch","edit","draw","by","type","_step3","_iterator3","edition","filtering","gatherRules","newRules","_step4","_iterator4","gatherRowRules","a","b","context","visible","_loop","_rules","_i3","newStyle","_i","_borderTypes","length","border","_i2","_borderTypes2","borderType","indexBorders","currentContext","ctx","hasValueByKeyAndSelector","filterContext","getValueByKeyAndSelector","result","Filtering","filters","filteredColumns","filteredRows","size","selector","FormatResolver","formattingRules","resolve","VisibilityResolver","hasRowFilters","every","hasRowFiltersByKey","_this2","hasColumnFilters","hasColumnFiltersByKey","compareCells","oldCell","newCell","compareSelectedCells","oldCells","newCells","selection","isIdSelected","compareEditedCells","getValueById","compareFilters","oldFilters","newFilters","getPinned","pinnedBegin","pinnedEnd","useResolvedColumnsOrRows","elements","element","pinned","useFormatResolver","dataFormatting","DataContext","createContext","ColumnsAndRowsContext","InteractionsContext","RenderingContext","SizeContext","StateProvider","borderWidth","_ref","header","_ref2","_ref3","validate","parse","_ref4","string","dataSelector","editedCellsAndFilters","unfilteredColumns","unfilteredRows","visibilityResolver","useVisibilityResolver","findVisibleColumns","findVisibleRows","left","width","newColumn","leftWithBorder","right","rightWithBorder","usePlacedColumns","top","height","newRow","topWithBorder","bottom","bottomWithBorder","usePlacedRows","sections","topLength","bottomLength","middleLength","leftLength","rightLength","centerLength","topRows","slice","bottomRows","middleRows","leftColumns","rightColumns","centerColumns","hasTopRows","hasLeftColumns","bottomShowTopBorder","middleShowTopBorder","middleShowBottomBorder","rightShowLeftBorder","centerShowLeftBorder","centerShowRightBorder","getHeight","showTopBorder","showBottomBorder","at","getWidth","showLeftBorder","showRightBorder","middle","center","getSections","highlight","highlightedCells","hoveredCell","focusedCell","renderFormatting","hoveredColumnKey","hoveredRowKey","focusedColumnKey","focusedRowKey","isSelected","rowIndex","columnIndex","background","foreground","color","_ref5","borderTop","Number","MAX_SAFE_INTEGER","borderBottom","borderLeft","borderRight","_ref6","_ref7","_ref8","_ref9","corner","_ref10","getRenderFormattingRules","renderFormatResolver","inputFormatResolver","fixedSize","totalSize","setSelectedCells","onSelectedCellsChange","setHighlightedCells","onHighlightedCellsChange","setEditedCells","onEditedCellsChange","setHoveredCell","onHoveredCellChange","setFocusedCell","onFocusedCellChange","setFilters","onFiltersChange","addSelectedCells","cells","oldSelectedCells","addEditedCells","oldEditedCells","hasValueById","addFilters","removeEditedCells","removeFilters","reduce","children","Context","Provider","useColumns","useRows","useSections","useSelectedCells","useHoveredCell","useFocusedCell","useRenderFormatResolver","useInputFormatResolver","useSetSelectedCells","useSetHighlightedCells","useSetEditedCells","useSetHoveredCell","useSetFocusedCell","useAddSelectedCells","useAddEditedCells","useAddFilters","useRemoveEditedCells","useRemoveFilters","useFixedSize","useTotalSize","useBorderWidth","TextResolver","canvas","document","createElement","getContext","fontMetrics","font","textMetrics","measureText","actualBoundingBoxDescent","actualBoundingBoxAscent","topOffset","fontBoundingBoxAscent","bottomOffset","fontBoundingBoxDescent","useDeepState","initialState","state","setState","newState","oldState","useEventListener","eventName","handler","deps","SizeAndScrollContext","compareScrollOffsets","oldScrollOffset","newScrollOffset","compareSizes","oldSize","newSize","SizeAndScrollProvider","_useDeepState2","_slicedToArray","scrollOffset","setScrollOffset","_useDeepState4","setSize","_useDeepState6","clientSize","setClientSize","scrollLeft","scrollTop","ObserverClass","observer","observe","disconnect","useDomObserver","ResizeObserver","getBoundingClientRect","clientWidth","clientHeight","useScrollOffset","useContext","useSize","useClientSize","contains","bounds","rect","clip","newRect","max","min","expand","margin","area","subtract","ScrollRectContext","requiredMargin","preloadedMargin","emptyRect","ScrollRectProvider","factory","scrollRect","previous","prevScrollRect","requiredScrollRect","preloadedScrollRect","useScrollRect","GridSectionContext","GridSectionProvider","horizontal","vertical","_sections$vertical","_sections$horizontal","actualHeight","actualWidth","sectionRect","sectionBorders","borders","useSectionColumns","useSectionRows","useSectionRect","useSectionBorders","GridCanvas","setCanvas","textResolver","formatResolver","nextFrame","requestAnimationFrame","borderOffset","rowCount","columnCount","horizontalBorderCount","verticalBorderCount","rowHeights","columnWidths","totalWidth","totalHeight","horizontalOffsets","acc","offset","verticalOffsets","columnOffsets","rowOffsets","minVisibleColumnIndex","findLastIndex","maxVisibleColumnIndex","minVisibleRowIndex","maxVisibleRowIndex","minVisibleVerticalBorderIndex","maxVisibleVerticalBorderIndex","minVisibleHorizontalBorderIndex","maxVisibleHorizontalBorderIndex","from","_","getCell","marginLeft","marginTop","marginRight","marginBottom","fillStyle","fillRect","setTransform","x","y","setClip","beginPath","save","cellTop","cellLeft","cellWidth","cellHeight","textAlign","textBaseline","paddingLeft","paddingRight","paddingTop","paddingBottom","moveTo","lineTo","fill","getFontMetrics","textX","textY","fillText","strokeStyle","lineWidth","stroke","restore","drawBorder","x1","y1","x2","y2","isHorizontal","xa","ya","xb","yb","dash","setLineDash","lineDashOffset","selectBorder","borderStyleA","borderStyleB","horizontalBorderIndex","topRowIndex","bottomRowIndex","borderStyle","verticalBorderIndex","leftColumnIndex","rightColumnIndex","cancelAnimationFrame","MouseAndKeyboardContext","compareMousePositions","oldMousePosition","newMousePosition","MouseAndKeyboardProvider","interactions","mousePosition","setMousePosition","isMouseDown","setIsMouseDown","event","clientX","offsetLeft","clientY","offsetTop","mousedown","mouseup","keydown","click","dblclick","focus","useInteraction","name","useMousePosition","useIsMouseDown","useFocus","forwardRef","onTextChange","placement","isValid","setElement","internalText","stopPropagation","setElementAndRef","onChange","target","select","autoFocus","position","zIndex","opacity","pointerEvents","outline","boxShadow","padding","fontSize","fontFamily","backgroundColor","placeholder","Fragment","findHighlightedCells","rowLookup","minColumnIndex","maxColumnIndex","minRowIndex","maxRowIndex","flatMap","getCellType","getEditableCells","GridInteractions","setText","_useState4","input","setInput","columnPlacement","useColumnPlacement","rowPlacement","useRowPlacement","isTextValid","hoverRowIndex","iterA","iterC","iterB","floor","findRowIndex","hoverColumnIndex","findColumnIndex","ctrlKey","arrowTo","shiftKey","arrowHorizontally","focusedColumnIndex","newColumnIndex","newFocusedCell","arrowVertically","focusedRowIndex","newRowIndex","preventDefault","editableCells","dataCells","filterCells","accept","inputPlacement","boxSizing","inputHasFocus","activeElement","GridInput","Grid","container","setContainer","className","tabIndex","maxWidth","maxHeight","overflow","display","gridTemplateColumns","gridTemplateRows","gridRow","gridColumn","defaultData","defaultColumns","defaultRows","defaultFormatting","defaultDataSelector","defaultPinnedTop","defaultPinnedBottom","defaultPinnedLeft","defaultPinnedRight","defaultBorderWidth","localSelectedCells","setLocalSelectedCells","localHighlightedCells","setLocalHighlightedCells","_useState6","localEditedCells","setLocalEditedCells","_useState8","localFilters","setLocalFilters","_useState10","localHoveredCell","setLocalHoveredCell","_useState12","localFocusedCell","setLocalFocusedCell","_props$onSelectedCell","call","_props$onHighlightedC","_props$onEditedCellsC","_props$onFiltersChang","_props$onHoveredCellC","_props$onFocusedCellC","module","exports","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","d","definition","o","defineProperty","enumerable","obj","prop","prototype","hasOwnProperty","r","Symbol","toStringTag","getCurrentScript","script","currentScript","doc_scripts","getElementsByTagName","scripts","i","async","textContent","isLocalScript","test","src","url","split","jsonpScriptSrc","__jsonpScriptSrc__","chunkId","isLocal","srcFragments","fileFragments","splice"],"sourceRoot":""}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{
|
|
2
|
+
"src/lib/components/DashSpreadGrid.jsx": {
|
|
3
|
+
"description": "",
|
|
4
|
+
"displayName": "DashSpreadGrid",
|
|
5
|
+
"methods": [],
|
|
6
|
+
"props": {
|
|
7
|
+
"id": {
|
|
8
|
+
"type": {
|
|
9
|
+
"name": "string"
|
|
10
|
+
},
|
|
11
|
+
"required": false,
|
|
12
|
+
"description": ""
|
|
13
|
+
},
|
|
14
|
+
"data": {
|
|
15
|
+
"type": {
|
|
16
|
+
"name": "array"
|
|
17
|
+
},
|
|
18
|
+
"required": false,
|
|
19
|
+
"description": "",
|
|
20
|
+
"defaultValue": {
|
|
21
|
+
"value": "[]",
|
|
22
|
+
"computed": false
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"columns": {
|
|
26
|
+
"type": {
|
|
27
|
+
"name": "array"
|
|
28
|
+
},
|
|
29
|
+
"required": false,
|
|
30
|
+
"description": "",
|
|
31
|
+
"defaultValue": {
|
|
32
|
+
"value": "[]",
|
|
33
|
+
"computed": false
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"rows": {
|
|
37
|
+
"type": {
|
|
38
|
+
"name": "array"
|
|
39
|
+
},
|
|
40
|
+
"required": false,
|
|
41
|
+
"description": "",
|
|
42
|
+
"defaultValue": {
|
|
43
|
+
"value": "[]",
|
|
44
|
+
"computed": false
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"formatting": {
|
|
48
|
+
"type": {
|
|
49
|
+
"name": "array"
|
|
50
|
+
},
|
|
51
|
+
"required": false,
|
|
52
|
+
"description": "",
|
|
53
|
+
"defaultValue": {
|
|
54
|
+
"value": "[]",
|
|
55
|
+
"computed": false
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"pinnedTop": {
|
|
59
|
+
"type": {
|
|
60
|
+
"name": "number"
|
|
61
|
+
},
|
|
62
|
+
"required": false,
|
|
63
|
+
"description": "",
|
|
64
|
+
"defaultValue": {
|
|
65
|
+
"value": "0",
|
|
66
|
+
"computed": false
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"pinnedBottom": {
|
|
70
|
+
"type": {
|
|
71
|
+
"name": "number"
|
|
72
|
+
},
|
|
73
|
+
"required": false,
|
|
74
|
+
"description": "",
|
|
75
|
+
"defaultValue": {
|
|
76
|
+
"value": "0",
|
|
77
|
+
"computed": false
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"pinnedLeft": {
|
|
81
|
+
"type": {
|
|
82
|
+
"name": "number"
|
|
83
|
+
},
|
|
84
|
+
"required": false,
|
|
85
|
+
"description": "",
|
|
86
|
+
"defaultValue": {
|
|
87
|
+
"value": "0",
|
|
88
|
+
"computed": false
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"pinnedRight": {
|
|
92
|
+
"type": {
|
|
93
|
+
"name": "number"
|
|
94
|
+
},
|
|
95
|
+
"required": false,
|
|
96
|
+
"description": "",
|
|
97
|
+
"defaultValue": {
|
|
98
|
+
"value": "0",
|
|
99
|
+
"computed": false
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dash_spread_grid",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Fast grid for Dash applications",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git://github.com/https://github.com/TomaszRewak/js-spread-grid/dash-spread-grid.git"
|
|
8
|
+
},
|
|
9
|
+
"bugs": {
|
|
10
|
+
"url": "https://github.com/https://github.com/TomaszRewak/js-spread-grid/dash-spread-grid/issues"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/https://github.com/TomaszRewak/js-spread-grid/dash-spread-grid",
|
|
13
|
+
"main": "build/index.js",
|
|
14
|
+
"scripts": {
|
|
15
|
+
"start": "webpack serve --config ./webpack.serve.config.js --open",
|
|
16
|
+
"validate-init": "python _validate_init.py",
|
|
17
|
+
"prepublishOnly": "npm run validate-init",
|
|
18
|
+
"copy-source": "rsync -a --delete ./../lib/src/ ./src/lib/lib",
|
|
19
|
+
"build:js": "webpack --mode production",
|
|
20
|
+
"build:backends": "dash-generate-components ./src/lib/components dash_spread_grid -p package-info.json --r-prefix '' --jl-prefix '' --ignore \\.test\\.",
|
|
21
|
+
"build:backends-activated": "(. venv/bin/activate || venv\\scripts\\activate && npm run build:backends)",
|
|
22
|
+
"build": "npm run copy-source && npm run build:js && npm run build:backends",
|
|
23
|
+
"build:activated": "npm run build:js && npm run build:backends-activated"
|
|
24
|
+
},
|
|
25
|
+
"author": "Tomasz Rewak <tomasz.rewak@gmail.com>",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"ramda": "^0.26.1"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@babel/core": "^7.22.1",
|
|
32
|
+
"@babel/plugin-proposal-object-rest-spread": "^7.20.7",
|
|
33
|
+
"@babel/preset-env": "^7.22.2",
|
|
34
|
+
"@babel/preset-react": "^7.22.3",
|
|
35
|
+
"@plotly/dash-component-plugins": "^1.2.3",
|
|
36
|
+
"@plotly/webpack-dash-dynamic-import": "^1.2.0",
|
|
37
|
+
"babel-eslint": "^10.1.0",
|
|
38
|
+
"babel-loader": "^9.1.2",
|
|
39
|
+
"copyfiles": "^2.1.1",
|
|
40
|
+
"css-loader": "^6.8.1",
|
|
41
|
+
"eslint": "^6.0.1",
|
|
42
|
+
"eslint-config-prettier": "^6.0.0",
|
|
43
|
+
"eslint-plugin-import": "^2.18.0",
|
|
44
|
+
"eslint-plugin-react": "^7.14.2",
|
|
45
|
+
"prop-types": "^15.8.1",
|
|
46
|
+
"react": "^16.8.6",
|
|
47
|
+
"react-docgen": "^5.4.3",
|
|
48
|
+
"react-dom": "^16.8.6",
|
|
49
|
+
"style-loader": "^3.3.3",
|
|
50
|
+
"styled-jsx": "^5.1.2",
|
|
51
|
+
"webpack": "^5.84.1",
|
|
52
|
+
"webpack-cli": "^5.1.1",
|
|
53
|
+
"webpack-dev-server": "^4.15.0"
|
|
54
|
+
},
|
|
55
|
+
"engines": {
|
|
56
|
+
"node": ">=8.11.0",
|
|
57
|
+
"npm": ">=6.1.0"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Metadata-Version: 1.1
|
|
2
|
+
Name: dash-spread-grid
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Fast grid for Dash applications
|
|
5
|
+
Home-page: UNKNOWN
|
|
6
|
+
Author: Tomasz Rewak <tomasz.rewak@gmail.com>
|
|
7
|
+
Author-email: UNKNOWN
|
|
8
|
+
License: MIT
|
|
9
|
+
Description: UNKNOWN
|
|
10
|
+
Platform: UNKNOWN
|
|
11
|
+
Classifier: Framework :: Dash
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
MANIFEST.in
|
|
3
|
+
README.md
|
|
4
|
+
package.json
|
|
5
|
+
setup.py
|
|
6
|
+
dash_spread_grid/DashSpreadGrid.py
|
|
7
|
+
dash_spread_grid/__init__.py
|
|
8
|
+
dash_spread_grid/_imports_.py
|
|
9
|
+
dash_spread_grid/dash_spread_grid.min.js
|
|
10
|
+
dash_spread_grid/dash_spread_grid.min.js.map
|
|
11
|
+
dash_spread_grid/metadata.json
|
|
12
|
+
dash_spread_grid/package-info.json
|
|
13
|
+
dash_spread_grid.egg-info/PKG-INFO
|
|
14
|
+
dash_spread_grid.egg-info/SOURCES.txt
|
|
15
|
+
dash_spread_grid.egg-info/dependency_links.txt
|
|
16
|
+
dash_spread_grid.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
dash_spread_grid
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dash_spread_grid",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Fast grid for Dash applications",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git://github.com/https://github.com/TomaszRewak/js-spread-grid/dash-spread-grid.git"
|
|
8
|
+
},
|
|
9
|
+
"bugs": {
|
|
10
|
+
"url": "https://github.com/https://github.com/TomaszRewak/js-spread-grid/dash-spread-grid/issues"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/https://github.com/TomaszRewak/js-spread-grid/dash-spread-grid",
|
|
13
|
+
"main": "build/index.js",
|
|
14
|
+
"scripts": {
|
|
15
|
+
"start": "webpack serve --config ./webpack.serve.config.js --open",
|
|
16
|
+
"validate-init": "python _validate_init.py",
|
|
17
|
+
"prepublishOnly": "npm run validate-init",
|
|
18
|
+
"copy-source": "rsync -a --delete ./../lib/src/ ./src/lib/lib",
|
|
19
|
+
"build:js": "webpack --mode production",
|
|
20
|
+
"build:backends": "dash-generate-components ./src/lib/components dash_spread_grid -p package-info.json --r-prefix '' --jl-prefix '' --ignore \\.test\\.",
|
|
21
|
+
"build:backends-activated": "(. venv/bin/activate || venv\\scripts\\activate && npm run build:backends)",
|
|
22
|
+
"build": "npm run copy-source && npm run build:js && npm run build:backends",
|
|
23
|
+
"build:activated": "npm run build:js && npm run build:backends-activated"
|
|
24
|
+
},
|
|
25
|
+
"author": "Tomasz Rewak <tomasz.rewak@gmail.com>",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"ramda": "^0.26.1"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@babel/core": "^7.22.1",
|
|
32
|
+
"@babel/plugin-proposal-object-rest-spread": "^7.20.7",
|
|
33
|
+
"@babel/preset-env": "^7.22.2",
|
|
34
|
+
"@babel/preset-react": "^7.22.3",
|
|
35
|
+
"@plotly/dash-component-plugins": "^1.2.3",
|
|
36
|
+
"@plotly/webpack-dash-dynamic-import": "^1.2.0",
|
|
37
|
+
"babel-eslint": "^10.1.0",
|
|
38
|
+
"babel-loader": "^9.1.2",
|
|
39
|
+
"copyfiles": "^2.1.1",
|
|
40
|
+
"css-loader": "^6.8.1",
|
|
41
|
+
"eslint": "^6.0.1",
|
|
42
|
+
"eslint-config-prettier": "^6.0.0",
|
|
43
|
+
"eslint-plugin-import": "^2.18.0",
|
|
44
|
+
"eslint-plugin-react": "^7.14.2",
|
|
45
|
+
"prop-types": "^15.8.1",
|
|
46
|
+
"react": "^16.8.6",
|
|
47
|
+
"react-docgen": "^5.4.3",
|
|
48
|
+
"react-dom": "^16.8.6",
|
|
49
|
+
"style-loader": "^3.3.3",
|
|
50
|
+
"styled-jsx": "^5.1.2",
|
|
51
|
+
"webpack": "^5.84.1",
|
|
52
|
+
"webpack-cli": "^5.1.1",
|
|
53
|
+
"webpack-dev-server": "^4.15.0"
|
|
54
|
+
},
|
|
55
|
+
"engines": {
|
|
56
|
+
"node": ">=8.11.0",
|
|
57
|
+
"npm": ">=6.1.0"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import os
|
|
3
|
+
from setuptools import setup
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
with open('package.json') as f:
|
|
7
|
+
package = json.load(f)
|
|
8
|
+
|
|
9
|
+
package_name = package["name"].replace(" ", "_").replace("-", "_")
|
|
10
|
+
|
|
11
|
+
setup(
|
|
12
|
+
name=package_name,
|
|
13
|
+
version=package["version"],
|
|
14
|
+
author=package['author'],
|
|
15
|
+
packages=[package_name],
|
|
16
|
+
include_package_data=True,
|
|
17
|
+
license=package['license'],
|
|
18
|
+
description=package.get('description', package_name),
|
|
19
|
+
install_requires=[],
|
|
20
|
+
classifiers = [
|
|
21
|
+
'Framework :: Dash',
|
|
22
|
+
],
|
|
23
|
+
)
|