This commit is contained in:
2025-09-07 22:09:54 +02:00
parent e1b817252c
commit 2fc0d000b6
7796 changed files with 2159515 additions and 933 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,287 @@
import collections
def get_named_tuple(name, dict):
return collections.namedtuple(name, dict.keys())(*dict.values())
Align = get_named_tuple(
"align",
{"default": "", "left": "<", "right": ">", "center": "^", "right_sign": "="},
)
Group = get_named_tuple("group", {"no": "", "yes": ","})
Padding = get_named_tuple("padding", {"no": "", "yes": "0"})
Prefix = get_named_tuple(
"prefix",
{
"yocto": 10**-24,
"zepto": 10**-21,
"atto": 10**-18,
"femto": 10**-15,
"pico": 10**-12,
"nano": 10**-9,
"micro": 10**-6,
"milli": 10**-3,
"none": None,
"kilo": 10**3,
"mega": 10**6,
"giga": 10**9,
"tera": 10**12,
"peta": 10**15,
"exa": 10**18,
"zetta": 10**21,
"yotta": 10**24,
},
)
Scheme = get_named_tuple(
"scheme",
{
"default": "",
"decimal": "r",
"decimal_integer": "d",
"decimal_or_exponent": "g",
"decimal_si_prefix": "s",
"exponent": "e",
"fixed": "f",
"percentage": "%",
"percentage_rounded": "p",
"binary": "b",
"octal": "o",
"lower_case_hex": "x",
"upper_case_hex": "X",
"unicode": "c",
},
)
Sign = get_named_tuple(
"sign",
{"default": "", "negative": "-", "positive": "+", "parantheses": "(", "space": " "},
)
Symbol = get_named_tuple(
"symbol", {"no": "", "yes": "$", "binary": "#b", "octal": "#o", "hex": "#x"}
)
Trim = get_named_tuple("trim", {"no": "", "yes": "~"})
class Format:
def __init__(self, **kwargs):
self._locale = {}
self._nully = ""
self._prefix = Prefix.none
self._specifier = {
"align": Align.default,
"fill": "",
"group": Group.no,
"width": "",
"padding": Padding.no,
"precision": "",
"sign": Sign.default,
"symbol": Symbol.no,
"trim": Trim.no,
"type": Scheme.default,
}
valid_methods = [
m for m in dir(self.__class__) if m[0] != "_" and m != "to_plotly_json"
]
for kw, val in kwargs.items():
if kw not in valid_methods:
raise TypeError(
"{0} is not a format method. Expected one of".format(kw),
str(list(valid_methods)),
)
getattr(self, kw)(val)
def _validate_char(self, value):
self._validate_string(value)
if len(value) != 1:
raise ValueError("expected value to a string of length one")
def _validate_non_negative_integer_or_none(self, value):
if value is None:
return
if not isinstance(value, int):
raise TypeError("expected value to be an integer")
if value < 0:
raise ValueError("expected value to be non-negative", str(value))
def _validate_named(self, value, named_values):
if value not in named_values:
raise TypeError("expected value to be one of", str(list(named_values)))
def _validate_string(self, value):
if not isinstance(value, (str, "".__class__)):
raise TypeError("expected value to be a string")
# Specifier
def align(self, value):
self._validate_named(value, Align)
self._specifier["align"] = value
return self
def fill(self, value):
self._validate_char(value)
self._specifier["fill"] = value
return self
def group(self, value):
if isinstance(value, bool):
value = Group.yes if value else Group.no
self._validate_named(value, Group)
self._specifier["group"] = value
return self
def padding(self, value):
if isinstance(value, bool):
value = Padding.yes if value else Padding.no
self._validate_named(value, Padding)
self._specifier["padding"] = value
return self
def padding_width(self, value):
self._validate_non_negative_integer_or_none(value)
self._specifier["width"] = value if value is not None else ""
return self
def precision(self, value):
self._validate_non_negative_integer_or_none(value)
self._specifier["precision"] = ".{0}".format(value) if value is not None else ""
return self
def scheme(self, value):
self._validate_named(value, Scheme)
self._specifier["type"] = value
return self
def sign(self, value):
self._validate_named(value, Sign)
self._specifier["sign"] = value
return self
def symbol(self, value):
self._validate_named(value, Symbol)
self._specifier["symbol"] = value
return self
def trim(self, value):
if isinstance(value, bool):
value = Trim.yes if value else Trim.no
self._validate_named(value, Trim)
self._specifier["trim"] = value
return self
# Locale
def symbol_prefix(self, value):
self._validate_string(value)
if "symbol" not in self._locale:
self._locale["symbol"] = [value, ""]
else:
self._locale["symbol"][0] = value
return self
def symbol_suffix(self, value):
self._validate_string(value)
if "symbol" not in self._locale:
self._locale["symbol"] = ["", value]
else:
self._locale["symbol"][1] = value
return self
def decimal_delimiter(self, value):
self._validate_char(value)
self._locale["decimal"] = value
return self
def group_delimiter(self, value):
self._validate_char(value)
self._locale["group"] = value
return self
def groups(self, groups):
groups = (
groups
if isinstance(groups, list)
else [groups]
if isinstance(groups, int)
else None
)
if not isinstance(groups, list):
raise TypeError("expected groups to be an integer or a list of integers")
if len(groups) == 0:
raise ValueError(
"expected groups to be an integer or a list of " "one or more integers"
)
for group in groups:
if not isinstance(group, int):
raise TypeError("expected entry to be an integer")
if group <= 0:
raise ValueError("expected entry to be a non-negative integer")
self._locale["grouping"] = groups
return self
# Nully
def nully(self, value):
self._nully = value
return self
# Prefix
def si_prefix(self, value):
self._validate_named(value, Prefix)
self._prefix = value
return self
def to_plotly_json(self):
f = {}
f["locale"] = self._locale.copy()
f["nully"] = self._nully
f["prefix"] = self._prefix
aligned = self._specifier["align"] != Align.default
f["specifier"] = "{}{}{}{}{}{}{}{}{}{}".format(
self._specifier["fill"] if aligned else "",
self._specifier["align"],
self._specifier["sign"],
self._specifier["symbol"],
self._specifier["padding"],
self._specifier["width"],
self._specifier["group"],
self._specifier["precision"],
self._specifier["trim"],
self._specifier["type"],
)
return f

