├── .Rbuildignore ├── .babelrc ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .npmignore ├── .prettierrc ├── .pylintrc ├── .vscode └── settings.json ├── CONTRIBUTING.md ├── DESCRIPTION ├── LICENSE ├── MANIFEST.in ├── NAMESPACE ├── Project.toml ├── R ├── dreQuill.R └── internal.R ├── README.md ├── _validate_init.py ├── dash_quill ├── Quill.py ├── __init__.py ├── _imports_.py ├── async-Quill.js ├── async-Quill.js.LICENSE.txt ├── async-Quill.js.map ├── dash_quill.min.js ├── dash_quill.min.js.map ├── metadata.json └── package-info.json ├── deps ├── async-Quill.js ├── async-Quill.js.LICENSE.txt ├── async-Quill.js.map ├── dash_quill.min.js └── dash_quill.min.js.map ├── index.html ├── inst └── deps │ ├── async-Quill.js │ ├── async-Quill.js.LICENSE.txt │ ├── async-Quill.js.map │ ├── dash_quill.min.js │ └── dash_quill.min.js.map ├── man └── dreQuill.Rd ├── package-lock.json ├── package.json ├── pytest.ini ├── requirements.txt ├── review_checklist.md ├── setup.py ├── src ├── DashQuill.jl ├── demo │ ├── App.js │ └── index.js ├── jl │ └── dre_quill.jl └── lib │ ├── LazyLoader.js │ ├── components │ └── Quill.react.js │ ├── fragments │ └── Quill.react.js │ └── index.js ├── tests ├── __init__.py ├── requirements.txt └── test_usage.py ├── usage.py ├── webpack.config.js └── webpack.serve.config.js /.Rbuildignore: -------------------------------------------------------------------------------- 1 | # ignore JS config files/folders 2 | node_modules/ 3 | coverage/ 4 | src/ 5 | lib/ 6 | .babelrc 7 | .builderrc 8 | .eslintrc 9 | .npmignore 10 | .editorconfig 11 | .eslintignore 12 | .prettierrc 13 | .circleci 14 | .github 15 | 16 | # demo folder has special meaning in R 17 | # this should hopefully make it still 18 | # allow for the possibility to make R demos 19 | demo/.*\.js 20 | demo/.*\.html 21 | demo/.*\.css 22 | 23 | # ignore Python files/folders 24 | setup.py 25 | usage.py 26 | setup.py 27 | requirements.txt 28 | MANIFEST.in 29 | CHANGELOG.md 30 | test/ 31 | # CRAN has weird LICENSE requirements 32 | LICENSE.txt 33 | ^.*\.Rproj$ 34 | ^\.Rproj\.user$ 35 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/preset-env", "@babel/preset-react"], 3 | "env": { 4 | "production": { 5 | "plugins": ["@babel/plugin-proposal-object-rest-spread", "styled-jsx/babel"] 6 | }, 7 | "development": { 8 | "plugins": ["@babel/plugin-proposal-object-rest-spread", "styled-jsx/babel"] 9 | }, 10 | "test": { 11 | "plugins": ["@babel/plugin-proposal-object-rest-spread", "styled-jsx/babel-test"] 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | *.css 2 | registerServiceWorker.js -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["eslint:recommended", "prettier"], 3 | "parser": "babel-eslint", 4 | "parserOptions": { 5 | "ecmaVersion": 6, 6 | "sourceType": "module", 7 | "ecmaFeatures": { 8 | "arrowFunctions": true, 9 | "blockBindings": true, 10 | "classes": true, 11 | "defaultParams": true, 12 | "destructuring": true, 13 | "forOf": true, 14 | "generators": true, 15 | "modules": true, 16 | "templateStrings": true, 17 | "jsx": true 18 | } 19 | }, 20 | "env": { 21 | "browser": true, 22 | "es6": true, 23 | "jasmine": true, 24 | "jest": true, 25 | "node": true 26 | }, 27 | "globals": { 28 | "jest": true 29 | }, 30 | "plugins": [ 31 | "react", 32 | "import" 33 | ], 34 | "rules": { 35 | "accessor-pairs": ["error"], 36 | "block-scoped-var": ["error"], 37 | "consistent-return": ["error"], 38 | "curly": ["error", "all"], 39 | "default-case": ["error"], 40 | "dot-location": ["off"], 41 | "dot-notation": ["error"], 42 | "eqeqeq": ["error"], 43 | "guard-for-in": ["off"], 44 | "import/named": ["off"], 45 | "import/no-duplicates": ["error"], 46 | "import/no-named-as-default": ["error"], 47 | "new-cap": ["error"], 48 | "no-alert": [1], 49 | "no-caller": ["error"], 50 | "no-case-declarations": ["error"], 51 | "no-console": ["off"], 52 | "no-div-regex": ["error"], 53 | "no-dupe-keys": ["error"], 54 | "no-else-return": ["error"], 55 | "no-empty-pattern": ["error"], 56 | "no-eq-null": ["error"], 57 | "no-eval": ["error"], 58 | "no-extend-native": ["error"], 59 | "no-extra-bind": ["error"], 60 | "no-extra-boolean-cast": ["error"], 61 | "no-inline-comments": ["error"], 62 | "no-implicit-coercion": ["error"], 63 | "no-implied-eval": ["error"], 64 | "no-inner-declarations": ["off"], 65 | "no-invalid-this": ["error"], 66 | "no-iterator": ["error"], 67 | "no-labels": ["error"], 68 | "no-lone-blocks": ["error"], 69 | "no-loop-func": ["error"], 70 | "no-multi-str": ["error"], 71 | "no-native-reassign": ["error"], 72 | "no-new": ["error"], 73 | "no-new-func": ["error"], 74 | "no-new-wrappers": ["error"], 75 | "no-param-reassign": ["error"], 76 | "no-process-env": ["warn"], 77 | "no-proto": ["error"], 78 | "no-redeclare": ["error"], 79 | "no-return-assign": ["error"], 80 | "no-script-url": ["error"], 81 | "no-self-compare": ["error"], 82 | "no-sequences": ["error"], 83 | "no-shadow": ["off"], 84 | "no-throw-literal": ["error"], 85 | "no-undefined": ["error"], 86 | "no-unused-expressions": ["error"], 87 | "no-use-before-define": ["error", "nofunc"], 88 | "no-useless-call": ["error"], 89 | "no-useless-concat": ["error"], 90 | "no-with": ["error"], 91 | "prefer-const": ["error"], 92 | "radix": ["error"], 93 | "react/jsx-no-duplicate-props": ["error"], 94 | "react/jsx-no-undef": ["error"], 95 | "react/jsx-uses-react": ["error"], 96 | "react/jsx-uses-vars": ["error"], 97 | "react/no-did-update-set-state": ["error"], 98 | "react/no-direct-mutation-state": ["error"], 99 | "react/no-is-mounted": ["error"], 100 | "react/no-unknown-property": ["error"], 101 | "react/prefer-es6-class": ["error", "always"], 102 | "react/prop-types": "error", 103 | "valid-jsdoc": ["off"], 104 | "yoda": ["error"], 105 | "spaced-comment": ["error", "always", { 106 | "block": { 107 | "exceptions": ["*"] 108 | } 109 | }], 110 | "no-unused-vars": ["error", { 111 | "args": "after-used", 112 | "argsIgnorePattern": "^_", 113 | "caughtErrorsIgnorePattern": "^e$" 114 | }], 115 | "no-magic-numbers": ["error", { 116 | "ignoreArrayIndexes": true, 117 | "ignore": [-1, 0, 1, 2, 3, 100, 10, 0.5] 118 | }], 119 | "no-underscore-dangle": ["off"] 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### Webpack 3 | .build_cache 4 | ### VisualStudioCode template 5 | .vscode/* 6 | !.vscode/settings.json 7 | !.vscode/tasks.json 8 | !.vscode/launch.json 9 | !.vscode/extensions.json 10 | ### JetBrains template 11 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm 12 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 13 | 14 | # User-specific stuff 15 | .idea/**/workspace.xml 16 | .idea/**/tasks.xml 17 | .idea/**/usage.statistics.xml 18 | .idea/**/dictionaries 19 | .idea/**/shelf 20 | 21 | # Sensitive or high-churn files 22 | .idea/**/dataSources/ 23 | .idea/**/dataSources.ids 24 | .idea/**/dataSources.local.xml 25 | .idea/**/sqlDataSources.xml 26 | .idea/**/dynamic.xml 27 | .idea/**/uiDesigner.xml 28 | .idea/**/dbnavigator.xml 29 | 30 | # Gradle 31 | .idea/**/gradle.xml 32 | .idea/**/libraries 33 | 34 | # Gradle and Maven with auto-import 35 | # When using Gradle or Maven with auto-import, you should exclude module files, 36 | # since they will be recreated, and may cause churn. Uncomment if using 37 | # auto-import. 38 | # .idea/modules.xml 39 | # .idea/*.iml 40 | # .idea/modules 41 | 42 | # CMake 43 | cmake-build-*/ 44 | 45 | # Mongo Explorer plugin 46 | .idea/**/mongoSettings.xml 47 | 48 | # File-based project format 49 | *.iws 50 | 51 | # IntelliJ 52 | out/ 53 | 54 | # mpeltonen/sbt-idea plugin 55 | .idea_modules/ 56 | 57 | # JIRA plugin 58 | atlassian-ide-plugin.xml 59 | 60 | # Cursive Clojure plugin 61 | .idea/replstate.xml 62 | 63 | # Crashlytics plugin (for Android Studio and IntelliJ) 64 | com_crashlytics_export_strings.xml 65 | crashlytics.properties 66 | crashlytics-build.properties 67 | fabric.properties 68 | 69 | # Editor-based Rest Client 70 | .idea/httpRequests 71 | ### Node template 72 | # Logs 73 | logs 74 | *.log 75 | npm-debug.log* 76 | yarn-debug.log* 77 | yarn-error.log* 78 | 79 | # Runtime data 80 | pids 81 | *.pid 82 | *.seed 83 | *.pid.lock 84 | 85 | # Directory for instrumented libs generated by jscoverage/JSCover 86 | lib-cov 87 | 88 | # Coverage directory used by tools like istanbul 89 | coverage 90 | 91 | # nyc test coverage 92 | .nyc_output 93 | 94 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 95 | .grunt 96 | 97 | # Bower dependency directory (https://bower.io/) 98 | bower_components 99 | 100 | # node-waf configuration 101 | .lock-wscript 102 | 103 | # Compiled binary addons (https://nodejs.org/api/addons.html) 104 | build/Release 105 | 106 | # Dependency directories 107 | node_modules/ 108 | jspm_packages/ 109 | 110 | # TypeScript v1 declaration files 111 | typings/ 112 | 113 | # Optional npm cache directory 114 | .npm 115 | 116 | # Optional eslint cache 117 | .eslintcache 118 | 119 | # Optional REPL history 120 | .node_repl_history 121 | 122 | # Output of 'npm pack' 123 | *.tgz 124 | 125 | # Yarn Integrity file 126 | .yarn-integrity 127 | 128 | # dotenv environment variables file 129 | .env 130 | 131 | # parcel-bundler cache (https://parceljs.org/) 132 | .cache 133 | 134 | # next.js build output 135 | .next 136 | 137 | # nuxt.js build output 138 | .nuxt 139 | 140 | # vuepress build output 141 | .vuepress/dist 142 | 143 | # Serverless directories 144 | .serverless 145 | ### Python template 146 | # Byte-compiled / optimized / DLL files 147 | __pycache__/ 148 | *.py[cod] 149 | *$py.class 150 | 151 | # C extensions 152 | *.so 153 | 154 | # Distribution / packaging 155 | .Python 156 | build/ 157 | develop-eggs/ 158 | dist/ 159 | downloads/ 160 | eggs/ 161 | .eggs/ 162 | lib64/ 163 | parts/ 164 | sdist/ 165 | var/ 166 | wheels/ 167 | *.egg-info/ 168 | .installed.cfg 169 | *.egg 170 | MANIFEST 171 | 172 | # PyInstaller 173 | # Usually these files are written by a python script from a template 174 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 175 | *.manifest 176 | *.spec 177 | 178 | # Installer logs 179 | pip-log.txt 180 | pip-delete-this-directory.txt 181 | 182 | # Unit test / coverage reports 183 | htmlcov/ 184 | .tox/ 185 | .coverage 186 | .coverage.* 187 | nosetests.xml 188 | coverage.xml 189 | *.cover 190 | .hypothesis/ 191 | .pytest_cache/ 192 | 193 | # Translations 194 | *.mo 195 | *.pot 196 | 197 | # Django stuff: 198 | local_settings.py 199 | db.sqlite3 200 | 201 | # Flask stuff: 202 | instance/ 203 | .webassets-cache 204 | 205 | # Scrapy stuff: 206 | .scrapy 207 | 208 | # Sphinx documentation 209 | docs/_build/ 210 | 211 | # PyBuilder 212 | target/ 213 | 214 | # Jupyter Notebook 215 | .ipynb_checkpoints 216 | 217 | # pyenv 218 | .python-version 219 | 220 | # celery beat schedule file 221 | celerybeat-schedule 222 | 223 | # SageMath parsed files 224 | *.sage.py 225 | 226 | # Environments 227 | .venv 228 | env/ 229 | venv/ 230 | ENV/ 231 | env.bak/ 232 | venv.bak/ 233 | 234 | # Spyder project settings 235 | .spyderproject 236 | .spyproject 237 | 238 | # Rope project settings 239 | .ropeproject 240 | 241 | # mkdocs documentation 242 | /site 243 | 244 | # mypy 245 | .mypy_cache/ 246 | ### SublimeText template 247 | # Cache files for Sublime Text 248 | *.tmlanguage.cache 249 | *.tmPreferences.cache 250 | *.stTheme.cache 251 | 252 | # Workspace files are user-specific 253 | *.sublime-workspace 254 | 255 | # Project files should be checked into the repository, unless a significant 256 | # proportion of contributors will probably not be using Sublime Text 257 | # *.sublime-project 258 | 259 | # SFTP configuration file 260 | sftp-config.json 261 | 262 | # Package control specific files 263 | Package Control.last-run 264 | Package Control.ca-list 265 | Package Control.ca-bundle 266 | Package Control.system-ca-bundle 267 | Package Control.cache/ 268 | Package Control.ca-certs/ 269 | Package Control.merged-ca-bundle 270 | Package Control.user-ca-bundle 271 | oscrypto-ca-bundle.crt 272 | bh_unicode_properties.cache 273 | 274 | # Sublime-github package stores a github token in this file 275 | # https://packagecontrol.io/packages/sublime-github 276 | GitHub.sublime-settings 277 | 278 | # Julia manifest file names 279 | Manifest.toml 280 | JuliaManifest.toml 281 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | /node_modules 3 | 4 | # testing 5 | /coverage 6 | 7 | # misc 8 | .DS_Store 9 | .env.local 10 | .env.development.local 11 | .env.test.local 12 | .env.production.local 13 | 14 | npm-debug.log* 15 | yarn-debug.log* 16 | yarn-error.log* 17 | 18 | # Development folders and files 19 | public 20 | src 21 | scripts 22 | config 23 | .travis.yml 24 | CHANGELOG.md 25 | README.md 26 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 4, 3 | "singleQuote": true, 4 | "bracketSpacing": false, 5 | "trailingComma": "es5" 6 | } 7 | -------------------------------------------------------------------------------- /.pylintrc: -------------------------------------------------------------------------------- 1 | [MASTER] 2 | 3 | # A comma-separated list of package or module names from where C extensions may 4 | # be loaded. Extensions are loading into the active Python interpreter and may 5 | # run arbitrary code 6 | extension-pkg-whitelist= 7 | 8 | # Add files or directories to the blacklist. They should be base names, not 9 | # paths. 10 | ignore=CVS 11 | 12 | # Add files or directories matching the regex patterns to the blacklist. The 13 | # regex matches against base names, not paths. 14 | ignore-patterns= 15 | 16 | # Python code to execute, usually for sys.path manipulation such as 17 | # pygtk.require(). 18 | #init-hook= 19 | 20 | # Use multiple processes to speed up Pylint. 21 | jobs=1 22 | 23 | # List of plugins (as comma separated values of python modules names) to load, 24 | # usually to register additional checkers. 25 | load-plugins= 26 | 27 | # Pickle collected data for later comparisons. 28 | persistent=yes 29 | 30 | # Specify a configuration file. 31 | #rcfile= 32 | 33 | # When enabled, pylint would attempt to guess common misconfiguration and emit 34 | # user-friendly hints instead of false-positive error messages 35 | suggestion-mode=yes 36 | 37 | # Allow loading of arbitrary C extensions. Extensions are imported into the 38 | # active Python interpreter and may run arbitrary code. 39 | unsafe-load-any-extension=no 40 | 41 | 42 | [MESSAGES CONTROL] 43 | 44 | # Only show warnings with the listed confidence levels. Leave empty to show 45 | # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED 46 | confidence= 47 | 48 | # Disable the message, report, category or checker with the given id(s). You 49 | # can either give multiple identifiers separated by comma (,) or put this 50 | # option multiple times (only on the command line, not in the configuration 51 | # file where it should appear only once).You can also use "--disable=all" to 52 | # disable everything first and then reenable specific checks. For example, if 53 | # you want to run only the similarities checker, you can use "--disable=all 54 | # --enable=similarities". If you want to run only the classes checker, but have 55 | # no Warning level messages displayed, use"--disable=all --enable=classes 56 | # --disable=W" 57 | disable=print-statement, 58 | parameter-unpacking, 59 | unpacking-in-except, 60 | old-raise-syntax, 61 | backtick, 62 | long-suffix, 63 | old-ne-operator, 64 | old-octal-literal, 65 | import-star-module-level, 66 | non-ascii-bytes-literal, 67 | raw-checker-failed, 68 | bad-inline-option, 69 | locally-disabled, 70 | locally-enabled, 71 | file-ignored, 72 | suppressed-message, 73 | useless-suppression, 74 | deprecated-pragma, 75 | apply-builtin, 76 | basestring-builtin, 77 | buffer-builtin, 78 | cmp-builtin, 79 | coerce-builtin, 80 | execfile-builtin, 81 | file-builtin, 82 | long-builtin, 83 | raw_input-builtin, 84 | reduce-builtin, 85 | standarderror-builtin, 86 | unicode-builtin, 87 | xrange-builtin, 88 | coerce-method, 89 | delslice-method, 90 | getslice-method, 91 | setslice-method, 92 | no-absolute-import, 93 | old-division, 94 | dict-iter-method, 95 | dict-view-method, 96 | next-method-called, 97 | metaclass-assignment, 98 | indexing-exception, 99 | raising-string, 100 | reload-builtin, 101 | oct-method, 102 | hex-method, 103 | nonzero-method, 104 | cmp-method, 105 | input-builtin, 106 | round-builtin, 107 | intern-builtin, 108 | unichr-builtin, 109 | map-builtin-not-iterating, 110 | zip-builtin-not-iterating, 111 | range-builtin-not-iterating, 112 | filter-builtin-not-iterating, 113 | using-cmp-argument, 114 | eq-without-hash, 115 | div-method, 116 | idiv-method, 117 | rdiv-method, 118 | exception-message-attribute, 119 | invalid-str-codec, 120 | sys-max-int, 121 | bad-python3-import, 122 | deprecated-string-function, 123 | deprecated-str-translate-call, 124 | deprecated-itertools-function, 125 | deprecated-types-field, 126 | next-method-defined, 127 | dict-items-not-iterating, 128 | dict-keys-not-iterating, 129 | dict-values-not-iterating, 130 | no-member, 131 | missing-docstring, 132 | invalid-name, 133 | redefined-builtin, 134 | wrong-import-order, 135 | too-many-arguments, 136 | too-many-locals, 137 | consider-using-enumerate, 138 | len-as-condition, 139 | too-many-branches, 140 | too-many-statements, 141 | blacklisted-name, 142 | line-too-long, 143 | bare-except, 144 | duplicate-code, 145 | too-many-function-args, 146 | attribute-defined-outside-init, 147 | broad-except 148 | 149 | # Enable the message, report, category or checker with the given id(s). You can 150 | # either give multiple identifier separated by comma (,) or put this option 151 | # multiple time (only on the command line, not in the configuration file where 152 | # it should appear only once). See also the "--disable" option for examples. 153 | enable=c-extension-no-member 154 | 155 | 156 | [REPORTS] 157 | 158 | # Python expression which should return a note less than 10 (10 is the highest 159 | # note). You have access to the variables errors warning, statement which 160 | # respectively contain the number of errors / warnings messages and the total 161 | # number of statements analyzed. This is used by the global evaluation report 162 | # (RP0004). 163 | evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) 164 | 165 | # Template used to display messages. This is a python new-style format string 166 | # used to format the message information. See doc for all details 167 | #msg-template= 168 | 169 | # Set the output format. Available formats are text, parseable, colorized, json 170 | # and msvs (visual studio).You can also give a reporter class, eg 171 | # mypackage.mymodule.MyReporterClass. 172 | output-format=text 173 | 174 | # Tells whether to display a full report or only the messages 175 | reports=no 176 | 177 | # Activate the evaluation score. 178 | score=yes 179 | 180 | 181 | [REFACTORING] 182 | 183 | # Maximum number of nested blocks for function / method body 184 | max-nested-blocks=5 185 | 186 | # Complete name of functions that never returns. When checking for 187 | # inconsistent-return-statements if a never returning function is called then 188 | # it will be considered as an explicit return statement and no message will be 189 | # printed. 190 | never-returning-functions=optparse.Values,sys.exit 191 | 192 | 193 | [BASIC] 194 | 195 | # Naming style matching correct argument names 196 | argument-naming-style=snake_case 197 | 198 | # Regular expression matching correct argument names. Overrides argument- 199 | # naming-style 200 | #argument-rgx= 201 | 202 | # Naming style matching correct attribute names 203 | attr-naming-style=snake_case 204 | 205 | # Regular expression matching correct attribute names. Overrides attr-naming- 206 | # style 207 | #attr-rgx= 208 | 209 | # Bad variable names which should always be refused, separated by a comma 210 | bad-names=foo, 211 | bar, 212 | baz, 213 | toto, 214 | tutu, 215 | tata 216 | 217 | # Naming style matching correct class attribute names 218 | class-attribute-naming-style=any 219 | 220 | # Regular expression matching correct class attribute names. Overrides class- 221 | # attribute-naming-style 222 | #class-attribute-rgx= 223 | 224 | # Naming style matching correct class names 225 | class-naming-style=PascalCase 226 | 227 | # Regular expression matching correct class names. Overrides class-naming-style 228 | #class-rgx= 229 | 230 | # Naming style matching correct constant names 231 | const-naming-style=UPPER_CASE 232 | 233 | # Regular expression matching correct constant names. Overrides const-naming- 234 | # style 235 | #const-rgx= 236 | 237 | # Minimum line length for functions/classes that require docstrings, shorter 238 | # ones are exempt. 239 | docstring-min-length=-1 240 | 241 | # Naming style matching correct function names 242 | function-naming-style=snake_case 243 | 244 | # Regular expression matching correct function names. Overrides function- 245 | # naming-style 246 | #function-rgx= 247 | 248 | # Good variable names which should always be accepted, separated by a comma 249 | good-names=i, 250 | j, 251 | k, 252 | ex, 253 | Run, 254 | _ 255 | 256 | # Include a hint for the correct naming format with invalid-name 257 | include-naming-hint=no 258 | 259 | # Naming style matching correct inline iteration names 260 | inlinevar-naming-style=any 261 | 262 | # Regular expression matching correct inline iteration names. Overrides 263 | # inlinevar-naming-style 264 | #inlinevar-rgx= 265 | 266 | # Naming style matching correct method names 267 | method-naming-style=snake_case 268 | 269 | # Regular expression matching correct method names. Overrides method-naming- 270 | # style 271 | #method-rgx= 272 | 273 | # Naming style matching correct module names 274 | module-naming-style=snake_case 275 | 276 | # Regular expression matching correct module names. Overrides module-naming- 277 | # style 278 | #module-rgx= 279 | 280 | # Colon-delimited sets of names that determine each other's naming style when 281 | # the name regexes allow several styles. 282 | name-group= 283 | 284 | # Regular expression which should only match function or class names that do 285 | # not require a docstring. 286 | no-docstring-rgx=^_ 287 | 288 | # List of decorators that produce properties, such as abc.abstractproperty. Add 289 | # to this list to register other decorators that produce valid properties. 290 | property-classes=abc.abstractproperty 291 | 292 | # Naming style matching correct variable names 293 | variable-naming-style=snake_case 294 | 295 | # Regular expression matching correct variable names. Overrides variable- 296 | # naming-style 297 | #variable-rgx= 298 | 299 | 300 | [FORMAT] 301 | 302 | # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. 303 | expected-line-ending-format= 304 | 305 | # Regexp for a line that is allowed to be longer than the limit. 306 | ignore-long-lines=^\s*(# )??$ 307 | 308 | # Number of spaces of indent required inside a hanging or continued line. 309 | indent-after-paren=4 310 | 311 | # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 312 | # tab). 313 | indent-string=' ' 314 | 315 | # Maximum number of characters on a single line. 316 | max-line-length=100 317 | 318 | # Maximum number of lines in a module 319 | max-module-lines=1000 320 | 321 | # List of optional constructs for which whitespace checking is disabled. `dict- 322 | # separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. 323 | # `trailing-comma` allows a space between comma and closing bracket: (a, ). 324 | # `empty-line` allows space-only lines. 325 | no-space-check=trailing-comma, 326 | dict-separator 327 | 328 | # Allow the body of a class to be on the same line as the declaration if body 329 | # contains single statement. 330 | single-line-class-stmt=no 331 | 332 | # Allow the body of an if to be on the same line as the test if there is no 333 | # else. 334 | single-line-if-stmt=no 335 | 336 | 337 | [LOGGING] 338 | 339 | # Logging modules to check that the string format arguments are in logging 340 | # function parameter format 341 | logging-modules=logging 342 | 343 | 344 | [MISCELLANEOUS] 345 | 346 | # List of note tags to take in consideration, separated by a comma. 347 | notes=FIXME, 348 | XXX, 349 | 350 | 351 | [SIMILARITIES] 352 | 353 | # Ignore comments when computing similarities. 354 | ignore-comments=yes 355 | 356 | # Ignore docstrings when computing similarities. 357 | ignore-docstrings=yes 358 | 359 | # Ignore imports when computing similarities. 360 | ignore-imports=no 361 | 362 | # Minimum lines number of a similarity. 363 | min-similarity-lines=4 364 | 365 | 366 | [SPELLING] 367 | 368 | # Limits count of emitted suggestions for spelling mistakes 369 | max-spelling-suggestions=4 370 | 371 | # Spelling dictionary name. Available dictionaries: none. To make it working 372 | # install python-enchant package. 373 | spelling-dict= 374 | 375 | # List of comma separated words that should not be checked. 376 | spelling-ignore-words= 377 | 378 | # A path to a file that contains private dictionary; one word per line. 379 | spelling-private-dict-file= 380 | 381 | # Tells whether to store unknown words to indicated private dictionary in 382 | # --spelling-private-dict-file option instead of raising a message. 383 | spelling-store-unknown-words=no 384 | 385 | 386 | [TYPECHECK] 387 | 388 | # List of decorators that produce context managers, such as 389 | # contextlib.contextmanager. Add to this list to register other decorators that 390 | # produce valid context managers. 391 | contextmanager-decorators=contextlib.contextmanager 392 | 393 | # List of members which are set dynamically and missed by pylint inference 394 | # system, and so shouldn't trigger E1101 when accessed. Python regular 395 | # expressions are accepted. 396 | generated-members= 397 | 398 | # Tells whether missing members accessed in mixin class should be ignored. A 399 | # mixin class is detected if its name ends with "mixin" (case insensitive). 400 | ignore-mixin-members=yes 401 | 402 | # This flag controls whether pylint should warn about no-member and similar 403 | # checks whenever an opaque object is returned when inferring. The inference 404 | # can return multiple potential results while evaluating a Python object, but 405 | # some branches might not be evaluated, which results in partial inference. In 406 | # that case, it might be useful to still emit no-member and other checks for 407 | # the rest of the inferred objects. 408 | ignore-on-opaque-inference=yes 409 | 410 | # List of class names for which member attributes should not be checked (useful 411 | # for classes with dynamically set attributes). This supports the use of 412 | # qualified names. 413 | ignored-classes=optparse.Values,thread._local,_thread._local 414 | 415 | # List of module names for which member attributes should not be checked 416 | # (useful for modules/projects where namespaces are manipulated during runtime 417 | # and thus existing member attributes cannot be deduced by static analysis. It 418 | # supports qualified module names, as well as Unix pattern matching. 419 | ignored-modules= 420 | 421 | # Show a hint with possible names when a member name was not found. The aspect 422 | # of finding the hint is based on edit distance. 423 | missing-member-hint=yes 424 | 425 | # The minimum edit distance a name should have in order to be considered a 426 | # similar match for a missing member name. 427 | missing-member-hint-distance=1 428 | 429 | # The total number of similar names that should be taken in consideration when 430 | # showing a hint for a missing member. 431 | missing-member-max-choices=1 432 | 433 | 434 | [VARIABLES] 435 | 436 | # List of additional names supposed to be defined in builtins. Remember that 437 | # you should avoid to define new builtins when possible. 438 | additional-builtins= 439 | 440 | # Tells whether unused global variables should be treated as a violation. 441 | allow-global-unused-variables=yes 442 | 443 | # List of strings which can identify a callback function by name. A callback 444 | # name must start or end with one of those strings. 445 | callbacks=cb_, 446 | _cb 447 | 448 | # A regular expression matching the name of dummy variables (i.e. expectedly 449 | # not used). 450 | dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ 451 | 452 | # Argument names that match this expression will be ignored. Default to name 453 | # with leading underscore 454 | ignored-argument-names=_.*|^ignored_|^unused_ 455 | 456 | # Tells whether we should check for unused import in __init__ files. 457 | init-import=no 458 | 459 | # List of qualified module names which can have objects that can redefine 460 | # builtins. 461 | redefining-builtins-modules=six.moves,past.builtins,future.builtins 462 | 463 | 464 | [CLASSES] 465 | 466 | # List of method names used to declare (i.e. assign) instance attributes. 467 | defining-attr-methods=__init__, 468 | __new__, 469 | setUp 470 | 471 | # List of member names, which should be excluded from the protected access 472 | # warning. 473 | exclude-protected=_asdict, 474 | _fields, 475 | _replace, 476 | _source, 477 | _make 478 | 479 | # List of valid names for the first argument in a class method. 480 | valid-classmethod-first-arg=cls 481 | 482 | # List of valid names for the first argument in a metaclass class method. 483 | valid-metaclass-classmethod-first-arg=mcs 484 | 485 | 486 | [DESIGN] 487 | 488 | # Maximum number of arguments for function / method 489 | max-args=5 490 | 491 | # Maximum number of attributes for a class (see R0902). 492 | max-attributes=7 493 | 494 | # Maximum number of boolean expressions in a if statement 495 | max-bool-expr=5 496 | 497 | # Maximum number of branch for function / method body 498 | max-branches=12 499 | 500 | # Maximum number of locals for function / method body 501 | max-locals=15 502 | 503 | # Maximum number of parents for a class (see R0901). 504 | max-parents=7 505 | 506 | # Maximum number of public methods for a class (see R0904). 507 | max-public-methods=20 508 | 509 | # Maximum number of return / yield for function / method body 510 | max-returns=6 511 | 512 | # Maximum number of statements in function / method body 513 | max-statements=50 514 | 515 | # Minimum number of public methods for a class (see R0903). 516 | min-public-methods=2 517 | 518 | 519 | [IMPORTS] 520 | 521 | # Allow wildcard imports from modules that define __all__. 522 | allow-wildcard-with-all=no 523 | 524 | # Analyse import fallback blocks. This can be used to support both Python 2 and 525 | # 3 compatible code, which means that the block might have code that exists 526 | # only in one or another interpreter, leading to false positives when analysed. 527 | analyse-fallback-blocks=no 528 | 529 | # Deprecated modules which should not be used, separated by a comma 530 | deprecated-modules=optparse,tkinter.tix 531 | 532 | # Create a graph of external dependencies in the given file (report RP0402 must 533 | # not be disabled) 534 | ext-import-graph= 535 | 536 | # Create a graph of every (i.e. internal and external) dependencies in the 537 | # given file (report RP0402 must not be disabled) 538 | import-graph= 539 | 540 | # Create a graph of internal dependencies in the given file (report RP0402 must 541 | # not be disabled) 542 | int-import-graph= 543 | 544 | # Force import order to recognize a module as part of the standard 545 | # compatibility libraries. 546 | known-standard-library= 547 | 548 | # Force import order to recognize a module as part of a third party library. 549 | known-third-party=enchant 550 | 551 | 552 | [EXCEPTIONS] 553 | 554 | # Exceptions that will emit a warning when being caught. Defaults to 555 | # "Exception" 556 | overgeneral-exceptions=Exception 557 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.linting.pylintEnabled": true 3 | } -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # CONTRIBUTING 2 | 3 | This project was generated by the [dash-component-boilerplate](https://github.com/plotly/dash-component-boilerplate) it contains the minimal set of code required to create your own custom Dash component. 4 | 5 | -------------------------------------------------------------------------------- /DESCRIPTION: -------------------------------------------------------------------------------- 1 | Package: dashQuill 2 | Title: A Quill-Based Rich Text Editor Component for Dash 3 | Version: 0.0.4 4 | Description: A Quill-Based Rich Text Editor Component for Dash 5 | Depends: R (>= 3.0.2) 6 | Imports: 7 | Suggests: 8 | License: MIT + file LICENSE 9 | URL: 10 | BugReports: 11 | Encoding: UTF-8 12 | LazyData: true 13 | KeepSource: true 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [year] [fullname] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include dash_quill/dash_quill.min.js 2 | include dash_quill/dash_quill.min.js.map 3 | include dash_quill/async-*.js 4 | include dash_quill/async-*.js.map 5 | include dash_quill/*-shared.js 6 | include dash_quill/*-shared.js.map 7 | include dash_quill/metadata.json 8 | include dash_quill/package-info.json 9 | include README.md 10 | include LICENSE 11 | include package.json 12 | -------------------------------------------------------------------------------- /NAMESPACE: -------------------------------------------------------------------------------- 1 | # AUTO GENERATED FILE - DO NOT EDIT 2 | 3 | export(dreQuill) 4 | -------------------------------------------------------------------------------- /Project.toml: -------------------------------------------------------------------------------- 1 | 2 | name = "DashQuill" 3 | uuid = "1b08a953-4be3-4667-9a23-ee249faccdc0" 4 | authors = ["Amien Johaadien "] 5 | version = "0.0.4" 6 | 7 | [deps] 8 | Dash = "1b08a953-4be3-4667-9a23-3db579824955" 9 | 10 | [compat] 11 | julia = "1.2" 12 | Dash = "0.1.3, 1.0" 13 | -------------------------------------------------------------------------------- /R/dreQuill.R: -------------------------------------------------------------------------------- 1 | # AUTO GENERATED FILE - DO NOT EDIT 2 | 3 | #' @export 4 | dreQuill <- function(id=NULL, charCount=NULL, maxLength=NULL, modules=NULL, value=NULL) { 5 | 6 | props <- list(id=id, charCount=charCount, maxLength=maxLength, modules=modules, value=value) 7 | if (length(props) > 0) { 8 | props <- props[!vapply(props, is.null, logical(1))] 9 | } 10 | component <- list( 11 | props = props, 12 | type = 'Quill', 13 | namespace = 'dash_quill', 14 | propNames = c('id', 'charCount', 'maxLength', 'modules', 'value'), 15 | package = 'dashQuill' 16 | ) 17 | 18 | structure(component, class = c('dash_component', 'list')) 19 | } 20 | -------------------------------------------------------------------------------- /R/internal.R: -------------------------------------------------------------------------------- 1 | .dashQuill_js_metadata <- function() { 2 | deps_metadata <- list(`dash_quill` = structure(list(name = "dash_quill", 3 | version = "0.0.4", src = list(href = NULL, 4 | file = "deps"), meta = NULL, 5 | script = 'async-Quill.js', 6 | stylesheet = NULL, head = NULL, attachment = NULL, package = "dashQuill", 7 | all_files = FALSE, async = TRUE), class = "html_dependency"), 8 | `dash_quill` = structure(list(name = "dash_quill", 9 | version = "0.0.4", src = list(href = NULL, 10 | file = "deps"), meta = NULL, 11 | script = 'async-Quill.js.map', 12 | stylesheet = NULL, head = NULL, attachment = NULL, package = "dashQuill", 13 | all_files = FALSE, dynamic = TRUE), class = "html_dependency"), 14 | `dash_quill` = structure(list(name = "dash_quill", 15 | version = "0.0.4", src = list(href = NULL, 16 | file = "deps"), meta = NULL, 17 | script = 'dash_quill.min.js', 18 | stylesheet = NULL, head = NULL, attachment = NULL, package = "dashQuill", 19 | all_files = FALSE), class = "html_dependency"), 20 | `dash_quill` = structure(list(name = "dash_quill", 21 | version = "0.0.4", src = list(href = NULL, 22 | file = "deps"), meta = NULL, 23 | script = 'dash_quill.min.js.map', 24 | stylesheet = NULL, head = NULL, attachment = NULL, package = "dashQuill", 25 | all_files = FALSE, dynamic = TRUE), class = "html_dependency")) 26 | return(deps_metadata) 27 | } 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dash Quill 2 | 3 | A rich text editor component for Dash applications, powered by [Quill.js](https://quilljs.com/). This component enables rich text editing capabilities in your Dash apps with a modern, user-friendly interface. 4 | 5 | ## Features 6 | 7 | - Rich text editing with formatting tools (bold, italic, lists, etc.) 8 | - Real-time content updates 9 | - Customizable toolbar options 10 | - Cross-language support (Python, R, Julia) 11 | - Seamless integration with Dash callbacks 12 | - Lightweight and performant 13 | 14 | ## Installation 15 | 16 | ```bash 17 | pip install dash-quill 18 | ``` 19 | 20 | For R: 21 | ```R 22 | install.packages("dashQuill") 23 | ``` 24 | 25 | For Julia: 26 | ```julia 27 | using Pkg 28 | Pkg.add("DashQuill") 29 | ``` 30 | 31 | ## Basic Usage 32 | 33 | ### Python 34 | ```python 35 | from dash import Dash, html 36 | import dash_quill 37 | 38 | app = Dash(__name__) 39 | 40 | app.layout = html.Div([ 41 | dash_quill.Quill( 42 | id='editor', 43 | value='Hello World!', 44 | placeholder='Start writing...' 45 | ) 46 | ]) 47 | 48 | if __name__ == '__main__': 49 | app.run_server(debug=True) 50 | ``` 51 | 52 | ### R 53 | ```R 54 | library(dash) 55 | library(dashQuill) 56 | 57 | app <- Dash$new() 58 | 59 | app$layout( 60 | htmlDiv(list( 61 | dre_quill( 62 | id='editor', 63 | value='Hello World!', 64 | placeholder='Start writing...' 65 | ) 66 | )) 67 | ) 68 | 69 | app$run_server() 70 | ``` 71 | 72 | ### Julia 73 | ```julia 74 | using Dash 75 | using DashQuill 76 | 77 | app = dash() 78 | 79 | app.layout = html_div() do 80 | dre_quill( 81 | id="editor", 82 | value="Hello World!", 83 | placeholder="Start writing..." 84 | ) 85 | end 86 | 87 | run_server(app) 88 | ``` 89 | 90 | ## Component Properties 91 | 92 | | Property | Type | Description | Default | 93 | |----------|------|-------------|---------| 94 | | id | string | The ID used to identify this component | required | 95 | | value | string | The editor content as HTML string | "" | 96 | | placeholder | string | Placeholder text when editor is empty | "Compose an epic..." | 97 | | readonly | boolean | Whether to make the editor read-only | false | 98 | | theme | string | Editor theme ("snow" or "bubble") | "snow" | 99 | | modules | dict | Quill modules configuration | default toolbar | 100 | 101 | ## Development 102 | 103 | ### Setting Up Development Environment 104 | 105 | 1. Clone the repository and install dependencies: 106 | ```bash 107 | # Install npm packages 108 | npm install 109 | 110 | # Create and activate virtual environment 111 | python -m venv venv 112 | source venv/bin/activate # or `venv\Scripts\activate` on Windows 113 | 114 | # Install Python dependencies 115 | pip install -r requirements.txt 116 | 117 | # Install test dependencies (optional) 118 | pip install -r tests/requirements.txt 119 | ``` 120 | 121 | 2. Run the demo app: 122 | ```bash 123 | npm run build 124 | python usage.py 125 | ``` 126 | 127 | Visit http://localhost:8050 in your web browser to see the demo. 128 | 129 | ### Component Development 130 | 131 | The main component code is in `src/lib/components/Quill.react.js`. The demo app is in `src/demo/`. 132 | 133 | To test your changes: 134 | 1. Build the component: `npm run build` 135 | 2. Run the demo: `python usage.py` 136 | 3. Run tests: `pytest tests/` 137 | 138 | ### Building for Production 139 | 140 | 1. Create distribution files: 141 | ```bash 142 | npm run build 143 | python setup.py sdist bdist_wheel 144 | ``` 145 | 146 | 2. Test the package: 147 | ```bash 148 | pip install dist/dash_quill-*.tar.gz 149 | ``` 150 | 151 | 3. Publish (if you have access): 152 | ```bash 153 | # Upload to PyPI 154 | twine upload dist/* 155 | 156 | # Publish to NPM (optional) 157 | npm publish 158 | ``` 159 | 160 | ## Contributing 161 | 162 | See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines on contributing to this project. 163 | 164 | ## Community 165 | 166 | - Report bugs or request features on [GitHub Issues](https://github.com/pandamodium/dash-quill/issues) 167 | - Get help on the [Dash Community Forum](https://community.plotly.com/c/dash) 168 | - Find more Dash components at [GitHub Topics: plotly-dash](https://github.com/topics/plotly-dash) 169 | 170 | ## License 171 | 172 | This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details. 173 | -------------------------------------------------------------------------------- /_validate_init.py: -------------------------------------------------------------------------------- 1 | """ 2 | DO NOT MODIFY 3 | This file is used to validate your publish settings. 4 | """ 5 | from __future__ import print_function 6 | 7 | import os 8 | import sys 9 | import importlib 10 | 11 | 12 | components_package = 'dash_quill' 13 | 14 | components_lib = importlib.import_module(components_package) 15 | 16 | missing_dist_msg = 'Warning {} was not found in `{}.__init__.{}`!!!' 17 | missing_manifest_msg = ''' 18 | Warning {} was not found in `MANIFEST.in`! 19 | It will not be included in the build! 20 | ''' 21 | 22 | with open('MANIFEST.in', 'r') as f: 23 | manifest = f.read() 24 | 25 | 26 | def check_dist(dist, filename): 27 | # Support the dev bundle. 28 | if filename.endswith('dev.js'): 29 | return True 30 | 31 | return any( 32 | filename in x 33 | for d in dist 34 | for x in ( 35 | [d.get('relative_package_path')] 36 | if not isinstance(d.get('relative_package_path'), list) 37 | else d.get('relative_package_path') 38 | ) 39 | ) 40 | 41 | 42 | def check_manifest(filename): 43 | return filename in manifest 44 | 45 | 46 | def check_file(dist, filename): 47 | if not check_dist(dist, filename): 48 | print( 49 | missing_dist_msg.format(filename, components_package, '_js_dist'), 50 | file=sys.stderr 51 | ) 52 | if not check_manifest(filename): 53 | print(missing_manifest_msg.format(filename), 54 | file=sys.stderr) 55 | 56 | 57 | for cur, _, files in os.walk(components_package): 58 | for f in files: 59 | 60 | if f.endswith('js'): 61 | # noinspection PyProtectedMember 62 | check_file(components_lib._js_dist, f) 63 | elif f.endswith('css'): 64 | # noinspection PyProtectedMember 65 | check_file(components_lib._css_dist, f) 66 | elif not f.endswith('py'): 67 | check_manifest(f) 68 | -------------------------------------------------------------------------------- /dash_quill/Quill.py: -------------------------------------------------------------------------------- 1 | # AUTO GENERATED FILE - DO NOT EDIT 2 | 3 | from dash.development.base_component import Component, _explicitize_args 4 | 5 | 6 | class Quill(Component): 7 | """A Quill component. 8 | ExampleComponent is an example component. 9 | It takes a property, `label`, and 10 | displays it. 11 | It renders an input with the property `value` 12 | which is editable by the user. 13 | 14 | Keyword arguments: 15 | 16 | - id (string; optional): 17 | The ID used to identify this component in Dash callbacks. 18 | slateContent={SlateRTE.deserializeHTMLString(value)}. 19 | 20 | - charCount (number; optional): 21 | The number of charaters in the editor (excl HTML). 22 | 23 | - maxLength (number; default 140): 24 | The value displayed in the input. 25 | 26 | - modules (dict; default { toolbar: [ [{ 'font': [] }], [{size: []}], ['bold', 'italic', 'underline'], [{'list': 'ordered'}, {'list': 'bullet'}], //['link', 'image'], //['clean'] ], clipboard: { // toggle to add extra line breaks when pasting HTML: matchVisual: False, }}): 27 | The toolbar options modules. Should be {'toolbar':[list of 28 | options]}. 29 | 30 | - value (string; optional): 31 | The value displayed in the input.""" 32 | _children_props = [] 33 | _base_nodes = ['children'] 34 | _namespace = 'dash_quill' 35 | _type = 'Quill' 36 | @_explicitize_args 37 | def __init__(self, id=Component.UNDEFINED, value=Component.UNDEFINED, maxLength=Component.UNDEFINED, charCount=Component.UNDEFINED, modules=Component.UNDEFINED, **kwargs): 38 | self._prop_names = ['id', 'charCount', 'maxLength', 'modules', 'value'] 39 | self._valid_wildcard_attributes = [] 40 | self.available_properties = ['id', 'charCount', 'maxLength', 'modules', 'value'] 41 | self.available_wildcard_properties = [] 42 | _explicit_args = kwargs.pop('_explicit_args') 43 | _locals = locals() 44 | _locals.update(kwargs) # For wildcard attrs and excess named props 45 | args = {k: _locals[k] for k in _explicit_args} 46 | 47 | super(Quill, self).__init__(**args) 48 | -------------------------------------------------------------------------------- /dash_quill/__init__.py: -------------------------------------------------------------------------------- 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 = ["Quill",] 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_quill.min.js', 70 | 'external_url': 'https://unpkg.com/{0}@{2}/{1}/{1}.min.js'.format( 71 | package_name, __name__, __version__), 72 | 'namespace': package_name 73 | }, 74 | { 75 | 'relative_package_path': 'dash_quill.min.js.map', 76 | 'external_url': 'https://unpkg.com/{0}@{2}/{1}/{1}.min.js.map'.format( 77 | package_name, __name__, __version__), 78 | 'namespace': package_name, 79 | 'dynamic': True 80 | } 81 | ] 82 | ) 83 | 84 | _css_dist = [] 85 | 86 | 87 | for _component in __all__: 88 | setattr(locals()[_component], '_js_dist', _js_dist) 89 | setattr(locals()[_component], '_css_dist', _css_dist) 90 | -------------------------------------------------------------------------------- /dash_quill/_imports_.py: -------------------------------------------------------------------------------- 1 | from .Quill import Quill 2 | 3 | __all__ = [ 4 | "Quill" 5 | ] -------------------------------------------------------------------------------- /dash_quill/async-Quill.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /*! 2 | * Quill Editor v1.3.7 3 | * https://quilljs.com/ 4 | * Copyright (c) 2014, Jason Chen 5 | * Copyright (c) 2013, salesforce.com 6 | */ 7 | -------------------------------------------------------------------------------- /dash_quill/dash_quill.min.js: -------------------------------------------------------------------------------- 1 | (()=>{"use strict";var e,t,r={6642:(e,t,r)=>{r.d(t,{Ay:()=>b,Gs:()=>y,tu:()=>m});var n=r(1609),o=r.n(n),i=r(6120),u=r.n(i),c=React.lazy((function(){return r.e(89).then(r.bind(r,2734))}));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 l(e,t){for(var r=0;r{e.exports=window.PropTypes},1609:e=>{e.exports=window.React},5795:e=>{e.exports=window.ReactDOM}},n={};function o(e){var t=n[e];if(void 0!==t)return t.exports;var i=n[e]={id:e,loaded:!1,exports:{}};return r[e].call(i.exports,i,i.exports,o),i.loaded=!0,i.exports}o.m=r,o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var r in t)o.o(t,r)&&!o.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o.f={},o.e=e=>Promise.all(Object.keys(o.f).reduce(((t,r)=>(o.f[r](e,t),t)),[])),o.u=e=>"async-Quill.js",o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="dash_quill:",o.l=(r,n,i,u)=>{if(e[r])e[r].push(n);else{var c,a;if(void 0!==i)for(var l=document.getElementsByTagName("script"),s=0;s{c.onerror=c.onload=null,clearTimeout(d);var o=e[r];if(delete e[r],c.parentNode&&c.parentNode.removeChild(c),o&&o.forEach((e=>e(n))),t)return t(n)},d=setTimeout(f.bind(null,void 0,{type:"timeout",target:c}),12e4);c.onerror=f.bind(null,c.onerror),c.onload=f.bind(null,c.onload),a&&document.head.appendChild(c)}},o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;o.g.importScripts&&(e=o.g.location+"");var t=o.g.document;if(!e&&t&&(t.currentScript&&"SCRIPT"===t.currentScript.tagName.toUpperCase()&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");if(r.length)for(var n=r.length-1;n>-1&&(!e||!/^http(s?):/.test(e));)e=r[n--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=e})();var i,u=function(){var e=document.currentScript;if(!e){for(var t=document.getElementsByTagName("script"),r=[],n=0;n{var e={792:0};o.f.j=(t,r)=>{var n=o.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var i=new Promise(((r,o)=>n=e[t]=[r,o]));r.push(n[2]=i);var u=o.p+o.u(t),c=new Error;o.l(u,(r=>{if(o.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var i=r&&("load"===r.type?"missing":r.type),u=r&&r.target&&r.target.src;c.message="Loading chunk "+t+" failed.\n("+i+": "+u+")",c.name="ChunkLoadError",c.type=i,c.request=u,n[1](c)}}),"chunk-"+t,t)}};var t=(t,r)=>{var n,i,[u,c,a]=r,l=0;if(u.some((t=>0!==e[t]))){for(n in c)o.o(c,n)&&(o.m[n]=c[n]);a&&a(o)}for(t&&t(r);ll.Ay});var l=o(6642);window.dash_quill=a})(); 2 | //# sourceMappingURL=dash_quill.min.js.map -------------------------------------------------------------------------------- /dash_quill/dash_quill.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"dash_quill.min.js","mappings":"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","sources":["webpack:///webpack/runtime/load script","webpack:///./src/lib/LazyLoader.js","webpack:///./src/lib/components/Quill.react.js","webpack:///external window \"PropTypes\"","webpack:///external window \"React\"","webpack:///external window \"ReactDOM\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/ensure chunk","webpack:///webpack/runtime/get javascript chunk filename","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/node module decorator","webpack:///webpack/runtime/publicPath","webpack:///webpack/runtime/compat","webpack:///webpack/runtime/jsonp chunk loading","webpack:///webpack/runtime/nonce"],"sourcesContent":["var inProgress = {};\nvar dataWebpackPrefix = \"dash_quill:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","export const Quill = React.lazy(() => import(/* webpackChunkName: \"Quill\" */ './fragments/Quill.react'));","import React, {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport { Quill as RealComponent } from '../LazyLoader';\n\n/**\n * ExampleComponent is an example component.\n * It takes a property, `label`, and\n * displays it.\n * It renders an input with the property `value`\n * which is editable by the user.\n */\nexport default class Quill extends Component {\n render() {\n return (\n \n \n \n );\n }\n}\n\nQuill.defaultProps = {\n //hasToolbar: true,\n maxLength: 140,\n modules: {\n toolbar: [\n [{ 'font': [] }],\n [{size: []}],\n ['bold', 'italic', 'underline'],\n [{'list': 'ordered'}, {'list': 'bullet'}],\n //['link', 'image'],\n //['clean']\n ], \n clipboard: {\n // toggle to add extra line breaks when pasting HTML:\n matchVisual: false,\n }\n },\n};\n\nQuill.propTypes = {\n /**\n * The ID used to identify this component in Dash callbacks.\n * slateContent={SlateRTE.deserializeHTMLString(value)}\n */\n id: PropTypes.string,\n\n // onChange: PropTypes.func,\n \n //hasToolbar: PropTypes.bool,\n \n /**\n * The value displayed in the input.\n */\n value: PropTypes.string,\n \n /**\n * The value displayed in the input.\n */\n maxLength: PropTypes.number,\n\n /**\n * The number of charaters in the editor (excl HTML)\n */\n charCount: PropTypes.number,\n /**\n * The toolbar options modules.\n * Should be {'toolbar':[list of options]}\n */\n modules: PropTypes.object,\n\n /**\n * Dash-assigned callback that should be called to report property changes\n * to Dash, to make them available for callbacks.\n */\n setProps: PropTypes.func\n };\n\n\nexport const defaultProps = Quill.defaultProps;\nexport const propTypes = Quill.propTypes;","module.exports = window[\"PropTypes\"];","module.exports = window[\"React\"];","module.exports = window[\"ReactDOM\"];","// 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\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\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__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + \"async-Quill\" + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\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};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","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_4m1735002721\");\n srcFragments.splice(-1, 1, fileFragments.join('.'))\n\n return srcFragments.join('/');\n };\n}\n","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkdash_quill\"] = self[\"webpackChunkdash_quill\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;"],"names":["inProgress","dataWebpackPrefix","Quill","React","lazy","_Component","_classCallCheck","_callSuper","arguments","_inherits","key","value","fallback","RealComponent","this","props","Component","defaultProps","maxLength","modules","toolbar","size","clipboard","matchVisual","propTypes","id","PropTypes","charCount","setProps","module","exports","window","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","loaded","__webpack_modules__","call","m","n","getter","__esModule","d","a","definition","o","Object","defineProperty","enumerable","get","f","e","chunkId","Promise","all","keys","reduce","promises","u","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","i","length","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","forEach","fn","setTimeout","bind","type","target","head","appendChild","r","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","location","currentScript","tagName","toUpperCase","test","Error","replace","p","getCurrentScript","doc_scripts","filter","async","text","textContent","slice","split","join","jsonpScriptSrc","__jsonpScriptSrc__","isLocal","srcFragments","fileFragments","splice","installedChunks","j","installedChunkData","promise","resolve","reject","error","errorType","realSrc","message","name","request","webpackJsonpCallback","parentChunkLoadingFunction","data","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","self"],"sourceRoot":""} -------------------------------------------------------------------------------- /dash_quill/metadata.json: -------------------------------------------------------------------------------- 1 | {"src/lib/components/Quill.react.js":{"description":"ExampleComponent is an example component.\nIt takes a property, `label`, and\ndisplays it.\nIt renders an input with the property `value`\nwhich is editable by the user.","displayName":"Quill","methods":[],"props":{"id":{"type":{"name":"string"},"required":false,"description":"The ID used to identify this component in Dash callbacks.\nslateContent={SlateRTE.deserializeHTMLString(value)}"},"value":{"type":{"name":"string"},"required":false,"description":"The value displayed in the input."},"maxLength":{"type":{"name":"number"},"required":false,"description":"The value displayed in the input.","defaultValue":{"value":"140","computed":false}},"charCount":{"type":{"name":"number"},"required":false,"description":"The number of charaters in the editor (excl HTML)"},"modules":{"type":{"name":"object"},"required":false,"description":"The toolbar options modules.\nShould be {'toolbar':[list of options]}","defaultValue":{"value":"{\n toolbar: [\n [{ 'font': [] }],\n [{size: []}],\n ['bold', 'italic', 'underline'],\n [{'list': 'ordered'}, {'list': 'bullet'}],\n //['link', 'image'],\n //['clean']\n ], \n clipboard: {\n // toggle to add extra line breaks when pasting HTML:\n matchVisual: false,\n }\n}","computed":false}},"setProps":{"type":{"name":"func"},"required":false,"description":"Dash-assigned callback that should be called to report property changes\nto Dash, to make them available for callbacks."}}}} -------------------------------------------------------------------------------- /dash_quill/package-info.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dash_quill", 3 | "version": "0.0.4", 4 | "description": "A Quill-Based Rich Text Editor Component for Dash", 5 | "main": "build/index.js", 6 | "scripts": { 7 | "start": "webpack serve --config ./webpack.serve.config.js --open", 8 | "validate-init": "python _validate_init.py", 9 | "prepublishOnly": "npm run validate-init", 10 | "build:js": "webpack --mode production", 11 | "build:backends": "dash-generate-components ./src/lib/components dash_quill -p package-info.json --r-prefix 'dre' --jl-prefix 'dre' --ignore \\.test\\.", 12 | "build:backends-activated": "(. venv/bin/activate || venv\\scripts\\activate && npm run build:backends)", 13 | "build": "npm run build:js && npm run build:backends", 14 | "build:activated": "npm run build:js && npm run build:backends-activated" 15 | }, 16 | "author": "Amien Johaadien ", 17 | "license": "MIT", 18 | "dependencies": { 19 | "ramda": "^0.26.1", 20 | "react-quill": "^2.0.0" 21 | }, 22 | "devDependencies": { 23 | "@babel/core": "^7.22.1", 24 | "@babel/plugin-proposal-object-rest-spread": "^7.20.7", 25 | "@babel/preset-env": "^7.22.2", 26 | "@babel/preset-react": "^7.22.3", 27 | "@plotly/dash-component-plugins": "^1.2.3", 28 | "@plotly/webpack-dash-dynamic-import": "^1.2.0", 29 | "babel-eslint": "^10.1.0", 30 | "babel-loader": "^9.1.2", 31 | "copyfiles": "^2.1.1", 32 | "css-loader": "^6.8.1", 33 | "eslint": "^6.0.1", 34 | "eslint-config-prettier": "^6.0.0", 35 | "eslint-plugin-import": "^2.18.0", 36 | "eslint-plugin-react": "^7.14.2", 37 | "prop-types": "^15.8.1", 38 | "react": "^16.8.6", 39 | "react-docgen": "^5.4.3", 40 | "react-dom": "^16.8.6", 41 | "style-loader": "^3.3.3", 42 | "styled-jsx": "^3.2.1", 43 | "webpack": "^5.84.1", 44 | "webpack-cli": "^5.1.1", 45 | "webpack-dev-server": "^4.15.0" 46 | }, 47 | "engines": { 48 | "node": ">=8.11.0", 49 | "npm": ">=6.1.0" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /deps/async-Quill.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /*! 2 | * Quill Editor v1.3.7 3 | * https://quilljs.com/ 4 | * Copyright (c) 2014, Jason Chen 5 | * Copyright (c) 2013, salesforce.com 6 | */ 7 | -------------------------------------------------------------------------------- /deps/dash_quill.min.js: -------------------------------------------------------------------------------- 1 | (()=>{"use strict";var e,t,r={6642:(e,t,r)=>{r.d(t,{Ay:()=>b,Gs:()=>y,tu:()=>m});var n=r(1609),o=r.n(n),i=r(6120),u=r.n(i),c=React.lazy((function(){return r.e(89).then(r.bind(r,2734))}));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 l(e,t){for(var r=0;r{e.exports=window.PropTypes},1609:e=>{e.exports=window.React},5795:e=>{e.exports=window.ReactDOM}},n={};function o(e){var t=n[e];if(void 0!==t)return t.exports;var i=n[e]={id:e,loaded:!1,exports:{}};return r[e].call(i.exports,i,i.exports,o),i.loaded=!0,i.exports}o.m=r,o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var r in t)o.o(t,r)&&!o.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o.f={},o.e=e=>Promise.all(Object.keys(o.f).reduce(((t,r)=>(o.f[r](e,t),t)),[])),o.u=e=>"async-Quill.js",o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="dash_quill:",o.l=(r,n,i,u)=>{if(e[r])e[r].push(n);else{var c,a;if(void 0!==i)for(var l=document.getElementsByTagName("script"),s=0;s{c.onerror=c.onload=null,clearTimeout(d);var o=e[r];if(delete e[r],c.parentNode&&c.parentNode.removeChild(c),o&&o.forEach((e=>e(n))),t)return t(n)},d=setTimeout(f.bind(null,void 0,{type:"timeout",target:c}),12e4);c.onerror=f.bind(null,c.onerror),c.onload=f.bind(null,c.onload),a&&document.head.appendChild(c)}},o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;o.g.importScripts&&(e=o.g.location+"");var t=o.g.document;if(!e&&t&&(t.currentScript&&"SCRIPT"===t.currentScript.tagName.toUpperCase()&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");if(r.length)for(var n=r.length-1;n>-1&&(!e||!/^http(s?):/.test(e));)e=r[n--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=e})();var i,u=function(){var e=document.currentScript;if(!e){for(var t=document.getElementsByTagName("script"),r=[],n=0;n{var e={792:0};o.f.j=(t,r)=>{var n=o.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var i=new Promise(((r,o)=>n=e[t]=[r,o]));r.push(n[2]=i);var u=o.p+o.u(t),c=new Error;o.l(u,(r=>{if(o.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var i=r&&("load"===r.type?"missing":r.type),u=r&&r.target&&r.target.src;c.message="Loading chunk "+t+" failed.\n("+i+": "+u+")",c.name="ChunkLoadError",c.type=i,c.request=u,n[1](c)}}),"chunk-"+t,t)}};var t=(t,r)=>{var n,i,[u,c,a]=r,l=0;if(u.some((t=>0!==e[t]))){for(n in c)o.o(c,n)&&(o.m[n]=c[n]);a&&a(o)}for(t&&t(r);ll.Ay});var l=o(6642);window.dash_quill=a})(); 2 | //# sourceMappingURL=dash_quill.min.js.map -------------------------------------------------------------------------------- /deps/dash_quill.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"dash_quill.min.js","mappings":"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","sources":["webpack:///webpack/runtime/load script","webpack:///./src/lib/LazyLoader.js","webpack:///./src/lib/components/Quill.react.js","webpack:///external window \"PropTypes\"","webpack:///external window \"React\"","webpack:///external window \"ReactDOM\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/ensure chunk","webpack:///webpack/runtime/get javascript chunk filename","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/node module decorator","webpack:///webpack/runtime/publicPath","webpack:///webpack/runtime/compat","webpack:///webpack/runtime/jsonp chunk loading","webpack:///webpack/runtime/nonce"],"sourcesContent":["var inProgress = {};\nvar dataWebpackPrefix = \"dash_quill:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","export const Quill = React.lazy(() => import(/* webpackChunkName: \"Quill\" */ './fragments/Quill.react'));","import React, {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport { Quill as RealComponent } from '../LazyLoader';\n\n/**\n * ExampleComponent is an example component.\n * It takes a property, `label`, and\n * displays it.\n * It renders an input with the property `value`\n * which is editable by the user.\n */\nexport default class Quill extends Component {\n render() {\n return (\n \n \n \n );\n }\n}\n\nQuill.defaultProps = {\n //hasToolbar: true,\n maxLength: 140,\n modules: {\n toolbar: [\n [{ 'font': [] }],\n [{size: []}],\n ['bold', 'italic', 'underline'],\n [{'list': 'ordered'}, {'list': 'bullet'}],\n //['link', 'image'],\n //['clean']\n ], \n clipboard: {\n // toggle to add extra line breaks when pasting HTML:\n matchVisual: false,\n }\n },\n};\n\nQuill.propTypes = {\n /**\n * The ID used to identify this component in Dash callbacks.\n * slateContent={SlateRTE.deserializeHTMLString(value)}\n */\n id: PropTypes.string,\n\n // onChange: PropTypes.func,\n \n //hasToolbar: PropTypes.bool,\n \n /**\n * The value displayed in the input.\n */\n value: PropTypes.string,\n \n /**\n * The value displayed in the input.\n */\n maxLength: PropTypes.number,\n\n /**\n * The number of charaters in the editor (excl HTML)\n */\n charCount: PropTypes.number,\n /**\n * The toolbar options modules.\n * Should be {'toolbar':[list of options]}\n */\n modules: PropTypes.object,\n\n /**\n * Dash-assigned callback that should be called to report property changes\n * to Dash, to make them available for callbacks.\n */\n setProps: PropTypes.func\n };\n\n\nexport const defaultProps = Quill.defaultProps;\nexport const propTypes = Quill.propTypes;","module.exports = window[\"PropTypes\"];","module.exports = window[\"React\"];","module.exports = window[\"ReactDOM\"];","// 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\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\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__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + \"async-Quill\" + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\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};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","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_4m1735002721\");\n srcFragments.splice(-1, 1, fileFragments.join('.'))\n\n return srcFragments.join('/');\n };\n}\n","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkdash_quill\"] = self[\"webpackChunkdash_quill\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;"],"names":["inProgress","dataWebpackPrefix","Quill","React","lazy","_Component","_classCallCheck","_callSuper","arguments","_inherits","key","value","fallback","RealComponent","this","props","Component","defaultProps","maxLength","modules","toolbar","size","clipboard","matchVisual","propTypes","id","PropTypes","charCount","setProps","module","exports","window","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","loaded","__webpack_modules__","call","m","n","getter","__esModule","d","a","definition","o","Object","defineProperty","enumerable","get","f","e","chunkId","Promise","all","keys","reduce","promises","u","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","i","length","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","forEach","fn","setTimeout","bind","type","target","head","appendChild","r","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","location","currentScript","tagName","toUpperCase","test","Error","replace","p","getCurrentScript","doc_scripts","filter","async","text","textContent","slice","split","join","jsonpScriptSrc","__jsonpScriptSrc__","isLocal","srcFragments","fileFragments","splice","installedChunks","j","installedChunkData","promise","resolve","reject","error","errorType","realSrc","message","name","request","webpackJsonpCallback","parentChunkLoadingFunction","data","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","self"],"sourceRoot":""} -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | my-dash-component 5 | 6 | 7 |
8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /inst/deps/async-Quill.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /*! 2 | * Quill Editor v1.3.7 3 | * https://quilljs.com/ 4 | * Copyright (c) 2014, Jason Chen 5 | * Copyright (c) 2013, salesforce.com 6 | */ 7 | -------------------------------------------------------------------------------- /inst/deps/dash_quill.min.js: -------------------------------------------------------------------------------- 1 | (()=>{"use strict";var e,t,r={6642:(e,t,r)=>{r.d(t,{Ay:()=>b,Gs:()=>y,tu:()=>m});var n=r(1609),o=r.n(n),i=r(6120),u=r.n(i),c=React.lazy((function(){return r.e(89).then(r.bind(r,2734))}));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 l(e,t){for(var r=0;r{e.exports=window.PropTypes},1609:e=>{e.exports=window.React},5795:e=>{e.exports=window.ReactDOM}},n={};function o(e){var t=n[e];if(void 0!==t)return t.exports;var i=n[e]={id:e,loaded:!1,exports:{}};return r[e].call(i.exports,i,i.exports,o),i.loaded=!0,i.exports}o.m=r,o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var r in t)o.o(t,r)&&!o.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o.f={},o.e=e=>Promise.all(Object.keys(o.f).reduce(((t,r)=>(o.f[r](e,t),t)),[])),o.u=e=>"async-Quill.js",o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="dash_quill:",o.l=(r,n,i,u)=>{if(e[r])e[r].push(n);else{var c,a;if(void 0!==i)for(var l=document.getElementsByTagName("script"),s=0;s{c.onerror=c.onload=null,clearTimeout(d);var o=e[r];if(delete e[r],c.parentNode&&c.parentNode.removeChild(c),o&&o.forEach((e=>e(n))),t)return t(n)},d=setTimeout(f.bind(null,void 0,{type:"timeout",target:c}),12e4);c.onerror=f.bind(null,c.onerror),c.onload=f.bind(null,c.onload),a&&document.head.appendChild(c)}},o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;o.g.importScripts&&(e=o.g.location+"");var t=o.g.document;if(!e&&t&&(t.currentScript&&"SCRIPT"===t.currentScript.tagName.toUpperCase()&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");if(r.length)for(var n=r.length-1;n>-1&&(!e||!/^http(s?):/.test(e));)e=r[n--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=e})();var i,u=function(){var e=document.currentScript;if(!e){for(var t=document.getElementsByTagName("script"),r=[],n=0;n{var e={792:0};o.f.j=(t,r)=>{var n=o.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var i=new Promise(((r,o)=>n=e[t]=[r,o]));r.push(n[2]=i);var u=o.p+o.u(t),c=new Error;o.l(u,(r=>{if(o.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var i=r&&("load"===r.type?"missing":r.type),u=r&&r.target&&r.target.src;c.message="Loading chunk "+t+" failed.\n("+i+": "+u+")",c.name="ChunkLoadError",c.type=i,c.request=u,n[1](c)}}),"chunk-"+t,t)}};var t=(t,r)=>{var n,i,[u,c,a]=r,l=0;if(u.some((t=>0!==e[t]))){for(n in c)o.o(c,n)&&(o.m[n]=c[n]);a&&a(o)}for(t&&t(r);ll.Ay});var l=o(6642);window.dash_quill=a})(); 2 | //# sourceMappingURL=dash_quill.min.js.map -------------------------------------------------------------------------------- /inst/deps/dash_quill.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"dash_quill.min.js","mappings":"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","sources":["webpack:///webpack/runtime/load script","webpack:///./src/lib/LazyLoader.js","webpack:///./src/lib/components/Quill.react.js","webpack:///external window \"PropTypes\"","webpack:///external window \"React\"","webpack:///external window \"ReactDOM\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/ensure chunk","webpack:///webpack/runtime/get javascript chunk filename","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/node module decorator","webpack:///webpack/runtime/publicPath","webpack:///webpack/runtime/compat","webpack:///webpack/runtime/jsonp chunk loading","webpack:///webpack/runtime/nonce"],"sourcesContent":["var inProgress = {};\nvar dataWebpackPrefix = \"dash_quill:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","export const Quill = React.lazy(() => import(/* webpackChunkName: \"Quill\" */ './fragments/Quill.react'));","import React, {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport { Quill as RealComponent } from '../LazyLoader';\n\n/**\n * ExampleComponent is an example component.\n * It takes a property, `label`, and\n * displays it.\n * It renders an input with the property `value`\n * which is editable by the user.\n */\nexport default class Quill extends Component {\n render() {\n return (\n \n \n \n );\n }\n}\n\nQuill.defaultProps = {\n //hasToolbar: true,\n maxLength: 140,\n modules: {\n toolbar: [\n [{ 'font': [] }],\n [{size: []}],\n ['bold', 'italic', 'underline'],\n [{'list': 'ordered'}, {'list': 'bullet'}],\n //['link', 'image'],\n //['clean']\n ], \n clipboard: {\n // toggle to add extra line breaks when pasting HTML:\n matchVisual: false,\n }\n },\n};\n\nQuill.propTypes = {\n /**\n * The ID used to identify this component in Dash callbacks.\n * slateContent={SlateRTE.deserializeHTMLString(value)}\n */\n id: PropTypes.string,\n\n // onChange: PropTypes.func,\n \n //hasToolbar: PropTypes.bool,\n \n /**\n * The value displayed in the input.\n */\n value: PropTypes.string,\n \n /**\n * The value displayed in the input.\n */\n maxLength: PropTypes.number,\n\n /**\n * The number of charaters in the editor (excl HTML)\n */\n charCount: PropTypes.number,\n /**\n * The toolbar options modules.\n * Should be {'toolbar':[list of options]}\n */\n modules: PropTypes.object,\n\n /**\n * Dash-assigned callback that should be called to report property changes\n * to Dash, to make them available for callbacks.\n */\n setProps: PropTypes.func\n };\n\n\nexport const defaultProps = Quill.defaultProps;\nexport const propTypes = Quill.propTypes;","module.exports = window[\"PropTypes\"];","module.exports = window[\"React\"];","module.exports = window[\"ReactDOM\"];","// 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\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\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__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + \"async-Quill\" + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\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};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","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_4m1735002721\");\n srcFragments.splice(-1, 1, fileFragments.join('.'))\n\n return srcFragments.join('/');\n };\n}\n","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkdash_quill\"] = self[\"webpackChunkdash_quill\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;"],"names":["inProgress","dataWebpackPrefix","Quill","React","lazy","_Component","_classCallCheck","_callSuper","arguments","_inherits","key","value","fallback","RealComponent","this","props","Component","defaultProps","maxLength","modules","toolbar","size","clipboard","matchVisual","propTypes","id","PropTypes","charCount","setProps","module","exports","window","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","loaded","__webpack_modules__","call","m","n","getter","__esModule","d","a","definition","o","Object","defineProperty","enumerable","get","f","e","chunkId","Promise","all","keys","reduce","promises","u","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","i","length","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","forEach","fn","setTimeout","bind","type","target","head","appendChild","r","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","location","currentScript","tagName","toUpperCase","test","Error","replace","p","getCurrentScript","doc_scripts","filter","async","text","textContent","slice","split","join","jsonpScriptSrc","__jsonpScriptSrc__","isLocal","srcFragments","fileFragments","splice","installedChunks","j","installedChunkData","promise","resolve","reject","error","errorType","realSrc","message","name","request","webpackJsonpCallback","parentChunkLoadingFunction","data","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","self"],"sourceRoot":""} -------------------------------------------------------------------------------- /man/dreQuill.Rd: -------------------------------------------------------------------------------- 1 | % Auto-generated: do not edit by hand 2 | \name{dreQuill} 3 | 4 | \alias{dreQuill} 5 | 6 | \title{Quill component} 7 | 8 | \description{ 9 | ExampleComponent is an example component. It takes a property, `label`, and displays it. It renders an input with the property `value` which is editable by the user. 10 | } 11 | 12 | \usage{ 13 | dreQuill(id=NULL, charCount=NULL, maxLength=NULL, modules=NULL, 14 | value=NULL) 15 | } 16 | 17 | \arguments{ 18 | \item{id}{Character. The ID used to identify this component in Dash callbacks. 19 | slateContent={SlateRTE.deserializeHTMLString(value)}} 20 | 21 | \item{charCount}{Numeric. The number of charaters in the editor (excl HTML)} 22 | 23 | \item{maxLength}{Numeric. The value displayed in the input.} 24 | 25 | \item{modules}{Named list. The toolbar options modules. 26 | Should be {'toolbar':[list of options]}} 27 | 28 | \item{value}{Character. The value displayed in the input.} 29 | } 30 | 31 | \value{named list of JSON elements corresponding to React.js properties and their values} 32 | 33 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dash_quill", 3 | "version": "0.0.4", 4 | "description": "A Quill-Based Rich Text Editor Component for Dash", 5 | "main": "build/index.js", 6 | "scripts": { 7 | "start": "webpack serve --config ./webpack.serve.config.js --open", 8 | "validate-init": "python _validate_init.py", 9 | "prepublishOnly": "npm run validate-init", 10 | "build:js": "webpack --mode production", 11 | "build:backends": "dash-generate-components ./src/lib/components dash_quill -p package-info.json --r-prefix 'dre' --jl-prefix 'dre' --ignore \\.test\\.", 12 | "build:backends-activated": "(. venv/bin/activate || venv\\scripts\\activate && npm run build:backends)", 13 | "build": "npm run build:js && npm run build:backends", 14 | "build:activated": "npm run build:js && npm run build:backends-activated" 15 | }, 16 | "author": "Amien Johaadien ", 17 | "license": "MIT", 18 | "dependencies": { 19 | "ramda": "^0.26.1", 20 | "react-quill": "^2.0.0" 21 | }, 22 | "devDependencies": { 23 | "@babel/core": "^7.22.1", 24 | "@babel/plugin-proposal-object-rest-spread": "^7.20.7", 25 | "@babel/preset-env": "^7.22.2", 26 | "@babel/preset-react": "^7.22.3", 27 | "@plotly/dash-component-plugins": "^1.2.3", 28 | "@plotly/webpack-dash-dynamic-import": "^1.2.0", 29 | "babel-eslint": "^10.1.0", 30 | "babel-loader": "^9.1.2", 31 | "copyfiles": "^2.1.1", 32 | "css-loader": "^6.8.1", 33 | "eslint": "^6.0.1", 34 | "eslint-config-prettier": "^6.0.0", 35 | "eslint-plugin-import": "^2.18.0", 36 | "eslint-plugin-react": "^7.14.2", 37 | "prop-types": "^15.8.1", 38 | "react": "^16.8.6", 39 | "react-docgen": "^5.4.3", 40 | "react-dom": "^16.8.6", 41 | "style-loader": "^3.3.3", 42 | "styled-jsx": "^3.2.1", 43 | "webpack": "^5.84.1", 44 | "webpack-cli": "^5.1.1", 45 | "webpack-dev-server": "^4.15.0" 46 | }, 47 | "engines": { 48 | "node": ">=8.11.0", 49 | "npm": ">=6.1.0" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | testpaths = tests/ 3 | addopts = -rsxX -vv 4 | log_format = %(asctime)s | %(levelname)s | %(name)s:%(lineno)d | %(message)s 5 | log_cli_level = ERROR 6 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # dash is required to call `build:py` 2 | dash[dev]>=2.0.0 3 | -------------------------------------------------------------------------------- /review_checklist.md: -------------------------------------------------------------------------------- 1 | # Code Review Checklist 2 | 3 | ## Code quality & design 4 | 5 | - Is your code clear? If you had to go back to it in a month, would you be happy to? If someone else had to contribute to it, would they be able to? 6 | 7 | A few suggestions: 8 | 9 | - Make your variable names descriptive and use the same naming conventions throughout the code. 10 | 11 | - For more complex pieces of logic, consider putting a comment, and maybe an example. 12 | 13 | - In the comments, focus on describing _why_ the code does what it does, rather than describing _what_ it does. The reader can most likely read the code, but not necessarily understand why it was necessary. 14 | 15 | - Don't overdo it in the comments. The code should be clear enough to speak for itself. Stale comments that no longer reflect the intent of the code can hurt code comprehension. 16 | 17 | * Don't repeat yourself. Any time you see that the same piece of logic can be applied in multiple places, factor it out into a function, or variable, and reuse that code. 18 | * Scan your code for expensive operations (large computations, DOM queries, React re-renders). Have you done your possible to limit their impact? If not, it is going to slow your app down. 19 | * Can you think of cases where your current code will break? How are you handling errors? Should the user see them as notifications? Should your app try to auto-correct them for them? 20 | 21 | ## Component API 22 | 23 | - Have you tested your component on the Python side by creating an app in `usage.py` ? 24 | 25 | Do all of your component's props work when set from the back-end? 26 | 27 | Should all of them be settable from the back-end or are some only relevant to user interactions in the front-end? 28 | 29 | - Have you provided some basic documentation about your component? The Dash community uses [react docstrings](https://github.com/plotly/dash-docs/blob/master/tutorial/plugins.py#L45) to provide basic information about dash components. Take a look at this [Checklist component example](https://github.com/plotly/dash-core-components/blob/master/src/components/Checklist.react.js) and others from the dash-core-components repository. 30 | 31 | At a minimum, you should describe what your component does, and describe its props and the features they enable. 32 | 33 | Be careful to use the correct formatting for your docstrings for them to be properly recognized. 34 | 35 | ## Tests 36 | 37 | - The Dash team uses integration tests extensively, and we highly encourage you to write tests for the main functionality of your component. In the `tests` folder of the boilerplate, you can see a sample integration test. By launching it, you will run a sample Dash app in a browser. You can run the test with: 38 | ``` 39 | python -m tests.test_render 40 | ``` 41 | [Browse the Dash component code on GitHub for more examples of testing.](https://github.com/plotly/dash-core-components) 42 | 43 | ## Ready to publish? Final scan 44 | 45 | - Take a last look at the external resources that your component is using. Are all the external resources used [referenced in `MANIFEST.in`](https://github.com/plotly/dash-docs/blob/0b2fd8f892db720a7f3dc1c404b4cff464b5f8d4/tutorial/plugins.py#L55)? 46 | 47 | - [You're ready to publish!](https://github.com/plotly/dash-component-boilerplate/blob/master/%7B%7Bcookiecutter.project_shortname%7D%7D/README.md#create-a-production-build-and-publish) 48 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import json 2 | from setuptools import setup 3 | from pathlib import Path 4 | 5 | here = Path(__file__).parent 6 | with open('package.json') as f: 7 | package = json.load(f) 8 | long_description = (here / 'README.md').read_text() 9 | 10 | package_name = package["name"].replace(" ", "_").replace("-", "_") 11 | 12 | setup( 13 | name=package_name, 14 | version=package["version"], 15 | author=package['author'], 16 | packages=[package_name], 17 | include_package_data=True, 18 | license=package['license'], 19 | description=package.get('description', package_name), 20 | long_description=long_description, 21 | long_description_content_type="text/markdown", 22 | install_requires=[], 23 | classifiers = [ 24 | 'Framework :: Dash', 25 | ], 26 | ) 27 | -------------------------------------------------------------------------------- /src/DashQuill.jl: -------------------------------------------------------------------------------- 1 | 2 | module DashQuill 3 | using Dash 4 | 5 | const resources_path = realpath(joinpath( @__DIR__, "..", "deps")) 6 | const version = "0.0.4" 7 | 8 | include("jl/dre_quill.jl") 9 | 10 | function __init__() 11 | DashBase.register_package( 12 | DashBase.ResourcePkg( 13 | "dash_quill", 14 | resources_path, 15 | version = version, 16 | [ 17 | DashBase.Resource( 18 | relative_package_path = "async-Quill.js", 19 | external_url = "https://unpkg.com/dash_quill@0.0.4/dash_quill/async-Quill.js", 20 | dynamic = nothing, 21 | async = :true, 22 | type = :js 23 | ), 24 | DashBase.Resource( 25 | relative_package_path = "async-Quill.js.map", 26 | external_url = "https://unpkg.com/dash_quill@0.0.4/dash_quill/async-Quill.js.map", 27 | dynamic = true, 28 | async = nothing, 29 | type = :js 30 | ), 31 | DashBase.Resource( 32 | relative_package_path = "dash_quill.min.js", 33 | external_url = "https://unpkg.com/dash_quill@0.0.4/dash_quill/dash_quill.min.js", 34 | dynamic = nothing, 35 | async = nothing, 36 | type = :js 37 | ), 38 | DashBase.Resource( 39 | relative_package_path = "dash_quill.min.js.map", 40 | external_url = "https://unpkg.com/dash_quill@0.0.4/dash_quill/dash_quill.min.js.map", 41 | dynamic = true, 42 | async = nothing, 43 | type = :js 44 | ) 45 | ] 46 | ) 47 | 48 | ) 49 | end 50 | end 51 | -------------------------------------------------------------------------------- /src/demo/App.js: -------------------------------------------------------------------------------- 1 | /* eslint no-magic-numbers: 0 */ 2 | import React, {Component} from 'react'; 3 | 4 | import { Quill } from '../lib'; 5 | 6 | class App extends Component { 7 | 8 | constructor() { 9 | super(); 10 | this.state = { 11 | value: '' 12 | }; 13 | this.setProps = this.setProps.bind(this); 14 | } 15 | 16 | setProps(newProps) { 17 | this.setState(newProps); 18 | } 19 | 20 | render() { 21 | return ( 22 |
23 | 27 |
28 | ) 29 | } 30 | } 31 | 32 | export default App; 33 | -------------------------------------------------------------------------------- /src/demo/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | 5 | ReactDOM.render(, document.getElementById('root')); 6 | -------------------------------------------------------------------------------- /src/jl/dre_quill.jl: -------------------------------------------------------------------------------- 1 | # AUTO GENERATED FILE - DO NOT EDIT 2 | 3 | export dre_quill 4 | 5 | """ 6 | dre_quill(;kwargs...) 7 | 8 | A Quill component. 9 | ExampleComponent is an example component. 10 | It takes a property, `label`, and 11 | displays it. 12 | It renders an input with the property `value` 13 | which is editable by the user. 14 | Keyword arguments: 15 | - `id` (String; optional): The ID used to identify this component in Dash callbacks. 16 | slateContent={SlateRTE.deserializeHTMLString(value)} 17 | - `charCount` (Real; optional): The number of charaters in the editor (excl HTML) 18 | - `maxLength` (Real; optional): The value displayed in the input. 19 | - `modules` (Dict; optional): The toolbar options modules. 20 | Should be {'toolbar':[list of options]} 21 | - `value` (String; optional): The value displayed in the input. 22 | """ 23 | function dre_quill(; kwargs...) 24 | available_props = Symbol[:id, :charCount, :maxLength, :modules, :value] 25 | wild_props = Symbol[] 26 | return Component("dre_quill", "Quill", "dash_quill", available_props, wild_props; kwargs...) 27 | end 28 | 29 | -------------------------------------------------------------------------------- /src/lib/LazyLoader.js: -------------------------------------------------------------------------------- 1 | export const Quill = React.lazy(() => import(/* webpackChunkName: "Quill" */ './fragments/Quill.react')); -------------------------------------------------------------------------------- /src/lib/components/Quill.react.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { Quill as RealComponent } from '../LazyLoader'; 4 | 5 | /** 6 | * ExampleComponent is an example component. 7 | * It takes a property, `label`, and 8 | * displays it. 9 | * It renders an input with the property `value` 10 | * which is editable by the user. 11 | */ 12 | export default class Quill extends Component { 13 | render() { 14 | return ( 15 | 16 | 17 | 18 | ); 19 | } 20 | } 21 | 22 | Quill.defaultProps = { 23 | //hasToolbar: true, 24 | maxLength: 140, 25 | modules: { 26 | toolbar: [ 27 | [{ 'font': [] }], 28 | [{size: []}], 29 | ['bold', 'italic', 'underline'], 30 | [{'list': 'ordered'}, {'list': 'bullet'}], 31 | //['link', 'image'], 32 | //['clean'] 33 | ], 34 | clipboard: { 35 | // toggle to add extra line breaks when pasting HTML: 36 | matchVisual: false, 37 | } 38 | }, 39 | }; 40 | 41 | Quill.propTypes = { 42 | /** 43 | * The ID used to identify this component in Dash callbacks. 44 | * slateContent={SlateRTE.deserializeHTMLString(value)} 45 | */ 46 | id: PropTypes.string, 47 | 48 | // onChange: PropTypes.func, 49 | 50 | //hasToolbar: PropTypes.bool, 51 | 52 | /** 53 | * The value displayed in the input. 54 | */ 55 | value: PropTypes.string, 56 | 57 | /** 58 | * The value displayed in the input. 59 | */ 60 | maxLength: PropTypes.number, 61 | 62 | /** 63 | * The number of charaters in the editor (excl HTML) 64 | */ 65 | charCount: PropTypes.number, 66 | /** 67 | * The toolbar options modules. 68 | * Should be {'toolbar':[list of options]} 69 | */ 70 | modules: PropTypes.object, 71 | 72 | /** 73 | * Dash-assigned callback that should be called to report property changes 74 | * to Dash, to make them available for callbacks. 75 | */ 76 | setProps: PropTypes.func 77 | }; 78 | 79 | 80 | export const defaultProps = Quill.defaultProps; 81 | export const propTypes = Quill.propTypes; -------------------------------------------------------------------------------- /src/lib/fragments/Quill.react.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { defaultProps, propTypes } from '../components/Quill.react'; 4 | import ReactQuill from 'react-quill'; 5 | import 'react-quill/dist/quill.snow.css'; 6 | 7 | /** 8 | * ExampleComponent is an example component. 9 | * It takes a property, `label`, and 10 | * displays it. 11 | * It renders an input with the property `value` 12 | * which is editable by the user. 13 | */ 14 | export default class Quill extends Component { 15 | 16 | constructor(props) { 17 | super(props) 18 | this.state = { editorHtml: this.props.value, theme: 'snow' } 19 | this.handleChange = this.handleChange.bind(this) 20 | this.reactQuillRef = React.createRef(); 21 | this.quillRef = null; // Quill instance 22 | this.newToolbar = this.props.modules 23 | } 24 | 25 | handleChange(html, delta, source, editor) { 26 | console.log('TRIGGERED handleChange'); 27 | //if (editor.getLength() < this.props.maxLength) { 28 | console.log('LENGTH IS GOOD'); 29 | console.log(this.props.value); 30 | //this.setState({ editorHtml: html }); 31 | this.props.setProps({ value: html }); 32 | this.props.setProps({ charCount: editor.getLength() }) 33 | //} 34 | } 35 | 36 | checkCharacterCount = (event) => { 37 | console.log('TRIGGERED checkCharacterCount'); 38 | 39 | const unprivilegedEditor = this.reactQuillRef.current.unprivilegedEditor; 40 | if (unprivilegedEditor.getLength() > this.props.maxLength && event.key !== 'Backspace') 41 | event.preventDefault(); 42 | }; 43 | 44 | handleThemeChange(newTheme) { 45 | if (newTheme === "core") newTheme = null; 46 | this.setState({ theme: newTheme }) 47 | } 48 | componentDidMount() { 49 | console.log('componentDidMount') 50 | this.attachQuillRefs() 51 | } 52 | 53 | componentDidUpdate() { 54 | console.log('componentDidUpdate') 55 | this.attachQuillRefs() 56 | } 57 | 58 | attachQuillRefs = () => { 59 | 60 | if (typeof this.reactQuillRef.getEditor !== 'function') return; 61 | console.log('Triggered GETEDITOR') 62 | this.quillRef = this.reactQuillRef.getEditor(); 63 | } 64 | render() { 65 | return ( < div > 66 | < 67 | ReactQuill ref = { this.reactQuillRef } 68 | id = { this.props.id } 69 | theme = { this.state.theme } 70 | onKeyDown = { this.checkCharacterCount } 71 | onChange = { this.handleChange } 72 | value = { this.props.value || '' } 73 | //modules={this.props.hasToolbar ? Quill.modules : Quill.modulesNoToolbar} 74 | modules = { this.props.modules } 75 | formats = { Quill.formats } 76 | bounds = { '.app' } 77 | placeholder = { this.props.placeholder } 78 | /> 79 | ) 80 | } 81 | } 82 | 83 | /* 84 | * Quill modules to attach to editor 85 | * See https://quilljs.com/docs/modules/ for complete options 86 | */ 87 | Quill.modules = { 88 | toolbar: [ 89 | [{ 'header': '1' }, { 'header': '2' }, { 'font': [] }], 90 | [{ size: [] }], 91 | ['bold', 'italic', 'underline', 'strike', 'blockquote'], 92 | [{ 'list': 'ordered' }, { 'list': 'bullet' }, 93 | { 'indent': '-1' }, { 'indent': '+1' } 94 | ], 95 | ['link', 'image'], 96 | ['clean'] 97 | ], 98 | clipboard: { 99 | // toggle to add extra line breaks when pasting HTML: 100 | matchVisual: false, 101 | } 102 | } 103 | 104 | Quill.modulesNoToolbar = { 105 | toolbar: false, 106 | clipboard: { 107 | // toggle to add extra line breaks when pasting HTML: 108 | matchVisual: false, 109 | } 110 | } 111 | 112 | /* 113 | * Quill editor formats 114 | * See https://quilljs.com/docs/formats/ 115 | */ 116 | Quill.formats = [ 117 | 'header', 'font', 'size', 118 | 'bold', 'italic', 'underline', 'strike', 'blockquote', 119 | 'list', 'bullet', 'indent', 120 | 'link', 'image' 121 | ] 122 | 123 | 124 | Quill.defaultProps = defaultProps; 125 | Quill.propTypes = propTypes; -------------------------------------------------------------------------------- /src/lib/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/prefer-default-export */ 2 | import Quill from './components/Quill.react'; 3 | 4 | export { 5 | Quill 6 | }; 7 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pandamodium/dash-quill/b54d23c0640bd37e4dc6e5c5e23955d7fa738cc1/tests/__init__.py -------------------------------------------------------------------------------- /tests/requirements.txt: -------------------------------------------------------------------------------- 1 | # Packages needed to run the tests. 2 | # Switch into a virtual environment 3 | # pip install -r requirements.txt 4 | 5 | dash[dev,testing]>=1.15.0 6 | -------------------------------------------------------------------------------- /tests/test_usage.py: -------------------------------------------------------------------------------- 1 | from dash.testing.application_runners import import_app 2 | 3 | 4 | # Basic test for the component rendering. 5 | # The dash_duo pytest fixture is installed with dash (v1.0+) 6 | def test_render_component(dash_duo): 7 | # Start a dash app contained as the variable `app` in `usage.py` 8 | app = import_app('usage') 9 | dash_duo.start_server(app) 10 | 11 | # Get the generated component input with selenium 12 | # The html input will be a children of the #input dash component 13 | my_component = dash_duo.find_element('#input > input') 14 | 15 | assert 'my-value' == my_component.get_attribute('value') 16 | 17 | # Clear the input 18 | dash_duo.clear_input(my_component) 19 | 20 | # Send keys to the custom input. 21 | my_component.send_keys('Hello dash') 22 | 23 | # Wait for the text to equal, if after the timeout (default 10 seconds) 24 | # the text is not equal it will fail the test. 25 | dash_duo.wait_for_text_to_equal('#output', 'You have entered Hello dash') 26 | -------------------------------------------------------------------------------- /usage.py: -------------------------------------------------------------------------------- 1 | import dash_quill 2 | from dash import Dash, callback, dcc, html, Input, Output, State 3 | 4 | app = Dash(__name__) 5 | quill_mods = [ 6 | [{ 'header': '1'}, {'header': '2'}, { 'font': [] }], 7 | [{'size': []}], 8 | ['bold', 'italic', 'underline', 'strike', 'blockquote'], 9 | [{'list': 'ordered'}, {'list': 'bullet'}, 10 | {'indent': '-1'}, {'indent': '+1'}], 11 | ['link', 'image'], 12 | ['clean'] 13 | ] 14 | app.layout = html.Div([ 15 | dash_quill.Quill( 16 | id='input', 17 | value='my-value-is different', 18 | maxLength=70, 19 | modules={'toolbar':quill_mods,'clipboard':{'matchVisual': False,}} 20 | # label='my-label' 21 | ), 22 | html.Div(id='output'), 23 | dash_quill.Quill( 24 | id='input2', 25 | value='my-value', 26 | maxLength=70, 27 | modules={'toolbar':False,'clipboard':{'matchVisual': False,}} 28 | # label='my-label' 29 | ), 30 | html.Br(), 31 | dash_quill.Quill( 32 | id='input3', 33 | value='my-value', 34 | maxLength=70, 35 | # label='my-label' 36 | ), 37 | html.Br(), 38 | dcc.Textarea(id='test-text',value='PLACEHOLDER') 39 | ]) 40 | 41 | 42 | @callback(Output('output', 'children'), [Input('input', 'value')],[State('input', 'charCount')]) 43 | def display_output(value,charCount): 44 | return 'You have entered {0} and nochars is {1}'.format(value,charCount) 45 | 46 | @callback(Output('test-text', 'value'), [Input('input', 'value')],[State('input', 'charCount')]) 47 | def display_output2(value,charCount): 48 | return 'You have entered {0} and nochars is {1}'.format(value,charCount) 49 | 50 | @callback(Output('input3', 'value'), [Input('input', 'value')],[State('input', 'charCount')]) 51 | def display_output2(value,charCount): 52 | return 'You have entered {0} and nochars is {1}'.format(value,charCount) 53 | 54 | 55 | if __name__ == '__main__': 56 | app.run(debug=True) 57 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const webpack = require('webpack'); 3 | const WebpackDashDynamicImport = require('@plotly/webpack-dash-dynamic-import'); 4 | const packagejson = require('./package.json'); 5 | 6 | const dashLibraryName = packagejson.name.replace(/-/g, '_'); 7 | 8 | module.exports = (env, argv) => { 9 | 10 | let mode; 11 | 12 | const overrides = module.exports || {}; 13 | 14 | // if user specified mode flag take that value 15 | if (argv && argv.mode) { 16 | mode = argv.mode; 17 | } 18 | 19 | // else if configuration object is already set (module.exports) use that value 20 | else if (overrides.mode) { 21 | mode = overrides.mode; 22 | } 23 | 24 | // else take webpack default (production) 25 | else { 26 | mode = 'production'; 27 | } 28 | 29 | let filename = (overrides.output || {}).filename; 30 | if(!filename) { 31 | const modeSuffix = mode === 'development' ? 'dev' : 'min'; 32 | filename = `${dashLibraryName}.${modeSuffix}.js`; 33 | } 34 | 35 | const entry = overrides.entry || {main: './src/lib/index.js'}; 36 | 37 | const devtool = overrides.devtool || 'source-map'; 38 | 39 | const externals = ('externals' in overrides) ? overrides.externals : ({ 40 | react: 'React', 41 | 'react-dom': 'ReactDOM', 42 | 'plotly.js': 'Plotly', 43 | 'prop-types': 'PropTypes', 44 | }); 45 | 46 | return { 47 | mode, 48 | entry, 49 | output: { 50 | path: path.resolve(__dirname, dashLibraryName), 51 | chunkFilename: '[name].js', 52 | filename, 53 | library: dashLibraryName, 54 | libraryTarget: 'window', 55 | }, 56 | devtool, 57 | devServer: { 58 | static: { 59 | directory: path.join(__dirname, '/') 60 | } 61 | }, 62 | externals, 63 | module: { 64 | rules: [ 65 | { 66 | test: /\.jsx?$/, 67 | exclude: /node_modules/, 68 | use: { 69 | loader: 'babel-loader', 70 | }, 71 | }, 72 | { 73 | test: /\.css$/, 74 | use: [ 75 | { 76 | loader: 'style-loader', 77 | }, 78 | { 79 | loader: 'css-loader', 80 | }, 81 | ], 82 | }, 83 | ], 84 | }, 85 | optimization: { 86 | splitChunks: { 87 | name: '[name].js', 88 | cacheGroups: { 89 | async: { 90 | chunks: 'async', 91 | minSize: 0, 92 | name(module, chunks, cacheGroupKey) { 93 | return `${cacheGroupKey}-${chunks[0].name}`; 94 | } 95 | }, 96 | shared: { 97 | chunks: 'all', 98 | minSize: 0, 99 | minChunks: 2, 100 | name: 'dash_quill-shared' 101 | } 102 | } 103 | } 104 | }, 105 | plugins: [ 106 | new WebpackDashDynamicImport(), 107 | new webpack.SourceMapDevToolPlugin({ 108 | filename: '[file].map', 109 | exclude: ['async-plotlyjs'] 110 | }) 111 | ] 112 | } 113 | }; 114 | -------------------------------------------------------------------------------- /webpack.serve.config.js: -------------------------------------------------------------------------------- 1 | const config = require('./webpack.config.js'); 2 | const path = require('path'); 3 | 4 | config.entry = {main: './src/demo/index.js'}; 5 | config.output = { 6 | filename: './output.js', 7 | path: path.resolve(__dirname), 8 | }; 9 | config.mode = 'development'; 10 | config.externals = undefined; // eslint-disable-line 11 | config.devtool = 'inline-source-map'; 12 | module.exports = config; 13 | --------------------------------------------------------------------------------