View File

@ -0,0 +1,19 @@
from .Format import Format, Group, Scheme, Sign, Symbol
def money(decimals, sign=Sign.default):
return Format(
group=Group.yes,
precision=decimals,
scheme=Scheme.fixed,
sign=sign,
symbol=Symbol.yes,
)
def percentage(decimals, rounded=False):
if not isinstance(rounded, bool):
raise TypeError("expected rounded to be a boolean")
rounded = Scheme.percentage_rounded if rounded else Scheme.percentage
return Format(scheme=rounded, precision=decimals)

View File

@ -0,0 +1,97 @@
# type: ignore
import os as _os
import sys as _sys
import json
import dash as _dash
if not hasattr(_dash, "__plotly_dash") and not hasattr(_dash, "development"):
print(
"Dash was not successfully imported. "
"Make sure you don't have a file "
'named \n"dash.py" in your current directory.',
file=_sys.stderr,
)
_sys.exit(1)
from ._imports_ import * # noqa: E402, F401, F403
from ._imports_ import __all__ as _components
from . import Format # noqa: F401, E402
from . import FormatTemplate # noqa: F401, E402
__all__ = _components + ["Format", "FormatTemplate"]
_basepath = _os.path.dirname(__file__)
_filepath = _os.path.abspath(_os.path.join(_basepath, "package-info.json"))
with open(_filepath) as f:
package = json.load(f)
package_name = package["name"].replace(" ", "_").replace("-", "_")
__version__ = package["version"]
_current_path = _os.path.dirname(_os.path.abspath(__file__))
_this_module = _sys.modules[__name__]
async_resources = ["export", "table", "highlight"]
_js_dist = []
_js_dist.extend(
[
{
"relative_package_path": "dash_table/async-{}.js".format(async_resource),
"external_url": (
"https://unpkg.com/dash-table@{}" "/dash_table/async-{}.js"
).format(__version__, async_resource),
"namespace": "dash",
"async": True,
}
for async_resource in async_resources
]
)
_js_dist.extend(
[
{
"relative_package_path": "dash_table/async-{}.js.map".format(
async_resource
),
"external_url": (
"https://unpkg.com/dash-table@{}" "/dash_table/async-{}.js.map"
).format(__version__, async_resource),
"namespace": "dash",
"dynamic": True,
}
for async_resource in async_resources
]
)
_js_dist.extend(
[
{
"relative_package_path": "dash_table/bundle.js",
"external_url": (
"https://unpkg.com/dash-table@{}/dash_table/bundle.js"
).format(__version__),
"namespace": "dash",
},
{
"relative_package_path": "dash_table/bundle.js.map",
"external_url": (
"https://unpkg.com/dash-table@{}/dash_table/bundle.js.map"
).format(__version__),
"namespace": "dash",
"dynamic": True,
},
]
)
_css_dist = []
for _component in __all__:
setattr(locals()[_component], "_js_dist", _js_dist)
setattr(locals()[_component], "_css_dist", _css_dist)

View File

@ -0,0 +1,3 @@
from .DataTable import DataTable
__all__ = ["DataTable"]

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,3 @@
/*! cpexcel.js (C) 2013-present SheetJS -- http://sheetjs.com */
/*! cputils.js (C) 2013-present SheetJS -- http://sheetjs.com */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,18 @@
/*!
Copyright (c) 2018 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/classnames
*/
/*!
Copyright (c) 2018 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/react-select
*/
/*!
* Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,13 @@
<!doctype>
<html>
<head>
<title>dash-table</title>
</head>
<body>
<div id='root'></div>
<script src='https://unpkg.com/react@16.14.0/umd/react.development.js'></script>
<script src='https://unpkg.com/react-dom@16.14.0/umd/react-dom.development.js'></script>
<script src="./demo.js"></script>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,124 @@
{
"name": "dash-table",
"version": "6.0.4",
"description": "Dash table",
"repository": {
"type": "git",
"url": "git@github.com:plotly/dash.git"
},
"bugs": {
"url": "https://github.com/plotly/dash/issues"
},
"homepage": "https://github.com/plotly/dash",
"main": "dash_table/bundle.js",
"scripts": {
"preprivate::test.server": "run-s private::wait_dash*",
"private::build": "node --max_old_space_size=4096 node_modules/webpack/bin/webpack --bail",
"private::build:js": "run-s \"private::build -- --mode production\"",
"private::build:js-test": "run-s \"private::build -- --mode development --config webpack.test.config.js\"",
"private::build:js-test-watch": "run-s \"private::build -- --mode development --config webpack.test.config.js --watch\"",
"private::build:backends": "dash-generate-components src/dash-table/dash/DataTable.js dash_table -p package-info.json && cp dash_table_base/** dash_table/ && dash-generate-components src/dash-table/dash/DataTable.js dash_table -p package-info.json -k DataTable --r-prefix 'dash' --r-suggests 'dash' --jl-prefix 'dash' && black dash_table",
"private::format.ts": "npm run private::lint.ts -- --fix",
"private::format.prettier": "prettier --config .prettierrc --write \"{src,tests,demo}/**/*.{js,ts,tsx}\"",
"private::format.black": "black dash_table_base tests",
"private::lint.ts": "eslint ./src ./tests",
"private::lint.flake": "flake8 dash_table_base tests",
"private::lint.black": "black --check dash_table_base tests",
"private::lint.prettier": "prettier --config .prettierrc \"{src,tests,demo}/**/*.{js,ts,tsx}\" --list-different",
"private::test.python": "python -m unittest tests/unit/format_test.py",
"private::test.unit": "karma start karma.conf.js --single-run",
"build.watch": "webpack serve --disable-host-check --content-base dash_table --mode development --config webpack.dev.config.js",
"build": "run-s private::build:js private::build:backends",
"postbuild": "es-check es2015 dash_table/bundle.js dash_table/async-*.js",
"format": "run-s private::format.*",
"lint": "run-s private::lint.*",
"test.server": "pytest --nopercyfinalize tests/selenium",
"test.unit": "run-s private::test.python private::test.unit",
"test.visual": "npm install --package-lock-only=false --no-save @percy/storybook@^3.3.1 @storybook/builder-webpack5@^6.5.13 @storybook/cli@^6.5.13 @storybook/manager-webpack5@^6.5.16 @storybook/react@^6.5.13 @storybook/semver@^7.3.2 && build-storybook && percy-storybook --widths=1280",
"test.visual-local": "npm install --package-lock-only=false --no-save @percy/storybook@^3.3.1 @storybook/builder-webpack5@^6.5.13 @storybook/cli@^6.5.13 @storybook/manager-webpack5@^6.5.16 @storybook/react@^6.5.13 @storybook/semver@^7.3.2 && build-storybook"
},
"author": "Chris Parmer <chris@plotly.com>",
"maintainer": "Alex Johnson <alex@plotly.com>",
"license": "MIT",
"devDependencies": {
"@babel/cli": "^7.28.0",
"@babel/core": "^7.28.0",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-transform-regenerator": "^7.28.1",
"@babel/polyfill": "^7.12.1",
"@babel/preset-env": "^7.28.0",
"@babel/preset-react": "^7.27.1",
"@fortawesome/fontawesome-svg-core": "1.2.36",
"@fortawesome/free-regular-svg-icons": "^5.15.4",
"@fortawesome/free-solid-svg-icons": "^5.15.4",
"@fortawesome/react-fontawesome": "^0.2.2",
"@plotly/dash-component-plugins": "^1.2.3",
"@plotly/webpack-dash-dynamic-import": "^1.3.0",
"@types/chai": "^4.3.5",
"@types/d3-format": "^3.0.1",
"@types/mocha": "^10.0.1",
"@types/papaparse": "^5.3.7",
"@types/ramda": "0.30.2",
"@types/react": "^16.14.8",
"@types/react-dom": "^16.9.13",
"@types/react-select": "^4.0.16",
"@typescript-eslint/eslint-plugin": "^5.59.7",
"@typescript-eslint/parser": "^5.59.7",
"babel-loader": "^9.2.1",
"chai": "^4.3.7",
"css-loader": "^6.8.1",
"css.escape": "^1.5.1",
"d3-format": "^3.1.0",
"es-check": "^7.1.1",
"eslint": "^8.41.0",
"eslint-config-prettier": "^8.8.0",
"fast-isnumeric": "^1.1.4",
"file-loader": "^6.2.0",
"highlight.js": "^11.8.0",
"karma": "^6.4.2",
"karma-chrome-launcher": "^3.2.0",
"karma-mocha": "^2.0.1",
"karma-typescript": "^5.5.4",
"karma-webpack": "^5.0.0",
"less": "^4.1.3",
"less-loader": "^11.1.0",
"mocha": "^10.2.0",
"npm-run-all": "^4.1.5",
"papaparse": "^5.4.1",
"prettier": "^2.8.8",
"ramda": "^0.30.1",
"raw-loader": "^4.0.2",
"react": "^16.14.0",
"react-docgen": "^5.4.3",
"react-dom": "^16.14.0",
"react-select": "^1.3.0",
"regenerator-runtime": "^0.13.11",
"remarkable": "^2.0.1",
"sheetclip": "^0.3.0",
"style-loader": "^3.3.3",
"ts-loader": "^9.5.2",
"typescript": "^5.8.3",
"webpack": "^5.101.0",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "5.2.2",
"webpack-preprocessor": "^0.1.12",
"xlsx": "^0.17.5",
"rimraf": "^5.0.5"
},
"files": [
"/dash_table/async-*{.js,.map}",
"/dash_table/bundle*{.js,.map}"
],
"peerDependencies": {
"prop-types": "^15.7.2",
"react": ">=16",
"react-dom": ">=16"
},
"engines": {
"node": ">=12.0.0",
"npm": ">=6.1.0"
},
"browserslist": [
"last 9 years and not dead"
]
}