diff --git a/.circleci/config.yml b/.circleci/config.yml index bbae13d8e..d0c5499ca 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -49,11 +49,40 @@ jobs: command: npm run build:py - run: - name: Run hosts + name: Run tests command: | . venv/bin/activate npm run test + + "visual-test": + docker: + - image: circleci/node:8.11.3-browsers + + steps: + - checkout + + - restore_cache: + key: deps1-{{ .Branch }}-{{ checksum "npm-shrinkwrap.json" }}-{{ checksum "package.json" }} + + - run: + name: Install package.json + command: npm i + + - save_cache: + key: deps1-{{ .Branch }}-{{ checksum "npm-shrinkwrap.json" }}-{{ checksum "package.json" }} + paths: + - node_modules + + - run: + name: Run build:js + command: npm run build:js + + - run: + name: Run visual tests + command: npm run test.visual + + "node": docker: - image: circleci/node:8.11.3 @@ -114,20 +143,6 @@ jobs: paths: - "venv" - - run: - name: Run black - command: | - . venv/bin/activate - black tests/dash --check - when: always - - - run: - name: Run pylint - command: | - . venv/bin/activate - flake8 tests.dash - when: always - - run: name: Run integration tests command: | @@ -143,3 +158,4 @@ workflows: - "python-3.6" - "node" - "test" + - "visual-test" diff --git a/.config/webpack/base.js b/.config/webpack/base.js index 6b6b88272..2270ffa31 100644 --- a/.config/webpack/base.js +++ b/.config/webpack/base.js @@ -62,7 +62,7 @@ module.exports = (preprocessor = {}, mode = 'development') => { }, resolve: { alias: { - 'cypress': path.resolve('./tests/e2e/cypress/src'), + 'cypress': path.resolve('./tests/cypress/src'), 'dash-table': path.resolve('./src/dash-table'), 'core': path.resolve('./src/core'), 'tests': path.resolve('./tests') diff --git a/CHANGELOG.md b/CHANGELOG.md index 74e0b6094..d7312b68f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +# Version 3.0 (ALPHA) + +Version 3.0 of the Dash-Table expands vastly on the capability of the 2.x table and provides features: + + - visually freezing rows and/or columns + - filtering in either FE or BE, basic filtering UI + - sorting in either FE or BE, basic sorting UI + - pagination in either FE or BE, basic pagination UI + - performance optimizations + - basic coverage through e2e, integration and unit tests + ## RC1, RC2, RC3, RC4 (Virtualization, Freeze, Deletable & Editable Columns, Performance) ### Virtualization @@ -189,14 +200,111 @@ Sorting arrow will no longer highlight. -## RC23 - Width percentage +# Version 3.1 (BETA) + +Version 3.1 of the Dash-Table builds upon the 3.0 table and solidifies the external facing API of the table + + - introducing the notion of derived properties + + - virtual and viewport dataframe and indices for more flexibility + - code refactoring to simplify and improve the existing implementation / prepare for the future + - documentation of the API and table features + - additional e2e, integration and unit tests for a more mature development platform + +### Derived Properties + +Derived properties are new to 3.1 +They are readonly properties that represent a transform from multiple 'first-class' properties of the component. + +For example, derived_viewport_dataframe is a readonly view based on + f(dataframe, filtering params, sorting params, pagination params) --> derived_viewport_dataframe + +Derived properties allow the component to expose complex state that can be useful for a Dash Server developer but without introducing dual states, a situation where multiple properties may represent the same state within the component, making it necessary to reconcile them on each prop update. + +## RC1 - Virtual and Viewport Dataframe + + - 4 new external facing derived properties and 4 internal facing controlled properties that represent: + 1. the filtered and sorted dataframe and the indices mapping + 2. the filtered, sorted and paginated dataframe and the indices mapping + + - derived_viewport_dataframe + - derived_viewport_indices + - derived_virtual_dataframe + - derived_virtual_indices + + In the event where sorting, filtering or pagination is done on the Dash Server, it is possible that some or all derived dataframes will be equal to the dataframe prop. + +## RC2 - Clean up column offsets + + - 1 new internal facing derived/controlled property: + columns: Columns -> columns: VisibleColumns + Gets rid of conditional processing for hidden columns in the cell and header factories as well as in navigation/selection handlers + + - A bunch of offsets were introduced to the table in the previous development cycle (2.x -> 3.0). Turns out these offsets are neither useful or necessary + - Validate compatibility of filtering, sorting, pagination + - External facing classes and attributes + * (ATTRIBUTE) data-dash-column= - Columns can now accept '%' width, minWidth, maxWidth. + .dash-cell, + .dash-header { + &[data-dash-column='ticker'] { + // styling + } + } + + * (CLASS) dash-cell + * (CLASS) dash-header + + * (CLASS) dash-delete-cell + * (CLASS) dash-delete-header + * (CLASS) dash-select-cell + * (CLASS) dash-select-header + + * (CLASS) dash-cell-value + + * (CLASS) dash-freeze-left + * (CLASS) dash-freeze-top + * (CLASS) dash-spreadsheet + * (CLASS) dash-spreadsheet-container + * (CLASS) dash-spreadsheet-inner + +## RC3 - Miscellaneous fixes for pagination, virtual df and viewport df + + Issue: https://github.com/plotly/dash-table/pull/112 + +## RC4 - Columns width percentage and default (fit to content) support + + * Added prop content_style that takes values 'fit' or 'grow' (Default='fit') + * Added width percentage support + * Modified default column behavior from fixed width to 'fit content' + * Modified width, min-width, max-width interaction on columns + +### Width percentage + + Columns can now accept '%' width, minWidth, maxWidth For the percentages to have meaning, the dash-table must be forced to have a width and the content of the dash-table must be forced to grow to fill the available space made available by the container (by default the table is only as big as it needs to be). - Added prop content_style that takes values 'fit' or 'grow' (Default='fit') + To use percentage-based column widths, add: + + * content style + content_style='grow' + + * table style (example) + table_style=[{ selector: '.dash-spreadsheet', rule: 'width: 100%; max-width: 100%' }] + + * column with %-based width + columns=[{ + id: 'column', + width: '40%' + }] + +### Default column width + + Columns now default to 'fit to content' when no width is defined + + Note: If pagination is used or the dataframe modified, the column width will be re-evaluated on each modification. + +### Interaction between width, min-width and max-width - 1. Add the prop content_style='grow' to make the table fill its space, this will make sure the % are applied to all the space available. - 2. Add the following selector (with the proper values) to the table_style prop - { selector: '.dash-spreadsheet', rule: 'width: 100%; max-width: 100%' } + Column min-width and max-width do not default to width value is not defined. diff --git a/TODO.md b/TODO.md deleted file mode 100644 index 5cd5100f9..000000000 --- a/TODO.md +++ /dev/null @@ -1,95 +0,0 @@ -- [x] Header -- [x] Column widths -- [x] Cell selection - - Delete while selected - - Enter turns into edit mode - - Escape, Tab turns off edit mode -- [x] Arrow keys -- [x] Tab to switch cells - -*** - -- [x] Copy and paste - - [x] Creates new columns and rows if necessary - - [x] Doesn't paste contents into the cell if unfocused - - [x] Pastes contents into cell if focused - -- [x] Multiselection - - [x] Shift click - - [x] Shift arrows - - [x] style - outlines - - [x] style - last_cell - - [x] Delete - - [x] Copyable - -*** - -- [x] Performance - - [x] Display subset of rows - - [x] Only rerender certain rows -- [x] Multiline headers -- [x] Hide columns -- [x] Details -- [x] -- [x] Multiselection styles - -*** - -- [x] 1px borders -- [x] Column bottom border -- [x] basic sorting - - multi column sort - -*** - -- [x] dropdowns - -*** - -- [x] Bugs and Stability - - [x] Remove thicker line on row 10 - - [x] Fix selection at the edges - - [x] Show mutli selection background color on dropdown - - [x] Blur input when leaving it - - [x] Sorting text data -- [x] Editable per-column - - [x] Double clicking doesn't focus cell - - [x] Pressing enter doesn't focus cell - - [x] Typing while cell is selected doesn't change cell's value - - [x] Cell is still selectable - - [x] Copying selected cells still works - - [x] Deleting selected cells doesn't remove entries from uneditable columns - - [x] Pasting doesn't update the cell - - [x] Cell's cursor indicates that the cell isn't editable - - [x] Better open/close icon arrows - -*** - -- [x] vertical (and horizontal) panes - -*** - -- multiline header -- scoped css styles -- scoped events -- css api - -*** - -- Reactivity (may be the below are already addressed above) - - Subset of columns / rows reactive - - being able to identify specific cells which are updated -- Add / delete row / col -- Column headers represented by two states viz. name and label; the label is displayed which can be editable and the name is used for all internal working. - - -*** - -- Hidden column edge cases -- Left aligned text values -- Custom styles -- Input styles -- Draggable column size -- Initial sorting -- Pressing enter while on a dropdown cell should open dropdown -- Filtering diff --git a/cypress.json b/cypress.json index d0b294171..eb765870e 100644 --- a/cypress.json +++ b/cypress.json @@ -1,9 +1,9 @@ { "video": false, - "fixturesFolder": "./tests/e2e/cypress/fixtures", - "integrationFolder": "./tests/e2e/cypress/integration", - "pluginsFile": "./tests/e2e/cypress/plugins/index.js", - "screenshotsFolder": "./tests/e2e/cypress/screenshots", - "supportFile": "./tests/e2e/cypress/support/index.js", - "videoFolder": "./tests/e2e/cypress/videos" + "fixturesFolder": "./tests/cypress/fixtures", + "integrationFolder": "./tests/cypress/tests", + "pluginsFile": "./tests/cypress/plugins/index.js", + "screenshotsFolder": "./tests/cypress/screenshots", + "supportFile": "./tests/cypress/support/index.js", + "videoFolder": "./tests/cypress/videos" } \ No newline at end of file diff --git a/dash_table/bundle.js b/dash_table/bundle.js index 4ca9265cf..9e8aa6e82 100644 --- a/dash_table/bundle.js +++ b/dash_table/bundle.js @@ -1,4 +1,4 @@ -window.dash_table=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=22)}([function(e,t,n){e.exports=n(26)()},function(e,t){e.exports=window.React},function(e,t,n){"use strict";function r(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}function o(e){return function t(n){return 0===arguments.length||r(n)?t:e.apply(this,arguments)}}n.r(t);var i=o(function(e){return function(){return e}}),u=i(!1),s=i(!0),a={"@@functional/placeholder":!0};function l(e){return function t(n,i){switch(arguments.length){case 0:return t;case 1:return r(n)?t:o(function(t){return e(n,t)});default:return r(n)&&r(i)?t:r(n)?o(function(t){return e(t,i)}):r(i)?o(function(t){return e(n,t)}):e(n,i)}}}var c=l(function(e,t){return Number(e)+Number(t)});function p(e,t){var n;e=e||[],t=t||[];var r=e.length,o=t.length,i=[];for(n=0;n=arguments.length)?a=t[s]:(a=arguments[i],i+=1),o[s]=a,r(a)||(u-=1),s+=1}return u<=0?n.apply(this,o):d(u,f(e,o,n))}}var h=l(function(e,t){return 1===e?o(t):d(e,f(e,[],t))}),v=o(function(e){return h(e.length,function(){var t=0,n=arguments[0],r=arguments[arguments.length-1],o=Array.prototype.slice.call(arguments,0);return o[0]=function(){var e=n.apply(this,p(arguments,[t,r]));return t+=1,e},e.apply(this,o)})});function g(e){return function t(n,i,u){switch(arguments.length){case 0:return t;case 1:return r(n)?t:l(function(t,r){return e(n,t,r)});case 2:return r(n)&&r(i)?t:r(n)?l(function(t,n){return e(t,i,n)}):r(i)?l(function(t,r){return e(n,t,r)}):o(function(t){return e(n,i,t)});default:return r(n)&&r(i)&&r(u)?t:r(n)&&r(i)?l(function(t,n){return e(t,n,u)}):r(n)&&r(u)?l(function(t,n){return e(t,i,n)}):r(i)&&r(u)?l(function(t,r){return e(n,t,r)}):r(n)?o(function(t){return e(t,i,u)}):r(i)?o(function(t){return e(n,t,u)}):r(u)?o(function(t){return e(n,i,t)}):e(n,i,u)}}}var y=g(function(e,t,n){if(t>=n.length||t<-n.length)return n;var r=(t<0?n.length:0)+t,o=p(n);return o[r]=e(n[r]),o}),b=Array.isArray||function(e){return null!=e&&e.length>=0&&"[object Array]"===Object.prototype.toString.call(e)};function m(e){return"function"==typeof e["@@transducer/step"]}function x(e,t,n){return function(){if(0===arguments.length)return n();var r=Array.prototype.slice.call(arguments,0),o=r.pop();if(!b(o)){for(var i=0;ie?t:e});function C(e,t){for(var n=0,r=t.length,o=Array(r);n0&&(e.hasOwnProperty(0)&&e.hasOwnProperty(e.length-1)))))}),F=function(){function e(e){this.f=e}return e.prototype["@@transducer/init"]=function(){throw new Error("init not implemented on XWrap")},e.prototype["@@transducer/result"]=function(e){return e},e.prototype["@@transducer/step"]=function(e,t){return this.f(e,t)},e}();function D(e){return new F(e)}var P=l(function(e,t){return d(e.length,function(){return e.apply(t,arguments)})});function R(e,t,n){for(var r=n.next();!r.done;){if((t=e["@@transducer/step"](t,r.value))&&t["@@transducer/reduced"]){t=t["@@transducer/value"];break}r=n.next()}return e["@@transducer/result"](t)}function T(e,t,n,r){return e["@@transducer/result"](n[r](P(e["@@transducer/step"],e),t))}var I="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";function j(e,t,n){if("function"==typeof e&&(e=D(e)),k(n))return function(e,t,n){for(var r=0,o=n.length;r=0;)z(t=K[n],e)&&!$(r,t)&&(r[r.length]=t),n-=1;return r}:function(e){return Object(e)!==e?[]:Object.keys(e)}),U=l(x(["fantasy-land/map","map"],N,function(e,t){switch(Object.prototype.toString.call(t)){case"[object Function]":return h(t.length,function(){return e.call(this,t.apply(this,arguments))});case"[object Object]":return j(function(n,r){return n[r]=e(t[r]),n},{},q(t));default:return C(e,t)}})),H=l(function(e,t){for(var n=t,r=0;r=0?r:0);no?1:0}),de=g(function(e,t,n){var r={};for(var o in n)r[o]=n[o];return r[e]=t,r}),fe=Number.isInteger||function(e){return e<<0===e},he=o(function(e){return null==e}),ve=g(function e(t,n,r){if(0===t.length)return n;var o=t[0];if(t.length>1){var i=!he(r)&&z(o,r)?r[o]:fe(t[1])?[]:{};n=e(Array.prototype.slice.call(t,1),n,i)}if(fe(o)&&b(r)){var u=[].concat(r);return u[o]=n,u}return de(o,n,r)}),ge=l(function(e,t){switch(e){case 0:return function(){return t.call(this)};case 1:return function(e){return t.call(this,e)};case 2:return function(e,n){return t.call(this,e,n)};case 3:return function(e,n,r){return t.call(this,e,n,r)};case 4:return function(e,n,r,o){return t.call(this,e,n,r,o)};case 5:return function(e,n,r,o,i){return t.call(this,e,n,r,o,i)};case 6:return function(e,n,r,o,i,u){return t.call(this,e,n,r,o,i,u)};case 7:return function(e,n,r,o,i,u,s){return t.call(this,e,n,r,o,i,u,s)};case 8:return function(e,n,r,o,i,u,s,a){return t.call(this,e,n,r,o,i,u,s,a)};case 9:return function(e,n,r,o,i,u,s,a,l){return t.call(this,e,n,r,o,i,u,s,a,l)};case 10:return function(e,n,r,o,i,u,s,a,l,c){return t.call(this,e,n,r,o,i,u,s,a,l,c)};default:throw new Error("First argument to nAry must be a non-negative integer no greater than ten")}}),ye=o(function(e){return ge(2,e)});function be(e){return"[object Function]"===Object.prototype.toString.call(e)}var me=l(function(e,t){var n=h(e,t);return h(e,function(){return j(re,U(n,arguments[0]),Array.prototype.slice.call(arguments,1))})}),xe=o(function(e){return me(e.length,e)}),Ee=l(function(e,t){return be(e)?function(){return e.apply(this,arguments)&&t.apply(this,arguments)}:xe(Z)(e,t)}),we=o(function(e){return h(e.length,e)}),_e=we(function(e){return e.apply(this,Array.prototype.slice.call(arguments,1))});function Oe(e){return function t(n){for(var r,o,i,u=[],s=0,a=n.length;st)throw new Error("min must not be greater than max in clamp(min, max, value)");return nt?t:n});function ke(e){return new RegExp(e.source,(e.global?"g":"")+(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.sticky?"y":"")+(e.unicode?"u":""))}var Fe=o(function(e){return null===e?"Null":void 0===e?"Undefined":Object.prototype.toString.call(e).slice(8,-1)});function De(e,t,n,r){var o=function(o){for(var i=t.length,u=0;u=0;){if(n[i]===e)return r[i]===t;i-=1}switch(o){case"Map":return e.size===t.size&&Ge(e.entries(),t.entries(),n.concat([e]),r.concat([t]));case"Set":return e.size===t.size&&Ge(e.values(),t.values(),n.concat([e]),r.concat([t]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var u=q(e);if(u.length!==q(t).length)return!1;var s=n.concat([e]),a=r.concat([t]);for(i=u.length-1;i>=0;){var l=u[i];if(!z(l,t)||!Je(t[l],e[l],s,a))return!1;i-=1}return!0}var Xe=l(function(e,t){return Je(e,t,[],[])});function Ze(e,t,n){var r,o;if("function"==typeof e.indexOf)switch(typeof t){case"number":if(0===t){for(r=1/t;n=0}function et(e){return'"'+e.replace(/\\/g,"\\\\").replace(/[\b]/g,"\\b").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0").replace(/"/g,'\\"')+'"'}var tt=function(e){return(e<10?"0":"")+e},nt="function"==typeof Date.prototype.toISOString?function(e){return e.toISOString()}:function(e){return e.getUTCFullYear()+"-"+tt(e.getUTCMonth()+1)+"-"+tt(e.getUTCDate())+"T"+tt(e.getUTCHours())+":"+tt(e.getUTCMinutes())+":"+tt(e.getUTCSeconds())+"."+(e.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+"Z"};function rt(e){return function(){return!e.apply(this,arguments)}}function ot(e,t){for(var n=0,r=t.length,o=[];n":e(r,o)},o=function(e,t){return C(function(t){return et(t)+": "+r(e[t])},t.slice().sort())};switch(Object.prototype.toString.call(t)){case"[object Arguments]":return"(function() { return arguments; }("+C(r,t).join(", ")+"))";case"[object Array]":return"["+C(r,t).concat(o(t,at(function(e){return/^\d+$/.test(e)},q(t)))).join(", ")+"]";case"[object Boolean]":return"object"==typeof t?"new Boolean("+r(t.valueOf())+")":t.toString();case"[object Date]":return"new Date("+(isNaN(t.valueOf())?r(NaN):et(nt(t)))+")";case"[object Null]":return"null";case"[object Number]":return"object"==typeof t?"new Number("+r(t.valueOf())+")":1/t==-1/0?"-0":t.toString(10);case"[object String]":return"object"==typeof t?"new String("+r(t.valueOf())+")":et(t);case"[object Undefined]":return"undefined";default:if("function"==typeof t.toString){var i=t.toString();if("[object Object]"!==i)return i}return"{"+o(t,q(t)).join(", ")+"}"}}(e,[])}),ct=l(function(e,t){if(b(e)){if(b(t))return e.concat(t);throw new TypeError(lt(t)+" is not an array")}if(A(e)){if(A(t))return e+t;throw new TypeError(lt(t)+" is not a string")}if(null!=e&&be(e["fantasy-land/concat"]))return e["fantasy-land/concat"](t);if(null!=e&&be(e.concat))return e.concat(t);throw new TypeError(lt(e)+' does not have a method named "concat" or "fantasy-land/concat"')}),pt=o(function(e){return d(J(S,0,U(function(e){return e[0].length},e)),function(){for(var t=0;t10)throw new Error("Constructor with greater than ten arguments");return 0===e?function(){return new t}:we(ge(e,function(e,n,r,o,i,u,s,a,l,c){switch(arguments.length){case 1:return new t(e);case 2:return new t(e,n);case 3:return new t(e,n,r);case 4:return new t(e,n,r,o);case 5:return new t(e,n,r,o,i);case 6:return new t(e,n,r,o,i,u);case 7:return new t(e,n,r,o,i,u,s);case 8:return new t(e,n,r,o,i,u,s,a);case 9:return new t(e,n,r,o,i,u,s,a,l);case 10:return new t(e,n,r,o,i,u,s,a,l,c)}}))}),ft=o(function(e){return dt(e.length,e)}),ht=l(Qe),vt=l(function(e,t){return h(J(S,0,G("length",t)),function(){var n=arguments,r=this;return e.apply(r,C(function(e){return e.apply(r,n)},t))})}),gt=function(){function e(e,t,n,r){this.valueFn=e,this.valueAcc=t,this.keyFn=n,this.xf=r,this.inputs={}}return e.prototype["@@transducer/init"]=w.init,e.prototype["@@transducer/result"]=function(e){var t;for(t in this.inputs)if(z(t,this.inputs)&&(e=this.xf["@@transducer/step"](e,this.inputs[t]))["@@transducer/reduced"]){e=e["@@transducer/value"];break}return this.inputs=null,this.xf["@@transducer/result"](e)},e.prototype["@@transducer/step"]=function(e,t){var n=this.keyFn(t);return this.inputs[n]=this.inputs[n]||[n,this.valueAcc],this.inputs[n][1]=this.valueFn(this.inputs[n][1],t),e},e}(),yt=f(4,[],x([],f(4,[],function(e,t,n,r){return new gt(e,t,n,r)}),function(e,t,n,r){return j(function(r,o){var i=n(o);return r[i]=e(z(i,r)?r[i]:t,o),r},{},r)})),bt=yt(function(e,t){return e+1},0),mt=c(-1),xt=l(function(e,t){return null==t||t!=t?e:t}),Et=g(function(e,t,n){var r=e(t),o=e(n);return r>o?-1:r0?(this.n-=1,e):this.xf["@@transducer/step"](e,t)},e}(),Dt=l(x(["drop"],l(function(e,t){return new Ft(e,t)}),function(e,t){return Ne(Math.max(0,e),1/0,t)})),Pt=function(){function e(e,t){this.xf=t,this.n=e,this.i=0}return e.prototype["@@transducer/init"]=w.init,e.prototype["@@transducer/result"]=w.result,e.prototype["@@transducer/step"]=function(e,t){this.i+=1;var n=0===this.n?e:this.xf["@@transducer/step"](e,t);return this.n>=0&&this.i>=this.n?E(n):n},e}(),Rt=l(x(["take"],l(function(e,t){return new Pt(e,t)}),function(e,t){return Ne(0,e<0?1/0:e,t)}));var Tt=function(){function e(e,t){this.xf=t,this.pos=0,this.full=!1,this.acc=new Array(e)}return e.prototype["@@transducer/init"]=w.init,e.prototype["@@transducer/result"]=function(e){return this.acc=null,this.xf["@@transducer/result"](e)},e.prototype["@@transducer/step"]=function(e,t){return this.full&&(e=this.xf["@@transducer/step"](e,this.acc[this.pos])),this.store(t),e},e.prototype.store=function(e){this.acc[this.pos]=e,this.pos+=1,this.pos===this.acc.length&&(this.pos=0,this.full=!0)},e}(),It=l(x([],l(function(e,t){return new Tt(e,t)}),function(e,t){return Rt(e=0&&e(t[n]);)n-=1;return Ne(0,n+1,t)})),Nt=function(){function e(e,t){this.xf=t,this.pred=e,this.lastValue=void 0,this.seenFirstValue=!1}return e.prototype["@@transducer/init"]=w.init,e.prototype["@@transducer/result"]=w.result,e.prototype["@@transducer/step"]=function(e,t){var n=!1;return this.seenFirstValue?this.pred(this.lastValue,t)&&(n=!0):this.seenFirstValue=!0,this.lastValue=t,n?e:this.xf["@@transducer/step"](e,t)},e}(),zt=l(function(e,t){return new Nt(e,t)}),Bt=l(function(e,t){var n=e<0?t.length+e:e;return A(t)?t.charAt(n):t[n]}),Vt=Bt(-1),Lt=l(x([],zt,function(e,t){var n=[],r=1,o=t.length;if(0!==o)for(n[0]=t[0];r=0?t.length-e:0,t)}),Gt=l(function(e,t){return Xe(Yt(e.length,t),e)}),Jt=g(function(e,t,n){return Xe(e(t),e(n))}),Xt=g(function(e,t,n){return Xe(t[e],n[e])}),Zt=l(function e(t,n){var r,o,i,u={};for(o in n)i=typeof(r=t[o]),u[o]="function"===i?r(n[o]):r&&"object"===i?e(r,n[o]):n[o];return u}),Qt=function(){function e(e,t){this.xf=t,this.f=e,this.found=!1}return e.prototype["@@transducer/init"]=w.init,e.prototype["@@transducer/result"]=function(e){return this.found||(e=this.xf["@@transducer/step"](e,void 0)),this.xf["@@transducer/result"](e)},e.prototype["@@transducer/step"]=function(e,t){return this.f(t)&&(this.found=!0,e=E(this.xf["@@transducer/step"](e,t))),e},e}(),en=l(x(["find"],l(function(e,t){return new Qt(e,t)}),function(e,t){for(var n=0,r=t.length;n=0;){if(e(t[n]))return t[n];n-=1}})),un=function(){function e(e,t){this.xf=t,this.f=e,this.idx=-1,this.lastIdx=-1}return e.prototype["@@transducer/init"]=w.init,e.prototype["@@transducer/result"]=function(e){return this.xf["@@transducer/result"](this.xf["@@transducer/step"](e,this.lastIdx))},e.prototype["@@transducer/step"]=function(e,t){return this.idx+=1,this.f(t)&&(this.lastIdx=this.idx),e},e}(),sn=l(x([],l(function(e,t){return new un(e,t)}),function(e,t){for(var n=t.length-1;n>=0;){if(e(t[n]))return n;n-=1}return-1})),an=o(Oe(!0)),ln=o(function(e){return h(e.length,function(t,n){var r=Array.prototype.slice.call(arguments,0);return r[0]=n,r[1]=t,e.apply(this,r)})}),cn=l(Me("forEach",function(e,t){for(var n=t.length,r=0;rt}),gn=l(function(e,t){return e>=t}),yn=l(z),bn=l(function(e,t){return e in t}),mn=Bt(0);function xn(e){return e}var En=o(xn),wn=g(function(e,t,n){return h(Math.max(e.length,t.length,n.length),function(){return e.apply(this,arguments)?t.apply(this,arguments):n.apply(this,arguments)})}),_n=c(1),On=yt(function(e,t){return t},null),Sn=l(function(e,t){return"function"!=typeof t.indexOf||b(t)?Ze(t,e,0):t.indexOf(e)}),Cn=Ne(0,-1),An=g(function(e,t,n){return ot(function(t){return He(e,t,n)},t)}),kn=g(function(e,t,n){e=e=0?e:n.length;var r=Array.prototype.slice.call(n,0);return r.splice(e,0,t),r}),Fn=g(function(e,t,n){return e=e=0?e:n.length,[].concat(Array.prototype.slice.call(n,0,e),t,Array.prototype.slice.call(n,e))});function Dn(e,t,n){var r,o=typeof e;switch(o){case"string":case"number":return 0===e&&1/e==-1/0?!!n._items["-0"]||(t&&(n._items["-0"]=!0),!1):null!==n._nativeSet?t?(r=n._nativeSet.size,n._nativeSet.add(e),n._nativeSet.size===r):n._nativeSet.has(e):o in n._items?e in n._items[o]||(t&&(n._items[o][e]=!0),!1):(t&&(n._items[o]={},n._items[o][e]=!0),!1);case"boolean":if(o in n._items){var i=e?1:0;return!!n._items[o][i]||(t&&(n._items[o][i]=!0),!1)}return t&&(n._items[o]=e?[!1,!0]:[!0,!1]),!1;case"function":return null!==n._nativeSet?t?(r=n._nativeSet.size,n._nativeSet.add(e),n._nativeSet.size===r):n._nativeSet.has(e):o in n._items?!!Qe(e,n._items[o])||(t&&n._items[o].push(e),!1):(t&&(n._items[o]=[e]),!1);case"undefined":return!!n._items[o]||(t&&(n._items[o]=!0),!1);case"object":if(null===e)return!!n._items.null||(t&&(n._items.null=!0),!1);default:return(o=Object.prototype.toString.call(e))in n._items?!!Qe(e,n._items[o])||(t&&n._items[o].push(e),!1):(t&&(n._items[o]=[e]),!1)}}var Pn=function(){function e(){this._nativeSet="function"==typeof Set?new Set:null,this._items={}}return e.prototype.add=function(e){return!Dn(e,!0,this)},e.prototype.has=function(e){return Dn(e,!1,this)},e}(),Rn=l(function(e,t){for(var n,r,o=new Pn,i=[],u=0;ut.length?(n=e,r=t):(n=t,r=e),Tn(ot(ln(Qe)(n),r))}),jn=l(Me("intersperse",function(e,t){for(var n=[],r=0,o=t.length;r=0;){if(Xe(t[n],e))return n;n-=1}return-1}return t.lastIndexOf(e)});function Xn(e){return"[object Number]"===Object.prototype.toString.call(e)}var Zn=o(function(e){return null!=e&&Xn(e.length)?e.length:NaN}),Qn=l(function(e,t){return function(n){return function(r){return U(function(e){return t(e,r)},n(e(r)))}}}),er=o(function(e){return Qn(Bt(e),Ct(e))}),tr=o(function(e){return Qn(H(e),ve(e))}),nr=o(function(e){return Qn(Y(e),de(e))}),rr=l(function(e,t){return e=0;)i=e(n[r],i[0]),o[r]=i[1],r-=1;return[o,i[0]]}),sr=l(function(e,t){return j(function(n,r){return n[r]=e(t[r],r,t),n},{},q(t))}),ar=l(function(e,t){return t.match(e)||[]}),lr=l(function(e,t){return fe(e)?!fe(t)||t<1?NaN:(e%t+t)%t:NaN}),cr=g(function(e,t,n){return e(n)>e(t)?n:t}),pr=J(c,0),dr=o(function(e){return pr(e)/e.length}),fr=o(function(e){var t=e.length;if(0===t)return NaN;var n=2-t%2,r=(t-n)/2;return dr(Array.prototype.slice.call(e,0).sort(function(e,t){return et?1:0}).slice(r,r+n))}),hr=l(function(e,t){var n={};return d(t.length,function(){var r=e.apply(this,arguments);return z(r,n)||(n[r]=t.apply(this,arguments)),n[r]})}),vr=hr(function(){return lt(arguments)}),gr=l(function(e,t){return Mn({},e,t)}),yr=o(function(e){return Mn.apply(null,[{}].concat(e))}),br=g(function(e,t,n){var r,o={};for(r in t)z(r,t)&&(o[r]=z(r,n)?e(r,t[r],n[r]):t[r]);for(r in n)z(r,n)&&!z(r,o)&&(o[r]=n[r]);return o}),mr=g(function e(t,n,r){return br(function(n,r,o){return it(r)&&it(o)?e(t,r,o):t(n,r,o)},n,r)}),xr=l(function(e,t){return mr(function(e,t,n){return t},e,t)}),Er=l(function(e,t){return mr(function(e,t,n){return n},e,t)}),wr=g(function(e,t,n){return mr(function(t,n,r){return e(n,r)},t,n)}),_r=g(function(e,t,n){return br(function(t,n,r){return e(n,r)},t,n)}),Or=l(function(e,t){return t0&&e(H(t,n))}),qr=l(function(e,t){for(var n={},r=0;r=0;)t=e(n[r],t),r-=1;return t}),uo=f(4,[],function(e,t,n,r){return j(function(n,r){return e(n,r)?t(n,r):E(n)},n,r)}),so=o(E),ao=l(function(e,t){var n,r=Number(t),o=0;if(r<0||isNaN(r))throw new RangeError("n must be a non-negative number");for(n=new Array(r);oo?1:0})}),yo=l(function(e,t){return Array.prototype.slice.call(t,0).sort(function(t,n){for(var r=0,o=0;0===r&&o=0&&e(t[n]);)n-=1;return Ne(n+1,1/0,t)}),Ao=function(){function e(e,t){this.xf=t,this.f=e}return e.prototype["@@transducer/init"]=w.init,e.prototype["@@transducer/result"]=w.result,e.prototype["@@transducer/step"]=function(e,t){return this.f(t)?this.xf["@@transducer/step"](e,t):E(e)},e}(),ko=l(x(["takeWhile"],l(function(e,t){return new Ao(e,t)}),function(e,t){for(var n=0,r=t.length;n{};let n,s="";switch(e){case o.TRACE:case o.INFO:n=window.console.log,s="color: white; background-color: #3166A2;";break;case r.DEBUG:case o.WARNING:n=window.console.warn,s="color: white; background-color: #E9B606;";break;case o.ERROR:case o.FATAL:n=window.console.error,s="color: white; background-color: #FF0000;"}let a=`${s&&u?"%c":""}[${i[e].toUpperCase()}]`;return s&&u?n.bind(window.console,a,s):n.bind(window.console,a)}u=!1;let c={setDebugLevel(e){a=e},setLogLevel(e){s=e}};Object.defineProperties(c,{trace:{get:()=>l(o.TRACE,s),configurable:!1,enumerable:!1},info:{get:()=>l(o.INFO,s),configurable:!1,enumerable:!1},warning:{get:()=>l(o.WARNING,s),configurable:!1,enumerable:!1},error:{get:()=>l(o.ERROR,s),configurable:!1,enumerable:!1},fatal:{get:()=>l(o.FATAL,s),configurable:!1,enumerable:!1},debug:{get:()=>l(r.DEBUG,a),configurable:!1,enumerable:!1}}),Object.freeze(c),t.default=c},function(e,t,n){var r; +window.dash_table=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=24)}([function(e,t,n){e.exports=n(28)()},function(e,t){e.exports=window.React},function(e,t,n){"use strict";function r(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}function o(e){return function t(n){return 0===arguments.length||r(n)?t:e.apply(this,arguments)}}n.r(t);var i=o(function(e){return function(){return e}}),u=i(!1),a=i(!0),s={"@@functional/placeholder":!0};function l(e){return function t(n,i){switch(arguments.length){case 0:return t;case 1:return r(n)?t:o(function(t){return e(n,t)});default:return r(n)&&r(i)?t:r(n)?o(function(t){return e(t,i)}):r(i)?o(function(t){return e(n,t)}):e(n,i)}}}var c=l(function(e,t){return Number(e)+Number(t)});function d(e,t){var n;e=e||[],t=t||[];var r=e.length,o=t.length,i=[];for(n=0;n=arguments.length)?s=t[a]:(s=arguments[i],i+=1),o[a]=s,r(s)||(u-=1),a+=1}return u<=0?n.apply(this,o):p(u,f(e,o,n))}}var h=l(function(e,t){return 1===e?o(t):p(e,f(e,[],t))}),v=o(function(e){return h(e.length,function(){var t=0,n=arguments[0],r=arguments[arguments.length-1],o=Array.prototype.slice.call(arguments,0);return o[0]=function(){var e=n.apply(this,d(arguments,[t,r]));return t+=1,e},e.apply(this,o)})});function y(e){return function t(n,i,u){switch(arguments.length){case 0:return t;case 1:return r(n)?t:l(function(t,r){return e(n,t,r)});case 2:return r(n)&&r(i)?t:r(n)?l(function(t,n){return e(t,i,n)}):r(i)?l(function(t,r){return e(n,t,r)}):o(function(t){return e(n,i,t)});default:return r(n)&&r(i)&&r(u)?t:r(n)&&r(i)?l(function(t,n){return e(t,n,u)}):r(n)&&r(u)?l(function(t,n){return e(t,i,n)}):r(i)&&r(u)?l(function(t,r){return e(n,t,r)}):r(n)?o(function(t){return e(t,i,u)}):r(i)?o(function(t){return e(n,t,u)}):r(u)?o(function(t){return e(n,i,t)}):e(n,i,u)}}}var g=y(function(e,t,n){if(t>=n.length||t<-n.length)return n;var r=(t<0?n.length:0)+t,o=d(n);return o[r]=e(n[r]),o}),b=Array.isArray||function(e){return null!=e&&e.length>=0&&"[object Array]"===Object.prototype.toString.call(e)};function m(e){return"function"==typeof e["@@transducer/step"]}function x(e,t,n){return function(){if(0===arguments.length)return n();var r=Array.prototype.slice.call(arguments,0),o=r.pop();if(!b(o)){for(var i=0;ie?t:e});function C(e,t){for(var n=0,r=t.length,o=Array(r);n0&&(e.hasOwnProperty(0)&&e.hasOwnProperty(e.length-1)))))}),F=function(){function e(e){this.f=e}return e.prototype["@@transducer/init"]=function(){throw new Error("init not implemented on XWrap")},e.prototype["@@transducer/result"]=function(e){return e},e.prototype["@@transducer/step"]=function(e,t){return this.f(e,t)},e}();function D(e){return new F(e)}var P=l(function(e,t){return p(e.length,function(){return e.apply(t,arguments)})});function M(e,t,n){for(var r=n.next();!r.done;){if((t=e["@@transducer/step"](t,r.value))&&t["@@transducer/reduced"]){t=t["@@transducer/value"];break}r=n.next()}return e["@@transducer/result"](t)}function j(e,t,n,r){return e["@@transducer/result"](n[r](P(e["@@transducer/step"],e),t))}var R="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";function T(e,t,n){if("function"==typeof e&&(e=D(e)),k(n))return function(e,t,n){for(var r=0,o=n.length;r=0;)z(t=W[n],e)&&!U(r,t)&&(r[r.length]=t),n-=1;return r}:function(e){return Object(e)!==e?[]:Object.keys(e)}),$=l(x(["fantasy-land/map","map"],N,function(e,t){switch(Object.prototype.toString.call(t)){case"[object Function]":return h(t.length,function(){return e.call(this,t.apply(this,arguments))});case"[object Object]":return T(function(n,r){return n[r]=e(t[r]),n},{},q(t));default:return C(e,t)}})),H=l(function(e,t){for(var n=t,r=0;r=0?r:0);no?1:0}),pe=y(function(e,t,n){var r={};for(var o in n)r[o]=n[o];return r[e]=t,r}),fe=Number.isInteger||function(e){return e<<0===e},he=o(function(e){return null==e}),ve=y(function e(t,n,r){if(0===t.length)return n;var o=t[0];if(t.length>1){var i=!he(r)&&z(o,r)?r[o]:fe(t[1])?[]:{};n=e(Array.prototype.slice.call(t,1),n,i)}if(fe(o)&&b(r)){var u=[].concat(r);return u[o]=n,u}return pe(o,n,r)}),ye=l(function(e,t){switch(e){case 0:return function(){return t.call(this)};case 1:return function(e){return t.call(this,e)};case 2:return function(e,n){return t.call(this,e,n)};case 3:return function(e,n,r){return t.call(this,e,n,r)};case 4:return function(e,n,r,o){return t.call(this,e,n,r,o)};case 5:return function(e,n,r,o,i){return t.call(this,e,n,r,o,i)};case 6:return function(e,n,r,o,i,u){return t.call(this,e,n,r,o,i,u)};case 7:return function(e,n,r,o,i,u,a){return t.call(this,e,n,r,o,i,u,a)};case 8:return function(e,n,r,o,i,u,a,s){return t.call(this,e,n,r,o,i,u,a,s)};case 9:return function(e,n,r,o,i,u,a,s,l){return t.call(this,e,n,r,o,i,u,a,s,l)};case 10:return function(e,n,r,o,i,u,a,s,l,c){return t.call(this,e,n,r,o,i,u,a,s,l,c)};default:throw new Error("First argument to nAry must be a non-negative integer no greater than ten")}}),ge=o(function(e){return ye(2,e)});function be(e){return"[object Function]"===Object.prototype.toString.call(e)}var me=l(function(e,t){var n=h(e,t);return h(e,function(){return T(re,$(n,arguments[0]),Array.prototype.slice.call(arguments,1))})}),xe=o(function(e){return me(e.length,e)}),we=l(function(e,t){return be(e)?function(){return e.apply(this,arguments)&&t.apply(this,arguments)}:xe(Z)(e,t)}),Ee=o(function(e){return h(e.length,e)}),Oe=Ee(function(e){return e.apply(this,Array.prototype.slice.call(arguments,1))});function _e(e){return function t(n){for(var r,o,i,u=[],a=0,s=n.length;at)throw new Error("min must not be greater than max in clamp(min, max, value)");return nt?t:n});function ke(e){return new RegExp(e.source,(e.global?"g":"")+(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.sticky?"y":"")+(e.unicode?"u":""))}var Fe=o(function(e){return null===e?"Null":void 0===e?"Undefined":Object.prototype.toString.call(e).slice(8,-1)});function De(e,t,n,r){var o=function(o){for(var i=t.length,u=0;u=0;){if(n[i]===e)return r[i]===t;i-=1}switch(o){case"Map":return e.size===t.size&&Ge(e.entries(),t.entries(),n.concat([e]),r.concat([t]));case"Set":return e.size===t.size&&Ge(e.values(),t.values(),n.concat([e]),r.concat([t]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var u=q(e);if(u.length!==q(t).length)return!1;var a=n.concat([e]),s=r.concat([t]);for(i=u.length-1;i>=0;){var l=u[i];if(!z(l,t)||!Je(t[l],e[l],a,s))return!1;i-=1}return!0}var Xe=l(function(e,t){return Je(e,t,[],[])});function Ze(e,t,n){var r,o;if("function"==typeof e.indexOf)switch(typeof t){case"number":if(0===t){for(r=1/t;n=0}function et(e){return'"'+e.replace(/\\/g,"\\\\").replace(/[\b]/g,"\\b").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0").replace(/"/g,'\\"')+'"'}var tt=function(e){return(e<10?"0":"")+e},nt="function"==typeof Date.prototype.toISOString?function(e){return e.toISOString()}:function(e){return e.getUTCFullYear()+"-"+tt(e.getUTCMonth()+1)+"-"+tt(e.getUTCDate())+"T"+tt(e.getUTCHours())+":"+tt(e.getUTCMinutes())+":"+tt(e.getUTCSeconds())+"."+(e.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+"Z"};function rt(e){return function(){return!e.apply(this,arguments)}}function ot(e,t){for(var n=0,r=t.length,o=[];n":e(r,o)},o=function(e,t){return C(function(t){return et(t)+": "+r(e[t])},t.slice().sort())};switch(Object.prototype.toString.call(t)){case"[object Arguments]":return"(function() { return arguments; }("+C(r,t).join(", ")+"))";case"[object Array]":return"["+C(r,t).concat(o(t,st(function(e){return/^\d+$/.test(e)},q(t)))).join(", ")+"]";case"[object Boolean]":return"object"==typeof t?"new Boolean("+r(t.valueOf())+")":t.toString();case"[object Date]":return"new Date("+(isNaN(t.valueOf())?r(NaN):et(nt(t)))+")";case"[object Null]":return"null";case"[object Number]":return"object"==typeof t?"new Number("+r(t.valueOf())+")":1/t==-1/0?"-0":t.toString(10);case"[object String]":return"object"==typeof t?"new String("+r(t.valueOf())+")":et(t);case"[object Undefined]":return"undefined";default:if("function"==typeof t.toString){var i=t.toString();if("[object Object]"!==i)return i}return"{"+o(t,q(t)).join(", ")+"}"}}(e,[])}),ct=l(function(e,t){if(b(e)){if(b(t))return e.concat(t);throw new TypeError(lt(t)+" is not an array")}if(A(e)){if(A(t))return e+t;throw new TypeError(lt(t)+" is not a string")}if(null!=e&&be(e["fantasy-land/concat"]))return e["fantasy-land/concat"](t);if(null!=e&&be(e.concat))return e.concat(t);throw new TypeError(lt(e)+' does not have a method named "concat" or "fantasy-land/concat"')}),dt=o(function(e){return p(J(S,0,$(function(e){return e[0].length},e)),function(){for(var t=0;t10)throw new Error("Constructor with greater than ten arguments");return 0===e?function(){return new t}:Ee(ye(e,function(e,n,r,o,i,u,a,s,l,c){switch(arguments.length){case 1:return new t(e);case 2:return new t(e,n);case 3:return new t(e,n,r);case 4:return new t(e,n,r,o);case 5:return new t(e,n,r,o,i);case 6:return new t(e,n,r,o,i,u);case 7:return new t(e,n,r,o,i,u,a);case 8:return new t(e,n,r,o,i,u,a,s);case 9:return new t(e,n,r,o,i,u,a,s,l);case 10:return new t(e,n,r,o,i,u,a,s,l,c)}}))}),ft=o(function(e){return pt(e.length,e)}),ht=l(Qe),vt=l(function(e,t){return h(J(S,0,G("length",t)),function(){var n=arguments,r=this;return e.apply(r,C(function(e){return e.apply(r,n)},t))})}),yt=function(){function e(e,t,n,r){this.valueFn=e,this.valueAcc=t,this.keyFn=n,this.xf=r,this.inputs={}}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=function(e){var t;for(t in this.inputs)if(z(t,this.inputs)&&(e=this.xf["@@transducer/step"](e,this.inputs[t]))["@@transducer/reduced"]){e=e["@@transducer/value"];break}return this.inputs=null,this.xf["@@transducer/result"](e)},e.prototype["@@transducer/step"]=function(e,t){var n=this.keyFn(t);return this.inputs[n]=this.inputs[n]||[n,this.valueAcc],this.inputs[n][1]=this.valueFn(this.inputs[n][1],t),e},e}(),gt=f(4,[],x([],f(4,[],function(e,t,n,r){return new yt(e,t,n,r)}),function(e,t,n,r){return T(function(r,o){var i=n(o);return r[i]=e(z(i,r)?r[i]:t,o),r},{},r)})),bt=gt(function(e,t){return e+1},0),mt=c(-1),xt=l(function(e,t){return null==t||t!=t?e:t}),wt=y(function(e,t,n){var r=e(t),o=e(n);return r>o?-1:r0?(this.n-=1,e):this.xf["@@transducer/step"](e,t)},e}(),Dt=l(x(["drop"],l(function(e,t){return new Ft(e,t)}),function(e,t){return Ne(Math.max(0,e),1/0,t)})),Pt=function(){function e(e,t){this.xf=t,this.n=e,this.i=0}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=E.result,e.prototype["@@transducer/step"]=function(e,t){this.i+=1;var n=0===this.n?e:this.xf["@@transducer/step"](e,t);return this.n>=0&&this.i>=this.n?w(n):n},e}(),Mt=l(x(["take"],l(function(e,t){return new Pt(e,t)}),function(e,t){return Ne(0,e<0?1/0:e,t)}));var jt=function(){function e(e,t){this.xf=t,this.pos=0,this.full=!1,this.acc=new Array(e)}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=function(e){return this.acc=null,this.xf["@@transducer/result"](e)},e.prototype["@@transducer/step"]=function(e,t){return this.full&&(e=this.xf["@@transducer/step"](e,this.acc[this.pos])),this.store(t),e},e.prototype.store=function(e){this.acc[this.pos]=e,this.pos+=1,this.pos===this.acc.length&&(this.pos=0,this.full=!0)},e}(),Rt=l(x([],l(function(e,t){return new jt(e,t)}),function(e,t){return Mt(e=0&&e(t[n]);)n-=1;return Ne(0,n+1,t)})),Nt=function(){function e(e,t){this.xf=t,this.pred=e,this.lastValue=void 0,this.seenFirstValue=!1}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=E.result,e.prototype["@@transducer/step"]=function(e,t){var n=!1;return this.seenFirstValue?this.pred(this.lastValue,t)&&(n=!0):this.seenFirstValue=!0,this.lastValue=t,n?e:this.xf["@@transducer/step"](e,t)},e}(),zt=l(function(e,t){return new Nt(e,t)}),Bt=l(function(e,t){var n=e<0?t.length+e:e;return A(t)?t.charAt(n):t[n]}),Vt=Bt(-1),Lt=l(x([],zt,function(e,t){var n=[],r=1,o=t.length;if(0!==o)for(n[0]=t[0];r=0?t.length-e:0,t)}),Gt=l(function(e,t){return Xe(Yt(e.length,t),e)}),Jt=y(function(e,t,n){return Xe(e(t),e(n))}),Xt=y(function(e,t,n){return Xe(t[e],n[e])}),Zt=l(function e(t,n){var r,o,i,u={};for(o in n)i=typeof(r=t[o]),u[o]="function"===i?r(n[o]):r&&"object"===i?e(r,n[o]):n[o];return u}),Qt=function(){function e(e,t){this.xf=t,this.f=e,this.found=!1}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=function(e){return this.found||(e=this.xf["@@transducer/step"](e,void 0)),this.xf["@@transducer/result"](e)},e.prototype["@@transducer/step"]=function(e,t){return this.f(t)&&(this.found=!0,e=w(this.xf["@@transducer/step"](e,t))),e},e}(),en=l(x(["find"],l(function(e,t){return new Qt(e,t)}),function(e,t){for(var n=0,r=t.length;n=0;){if(e(t[n]))return t[n];n-=1}})),un=function(){function e(e,t){this.xf=t,this.f=e,this.idx=-1,this.lastIdx=-1}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=function(e){return this.xf["@@transducer/result"](this.xf["@@transducer/step"](e,this.lastIdx))},e.prototype["@@transducer/step"]=function(e,t){return this.idx+=1,this.f(t)&&(this.lastIdx=this.idx),e},e}(),an=l(x([],l(function(e,t){return new un(e,t)}),function(e,t){for(var n=t.length-1;n>=0;){if(e(t[n]))return n;n-=1}return-1})),sn=o(_e(!0)),ln=o(function(e){return h(e.length,function(t,n){var r=Array.prototype.slice.call(arguments,0);return r[0]=n,r[1]=t,e.apply(this,r)})}),cn=l(Ie("forEach",function(e,t){for(var n=t.length,r=0;rt}),yn=l(function(e,t){return e>=t}),gn=l(z),bn=l(function(e,t){return e in t}),mn=Bt(0);function xn(e){return e}var wn=o(xn),En=y(function(e,t,n){return h(Math.max(e.length,t.length,n.length),function(){return e.apply(this,arguments)?t.apply(this,arguments):n.apply(this,arguments)})}),On=c(1),_n=gt(function(e,t){return t},null),Sn=l(function(e,t){return"function"!=typeof t.indexOf||b(t)?Ze(t,e,0):t.indexOf(e)}),Cn=Ne(0,-1),An=y(function(e,t,n){return ot(function(t){return He(e,t,n)},t)}),kn=y(function(e,t,n){e=e=0?e:n.length;var r=Array.prototype.slice.call(n,0);return r.splice(e,0,t),r}),Fn=y(function(e,t,n){return e=e=0?e:n.length,[].concat(Array.prototype.slice.call(n,0,e),t,Array.prototype.slice.call(n,e))});function Dn(e,t,n){var r,o=typeof e;switch(o){case"string":case"number":return 0===e&&1/e==-1/0?!!n._items["-0"]||(t&&(n._items["-0"]=!0),!1):null!==n._nativeSet?t?(r=n._nativeSet.size,n._nativeSet.add(e),n._nativeSet.size===r):n._nativeSet.has(e):o in n._items?e in n._items[o]||(t&&(n._items[o][e]=!0),!1):(t&&(n._items[o]={},n._items[o][e]=!0),!1);case"boolean":if(o in n._items){var i=e?1:0;return!!n._items[o][i]||(t&&(n._items[o][i]=!0),!1)}return t&&(n._items[o]=e?[!1,!0]:[!0,!1]),!1;case"function":return null!==n._nativeSet?t?(r=n._nativeSet.size,n._nativeSet.add(e),n._nativeSet.size===r):n._nativeSet.has(e):o in n._items?!!Qe(e,n._items[o])||(t&&n._items[o].push(e),!1):(t&&(n._items[o]=[e]),!1);case"undefined":return!!n._items[o]||(t&&(n._items[o]=!0),!1);case"object":if(null===e)return!!n._items.null||(t&&(n._items.null=!0),!1);default:return(o=Object.prototype.toString.call(e))in n._items?!!Qe(e,n._items[o])||(t&&n._items[o].push(e),!1):(t&&(n._items[o]=[e]),!1)}}var Pn=function(){function e(){this._nativeSet="function"==typeof Set?new Set:null,this._items={}}return e.prototype.add=function(e){return!Dn(e,!0,this)},e.prototype.has=function(e){return Dn(e,!1,this)},e}(),Mn=l(function(e,t){for(var n,r,o=new Pn,i=[],u=0;ut.length?(n=e,r=t):(n=t,r=e),jn(ot(ln(Qe)(n),r))}),Tn=l(Ie("intersperse",function(e,t){for(var n=[],r=0,o=t.length;r=0;){if(Xe(t[n],e))return n;n-=1}return-1}return t.lastIndexOf(e)});function Xn(e){return"[object Number]"===Object.prototype.toString.call(e)}var Zn=o(function(e){return null!=e&&Xn(e.length)?e.length:NaN}),Qn=l(function(e,t){return function(n){return function(r){return $(function(e){return t(e,r)},n(e(r)))}}}),er=o(function(e){return Qn(Bt(e),Ct(e))}),tr=o(function(e){return Qn(H(e),ve(e))}),nr=o(function(e){return Qn(Y(e),pe(e))}),rr=l(function(e,t){return e=0;)i=e(n[r],i[0]),o[r]=i[1],r-=1;return[o,i[0]]}),ar=l(function(e,t){return T(function(n,r){return n[r]=e(t[r],r,t),n},{},q(t))}),sr=l(function(e,t){return t.match(e)||[]}),lr=l(function(e,t){return fe(e)?!fe(t)||t<1?NaN:(e%t+t)%t:NaN}),cr=y(function(e,t,n){return e(n)>e(t)?n:t}),dr=J(c,0),pr=o(function(e){return dr(e)/e.length}),fr=o(function(e){var t=e.length;if(0===t)return NaN;var n=2-t%2,r=(t-n)/2;return pr(Array.prototype.slice.call(e,0).sort(function(e,t){return et?1:0}).slice(r,r+n))}),hr=l(function(e,t){var n={};return p(t.length,function(){var r=e.apply(this,arguments);return z(r,n)||(n[r]=t.apply(this,arguments)),n[r]})}),vr=hr(function(){return lt(arguments)}),yr=l(function(e,t){return In({},e,t)}),gr=o(function(e){return In.apply(null,[{}].concat(e))}),br=y(function(e,t,n){var r,o={};for(r in t)z(r,t)&&(o[r]=z(r,n)?e(r,t[r],n[r]):t[r]);for(r in n)z(r,n)&&!z(r,o)&&(o[r]=n[r]);return o}),mr=y(function e(t,n,r){return br(function(n,r,o){return it(r)&&it(o)?e(t,r,o):t(n,r,o)},n,r)}),xr=l(function(e,t){return mr(function(e,t,n){return t},e,t)}),wr=l(function(e,t){return mr(function(e,t,n){return n},e,t)}),Er=y(function(e,t,n){return mr(function(t,n,r){return e(n,r)},t,n)}),Or=y(function(e,t,n){return br(function(t,n,r){return e(n,r)},t,n)}),_r=l(function(e,t){return t0&&e(H(t,n))}),qr=l(function(e,t){for(var n={},r=0;r=0;)t=e(n[r],t),r-=1;return t}),uo=f(4,[],function(e,t,n,r){return T(function(n,r){return e(n,r)?t(n,r):w(n)},n,r)}),ao=o(w),so=l(function(e,t){var n,r=Number(t),o=0;if(r<0||isNaN(r))throw new RangeError("n must be a non-negative number");for(n=new Array(r);oo?1:0})}),go=l(function(e,t){return Array.prototype.slice.call(t,0).sort(function(t,n){for(var r=0,o=0;0===r&&o=0&&e(t[n]);)n-=1;return Ne(n+1,1/0,t)}),Ao=function(){function e(e,t){this.xf=t,this.f=e}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=E.result,e.prototype["@@transducer/step"]=function(e,t){return this.f(t)?this.xf["@@transducer/step"](e,t):w(e)},e}(),ko=l(x(["takeWhile"],l(function(e,t){return new Ao(e,t)}),function(e,t){for(var n=0,r=t.length;no(e)},t.memoizeOneWithFlag=function(e){let t,n=null,o=!0;return(...i)=>{let u=(0,r.isEqualArgs)(n,i)?{cached:!0,first:o,result:t}:{cached:!1,first:o,result:(n=i)&&(t=e(...i))};return o=!1,u}},t.memoizeAll=function(e){const t=[];return(...n)=>{let o=t.find(e=>(0,r.isEqualArgs)(e.args,n));return(o||t[t.push({args:n,result:e(...n)})-1]).result}};var r=n(31);function o(e){let t,n=null;return(...o)=>(0,r.isEqualArgs)(n,o)?t:(n=o)&&(t=e(...o))}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=t.DebugLevel=void 0;!function(e){e[e.DEBUG=6]="DEBUG",e[e.NONE=7]="NONE"}(r||(t.DebugLevel=r={}));var o=t.LogLevel=void 0;!function(e){e[e.TRACE=0]="TRACE",e[e.INFO=1]="INFO",e[e.WARNING=2]="WARNING",e[e.ERROR=3]="ERROR",e[e.FATAL=4]="FATAL",e[e.NONE=5]="NONE"}(o||(t.LogLevel=o={}));let i=[];i[o.TRACE]="trace",i[o.INFO]="info",i[o.WARNING]="warning",i[o.ERROR]="error",i[o.FATAL]="fatal",i[o.NONE]="none",i[r.DEBUG]="debug",i[r.NONE]="trace";let u,a=o.NONE,s=r.NONE;function l(e,t){if(e{};let n,a="";switch(e){case o.TRACE:case o.INFO:n=window.console.log,a="color: white; background-color: #3166A2;";break;case r.DEBUG:case o.WARNING:n=window.console.warn,a="color: white; background-color: #E9B606;";break;case o.ERROR:case o.FATAL:n=window.console.error,a="color: white; background-color: #FF0000;"}let s=`${a&&u?"%c":""}[${i[e].toUpperCase()}]`;return a&&u?n.bind(window.console,s,a):n.bind(window.console,s)}u=!1;let c={setDebugLevel(e){s=e},setLogLevel(e){a=e}};Object.defineProperties(c,{trace:{get:()=>l(o.TRACE,a),configurable:!1,enumerable:!1},info:{get:()=>l(o.INFO,a),configurable:!1,enumerable:!1},warning:{get:()=>l(o.WARNING,a),configurable:!1,enumerable:!1},error:{get:()=>l(o.ERROR,a),configurable:!1,enumerable:!1},fatal:{get:()=>l(o.FATAL,a),configurable:!1,enumerable:!1},debug:{get:()=>l(r.DEBUG,s),configurable:!1,enumerable:!1}}),Object.freeze(c),t.default=c},function(e,t,n){var r; /*! Copyright (c) 2017 Jed Watson. Licensed under the MIT License (MIT), see @@ -9,10 +9,10 @@ window.dash_table=function(e){var t={};function n(r){if(t[r])return t[r].exports Licensed under the MIT License (MIT), see http://jedwatson.github.io/classnames */ -!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t(0,r.isEqualArgs)(n,o)?t:(n=o)&&(t=e(...o))},t.memoizeAll=function(e){const t=[];return(...n)=>{let o=t.find(e=>(0,r.isEqualArgs)(e.args,n));return(o||t[t.push({args:n,result:e(...n)})-1]).result}};var r=n(12)},function(e,t){e.exports=window.ReactDOM},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.defaultIsNully=t.SortDirection=void 0;var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));var o=t.SortDirection=void 0;!function(e){e.Ascending="asc",e.Descending="desc",e.None="none"}(o||(t.SortDirection=o={}));const i=t.defaultIsNully=(e=>void 0===e||null===e);t.default=((e,t,n=i)=>t.length?r.sortWith(r.map(e=>e.direction===o.Descending?r.comparator((t,r)=>{const o=e.columnId,i=t[o],u=r[o];return!n(i)&&(!!n(u)||i>u)}):r.comparator((t,r)=>{const o=e.columnId,i=t[o],u=r[o];return!n(i)&&(!!n(u)||i=0&&a.splice(t,1)}function h(e){var t=document.createElement("style");return void 0===e.attrs.type&&(e.attrs.type="text/css"),v(t,e.attrs),d(e,t),t}function v(e,t){Object.keys(t).forEach(function(n){e.setAttribute(n,t[n])})}function g(e,t){var n,r,o,i;if(t.transform&&e.css){if(!(i=t.transform(e.css)))return function(){};e.css=i}if(t.singleton){var a=s++;n=u||(u=h(t)),r=b.bind(null,n,a,!1),o=b.bind(null,n,a,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(e){var t=document.createElement("link");return void 0===e.attrs.type&&(e.attrs.type="text/css"),e.attrs.rel="stylesheet",v(t,e.attrs),d(e,t),t}(t),r=function(e,t,n){var r=n.css,o=n.sourceMap,i=void 0===t.convertToAbsoluteUrls&&o;(t.convertToAbsoluteUrls||i)&&(r=l(r));o&&(r+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(o))))+" */");var u=new Blob([r],{type:"text/css"}),s=e.href;e.href=URL.createObjectURL(u),s&&URL.revokeObjectURL(s)}.bind(null,n,t),o=function(){f(n),n.href&&URL.revokeObjectURL(n.href)}):(n=h(t),r=function(e,t){var n=t.css,r=t.media;r&&e.setAttribute("media",r);if(e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}.bind(null,n),o=function(){f(n)});return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else o()}}e.exports=function(e,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||"boolean"==typeof t.singleton||(t.singleton=o()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var n=p(e,t);return c(n,t),function(e){for(var o=[],i=0;ie===this.dataframe[t])||(this.__dataframe=n,this.__indices=o,this.target.update({viewportDataframe:n,viewportIndices:o}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){let t=null,n=[];for(;e.length;){e=e.replace(/^\s+/,"");let o=r.default.filter(e=>t&&e.when&&-1!==e.when.indexOf(t.name));if(o.length||(o=r.default),!(t=o.find(t=>t.regexp.test(e))||null))return{lexemes:n,valid:!1,error:e};const i=(e.match(t.regexp)||[])[0];n.push({lexeme:t,value:i}),e=e.substring(i.length)}return{lexemes:n,valid:!0}};var r=function(e){return e&&e.__esModule?e:{default:e}}(n(16))},function(e,t,n){"use strict";function r(e){return void 0!==e&&null!==e&&"object"==typeof e&&e.constructor===Object}function o(e,t,n=!1){return e===t||i(Object.values(e),Object.values(t),n)}function i(e,t,n=!1){return!!e&&e.length===t.length&&!!e.every((e,u)=>{const s=t[u];return e===s||n&&(Array.isArray(e)&&Array.isArray(s)&&i(e,s,n)||r(e)&&r(s)&&o(e,s,n))})}Object.defineProperty(t,"__esModule",{value:!0}),t.isEqual=o,t.isEqualArgs=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.colIsEditable=function(e,t){return e&&(!r.has("editable",t)||t.editable)};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isPrintableChar=function(e){return 32===e||e>=48&&e<=57||e>=96&&e<=111||e>=186&&e<=192||e>=219&&e<=222||e>=226||e>=65&&e<=90},t.isMetaKey=function(e){return-1!==o.indexOf(e)},t.isNavKey=function(e){return-1!==u.indexOf(e)},t.isArrowKey=function(e){return-1!==i.indexOf(e)},t.isCtrlKey=function(e){const t=[];window.navigator.platform.includes("Mac")?t.push(r.COMMAND_LEFT,r.COMMAND_RIGHT,r.COMMAND_FIREFOX):t.push(r.CONTROL);return t.includes(e)},t.isCtrlMetaKey=function(e){return[r.CONTROL,r.COMMAND_LEFT,r.COMMAND_RIGHT,r.COMMAND_FIREFOX].includes(e)};const r=t.KEY_CODES={MOUSE_LEFT:1,MOUSE_RIGHT:3,MOUSE_MIDDLE:2,BACKSPACE:8,COMMA:188,INSERT:45,DELETE:46,END:35,ENTER:13,ESCAPE:27,CONTROL:17,COMMAND_LEFT:91,COMMAND_RIGHT:93,COMMAND_FIREFOX:224,ALT:18,HOME:36,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,SPACE:32,SHIFT:16,CAPS_LOCK:20,TAB:9,ARROW_RIGHT:39,ARROW_LEFT:37,ARROW_UP:38,ARROW_DOWN:40,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,A:65,X:88,C:67,V:86},o=[r.ARROW_DOWN,r.ARROW_UP,r.ARROW_LEFT,r.ARROW_RIGHT,r.HOME,r.END,r.DELETE,r.BACKSPACE,r.F1,r.F2,r.F3,r.F4,r.F5,r.F6,r.F7,r.F8,r.F9,r.F10,r.F11,r.F12,r.TAB,r.PAGE_DOWN,r.PAGE_UP,r.ENTER,r.ESCAPE,r.SHIFT,r.CAPS_LOCK,r.ALT],i=[r.ARROW_DOWN,r.ARROW_UP,r.ARROW_LEFT,r.ARROW_RIGHT],u=[...i,r.TAB,r.ENTER];t.isCtrlDown=(e=>(e.ctrlKey||e.metaKey)&&!e.altKey)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.deleteRow=function(e,t){const n=t.active_cell,o=t.dataframe,i=t.end_cell,u=t.selected_cell,s=t.selected_rows,a=t.start_cell,l={dataframe:r.remove(e,1,o)};r.is(Array,n)&&n[0]===e&&(l.active_cell=[]);r.is(Array,i)&&i[0]===e&&(l.end_cell=[]);r.is(Array,u)&&u[0]===e&&(l.selected_cell=[]);r.is(Array,a)&&a[0]===e&&(l.start_cell=[0,0]);r.is(Array,s)&&r.contains(e,s)&&(l.selected_rows=r.without([e],s));return l},t.deleteColumn=function(e,t,n){const i=n.columns,u=n.dataframe;var s=o(e,t,n);const a=s.groupIndexFirst,l=s.groupIndexLast,c=r.slice(a,l+1,r.pluck("id",i));return{columns:r.remove(a,1+l-a,i),dataframe:r.map(r.omit(c),u),active_cell:[],end_cell:[],selected_cell:[],start_cell:[0]}},t.editColumnName=function(e,t,n){const i=n.columns;var u=o(e,t,n);const s=u.groupIndexFirst,a=u.groupIndexLast,l=window.prompt("Enter a new column name");let c=r.clone(i);return r.range(s,a+1).map(e=>{let n;n="Array"===r.type(i[e].name)?[e,"name",t]:[e,"name"],c=r.set(r.lensPath(n),l,c)}),{columns:c}};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));function o(e,t,n){const o=n.columns;let i,u;"Null"!==r.type(t)?(i=e.name[t],u=r.pluck(t,r.pluck("name",o))):(i=e.name,u=r.pluck("name",o));const s=r.findIndex(r.propEq("id",e.id),o);let a=s,l=s;for(;u[a-1]===i;)a--;for(;u[l+1]===i;)l++;return{groupIndexFirst:a,groupIndexLast:l}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LexemeType=void 0;var r=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var u,s=e[Symbol.iterator]();!(r=(u=s.next()).done)&&(n.push(u.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw i}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),o=function(e){return e&&e.__esModule?e:{default:e}}(n(3));var i=t.LexemeType=void 0;!function(e){e.And="and",e.BlockClose="close-block",e.BlockOpen="open-block",e.BinaryOperator="logical-binary-operator",e.Expression="expression",e.Or="or",e.Operand="operand",e.UnaryNot="unary-not",e.UnaryOperator="logical-unary-operator"}(i||(t.LexemeType=i={}));const u={resolve:(e,t)=>{if(o.default.trace("resolve -> exp",e,t),/^('.*')|(".*")$/.test(t.value))return t.value.slice(1,t.value.length-1);if(!/^\w+\(.*\)$/.test(t.value))return e[t.value];{const e=t.value.match(/^(\w+)\((.*)\)$/);if(!e)throw Error();{var n=r(e,3);const t=n[1],o=n[2];switch(t){case"num":return parseInt(o,10);case"str":default:return o}}}},regexp:/^(((num|str)\([^()]*\))|'([^()']|\\')+'|"([^()"]|\\")+"|\w+)/},s=[{evaluate:(e,t)=>{o.default.trace("evalute -> &&",e,t);const n=t,r=n.left.lexeme.evaluate(e,n.left),i=n.right.lexeme.evaluate(e,n.right);return r&&i},name:i.And,priority:2,regexp:/^(and\s|&&)/i,syntaxer:(e,t,n)=>Object.assign({left:e.slice(0,n),right:e.slice(n+1)},t)},{evaluate:(e,t)=>{o.default.trace("evalute -> ||",e,t);const n=t;return n.left.lexeme.evaluate(e,n.left)||n.right.lexeme.evaluate(e,n.right)},name:i.Or,priority:3,regexp:/^(or\s|\|\|)/i,syntaxer:(e,t,n)=>Object.assign({left:e.slice(0,n),right:e.slice(n+1)},t)},{name:i.BlockClose,nesting:-1,regexp:/^\)/},{evaluate:(e,t)=>{o.default.trace("evaluate -> ()",e,t);const n=t;return n.block.lexeme.evaluate(e,n.block)},name:i.BlockOpen,nesting:1,priority:1,regexp:/^\(/,syntaxer:e=>Object.assign({block:e.slice(1,e.length-1)},e[0]),when:[i.UnaryNot]},Object.assign({name:i.Operand},u),{evaluate:(e,t)=>{o.default.trace("evaluate -> binary",e,t);const n=t,r=n.left.lexeme.resolve(e,n.left),i=n.right.lexeme.resolve(e,n.right);switch(o.default.trace(`opValue: ${r}, expValue: ${i}`),t.value.toLowerCase()){case"eq":case"=":return r===i;case"gt":case">":return r>i;case"ge":case">=":return r>=i;case"lt":case"<":return r=|<=|>|<|!=|=|ge|le|gt|lt|eq|ne)/i,syntaxer:e=>{var t=r(e,3);let n=t[0],o=t[1],i=t[2];return Object.assign({left:n,right:i},o)},when:[i.Operand]},{evaluate:(e,t)=>{o.default.trace("evaluate -> unary",e,t);const n=t,r=n.block.lexeme.resolve(e,n.block);switch(t.value.toLowerCase()){case"is even":return"number"==typeof r&&r%2==0;case"is nil":return void 0===r||null===r;case"is bool":return"boolean"==typeof r;case"is odd":return"number"==typeof r&&r%2==1;case"is num":return"number"==typeof r;case"is object":return null!==r&&"object"==typeof r;case"is str":return"string"==typeof r;case"is prime":return"number"==typeof r&&(e=>{if(2===e)return!0;if(e<2||e%2==0)return!1;for(let t=3;t*t<=e;t+=2)if(e%t==0)return!1;return!0})(r);default:throw new Error}},name:i.UnaryOperator,priority:0,regexp:/^((is nil)|(is odd)|(is even)|(is bool)|(is num)|(is object)|(is str)|(is prime))/i,syntaxer:e=>{var t=r(e,2);let n=t[0],o=t[1];return Object.assign({block:n},o)},when:[i.Operand]},{evaluate:(e,t)=>{o.default.trace("evaluate -> unary not",e,t);const n=t;return!n.block.lexeme.evaluate(e,n.block)},name:i.UnaryNot,priority:1.5,regexp:/^!/,syntaxer:e=>Object.assign({block:e.slice(1,e.length)},e[0]),when:[i.UnaryNot]},Object.assign({name:i.Expression,when:[i.BinaryOperator]},u)];t.default=s},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=u(n(3)),o=u(n(11)),i=u(n(18));function u(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e){this.query=e,this.evaluate=(e=>{if(!this.isValid||!this.tree){const e=`unable to evaluate target: syntax tree is invalid for query=${this.query}`;throw r.default.error(e),new Error(e)}const t=this.tree.lexeme.evaluate;return!!t&&t(e,this.tree)}),this.filter=(e=>e.filter(this.evaluate)),this.result=(0,i.default)((0,o.default)(this.query))}get isValid(){return this.result.valid}get tree(){return this.result.tree}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(3));const o=e=>{let t=0;const n=e.map(e=>{const n=Object.assign({},e,{nesting:t});return t+=e.lexeme.nesting||0,n}),i=n.filter(e=>0===e.nesting&&"number"==typeof e.lexeme.priority).sort((e,t)=>(t.lexeme.priority||-1)-(e.lexeme.priority||-1))[0];r.default.trace("parser -> pivot",i,e);const u=n.indexOf(i);if(i.lexeme.syntaxer){let t=i.lexeme.syntaxer(e,i,u);return Array.isArray(t.left)&&(t.left=o(t.left)),Array.isArray(t.right)&&(t.right=o(t.right)),Array.isArray(t.block)&&(t.block=o(t.block)),t}throw new Error(i.lexeme.name)};t.default=(e=>{const t=e.lexemes;if(!e.valid)return{valid:!1,error:`lexer -- ${e.error}`};try{return{tree:o(t),valid:!0}}catch(e){return{valid:!1,error:e}}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=((e,t=null)=>{if(t=t||(()=>{for(t=e;t&&"td"!==t.nodeName.toLowerCase();)t=t.parentElement;return t})(),!e||!t)return;let n=e;for(;"relative"!==getComputedStyle(n).position&&"sticky"!==getComputedStyle(n).position&&n.parentElement;)n=n.parentElement;let r=e;for(;"relative"!==getComputedStyle(r).position&&r.parentElement;)r=r.parentElement;const o=n.getBoundingClientRect(),i=r.getBoundingClientRect(),u=t.getBoundingClientRect(),s=u.left-o.left+n.scrollLeft,a=u.top-o.top+n.scrollTop+u.height;e.style.width=`${u.width}px`,e.style.top=`${a}px`,e.style.left=`${s}px`,e.style.position="absolute",u.top+u.height/2>i.bottom||u.top-u.height/2i.left+i.width?e.style.display="none":e.style.display="block"})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=function(e){return e&&e.__esModule?e:{default:e}}(r);class i extends r.PureComponent{constructor(e){super(e),this.handleChange=(e=>this.setState({value:e.target.value})),this.submit=(()=>this.state.value!==this.props.value&&this.props.submit(this.state.value)),this.state={value:e.value}}get propsWithDefaults(){return this.props}render(){var e=this.propsWithDefaults;const t=e.stopPropagation,n=e.updateOnBlur,r=e.updateOnSubmit;let i={onBlur:n?this.submit:void 0,onKeyDown:t?e=>e.stopPropagation():void 0,onSubmit:r?this.submit:void 0};return o.default.createElement("input",Object.assign({ref:"input",type:"text",value:this.state.value||"",onChange:this.handleChange},i))}}t.default=i,i.defaultProps={stopPropagation:!1,updateOnBlur:!0,updateOnSubmit:!0}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(this.props,[]);return function(e){c.forEach(function(t){return delete e[t]})}(o),o.className=this.props.inputClassName,o.id=this.state.inputId,o.style=n,u.default.createElement("div",{className:this.props.className,style:t},this.renderStyles(),u.default.createElement("input",r({},o,{ref:this.inputRef})),u.default.createElement("div",{ref:this.sizerRef,style:l},e),this.props.placeholder?u.default.createElement("div",{ref:this.placeHolderSizerRef,style:l},this.props.placeholder):null)}}]),t}();h.propTypes={className:s.default.string,defaultValue:s.default.any,extraWidth:s.default.oneOfType([s.default.number,s.default.string]),id:s.default.string,injectStyles:s.default.bool,inputClassName:s.default.string,inputRef:s.default.func,inputStyle:s.default.object,minWidth:s.default.oneOfType([s.default.number,s.default.string]),onAutosize:s.default.func,onChange:s.default.func,placeholder:s.default.string,placeholderIsMinWidth:s.default.bool,style:s.default.object,value:s.default.any},h.defaultProps={minWidth:1,injectStyles:!0},t.default=h},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Table=void 0;var r=u(n(23)),o=u(n(3)),i=u(n(25));function u(e){return e&&e.__esModule?e:{default:e}}o.default.setDebugLevel(r.default.debugLevel),o.default.setLogLevel(r.default.logLevel),t.Table=i.default},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),o=function(e){return e&&e.__esModule?e:{default:e}}(n(24));const i="dash_debug",u="dash_log";t.default=class{static get searchParams(){return new URL(window.location.href).searchParams||{get:()=>null}}static get debugLevel(){const e=this.searchParams.get(i)||o.default.get(i);return e&&r.DebugLevel[e]||r.DebugLevel.NONE}static get logLevel(){const e=this.searchParams.get(u)||o.default.get(u);return e&&r.LogLevel[e]||r.LogLevel.ERROR}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=864e5,o=63072e7;class i{static delete(e,t="",n="/"){let o=new Date((new Date).getTime()-r).toUTCString();document.cookie=`${e}=;expires=${o};domain=${t};path=${n}`}static get(e){if(!e.length)return;return e=e.toLowerCase(),(document.cookie.split(";").map(e=>{let t=e.split("=");return{id:t[0].trim(),value:t[1]}}).find(t=>e===t.id.toLocaleLowerCase())||{}).value}static set(e,t,n="",r="/"){let u=`${e}=${t};expires=${new Date((new Date).getTime()+o).toUTCString()};domain=${n};path=${r}`;i.get(e)&&i.delete(e,n,r),document.cookie=u}}t.default=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.propTypes=t.defaultProps=void 0;var r=n(1),o=s(r),i=s(n(0)),u=s(n(28));function s(e){return e&&e.__esModule?e:{default:e}}n(58);class a extends r.Component{render(){return o.default.createElement(u.default,this.props)}}t.default=a;const l=t.defaultProps={virtualization:"fe",virtualization_settings:{displayed_pages:1,current_page:0,page_size:250},navigation:"page",content_style:"fit",filtering:!1,filtering_settings:"",filtering_type:"basic",filtering_types:["basic"],sorting:!1,sorting_type:"single",sorting_settings:[],virtual_dataframe:[],virtual_dataframe_indices:[],column_conditional_dropdowns:[],column_static_dropdown:[],column_conditional_styles:[],column_static_style:[],row_conditional_styles:[],row_static_style:{},changed_data:{},dataframe:[],columns:[],editable:!1,active_cell:[],index_name:"",types:{},merged_styles:{},selected_cell:[[]],selected_rows:[],row_selectable:!1,table_style:[],base_styles:{numeric:{"text-align":"right","font-family":"'Droid Sans Mono', Courier, monospace"},string:{"text-align":"left"},input:{padding:0,margin:0,width:"80px",border:"none","font-size":"1rem"},"input-active":{outline:"#7FDBFF auto 3px"},table:{},thead:{},th:{},td:{}}},c=t.propTypes={active_cell:i.default.array,columns:i.default.arrayOf(i.default.object),content_style:i.default.oneOf(["fit","grow"]),dataframe:i.default.arrayOf(i.default.object),dataframe_previous:i.default.arrayOf(i.default.object),dataframe_timestamp:i.default.any,editable:i.default.bool,end_cell:i.default.arrayOf(i.default.number),id:i.default.string.isRequired,is_focused:i.default.bool,merge_duplicate_headers:i.default.bool,n_fixed_columns:i.default.number,n_fixed_rows:i.default.number,row_deletable:i.default.bool,row_selectable:i.default.oneOf(["single","multi",!1]),selected_cell:i.default.arrayOf(i.default.arrayOf(i.default.number)),selected_rows:i.default.arrayOf(i.default.number),setProps:i.default.any,start_cell:i.default.arrayOf(i.default.number),style_as_list_view:i.default.bool,table_style:i.default.arrayOf(i.default.shape({selector:i.default.string,rule:i.default.string})),virtualization:i.default.oneOf(["fe","be",!0,!1]),virtualization_settings:i.default.shape({displayed_pages:i.default.number,current_page:i.default.number,page_size:i.default.number}),navigation:i.default.string,column_conditional_dropdowns:i.default.arrayOf(i.default.shape({id:i.default.string,dropdowns:i.default.arrayOf(i.default.shape({condition:i.default.string,dropdown:i.default.arrayOf(i.default.shape({label:i.default.string,value:i.default.any}))}))})),column_static_dropdown:i.default.arrayOf(i.default.shape({id:i.default.string,dropdown:i.default.arrayOf(i.default.shape({label:i.default.string,value:i.default.any}))})),column_conditional_style:i.default.arrayOf(i.default.shape({id:i.default.string,styles:i.default.arrayOf(i.default.shape({condition:i.default.string,style:i.default.object}))})),column_static_style:i.default.arrayOf(i.default.shape({id:i.default.string,style:i.default.object})),row_conditional_styles:i.default.arrayOf(i.default.shape({condition:i.default.string,style:i.default.object})),row_static_style:i.default.object,filtering:i.default.oneOf(["fe","be",!0,!1]),filtering_settings:i.default.string,filtering_type:i.default.oneOf(["basic"]),filtering_types:i.default.arrayOf(i.default.oneOf(["basic"])),sorting:i.default.oneOf(["fe","be",!0,!1]),sorting_type:i.default.oneOf(["single","multi"]),sorting_settings:i.default.arrayOf(i.default.shape({columnId:i.default.oneOfType([i.default.string,i.default.number]),direction:i.default.oneOf(["asc","desc"])})),sorting_treat_empty_string_as_none:i.default.bool,virtual_dataframe:i.default.arrayOf(i.default.object),virtual_dataframe_indices:i.default.arrayOf(i.default.number),dropdown_properties:i.default.any};a.defaultProps=l,a.propTypes=c},function(e,t,n){"use strict";var r=n(27);function o(){}e.exports=function(){function e(e,t,n,o,i,u){if(u!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t};return n.checkPropTypes=o,n.PropTypes=n,n}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=c(r),i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),u=n(5),s=c(n(29)),a=c(n(33)),l=c(n(50));function c(e){return e&&e.__esModule?e:{default:e}}n(51),n(54),n(56);t.default=class extends r.Component{constructor(e){super(e),this.__adapter=(0,u.memoizeOne)(()=>new l.default(this)),this.__setProps=(0,u.memoizeOne)(e=>e?t=>{if(i.has("dataframe",t)){const e=this.props.dataframe;t.dataframe_timestamp=Date.now(),t.dataframe_previous=e}e(t)}:e=>this.setState(e)),this.__virtualizer=(0,u.memoizeOne)((e,t)=>s.default.getVirtualizer(this.adapter))}get setProps(){return this.__setProps(this.props.setProps)}render(){const e=this.setProps,t=this.virtualizer;return t.refresh(),o.default.createElement(a.default,Object.assign({},i.mergeAll([this.props,this.state,{setProps:e,virtualizer:t}])))}get adapter(){return this.__adapter()}get virtualizer(){var e=this.props;const t=e.virtualization,n=e.virtualization_settings;return this.__virtualizer(t,n)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=u(n(30)),o=u(n(31)),i=u(n(32));function u(e){return e&&e.__esModule?e:{default:e}}t.default=class{static getVirtualizer(e){switch(e.virtualization){case!1:return new i.default(e);case!0:case"fe":return new o.default(e);case"be":return new r.default(e);default:throw new Error(`Unknown virtualization type: '${e.virtualization}'`)}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(10));t.default=class extends r.default{constructor(e){super(e)}getDataframe(){var e=this.target;return{dataframe:e.dataframe,indices:e.indices}}get offset(){return 0}loadNext(){let e=this.target.settings;e.current_page++,this.target.update({settings:e})}loadPrevious(){let e=this.target.settings;e.current_page<=0||(e.current_page--,this.target.update({settings:e}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(10));t.default=class extends r.default{constructor(e){super(e)}getDataframe(){var e=this.target;let t=e.settings,n=e.dataframe,r=e.indices,o=Math.min(t.current_page,Math.floor(n.length/t.page_size));return this.firstIndex=t.page_size*o,this.lastIndex=Math.min(this.firstIndex+t.displayed_pages*t.page_size,n.length),{dataframe:n.slice(this.firstIndex,this.lastIndex),indices:r.slice(this.firstIndex,this.lastIndex)}}get offset(){return this.firstIndex}loadNext(){var e=this.target;let t=e.settings,n=e.dataframe,r=Math.floor(n.length/t.page_size);t.current_page>=r||(t.current_page++,this.target.update({settings:t}))}loadPrevious(){let e=this.target.settings;e.current_page<=0||(e.current_page--,this.target.update({settings:e}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=function(e){return e&&e.__esModule?e:{default:e}}(n(10));t.default=class extends o.default{constructor(e){super(e),this.refresh()}getDataframe(){let e=this.target.dataframe;return{dataframe:e,indices:r.range(0,e.length)}}get offset(){return 0}loadNext(){}loadPrevious(){}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=m(r),i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),u=m(n(34)),s=n(13),a=n(14),l=n(35),c=n(36),p=m(c),d=m(n(3)),f=n(5),h=m(n(11)),v=m(n(39)),g=m(n(42)),y=m(n(19)),b=m(n(46));function m(e){return e&&e.__esModule?e:{default:e}}const x=i.sort((e,t)=>e-t);t.default=class extends r.Component{constructor(e){super(e),this.getLexerResult=(0,f.memoizeOne)(h.default),this.handleClickOutside=(e=>{const t=this.$el;t&&!t.contains(e.target)&&this.props.is_focused&&this.props.setProps({is_focused:!1})}),this.handlePaste=(e=>{const t=this.$el;t&&t.contains(document.activeElement)&&this.onPaste(e)}),this.handleResize=(()=>{var e=this.refs;const t=e.r0c0,n=e.r0c1,r=e.r1c0,o=e.r1c1;var u=this.props;const s=u.n_fixed_columns,a=u.n_fixed_rows,l=u.table_style;i.forEach(({selector:e,rule:t})=>{this.stylesheet.setRule(e,t)},l);let c=n.querySelectorAll("tr");t.querySelectorAll("tr").forEach((e,t)=>{const n=c[t];e.style.height=getComputedStyle(n).height});let p=o.querySelectorAll("tr > th:first-of-type");r.querySelectorAll("tr > th:first-of-type").forEach((e,t)=>{const n=p[t].parentElement;e.parentElement.style.height=getComputedStyle(n).height});const d=o.querySelector("tr > td:first-of-type");if(d){const e=d.parentElement;this.stylesheet.setRule(".cell-1-0 tr",`height: ${getComputedStyle(e).height}`)}a&&o.querySelectorAll("tr:first-of-type td").forEach((e,t)=>{const n=getComputedStyle(e).width;this.stylesheet.setRule(`.dash-fixed-row:not(.dash-fixed-column) th:nth-of-type(${t+1})`,`width: ${n}; min-width: ${n}; max-width: ${n};`)}),s&&a&&r.querySelectorAll("tr:first-of-type td").forEach((e,t)=>{const n=getComputedStyle(e).width;this.stylesheet.setRule(`.dash-fixed-column.dash-fixed-row th:nth-of-type(${t+1})`,`width: ${n}; min-width: ${n}; max-width: ${n};`)})}),this.handleKeyDown=(e=>{var t=this.props;const n=t.active_cell,r=t.columns,o=t.setProps,i=t.is_focused,u=t.editable;if(d.default.trace(`handleKeyDown: ${e.key}`),(0,a.isCtrlMetaKey)(e.keyCode))return;const l=(0,a.isCtrlDown)(e);l&&e.keyCode===a.KEY_CODES.V||e.keyCode===a.KEY_CODES.C&&l&&!i||(e.keyCode!==a.KEY_CODES.ESCAPE?e.keyCode!==a.KEY_CODES.ENTER||i||!(0,s.colIsEditable)(u,r[n[1]])?i&&e.keyCode!==a.KEY_CODES.TAB&&e.keyCode!==a.KEY_CODES.ENTER||((0,a.isNavKey)(e.keyCode)?this.switchCell(e):e.keyCode===a.KEY_CODES.BACKSPACE||e.keyCode===a.KEY_CODES.DELETE?this.deleteCell(e):this.props.is_focused||!(0,s.colIsEditable)(u,r[n[1]])||(0,a.isMetaKey)(e.keyCode)||o({is_focused:!0})):o({is_focused:!0}):o({is_focused:!1}))}),this.switchCell=(e=>{const t=e;var n=this.props;const r=n.active_cell,o=n.columns,u=n.row_deletable,s=n.row_selectable,l=n.selected_cell,c=n.setProps,p=n.virtualizer.dataframe;e.preventDefault(),this.$el.focus();const d=l.length>1,f=t.keyCode===a.KEY_CODES.ENTER||t.keyCode===a.KEY_CODES.TAB;if(d&&f)return void c({is_focused:!1,active_cell:this.getNextCell(t,{currentCell:r,restrictToSelection:!0})});if(!t.shiftKey){const e=this.getNextCell(t,{currentCell:r,restrictToSelection:!1});return void c({is_focused:!1,selected_cell:[e],active_cell:e})}let h=[],v=[];const g=x(i.uniq(i.pluck(0,l))),y=x(i.uniq(i.pluck(1,l))),b=g[0],m=y[0],E=g[g.length-1],w=y[y.length-1],_=(u?1:0)+(s?1:0),O=[];o.forEach((e,t)=>{e.hidden||O.push(t+_)});const S=t.keyCode===a.KEY_CODES.ARROW_DOWN||t.keyCode===a.KEY_CODES.ENTER,C=t.keyCode===a.KEY_CODES.ARROW_UP,A=t.keyCode===a.KEY_CODES.ARROW_RIGHT||t.keyCode===a.KEY_CODES.TAB,k=t.keyCode===a.KEY_CODES.ARROW_LEFT;S&&r[0]>b?v=y.map(e=>[b,e]):S&&E!==p.length-1?h=y.map(e=>[E+1,e]):C&&r[0][E,e]):C&&b>0?h=y.map(e=>[b-1,e]):k&&r[1][e,w]):k&&m>0?h=g.map(e=>[e,m-1]):A&&r[1]>m?v=g.map(e=>[e,m]):A&&w+1<=i.last(O)&&(h=g.map(e=>[e,w+1])),c({is_focused:!1,selected_cell:i.without(v,i.uniq(i.concat(h,l)))})}),this.deleteCell=(e=>{var t=this.props;const n=t.columns,r=t.dataframe,o=t.editable,u=t.row_deletable,a=t.row_selectable,l=t.selected_cell,c=t.setProps,p=t.virtual_dataframe_indices;e.preventDefault();let d=r;const f=(u?1:0)+(a?1:0);i.map(e=>[p[e[0]],e[1]-f],l).forEach(e=>{(0,s.colIsEditable)(o,n[e[1]])&&(d=i.set(i.lensPath([e[0],n[e[1]].id]),"",d))}),c({dataframe:d})}),this.getNextCell=((e,{restrictToSelection:t,currentCell:n})=>{var r=this.props;const o=r.columns,u=r.row_deletable,s=r.row_selectable,c=r.selected_cell,p=r.virtualizer.dataframe,d=e,f=[],h=(u?1:0)+(s?1:0);switch(t||o.forEach((e,t)=>{e.hidden||f.push(t+h)}),d.keyCode){case a.KEY_CODES.ARROW_LEFT:return t?(0,l.selectionCycle)([n[0],n[1]-1],c):[n[0],i.max(f[0],f[i.indexOf(n[1],f)-1])];case a.KEY_CODES.ARROW_RIGHT:case a.KEY_CODES.TAB:return t?(0,l.selectionCycle)([n[0],n[1]+1],c):[n[0],i.min(i.last(f),f[i.indexOf(n[1],f)+1])];case a.KEY_CODES.ARROW_UP:return t?(0,l.selectionCycle)([n[0]-1,n[1]],c):[i.max(0,n[0]-1),n[1]];case a.KEY_CODES.ARROW_DOWN:case a.KEY_CODES.ENTER:return t?(0,l.selectionCycle)([n[0]+1,n[1]],c):[i.min(p.length-1,n[0]+1),n[1]];default:throw new Error(`Table.getNextCell: unknown navigation keycode ${d.keyCode}`)}}),this.onCopy=(e=>{var t=this.props;const n=t.columns,r=t.row_deletable,o=t.row_selectable,u=t.selected_cell,s=t.virtualizer.dataframe,a=(r?1:0)+(o?1:0),l=i.map(e=>[e[0],e[1]-a],u);v.default.toClipboard(e,l,n,s),this.$el.focus()}),this.onPaste=(e=>{var t=this.props;const n=t.active_cell,r=t.columns,o=t.dataframe,i=t.editable,u=t.filtering_settings,s=t.row_deletable,a=t.row_selectable,l=t.setProps,c=t.sorting_settings,p=t.virtual_dataframe_indices;if(!i)return;const d=(s?1:0)+(a?1:0),f=[n[0],n[1]-d],h=v.default.fromClipboard(e,f,p,r,o,!0,!c.length||!u.length);h&&l(h)}),this.loadNext=(()=>{this.props.virtualizer.loadNext()}),this.loadPrevious=(()=>{this.props.virtualizer.loadPrevious()}),this.onContainerScroll=(e=>{if(!this.props.n_fixed_columns)return;const t=this.refs.spreadsheet;e.target===t&&this.stylesheet.setRule(".frozen-left",`margin-top: ${-e.target.scrollTop}px;`)}),this.applyStyle=((e,t,n)=>{let r=0;t&&(this.stylesheet.setRule(`.dash-spreadsheet-inner td.column-${r}`,"width: 30px; max-width: 30px; min-width: 30px;"),++r),n&&(this.stylesheet.setRule(`.dash-spreadsheet-inner td.column-${r}`,"width: 30px; max-width: 30px; min-width: 30px;"),++r),i.forEach(e=>{const t=u.default.unit(e.width||c.DEFAULT_CELL_WIDTH,"px"),n=u.default.unit(e.maxWidth||e.width||c.DEFAULT_CELL_WIDTH,"px"),o=u.default.unit(e.minWidth||e.width||c.DEFAULT_CELL_WIDTH,"px");this.stylesheet.setRule(`.dash-spreadsheet-inner td.column-${r}`,`width: ${t}; max-width: ${n}; min-width: ${o};`),this.stylesheet.setRule(`.dash-spreadsheet-inner th.column-${r}`,`width: ${t}; max-width: ${n}; min-width: ${o};`),++r},e)}),this.renderFragment=(e=>e?o.default.createElement("table",{tabIndex:-1},o.default.createElement("tbody",null,e.map((e,t)=>o.default.createElement("tr",{key:`row-${t}`},e)))):null),this.handleSetFilter=(e=>this.props.setProps({filtering_settings:e})),this.getCells=(()=>[...p.default.createHeaders(this.props),...this.filterFactory.createFilters(),...this.cellFactory.createCells()]),this.getFragments=((e,t,n)=>{const r=t?i.map(e=>e.splice(0,i.reduceWhile(e=>e.count(e.cells++,e.count+=t.props.colSpan||1,e),{cells:0,count:0},e).cells),e):null,o=n?e.splice(0,n):null,u=n&&r?r.splice(0,n):null;return[[this.renderFragment(u),this.renderFragment(o)],[this.renderFragment(r),this.renderFragment(e)]]}),this.handleDropdown=(()=>{const e=this.refs.r1c1;(0,y.default)(e.querySelector(".Select-menu-outer"))}),this.onScroll=(e=>{const t=this.refs.r0c1;d.default.trace(`ControlledTable fragment scrolled to (left,top)=(${e.target.scrollLeft},${e.target.scrollTop})`),t.style.marginLeft=`${-e.target.scrollLeft}px`,this.handleDropdown()}),this.cellFactory=new g.default(()=>this.props),this.filterFactory=new b.default(()=>{var e=this.props;const t=e.row_deletable,n=e.row_selectable,r=(t?1:0)+(n?1:0);return{columns:this.props.columns,filtering:this.props.filtering,filtering_settings:this.props.filtering_settings,filtering_type:this.props.filtering_type,id:this.props.id,offset:r,setFilter:this.handleSetFilter}}),this.stylesheet=new u.default(`#${e.id}`)}get lexerResult(){const e=this.props.filtering_settings;return this.getLexerResult(e)}componentDidMount(){this.props.selected_cell.length&&!i.contains(this.props.active_cell,this.props.selected_cell)&&this.props.setProps({active_cell:this.props.selected_cell[0]}),this.handleResize()}componentWillMount(){window.addEventListener("resize",this.handleResize),document.addEventListener("paste",this.handlePaste),document.addEventListener("mousedown",this.handleClickOutside)}componentWillUnmount(){window.removeEventListener("resize",this.handleResize),document.removeEventListener("mousedown",this.handleClickOutside),document.removeEventListener("paste",this.handlePaste)}componentDidUpdate(){this.handleResize(),this.handleDropdown()}get $el(){return document.getElementById(this.props.id)}get displayPagination(){var e=this.props;const t=e.dataframe,n=e.navigation,r=e.virtualization,o=e.virtualization_settings;return"page"===n&&("fe"===r&&o.page_sizeo.default.createElement("div",{key:`r${t}`,ref:`r${t}`,className:`row row-${t}`,onScroll:this.onScroll},e.map((e,n)=>o.default.createElement("div",{key:n,ref:`r${t}c${n}`,className:`cell cell-${t}-${n} ${p[t][n]}`},e)))))),this.displayPagination?o.default.createElement("div",null,o.default.createElement("button",{className:"previous-page",onClick:this.loadPrevious},"Previous"),o.default.createElement("button",{className:"next-page",onClick:this.loadNext},"Next")):null)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(3));class o{constructor(e){this.name=e}get rules(){const e=this.sheet;return Array.from(e.rules||e.cssRules)}addRule(e,t){this.sheet.addRule?this.sheet.addRule(e,t):this.sheet.insertRule(`${e} { ${t} }`,0)}deleteRule(e){this.sheet.deleteRule(e)}findRule(e){const t=this.rules,n=t.findIndex(t=>t.selectorText===e);return-1===n?null:{rule:t[n],index:n}}get sheet(){return(this.__stylesheet=this.__stylesheet||(()=>{const e=document.createElement("style");return e.type="text/css",e.id=this.name,document.getElementsByTagName("head")[0].appendChild(e),e})()).sheet}}class i{constructor(e){this.prefix=e,this.stylesheet=new o(`${e}-dynamic-inline.css`)}static unit(e,t="px"){return i.hasUnit(e)?e:`${e}${t}`}static hasUnit(e){return"string"==typeof e&&/^\d+(\.\d+)?(px|em|rem|%)$/.test(e)}deleteRule(e){e=`${this.prefix} ${e}`;const t=this.stylesheet.findRule(e);t&&this.stylesheet.deleteRule(t.index)}setRule(e,t){e=`${this.prefix} ${e}`;const n=this.stylesheet.findRule(e);if(n){if(n.rule.cssText===t||n.rule.cssText===`${e} { ${t} }`)return;this.stylesheet.deleteRule(n.index)}this.stylesheet.addRule(e,t),r.default.trace("stylesheet",e,t)}}t.default=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var u,s=e[Symbol.iterator]();!(r=(u=s.next()).done)&&(n.push(u.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw i}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();t.selectionCycle=function(e,t){const n=o.uniq(o.pluck(0,t)).sort((e,t)=>e-t),i=o.uniq(o.pluck(1,t)).sort((e,t)=>e-t),u=n[0],s=i[0],a=n[n.length-1],l=i[i.length-1];var c=r(e,2);const p=c[0],d=c[1],f=[p,d];p>a&&(f[0]=u,f[1]=d+1>l?s:d+1);pl&&(f[1]=s,f[0]=p+1>a?u:p+1);dArray.isArray(e.name)?e.name.length:1,d=(e,t)=>Array.isArray(e.name)?e.name[t]:"";class f{static getSorting(e,t){const n=o.find(t=>t.columnId===e,t);return n?n.direction:i.SortDirection.None}static doSort(e,t){return()=>{const n=t.sorting_settings,r=t.sorting_type;let o;switch(f.getSorting(e,n)){case i.SortDirection.Descending:o=i.SortDirection.Ascending;break;case i.SortDirection.Ascending:o=i.SortDirection.None;break;case i.SortDirection.None:default:o=i.SortDirection.Descending}const a="single"===r?s.default:u.default;t.setProps({sorting_settings:a(n,{columnId:e,direction:o})})}}static getSortingIcon(e,t){const n=t.sorting_settings;switch(f.getSorting(e,n)){case i.SortDirection.Descending:return"↑";case i.SortDirection.Ascending:return"↓";case i.SortDirection.None:default:return"↕"}}static createHeaderCells(e){const t=e.columns,n=e.columnRowIndex,i=e.labels,u=e.mergeCells,s=e.offset,l=e.rowSorting,c=e.virtualization;let p=[];if(u){p=[0];let e=0;i.forEach((n,r)=>{t[r].hidden||n===i[e]||(p.push(r),e=r)})}else p=o.range(0,t.length);return o.filter(e=>!!e,p.map((d,h)=>{const v=t[d];if(v.hidden)return null;let g;if(u){const e=o.slice(d,p[h+1]||1/0,t).filter(o.propEq("hidden",!0)).length;g=d===o.last(p)?i.length-d-e:p[h+1]-d-e}else g=1;return r.default.createElement("th",{key:`header-cell-${d}`,colSpan:g,className:`column-${d+s} `+(d===t.length-1||d===o.last(p)?"cell--right-last ":"")},l?r.default.createElement("span",{className:"sort",onClick:f.doSort(v.id,e)},f.getSortingIcon(v.id,e)):"",v.editable_name&&"Boolean"===o.type(v.editable_name)||"Number"===o.type(v.editable_name)&&v.editable_name===n?r.default.createElement("span",{className:"column-header--edit",onClick:function(e,t,n){return()=>{(0,n.setProps)(a.editColumnName(e,t,n))}}(v,n,e)},"✎"):"",v.deletable&&"be"!==c&&"Boolean"===o.type(v.deletable)||"Number"===o.type(v.deletable)&&v.deletable===n?r.default.createElement("span",{className:"column-header--delete",onClick:function(e,t,n){return()=>{(0,n.setProps)(a.deleteColumn(e,t,n))}}(v,n,e)},"×"):"",r.default.createElement("span",null,i[d]))}))}static createDeletableHeader(e){return e.row_deletable?r.default.createElement("th",{key:"delete",className:"expanded-row--empty-cell",style:{width:"30px",maxWidth:"30px",minWidth:"30px"}}):null}static createSelectableHeader(e){return e.row_selectable?r.default.createElement("th",{key:"select",className:"expanded-row--empty-cell",style:{width:"30px",maxWidth:"30px",minWidth:"30px"}}):null}static createHeaders(e){let t=e.columns,n=e.dataframe,r=e.sorting,i=e.merge_duplicate_headers,u=e.n_fixed_columns,s=e.row_deletable,a=e.row_selectable,l=e.setProps,c=e.sorting_settings,h=e.sorting_type,v=e.virtualization;const g=(s?1:0)+(a?1:0),y=this.createDeletableHeader(e),b=this.createSelectableHeader(e),m=Math.max.apply(Math,t.map(p));let x;return x=1===m?[[...y?[y]:[],...b?[b]:[],...f.createHeaderCells({columns:t,columnRowIndex:0,dataframe:n,labels:o.pluck("name",t),n_fixed_columns:u,offset:g,rowSorting:r,setProps:l,sorting_settings:c,sorting_type:h,virtualization:v})]]:o.range(0,m).map(e=>[...y?[y]:[],...b?[b]:[],...f.createHeaderCells({columns:t,columnRowIndex:e,dataframe:n,labels:t.map(t=>o.isNil(t.name)&&e===m-1?t.id:d(t,e)),n_fixed_columns:u,offset:g,rowSorting:!!r&&e+1===m,mergeCells:i&&e+1!==m,setProps:l,sorting_settings:c,sorting_type:h,virtualization:v})])}}t.default=f},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=function(e){return e&&e.__esModule?e:{default:e}}(n(3)),i=n(7);t.default=((e,t)=>{if(o.default.trace("multi - updateSettings",e,t),e=r.clone(e),t.direction===i.SortDirection.None){const n=r.findIndex(e=>e.columnId===t.columnId,e);-1!==n&&e.splice(n,1)}else{const n=r.find(e=>e.columnId===t.columnId,e);n?n.direction=t.direction:e.push(t)}return e})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(3)),o=n(7);t.default=((e,t)=>(r.default.trace("single - updateSettings",e,t),t.direction===o.SortDirection.None?[]:[t]))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=a(n(40)),i=a(n(41)),u=a(n(3)),s=n(13);function a(e){return e&&e.__esModule?e:{default:e}}t.default=class{static toClipboard(e,t,n,s){const a=r.uniq(r.pluck(0,t).sort((e,t)=>e-t)),l=r.uniq(r.pluck(1,t).sort((e,t)=>e-t)),c=r.slice(r.head(a),r.last(a)+1,s).map(e=>r.props(l,r.props(r.pluck("id",n),e))),p=o.default.prototype.stringify(c);u.default.trace("TableClipboard -- set clipboard data: ",p),i.default.set(e,p)}static fromClipboard(e,t,n,a,l,c=!0,p=!0){const d=i.default.get(e);if(u.default.trace("TableClipboard -- get clipboard data: ",d),!d)return;const f=o.default.prototype.parse(d);let h=l;const v=a;if(c&&f[0].length+t[1]>=a.length)for(let e=a.length;et[`Column ${e}`]="");p&&u.default.debug("Clipboard -- Sorting or filtering active, do not create new rows");const g=n[t[0]];if(p&&f.length+g>=l.length){const e={};a.forEach(t=>e[t.id]=""),h=r.concat(h,r.repeat(e,f.length+g-l.length))}return f.forEach((e,o)=>e.forEach((e,i)=>{const u=t[0]+o;if(n.length<=t[0]+o)return;const a=n[u],l=t[1]+i,c=v[l];c&&(0,s.colIsEditable)(!0,c)&&(h=r.set(r.lensPath([a,c.id]),e,h))})),{dataframe:h,columns:v}}}},function(e,t){!function(t){"use strict";function n(){}function r(e){return e.split('"').length-1}n.prototype=Object.create(Object.prototype,{parse:{value:function(e){var t,n,o,i,u,s,a,l=[],c=0;for((o=e.split("\n")).length>1&&""===o[o.length-1]&&o.pop(),t=0,n=o.length;t0&&(u+="\t"),"string"==typeof(i=e[t][r])?i.indexOf("\n")>-1?u+='"'+i.replace(/"/g,'""')+'"':u+=i:u+=null===i||void 0===i?"":i;u+="\n"}return u},enumerable:!0,configurable:!1,writable:!1}}),void 0!==e&&e.exports?e.exports=n:t.SheetClip=n}(this)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.default=class{static set(e,t){e.clipboardData.setData("text/plain",t),e.preventDefault()}static get(e){let t;return t=e.clipboardData?e.clipboardData.getData("text/plain"):void 0}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=a(n(2)),o=s(n(1)),i=s(n(43)),u=a(n(15));function s(e){return e&&e.__esModule?e:{default:e}}function a(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}t.default=class{constructor(e){this.propsFn=e,this.handlers=new Map,this.isCellSelected=((e,t,n)=>e&&r.contains([t,n],e)),this.getEventHandler=((e,t,n)=>{const r=this.handlers.get(e)||this.handlers.set(e,new Map).get(e),o=r.get(t)||r.set(t,new Map).get(t);return o.get(n)||o.set(n,e.bind(this,t,n)).get(n)}),this.handleClick=((e,t,n)=>{var o=this.props;const i=o.columns,u=o.editable,s=o.is_focused,a=o.row_deletable,l=o.row_selectable,c=o.selected_cell,p=o.setProps,d=this.isCellSelected(c,e,t);if(!u)return;if(s||n.preventDefault(),d)return;const f=(a?1:0)+(l?1:0);n.preventDefault();const h=[e,t+f],v={is_focused:!1,active_cell:h},g=[];i.forEach((e,t)=>{e.hidden||g.push(t+f)});const y=r.uniq(r.pluck(0,c)).sort((e,t)=>e-t),b=r.uniq(r.pluck(1,c)).sort((e,t)=>e-t),m=y[0],x=b[0];n.shiftKey?v.selected_cell=r.xprod(r.range(r.min(m,h[0]),r.max(m,h[0])+1),r.range(r.min(x,h[1]),r.max(x,h[1])+1)).filter(e=>r.contains(e[1],g)):v.selected_cell=[h],p(v)}),this.handleDoubleClick=((e,t,n)=>{var r=this.props;const o=r.editable,i=r.is_focused,u=r.row_deletable,s=r.row_selectable,a=r.setProps;if(!o)return;const l=[e,t+((u?1:0)+(s?1:0))];i||(n.preventDefault(),a({selected_cell:[l],active_cell:l,is_focused:!0}))}),this.handleChange=((e,t,n)=>{var o=this.props;const i=o.columns,u=o.dataframe,s=o.editable,a=o.setProps,l=i[t];s&&a({dataframe:r.set(r.lensPath([e,l.id]),n,u)})}),this.handlePaste=(e=>{e.preventDefault()})}get props(){return this.propsFn()}rowSelectCell(e){var t=this.props;const n=t.setProps,i=t.selected_rows,u=t.row_selectable;return u?o.default.createElement("td",{key:"select",className:"select-cell",style:{width:"30px",maxWidth:"30px",minWidth:"30px"}},o.default.createElement("input",{type:"single"===u?"radio":"checkbox",name:"row-select",checked:r.contains(e,i),onChange:()=>n({selected_rows:"single"===u?[e]:r.ifElse(r.contains(e),r.without([e]),r.append(e))(i)})})):null}rowDeleteCell(e){var t=this.props;const n=t.setProps;return t.row_deletable?o.default.createElement("td",{key:"delete",className:"delete-cell",onClick:()=>n(u.deleteRow(e,this.props)),style:{width:"30px",maxWidth:"30px",minWidth:"30px"}},"×"):null}createCells(){var e=this.props;const t=e.active_cell,n=e.columns,u=e.column_conditional_dropdowns,s=e.column_conditional_styles,a=e.column_static_dropdown,l=e.column_static_style,c=e.dropdown_properties,p=e.editable,d=e.id,f=e.is_focused,h=e.row_deletable,v=e.row_selectable,g=e.selected_cell,y=e.virtualizer,b=y.dataframe,m=y.indices,x=n.filter(e=>!e.hidden),E=(h?1:0)+(v?1:0);return b.map((e,h)=>{const v=m[h],y=this.rowDeleteCell(v),b=this.rowSelectCell(v),w=x.map((y,b)=>{b+=E;let m=(c&&c[y.id]&&(c[y.id].length>v?c[y.id][v]:null)||y||{}).options;const x=n.indexOf(y),w=[`column-${x+E}`];let _=u.find(e=>e.id===y.id),O=a.find(e=>e.id===y.id);_=_&&_.dropdowns,O=m||O&&O.dropdown;let S=s.find(e=>e.id===y.id),C=l.find(e=>e.id===y.id);return S=S&&S.styles,C=C&&C.style,o.default.createElement(i.default,{key:`${y.id}-${b}`,active:t[0]===h&&t[1]===x+E,classes:w,clearable:y.clearable,conditionalDropdowns:_,conditionalStyles:S,datum:e,editable:p,focused:!!f,onClick:this.getEventHandler(this.handleClick,h,x),onDoubleClick:this.getEventHandler(this.handleDoubleClick,h,x),onPaste:this.handlePaste,onChange:this.getEventHandler(this.handleChange,v,x),property:y.id,selected:r.contains([h,x+E],g),staticDropdown:O,staticStyle:C,tableId:d,type:y.type,value:e[y.id]})});return b&&w.unshift(b),y&&w.unshift(y),w})}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(1),i=f(o),u=f(n(44)),s=n(12),a=n(5),l=f(n(45)),c=f(n(17)),p=n(14),d=f(n(19));function f(e){return e&&e.__esModule?e:{default:e}}class h extends o.Component{constructor(e){super(e),this.getDropdown=(0,a.memoizeOne)((...e)=>e.length?e.slice(-1)[0]:void 0),this.getStyle=(0,a.memoizeOne)((...e)=>e.length?r.mergeAll(e):void 0),this.propagateChange=(()=>{if(this.state.value===this.props.value)return;(0,this.props.onChange)(this.state.value)}),this.handleChange=(e=>{this.setState({value:e.target.value})}),this.handleKeyDown=(e=>{e.keyCode!==p.KEY_CODES.ENTER&&e.keyCode!==p.KEY_CODES.TAB||this.propagateChange()}),this.handleOpenDropdown=(()=>{var e=this.refs;const t=e.dropdown,n=e.td;(0,d.default)(t.wrapper.querySelector(".Select-menu-outer"),n)}),this.state={value:e.value}}get propsWithDefaults(){return this.props}get classes(){var e=this.propsWithDefaults;let t=e.active,n=e.classes,r=e.editable,o=e.selected,i=e.type;return[...t?["focused"]:[],...r?[]:["cell--uneditable"],...o?["cell--selected"]:[],..."dropdown"===i?["dropdown"]:[],...n]}renderDropdown(){var e=this.propsWithDefaults;const t=e.clearable,n=e.onChange,r=e.value,o=this.dropdown;return o?i.default.createElement(u.default,{ref:"dropdown",clearable:t,onChange:e=>{n(e?e.value:e)},onOpen:this.handleOpenDropdown,options:o,placeholder:"",value:r}):this.renderValue()}renderInput(){var e=this.propsWithDefaults;const t=e.active,n=e.focused,r=e.onClick,o=e.onDoubleClick,u=e.onPaste,s={className:[...t?["input-active"]:[],...n?["focused"]:["unfocused"],...["cell-value"]].join(" "),onClick:r,onDoubleClick:o};return t||this.state.value!==this.props.value?i.default.createElement("input",Object.assign({ref:"textInput",type:"text",value:this.state.value,onBlur:this.propagateChange,onChange:this.handleChange,onKeyDown:this.handleKeyDown,onPaste:u},s)):this.renderValue(s)}renderValue(e={}){const t=this.propsWithDefaults.value;return i.default.createElement("div",Object.assign({},e),t)}renderInner(){switch(this.props.type){case"text":case"numeric":return this.renderInput();case"dropdown":return this.renderDropdown();default:return this.renderValue()}}get dropdown(){var e=this.propsWithDefaults;let t=e.conditionalDropdowns,n=e.datum,o=e.property,i=e.staticDropdown,u=e.tableId;const s=[...i?[i]:[],...r.map(([e])=>e.dropdown,r.filter(([e,t])=>h.dropdownAstCache([u,o,t],[e.condition]).evaluate(n),r.addIndex(r.map)((e,t)=>[e,t],t)))];return this.getDropdown(...s)}get style(){var e=this.propsWithDefaults;let t=e.conditionalStyles,n=e.datum,o=e.property,i=e.staticStyle,u=e.tableId;const s=[i,...r.map(([e])=>e.style,r.filter(([e,t])=>h.styleAstCache([u,o,t],[e.condition]).evaluate(n),r.addIndex(r.map)((e,t)=>[e,t],t)))];return this.getStyle(...s)}render(){return i.default.createElement("td",{ref:"td",tabIndex:-1,className:this.classes.join(" "),style:this.style},this.renderInner())}componentWillReceiveProps(e){const t=e.value;this.state.value!==t&&this.setState({value:t})}componentDidUpdate(){const e=this.propsWithDefaults.active,t=this.refs.textInput;e&&t&&document.activeElement!==t&&(t.focus(),t.setSelectionRange(0,t.value?t.value.length:0)),e&&this.refs.dropdown&&this.refs.td.focus()}shouldComponentUpdate(e,t){const n=this.props,r=this.state;return!(0,s.isEqual)(n,e,!0)||!(0,s.isEqual)(r,t,!0)}}t.default=h,h.dropdownAstCache=(0,l.default)(e=>new c.default(e)),h.styleAstCache=(0,l.default)(e=>new c.default(e)),h.defaultProps={classes:[],conditionalDropdowns:[],conditionalStyles:[],staticStyle:{},type:"text"}},function(e,t,n){"use strict";n.r(t),n.d(t,"Async",function(){return V}),n.d(t,"AsyncCreatable",function(){return Y}),n.d(t,"Creatable",function(){return L}),n.d(t,"Value",function(){return F}),n.d(t,"Option",function(){return k}),n.d(t,"defaultMenuRenderer",function(){return b}),n.d(t,"defaultArrowRenderer",function(){return d}),n.d(t,"defaultClearRenderer",function(){return f}),n.d(t,"defaultFilterOptions",function(){return y});var r=n(21),o=n.n(r),i=n(4),u=n.n(i),s=n(0),a=n.n(s),l=n(1),c=n.n(l),p=n(6),d=function(e){var t=e.onMouseDown;return c.a.createElement("span",{className:"Select-arrow",onMouseDown:t})};d.propTypes={onMouseDown:a.a.func};var f=function(){return c.a.createElement("span",{className:"Select-clear",dangerouslySetInnerHTML:{__html:"×"}})},h=[{base:"A",letters:/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g},{base:"AA",letters:/[\uA732]/g},{base:"AE",letters:/[\u00C6\u01FC\u01E2]/g},{base:"AO",letters:/[\uA734]/g},{base:"AU",letters:/[\uA736]/g},{base:"AV",letters:/[\uA738\uA73A]/g},{base:"AY",letters:/[\uA73C]/g},{base:"B",letters:/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g},{base:"C",letters:/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g},{base:"D",letters:/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g},{base:"DZ",letters:/[\u01F1\u01C4]/g},{base:"Dz",letters:/[\u01F2\u01C5]/g},{base:"E",letters:/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g},{base:"F",letters:/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g},{base:"G",letters:/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g},{base:"H",letters:/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g},{base:"I",letters:/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g},{base:"J",letters:/[\u004A\u24BF\uFF2A\u0134\u0248]/g},{base:"K",letters:/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g},{base:"L",letters:/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g},{base:"LJ",letters:/[\u01C7]/g},{base:"Lj",letters:/[\u01C8]/g},{base:"M",letters:/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g},{base:"N",letters:/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g},{base:"NJ",letters:/[\u01CA]/g},{base:"Nj",letters:/[\u01CB]/g},{base:"O",letters:/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g},{base:"OI",letters:/[\u01A2]/g},{base:"OO",letters:/[\uA74E]/g},{base:"OU",letters:/[\u0222]/g},{base:"P",letters:/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g},{base:"Q",letters:/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g},{base:"R",letters:/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g},{base:"S",letters:/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g},{base:"T",letters:/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g},{base:"TZ",letters:/[\uA728]/g},{base:"U",letters:/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g},{base:"V",letters:/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g},{base:"VY",letters:/[\uA760]/g},{base:"W",letters:/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g},{base:"X",letters:/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g},{base:"Y",letters:/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g},{base:"Z",letters:/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g},{base:"a",letters:/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},{base:"aa",letters:/[\uA733]/g},{base:"ae",letters:/[\u00E6\u01FD\u01E3]/g},{base:"ao",letters:/[\uA735]/g},{base:"au",letters:/[\uA737]/g},{base:"av",letters:/[\uA739\uA73B]/g},{base:"ay",letters:/[\uA73D]/g},{base:"b",letters:/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},{base:"c",letters:/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},{base:"d",letters:/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},{base:"dz",letters:/[\u01F3\u01C6]/g},{base:"e",letters:/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},{base:"f",letters:/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},{base:"g",letters:/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},{base:"h",letters:/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},{base:"hv",letters:/[\u0195]/g},{base:"i",letters:/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},{base:"j",letters:/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},{base:"k",letters:/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},{base:"l",letters:/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},{base:"lj",letters:/[\u01C9]/g},{base:"m",letters:/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},{base:"n",letters:/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},{base:"nj",letters:/[\u01CC]/g},{base:"o",letters:/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},{base:"oi",letters:/[\u01A3]/g},{base:"ou",letters:/[\u0223]/g},{base:"oo",letters:/[\uA74F]/g},{base:"p",letters:/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},{base:"q",letters:/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},{base:"r",letters:/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},{base:"s",letters:/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},{base:"t",letters:/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},{base:"tz",letters:/[\uA729]/g},{base:"u",letters:/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},{base:"v",letters:/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},{base:"vy",letters:/[\uA761]/g},{base:"w",letters:/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},{base:"x",letters:/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},{base:"y",letters:/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},{base:"z",letters:/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}],v=function(e){for(var t=0;t-1)return!1;if(r.filterOption)return r.filterOption.call(void 0,e,t);if(!t)return!0;var o=e[r.valueKey],i=e[r.labelKey],u=g(o),s=g(i);if(!u&&!s)return!1;var a=u?String(o):null,l=s?String(i):null;return r.ignoreAccents&&(a&&"label"!==r.matchProp&&(a=v(a)),l&&"value"!==r.matchProp&&(l=v(l))),r.ignoreCase&&(a&&"label"!==r.matchProp&&(a=a.toLowerCase()),l&&"value"!==r.matchProp&&(l=l.toLowerCase())),"start"===r.matchPos?a&&"label"!==r.matchProp&&a.substr(0,t.length)===t||l&&"value"!==r.matchProp&&l.substr(0,t.length)===t:a&&"label"!==r.matchProp&&a.indexOf(t)>=0||l&&"value"!==r.matchProp&&l.indexOf(t)>=0})},b=function(e){var t=e.focusedOption,n=e.focusOption,r=e.inputValue,o=e.instancePrefix,i=e.onFocus,s=e.onOptionRef,a=e.onSelect,l=e.optionClassName,p=e.optionComponent,d=e.optionRenderer,f=e.options,h=e.removeValue,v=e.selectValue,g=e.valueArray,y=e.valueKey,b=p;return f.map(function(e,p){var f=g&&g.some(function(t){return t[y]===e[y]}),m=e===t,x=u()(l,{"Select-option":!0,"is-selected":f,"is-focused":m,"is-disabled":e.disabled});return c.a.createElement(b,{className:x,focusOption:n,inputValue:r,instancePrefix:o,isDisabled:e.disabled,isFocused:m,isSelected:f,key:"option-"+p+"-"+e[y],onFocus:i,onSelect:a,option:e,optionIndex:p,ref:function(e){s(e,m)},removeValue:h,selectValue:v},d(e,p,r))})};b.propTypes={focusOption:a.a.func,focusedOption:a.a.object,inputValue:a.a.string,instancePrefix:a.a.string,onFocus:a.a.func,onOptionRef:a.a.func,onSelect:a.a.func,optionClassName:a.a.string,optionComponent:a.a.func,optionRenderer:a.a.func,options:a.a.array,removeValue:a.a.func,selectValue:a.a.func,valueArray:a.a.array,valueKey:a.a.string};var m=function(e){e.preventDefault(),e.stopPropagation(),"A"===e.target.tagName&&"href"in e.target&&(e.target.target?window.open(e.target.href,e.target.target):window.location.href=e.target.href)},x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},E=(function(){function e(e){this.value=e}function t(t){var n,r;function o(n,r){try{var u=t[n](r),s=u.value;s instanceof e?Promise.resolve(s.value).then(function(e){o("next",e)},function(e){o("throw",e)}):i(u.done?"return":"normal",u.value)}catch(e){i("throw",e)}}function i(e,t){switch(e){case"return":n.resolve({value:t,done:!0});break;case"throw":n.reject(t);break;default:n.resolve({value:t,done:!1})}(n=n.next)?o(n.key,n.arg):r=null}this._invoke=function(e,t){return new Promise(function(i,u){var s={key:e,arg:t,resolve:i,reject:u,next:null};r?r=r.next=s:(n=r=s,o(e,t))})},"function"!=typeof t.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(t.prototype[Symbol.asyncIterator]=function(){return this}),t.prototype.next=function(e){return this._invoke("next",e)},t.prototype.throw=function(e){return this._invoke("throw",e)},t.prototype.return=function(e){return this._invoke("return",e)}}(),function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}),w=function(){function e(e,t){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n},A=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t},k=function(e){function t(e){E(this,t);var n=A(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleMouseDown=n.handleMouseDown.bind(n),n.handleMouseEnter=n.handleMouseEnter.bind(n),n.handleMouseMove=n.handleMouseMove.bind(n),n.handleTouchStart=n.handleTouchStart.bind(n),n.handleTouchEnd=n.handleTouchEnd.bind(n),n.handleTouchMove=n.handleTouchMove.bind(n),n.onFocus=n.onFocus.bind(n),n}return S(t,e),w(t,[{key:"handleMouseDown",value:function(e){e.preventDefault(),e.stopPropagation(),this.props.onSelect(this.props.option,e)}},{key:"handleMouseEnter",value:function(e){this.onFocus(e)}},{key:"handleMouseMove",value:function(e){this.onFocus(e)}},{key:"handleTouchEnd",value:function(e){this.dragging||this.handleMouseDown(e)}},{key:"handleTouchMove",value:function(){this.dragging=!0}},{key:"handleTouchStart",value:function(){this.dragging=!1}},{key:"onFocus",value:function(e){this.props.isFocused||this.props.onFocus(this.props.option,e)}},{key:"render",value:function(){var e=this.props,t=e.option,n=e.instancePrefix,r=e.optionIndex,o=u()(this.props.className,t.className);return t.disabled?c.a.createElement("div",{className:o,onMouseDown:m,onClick:m},this.props.children):c.a.createElement("div",{className:o,style:t.style,role:"option","aria-label":t.label,onMouseDown:this.handleMouseDown,onMouseEnter:this.handleMouseEnter,onMouseMove:this.handleMouseMove,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEnd,id:n+"-option-"+r,title:t.title},this.props.children)}}]),t}(c.a.Component);k.propTypes={children:a.a.node,className:a.a.string,instancePrefix:a.a.string.isRequired,isDisabled:a.a.bool,isFocused:a.a.bool,isSelected:a.a.bool,onFocus:a.a.func,onSelect:a.a.func,onUnfocus:a.a.func,option:a.a.object.isRequired,optionIndex:a.a.number};var F=function(e){function t(e){E(this,t);var n=A(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleMouseDown=n.handleMouseDown.bind(n),n.onRemove=n.onRemove.bind(n),n.handleTouchEndRemove=n.handleTouchEndRemove.bind(n),n.handleTouchMove=n.handleTouchMove.bind(n),n.handleTouchStart=n.handleTouchStart.bind(n),n}return S(t,e),w(t,[{key:"handleMouseDown",value:function(e){if("mousedown"!==e.type||0===e.button)return this.props.onClick?(e.stopPropagation(),void this.props.onClick(this.props.value,e)):void(this.props.value.href&&e.stopPropagation())}},{key:"onRemove",value:function(e){e.preventDefault(),e.stopPropagation(),this.props.onRemove(this.props.value)}},{key:"handleTouchEndRemove",value:function(e){this.dragging||this.onRemove(e)}},{key:"handleTouchMove",value:function(){this.dragging=!0}},{key:"handleTouchStart",value:function(){this.dragging=!1}},{key:"renderRemoveIcon",value:function(){if(!this.props.disabled&&this.props.onRemove)return c.a.createElement("span",{className:"Select-value-icon","aria-hidden":"true",onMouseDown:this.onRemove,onTouchEnd:this.handleTouchEndRemove,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove},"×")}},{key:"renderLabel",value:function(){return this.props.onClick||this.props.value.href?c.a.createElement("a",{className:"Select-value-label",href:this.props.value.href,target:this.props.value.target,onMouseDown:this.handleMouseDown,onTouchEnd:this.handleMouseDown},this.props.children):c.a.createElement("span",{className:"Select-value-label",role:"option","aria-selected":"true",id:this.props.id},this.props.children)}},{key:"render",value:function(){return c.a.createElement("div",{className:u()("Select-value",this.props.value.className),style:this.props.value.style,title:this.props.value.title},this.renderRemoveIcon(),this.renderLabel())}}]),t}(c.a.Component);F.propTypes={children:a.a.node,disabled:a.a.bool,id:a.a.string,onClick:a.a.func,onRemove:a.a.func,value:a.a.object.isRequired}; +!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t{const u=n.slice(-1)[0],a=n.slice(0,-1),s=r.reduce((e,t)=>e.get(t)||e.set(t,new Map).get(t),t,a);return(s.get(u)||s.set(u,function(e){return(0,o.memoizeOne)((...t)=>e(...t))}(e)).get(u))(...i)}};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(3)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.defaultIsNully=t.SortDirection=void 0;var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));var o=t.SortDirection=void 0;!function(e){e.Ascending="asc",e.Descending="desc",e.None="none"}(o||(t.SortDirection=o={}));const i=t.defaultIsNully=(e=>void 0===e||null===e);t.default=((e,t,n=i)=>t.length?r.sortWith(r.map(e=>e.direction===o.Descending?r.comparator((t,r)=>{const o=e.columnId,i=t[o],u=r[o];return!n(i)&&(!!n(u)||i>u)}):r.comparator((t,r)=>{const o=e.columnId,i=t[o],u=r[o];return!n(i)&&(!!n(u)||i=0&&s.splice(t,1)}function h(e){var t=document.createElement("style");return void 0===e.attrs.type&&(e.attrs.type="text/css"),v(t,e.attrs),p(e,t),t}function v(e,t){Object.keys(t).forEach(function(n){e.setAttribute(n,t[n])})}function y(e,t){var n,r,o,i;if(t.transform&&e.css){if(!(i=t.transform(e.css)))return function(){};e.css=i}if(t.singleton){var s=a++;n=u||(u=h(t)),r=b.bind(null,n,s,!1),o=b.bind(null,n,s,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(e){var t=document.createElement("link");return void 0===e.attrs.type&&(e.attrs.type="text/css"),e.attrs.rel="stylesheet",v(t,e.attrs),p(e,t),t}(t),r=function(e,t,n){var r=n.css,o=n.sourceMap,i=void 0===t.convertToAbsoluteUrls&&o;(t.convertToAbsoluteUrls||i)&&(r=l(r));o&&(r+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(o))))+" */");var u=new Blob([r],{type:"text/css"}),a=e.href;e.href=URL.createObjectURL(u),a&&URL.revokeObjectURL(a)}.bind(null,n,t),o=function(){f(n),n.href&&URL.revokeObjectURL(n.href)}):(n=h(t),r=function(e,t){var n=t.css,r=t.media;r&&e.setAttribute("media",r);if(e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}.bind(null,n),o=function(){f(n)});return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else o()}}e.exports=function(e,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||"boolean"==typeof t.singleton||(t.singleton=o()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var n=d(e,t);return c(n,t),function(e){for(var o=[],i=0;it&&e.when&&-1!==e.when.indexOf(t.name));if(o.length||(o=r.default),!(t=o.find(t=>t.regexp.test(e))||null))return{lexemes:n,valid:!1,error:e};const i=(e.match(t.regexp)||[])[0];n.push({lexeme:t,value:i}),e=e.substring(i.length)}return{lexemes:n,valid:!0}};var r=function(e){return e&&e.__esModule?e:{default:e}}(n(16))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=u(n(4)),o=u(n(12)),i=u(n(19));function u(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e){this.query=e,this.evaluate=(e=>{if(!this.isValid||!this.tree){const e=`unable to evaluate target: syntax tree is invalid for query=${this.query}`;throw r.default.error(e),new Error(e)}const t=this.tree.lexeme.evaluate;return!!t&&t(e,this.tree)}),this.filter=(e=>e.filter(this.evaluate)),this.result=(0,i.default)((0,o.default)(this.query))}get isValid(){return this.result.valid}get tree(){return this.result.tree}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.colIsEditable=function(e,t){return e&&(!r.has("editable",t)||t.editable)};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isPrintableChar=function(e){return 32===e||e>=48&&e<=57||e>=96&&e<=111||e>=186&&e<=192||e>=219&&e<=222||e>=226||e>=65&&e<=90},t.isMetaKey=function(e){return-1!==o.indexOf(e)},t.isNavKey=function(e){return-1!==u.indexOf(e)},t.isArrowKey=function(e){return-1!==i.indexOf(e)},t.isCtrlKey=function(e){const t=[];window.navigator.platform.includes("Mac")?t.push(r.COMMAND_LEFT,r.COMMAND_RIGHT,r.COMMAND_FIREFOX):t.push(r.CONTROL);return t.includes(e)},t.isCtrlMetaKey=function(e){return[r.CONTROL,r.COMMAND_LEFT,r.COMMAND_RIGHT,r.COMMAND_FIREFOX].includes(e)};const r=t.KEY_CODES={MOUSE_LEFT:1,MOUSE_RIGHT:3,MOUSE_MIDDLE:2,BACKSPACE:8,COMMA:188,INSERT:45,DELETE:46,END:35,ENTER:13,ESCAPE:27,CONTROL:17,COMMAND_LEFT:91,COMMAND_RIGHT:93,COMMAND_FIREFOX:224,ALT:18,HOME:36,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,SPACE:32,SHIFT:16,CAPS_LOCK:20,TAB:9,ARROW_RIGHT:39,ARROW_LEFT:37,ARROW_UP:38,ARROW_DOWN:40,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,A:65,X:88,C:67,V:86},o=[r.ARROW_DOWN,r.ARROW_UP,r.ARROW_LEFT,r.ARROW_RIGHT,r.HOME,r.END,r.DELETE,r.BACKSPACE,r.F1,r.F2,r.F3,r.F4,r.F5,r.F6,r.F7,r.F8,r.F9,r.F10,r.F11,r.F12,r.TAB,r.PAGE_DOWN,r.PAGE_UP,r.ENTER,r.ESCAPE,r.SHIFT,r.CAPS_LOCK,r.ALT],i=[r.ARROW_DOWN,r.ARROW_UP,r.ARROW_LEFT,r.ARROW_RIGHT],u=[...i,r.TAB,r.ENTER];t.isCtrlDown=(e=>(e.ctrlKey||e.metaKey)&&!e.altKey)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LexemeType=void 0;var r=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var u,a=e[Symbol.iterator]();!(r=(u=a.next()).done)&&(n.push(u.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),o=function(e){return e&&e.__esModule?e:{default:e}}(n(4));var i=t.LexemeType=void 0;!function(e){e.And="and",e.BlockClose="close-block",e.BlockOpen="open-block",e.BinaryOperator="logical-binary-operator",e.Expression="expression",e.Or="or",e.Operand="operand",e.UnaryNot="unary-not",e.UnaryOperator="logical-unary-operator"}(i||(t.LexemeType=i={}));const u={resolve:(e,t)=>{if(o.default.trace("resolve -> exp",e,t),/^('.*')|(".*")$/.test(t.value))return t.value.slice(1,t.value.length-1);if(!/^\w+\(.*\)$/.test(t.value))return e[t.value];{const e=t.value.match(/^(\w+)\((.*)\)$/);if(!e)throw Error();{var n=r(e,3);const t=n[1],o=n[2];switch(t){case"num":return parseInt(o,10);case"str":default:return o}}}},regexp:/^(((num|str)\([^()]*\))|'([^()']|\\')+'|"([^()"]|\\")+"|\w+)/},a=[{evaluate:(e,t)=>{o.default.trace("evalute -> &&",e,t);const n=t,r=n.left.lexeme.evaluate(e,n.left),i=n.right.lexeme.evaluate(e,n.right);return r&&i},name:i.And,priority:2,regexp:/^(and\s|&&)/i,syntaxer:(e,t,n)=>Object.assign({left:e.slice(0,n),right:e.slice(n+1)},t)},{evaluate:(e,t)=>{o.default.trace("evalute -> ||",e,t);const n=t;return n.left.lexeme.evaluate(e,n.left)||n.right.lexeme.evaluate(e,n.right)},name:i.Or,priority:3,regexp:/^(or\s|\|\|)/i,syntaxer:(e,t,n)=>Object.assign({left:e.slice(0,n),right:e.slice(n+1)},t)},{name:i.BlockClose,nesting:-1,regexp:/^\)/},{evaluate:(e,t)=>{o.default.trace("evaluate -> ()",e,t);const n=t;return n.block.lexeme.evaluate(e,n.block)},name:i.BlockOpen,nesting:1,priority:1,regexp:/^\(/,syntaxer:e=>Object.assign({block:e.slice(1,e.length-1)},e[0]),when:[i.UnaryNot]},Object.assign({name:i.Operand},u),{evaluate:(e,t)=>{o.default.trace("evaluate -> binary",e,t);const n=t,r=n.left.lexeme.resolve(e,n.left),i=n.right.lexeme.resolve(e,n.right);switch(o.default.trace(`opValue: ${r}, expValue: ${i}`),t.value.toLowerCase()){case"eq":case"=":return r===i;case"gt":case">":return r>i;case"ge":case">=":return r>=i;case"lt":case"<":return r=|<=|>|<|!=|=|ge|le|gt|lt|eq|ne)/i,syntaxer:e=>{var t=r(e,3);let n=t[0],o=t[1],i=t[2];return Object.assign({left:n,right:i},o)},when:[i.Operand]},{evaluate:(e,t)=>{o.default.trace("evaluate -> unary",e,t);const n=t,r=n.block.lexeme.resolve(e,n.block);switch(t.value.toLowerCase()){case"is even":return"number"==typeof r&&r%2==0;case"is nil":return void 0===r||null===r;case"is bool":return"boolean"==typeof r;case"is odd":return"number"==typeof r&&r%2==1;case"is num":return"number"==typeof r;case"is object":return null!==r&&"object"==typeof r;case"is str":return"string"==typeof r;case"is prime":return"number"==typeof r&&(e=>{if(2===e)return!0;if(e<2||e%2==0)return!1;for(let t=3;t*t<=e;t+=2)if(e%t==0)return!1;return!0})(r);default:throw new Error}},name:i.UnaryOperator,priority:0,regexp:/^((is nil)|(is odd)|(is even)|(is bool)|(is num)|(is object)|(is str)|(is prime))/i,syntaxer:e=>{var t=r(e,2);let n=t[0],o=t[1];return Object.assign({block:n},o)},when:[i.Operand]},{evaluate:(e,t)=>{o.default.trace("evaluate -> unary not",e,t);const n=t;return!n.block.lexeme.evaluate(e,n.block)},name:i.UnaryNot,priority:1.5,regexp:/^!/,syntaxer:e=>Object.assign({block:e.slice(1,e.length)},e[0]),when:[i.UnaryNot]},Object.assign({name:i.Expression,when:[i.BinaryOperator]},u)];t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=((e,t=null)=>{if(t=t||(()=>{for(t=e;t&&"td"!==t.nodeName.toLowerCase();)t=t.parentElement;return t})(),!e||!t)return;let n=e;for(;"relative"!==getComputedStyle(n).position&&"sticky"!==getComputedStyle(n).position&&n.parentElement;)n=n.parentElement;let r=e;for(;"relative"!==getComputedStyle(r).position&&r.parentElement;)r=r.parentElement;const o=n.getBoundingClientRect(),i=r.getBoundingClientRect(),u=t.getBoundingClientRect(),a=u.left-o.left+n.scrollLeft,s=u.top-o.top+n.scrollTop+u.height;e.style.width=`${u.width}px`,e.style.top=`${s}px`,e.style.left=`${a}px`,e.style.position="absolute",u.top+u.height/2>i.bottom||u.top-u.height/2i.left+i.width?e.style.display="none":e.style.display="block"})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=((e,t,n)=>e[0]===t&&e[1]===n)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(4));const o=e=>{let t=0;const n=e.map(e=>{const n=Object.assign({},e,{nesting:t});return t+=e.lexeme.nesting||0,n}),i=n.filter(e=>0===e.nesting&&"number"==typeof e.lexeme.priority).sort((e,t)=>(t.lexeme.priority||-1)-(e.lexeme.priority||-1))[0];r.default.trace("parser -> pivot",i,e);const u=n.indexOf(i);if(i.lexeme.syntaxer){let t=i.lexeme.syntaxer(e,i,u);return Array.isArray(t.left)&&(t.left=o(t.left)),Array.isArray(t.right)&&(t.right=o(t.right)),Array.isArray(t.block)&&(t.block=o(t.block)),t}throw new Error(i.lexeme.name)};t.default=(e=>{const t=e.lexemes;if(!e.valid)return{valid:!1,error:`lexer -- ${e.error}`};try{return{tree:o(t),valid:!0}}catch(e){return{valid:!1,error:e}}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.matrixMap=function(e,t,n){const o=r.addIndex(r.map),i=r.addIndex(r.map);return o((e,r)=>i((e,o)=>n(e,t[r][o],r,o),e),e)},t.matrixMap3=function(e,t,n,o){const i=r.addIndex(r.map),u=r.addIndex(r.map);return i((e,r)=>u((e,i)=>o(e,t[r][i],n[r][i],r,i),e),e)},t.matrixMap4=function(e,t,n,o,i){const u=r.addIndex(r.map),a=r.addIndex(r.map);return u((e,r)=>a((e,u)=>i(e,t[r][u],n[r][u],o[r][u],r,u),e),e)},t.matrixMapN=function(e,...t){const n=t.slice(0,1),o=t.slice(1),i=r.addIndex(r.map),u=r.addIndex(r.map);return i((t,n)=>u((t,r)=>e(n,r,[t,...o.map(e=>e[n][r])]),t),n)};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.arrayMap=function(e,t,n){return r.addIndex(r.map)((e,r)=>n(e,t[r],r),e)},t.arrayMap3=function(e,t,n,o){return r.addIndex(r.map)((e,r)=>o(e,t[r],n[r],r),e)},t.arrayMapN=function(e,...t){const n=t.slice(0,1),o=t.slice(1);return r.addIndex(r.map)((t,n)=>e(n,[t,...o.map(e=>e[n])]),n)};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=function(e){return e&&e.__esModule?e:{default:e}}(r);class i extends r.PureComponent{constructor(e){super(e),this.handleChange=(e=>this.setState({value:e.target.value})),this.submit=(()=>this.state.value!==this.props.value&&this.props.submit(this.state.value)),this.state={value:e.value}}get propsWithDefaults(){return this.props}render(){var e=this.propsWithDefaults;const t=e.stopPropagation,n=e.updateOnBlur,r=e.updateOnSubmit;let i={onBlur:n?this.submit:void 0,onKeyDown:t?e=>e.stopPropagation():void 0,onSubmit:r?this.submit:void 0};return o.default.createElement("input",Object.assign({ref:"input",type:"text",value:this.state.value||"",onChange:this.handleChange},i))}}t.default=i,i.defaultProps={stopPropagation:!1,updateOnBlur:!0,updateOnSubmit:!0}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(this.props,[]);return function(e){c.forEach(function(t){return delete e[t]})}(o),o.className=this.props.inputClassName,o.id=this.state.inputId,o.style=n,u.default.createElement("div",{className:this.props.className,style:t},this.renderStyles(),u.default.createElement("input",r({},o,{ref:this.inputRef})),u.default.createElement("div",{ref:this.sizerRef,style:l},e),this.props.placeholder?u.default.createElement("div",{ref:this.placeHolderSizerRef,style:l},this.props.placeholder):null)}}]),t}();h.propTypes={className:a.default.string,defaultValue:a.default.any,extraWidth:a.default.oneOfType([a.default.number,a.default.string]),id:a.default.string,injectStyles:a.default.bool,inputClassName:a.default.string,inputRef:a.default.func,inputStyle:a.default.object,minWidth:a.default.oneOfType([a.default.number,a.default.string]),onAutosize:a.default.func,onChange:a.default.func,placeholder:a.default.string,placeholderIsMinWidth:a.default.bool,style:a.default.object,value:a.default.any},h.defaultProps={minWidth:1,injectStyles:!0},t.default=h},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Table=void 0;var r=u(n(25)),o=u(n(4)),i=u(n(27));function u(e){return e&&e.__esModule?e:{default:e}}o.default.setDebugLevel(r.default.debugLevel),o.default.setLogLevel(r.default.logLevel),t.Table=i.default},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(4),o=function(e){return e&&e.__esModule?e:{default:e}}(n(26));const i="dash_debug",u="dash_log";t.default=class{static get searchParams(){return new URL(window.location.href).searchParams||{get:()=>null}}static get debugLevel(){const e=this.searchParams.get(i)||o.default.get(i);return e&&r.DebugLevel[e]||r.DebugLevel.NONE}static get logLevel(){const e=this.searchParams.get(u)||o.default.get(u);return e&&r.LogLevel[e]||r.LogLevel.ERROR}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=864e5,o=63072e7;class i{static delete(e,t="",n="/"){let o=new Date((new Date).getTime()-r).toUTCString();document.cookie=`${e}=;expires=${o};domain=${t};path=${n}`}static get(e){if(!e.length)return;return e=e.toLowerCase(),(document.cookie.split(";").map(e=>{let t=e.split("=");return{id:t[0].trim(),value:t[1]}}).find(t=>e===t.id.toLocaleLowerCase())||{}).value}static set(e,t,n="",r="/"){let u=`${e}=${t};expires=${new Date((new Date).getTime()+o).toUTCString()};domain=${n};path=${r}`;i.get(e)&&i.delete(e,n,r),document.cookie=u}}t.default=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.propTypes=t.defaultProps=void 0;var r=n(1),o=s(r),i=s(n(0)),u=s(n(30));n(78);var a=s(n(4));function s(e){return e&&e.__esModule?e:{default:e}}class l extends r.Component{render(){var e=this.props;const t=e.filtering,n=e.sorting,r=e.pagination_mode;function i(e){return-1!==["be",!1].indexOf(e)}return function(e){return-1!==["fe",!0,!1].indexOf(e)}(r)||i(t)&&i(n)?o.default.createElement(u.default,this.props):(a.default.error("Invalid combination of filtering / sorting / pagination",t,n,r),o.default.createElement("div",null,"Invalid props combination"))}}t.default=l;const c=t.defaultProps={pagination_mode:"fe",pagination_settings:{displayed_pages:1,current_page:0,page_size:250},navigation:"page",content_style:"fit",filtering:!1,filtering_settings:"",filtering_type:"basic",filtering_types:["basic"],sorting:!1,sorting_type:"single",sorting_settings:[],derived_viewport_dataframe:[],derived_viewport_indices:[],derived_virtual_dataframe:[],derived_virtual_indices:[],column_conditional_dropdowns:[],column_static_dropdown:[],column_conditional_styles:[],column_static_style:[],row_conditional_styles:[],row_static_style:{},dataframe:[],columns:[],editable:!1,active_cell:[],selected_cell:[[]],selected_rows:[],row_selectable:!1,table_style:[]},d=t.propTypes={active_cell:i.default.array,columns:i.default.arrayOf(i.default.object),content_style:i.default.oneOf(["fit","grow"]),dataframe:i.default.arrayOf(i.default.object),dataframe_previous:i.default.arrayOf(i.default.object),dataframe_timestamp:i.default.any,editable:i.default.bool,end_cell:i.default.arrayOf(i.default.number),id:i.default.string.isRequired,is_focused:i.default.bool,merge_duplicate_headers:i.default.bool,n_fixed_columns:i.default.number,n_fixed_rows:i.default.number,row_deletable:i.default.bool,row_selectable:i.default.oneOf(["single","multi",!1]),selected_cell:i.default.arrayOf(i.default.arrayOf(i.default.number)),selected_rows:i.default.arrayOf(i.default.number),setProps:i.default.any,start_cell:i.default.arrayOf(i.default.number),style_as_list_view:i.default.bool,table_style:i.default.arrayOf(i.default.shape({selector:i.default.string,rule:i.default.string})),pagination_mode:i.default.oneOf(["fe","be",!0,!1]),pagination_settings:i.default.shape({displayed_pages:i.default.number,current_page:i.default.number,page_size:i.default.number}),navigation:i.default.string,column_conditional_dropdowns:i.default.arrayOf(i.default.shape({id:i.default.string,dropdowns:i.default.arrayOf(i.default.shape({condition:i.default.string,dropdown:i.default.arrayOf(i.default.shape({label:i.default.string,value:i.default.any}))}))})),column_static_dropdown:i.default.arrayOf(i.default.shape({id:i.default.string,dropdown:i.default.arrayOf(i.default.shape({label:i.default.string,value:i.default.any}))})),column_conditional_style:i.default.arrayOf(i.default.shape({id:i.default.string,styles:i.default.arrayOf(i.default.shape({condition:i.default.string,style:i.default.object}))})),column_static_style:i.default.arrayOf(i.default.shape({id:i.default.string,style:i.default.object})),row_conditional_styles:i.default.arrayOf(i.default.shape({condition:i.default.string,style:i.default.object})),row_static_style:i.default.object,filtering:i.default.oneOf(["fe","be",!0,!1]),filtering_settings:i.default.string,filtering_type:i.default.oneOf(["basic"]),filtering_types:i.default.arrayOf(i.default.oneOf(["basic"])),sorting:i.default.oneOf(["fe","be",!0,!1]),sorting_type:i.default.oneOf(["single","multi"]),sorting_settings:i.default.arrayOf(i.default.shape({columnId:i.default.oneOfType([i.default.string,i.default.number]),direction:i.default.oneOf(["asc","desc"])})),sorting_treat_empty_string_as_none:i.default.bool,derived_viewport_dataframe:i.default.arrayOf(i.default.object),derived_viewport_indices:i.default.arrayOf(i.default.number),derived_virtual_dataframe:i.default.arrayOf(i.default.object),derived_virtual_indices:i.default.arrayOf(i.default.number),dropdown_properties:i.default.any};l.defaultProps=c,l.propTypes=d},function(e,t,n){"use strict";var r=n(29);function o(){}e.exports=function(){function e(e,t,n,o,i,u){if(u!==r){var a=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw a.name="Invariant Violation",a}}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t};return n.checkPropTypes=o,n.PropTypes=n,n}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=p(r),i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),u=n(3),a=p(n(32)),s=p(n(67)),l=p(n(68)),c=p(n(69)),d=p(n(70));function p(e){return e&&e.__esModule?e:{default:e}}n(71),n(74),n(76);const f=/^derived_/;t.default=class extends r.Component{constructor(e){super(e),this.__setProps=(0,u.memoizeOne)(e=>e?t=>{if(i.has("dataframe",t)){const e=this.props.dataframe;t.dataframe_timestamp=Date.now(),t.dataframe_previous=e}e(t)}:e=>this.setState(e)),this.paginator=(0,s.default)(),this.viewport=(0,l.default)(),this.virtual=(0,c.default)(),this.visibleColumns=(0,d.default)(),this.filterCache=(0,u.memoizeOneWithFlag)(e=>e),this.paginationCache=(0,u.memoizeOneWithFlag)(e=>e),this.sortCache=(0,u.memoizeOneWithFlag)(e=>e),this.viewportCache=(0,u.memoizeOneWithFlag)(e=>e),this.virtualCache=(0,u.memoizeOneWithFlag)(e=>e),this.controlled=this.getControlledProps(this.props),this.updateDerivedProps()}componentWillReceiveProps(e){this.controlled=this.getControlledProps(e),this.updateDerivedProps()}shouldComponentUpdate(e){const t=this.props;return i.any(n=>!f.test(n)&&t[n]!==e[n],i.keysIn(t))}render(){return o.default.createElement(a.default,Object.assign({},this.controlled))}getControlledProps(e){const t=this.setProps,n=e.columns,r=e.dataframe,o=e.filtering,u=e.filtering_settings,a=e.pagination_mode,s=e.pagination_settings,l=e.sorting,c=e.sorting_settings,d=e.sorting_treat_empty_string_as_none,p=this.virtual(r,o,u,l,c,d),f=this.viewport(a,s,p.dataframe,p.indices),h=this.paginator(a,s,t,p.dataframe),v=this.visibleColumns(n);return i.mergeAll([e,{columns:v,paginator:h,setProps:t,viewport:f,virtual:p}])}updateDerivedProps(){var e=this.controlled;const t=e.filtering,n=e.filtering_settings,r=e.pagination_mode,o=e.pagination_settings,i=e.sorting,u=e.sorting_settings,a=e.viewport,s=e.virtual,l=this.viewportCache(a).cached,c=this.virtualCache(s).cached,d=this.filterCache(n),p=this.paginationCache(o),f=this.sortCache(u),h=!d.cached&&!d.first&&"be"===t||!p.cached&&!p.first&&"be"===r||!f.cached&&!f.first&&"be"===i;if(c&&l&&!h)return;const v=this.setProps;let y={};c||(y.derived_virtual_dataframe=s.dataframe,y.derived_virtual_indices=s.indices),l||(y.derived_viewport_dataframe=a.dataframe,y.derived_viewport_indices=a.indices),h&&(y.active_cell=void 0,y.selected_cell=void 0,y.selected_rows=void 0),setTimeout(()=>v(y),0)}get setProps(){return this.__setProps(this.props.setProps)}}},function(e,t,n){"use strict";function r(e){return void 0!==e&&null!==e&&"object"==typeof e&&e.constructor===Object}function o(e,t,n=!1){return e===t||i(Object.values(e),Object.values(t),n)}function i(e,t,n=!1){return!!e&&e.length===t.length&&!!e.every((e,u)=>{const a=t[u];return e===a||n&&(Array.isArray(e)&&Array.isArray(a)&&i(e,a,n)||r(e)&&r(a)&&o(e,a,n))})}Object.defineProperty(t,"__esModule",{value:!0}),t.isEqual=o,t.isEqualArgs=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=g(r),i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),u=g(n(33)),a=n(14),s=n(15),l=n(34),c=g(n(4)),d=n(3),p=g(n(12)),f=g(n(35)),h=g(n(17)),v=g(n(38)),y=g(n(66));function g(e){return e&&e.__esModule?e:{default:e}}const b=i.sort((e,t)=>e-t);t.default=class extends r.PureComponent{constructor(e){super(e),this.getLexerResult=(0,d.memoizeOne)(p.default),this.handleClickOutside=(e=>{const t=this.$el;t&&!t.contains(e.target)&&this.props.is_focused&&this.props.setProps({is_focused:!1})}),this.handlePaste=(e=>{const t=this.$el;t&&t.contains(document.activeElement)&&this.onPaste(e)}),this.forceHandleResize=(()=>this.handleResize(!0)),this.handleResize=((e=!1)=>{if(this.state.forcedResizeOnly&&!e)return;e||this.setState({forcedResizeOnly:!0}),this.updateStylesheet();var t=this.refs;const n=t.r0c0,r=t.r0c1,o=t.r1c0,i=t.r1c1;let u=r.querySelectorAll("tr");n.querySelectorAll("tr").forEach((e,t)=>{const n=u[t];e.style.height=`${n.clientHeight}px`});let a=i.querySelectorAll("tr > th:first-of-type");o.querySelectorAll("tr > th:first-of-type").forEach((e,t)=>{const n=a[t].parentElement;e.parentElement.style.height=getComputedStyle(n).height});const s=i.querySelector("tr > td:first-of-type");if(s){const e=s.parentElement;this.stylesheet.setRule(".dash-fixed-column tr",`height: ${getComputedStyle(e).height};`)}}),this.handleKeyDown=(e=>{var t=this.props;const n=t.active_cell,r=t.columns,o=t.setProps,i=t.is_focused,u=t.editable;if(c.default.trace(`handleKeyDown: ${e.key}`),(0,s.isCtrlMetaKey)(e.keyCode))return;const l=(0,s.isCtrlDown)(e);l&&e.keyCode===s.KEY_CODES.V||e.keyCode===s.KEY_CODES.C&&l&&!i||(e.keyCode!==s.KEY_CODES.ESCAPE?e.keyCode!==s.KEY_CODES.ENTER||i||!(0,a.colIsEditable)(u,r[n[1]])?i&&e.keyCode!==s.KEY_CODES.TAB&&e.keyCode!==s.KEY_CODES.ENTER||((0,s.isNavKey)(e.keyCode)?this.switchCell(e):e.keyCode===s.KEY_CODES.BACKSPACE||e.keyCode===s.KEY_CODES.DELETE?this.deleteCell(e):this.props.is_focused||!(0,a.colIsEditable)(u,r[n[1]])||(0,s.isMetaKey)(e.keyCode)||o({is_focused:!0})):o({is_focused:!0}):o({is_focused:!1}))}),this.switchCell=(e=>{const t=e;var n=this.props;const r=n.active_cell,o=n.columns,u=n.selected_cell,a=n.setProps,l=n.viewport;e.preventDefault(),this.$el.focus();const c=u.length>1,d=t.keyCode===s.KEY_CODES.ENTER||t.keyCode===s.KEY_CODES.TAB;if(c&&d)return void a({is_focused:!1,active_cell:this.getNextCell(t,{currentCell:r,restrictToSelection:!0})});if(!t.shiftKey){const e=this.getNextCell(t,{currentCell:r,restrictToSelection:!1});return void a({is_focused:!1,selected_cell:[e],active_cell:e})}let p=[],f=[];const h=b(i.uniq(i.pluck(0,u))),v=b(i.uniq(i.pluck(1,u))),y=h[0],g=v[0],m=h[h.length-1],x=v[v.length-1],w=t.keyCode===s.KEY_CODES.ARROW_DOWN||t.keyCode===s.KEY_CODES.ENTER,E=t.keyCode===s.KEY_CODES.ARROW_UP,O=t.keyCode===s.KEY_CODES.ARROW_RIGHT||t.keyCode===s.KEY_CODES.TAB,_=t.keyCode===s.KEY_CODES.ARROW_LEFT;w&&r[0]>y?f=v.map(e=>[y,e]):w&&m!==l.dataframe.length-1?p=v.map(e=>[m+1,e]):E&&r[0][m,e]):E&&y>0?p=v.map(e=>[y-1,e]):_&&r[1][e,x]):_&&g>0?p=h.map(e=>[e,g-1]):O&&r[1]>g?f=h.map(e=>[e,g]):O&&x+1<=o.length-1&&(p=h.map(e=>[e,x+1])),a({is_focused:!1,selected_cell:i.without(f,i.uniq(i.concat(p,u)))})}),this.deleteCell=(e=>{var t=this.props;const n=t.columns,r=t.dataframe,o=t.editable,u=t.selected_cell,s=t.setProps,l=t.viewport;e.preventDefault();let c=r;i.map(e=>[l.indices[e[0]],e[1]],u).forEach(e=>{(0,a.colIsEditable)(o,n[e[1]])&&(c=i.set(i.lensPath([e[0],n[e[1]].id]),"",c))}),s({dataframe:c})}),this.getNextCell=((e,{restrictToSelection:t,currentCell:n})=>{var r=this.props;const o=r.columns,u=r.selected_cell,a=r.viewport,c=e;switch(c.keyCode){case s.KEY_CODES.ARROW_LEFT:return t?(0,l.selectionCycle)([n[0],n[1]-1],u):[n[0],i.max(0,n[1]-1)];case s.KEY_CODES.ARROW_RIGHT:case s.KEY_CODES.TAB:return t?(0,l.selectionCycle)([n[0],n[1]+1],u):[n[0],i.min(o.length-1,n[1]+1)];case s.KEY_CODES.ARROW_UP:return t?(0,l.selectionCycle)([n[0]-1,n[1]],u):[i.max(0,n[0]-1),n[1]];case s.KEY_CODES.ARROW_DOWN:case s.KEY_CODES.ENTER:return t?(0,l.selectionCycle)([n[0]+1,n[1]],u):[i.min(a.dataframe.length-1,n[0]+1),n[1]];default:throw new Error(`Table.getNextCell: unknown navigation keycode ${c.keyCode}`)}}),this.onCopy=(e=>{var t=this.props;const n=t.columns,r=t.selected_cell,o=t.viewport;f.default.toClipboard(e,r,n,o.dataframe),this.$el.focus()}),this.onPaste=(e=>{var t=this.props;const n=t.active_cell,r=t.columns,o=t.dataframe,i=t.editable,u=t.filtering_settings,a=t.setProps,s=t.sorting_settings,l=t.viewport;if(!i)return;const c=f.default.fromClipboard(e,n,l.indices,r,o,!0,!s.length||!u.length);c&&a(c)}),this.loadNext=(()=>{this.props.paginator.loadNext()}),this.loadPrevious=(()=>{this.props.paginator.loadPrevious()}),this.applyStyle=(()=>{var e=this.props;const t=e.columns,n=e.n_fixed_columns,r=e.n_fixed_rows,o=e.row_deletable,a=e.row_selectable;var s=this.refs;const l=s.r1c0,c=s.r1c1;o&&(this.stylesheet.setRule(".dash-spreadsheet-inner td.dash-delete-cell","width: 30px; max-width: 30px; min-width: 30px;"),this.stylesheet.setRule(".dash-spreadsheet-inner th.dash-delete-header","width: 30px; max-width: 30px; min-width: 30px;")),a&&(this.stylesheet.setRule(".dash-spreadsheet-inner td.dash-select-cell","width: 30px; max-width: 30px; min-width: 30px;"),this.stylesheet.setRule(".dash-spreadsheet-inner th.dash-select-header","width: 30px; max-width: 30px; min-width: 30px;")),i.addIndex(i.forEach)((e,t)=>{const n=[];if(e.width&&n.push(`width: ${u.default.unit(e.width,"px")};`),e.minWidth&&n.push(`min-width: ${u.default.unit(e.minWidth,"px")};`),e.maxWidth&&n.push(`max-width: ${u.default.unit(e.maxWidth,"px")};`),n.length){const e=n.join(" ");this.stylesheet.setRule(`.dash-spreadsheet-inner td.column-${t}`,e),this.stylesheet.setRule(`.dash-spreadsheet-inner th.column-${t}`,e)}},t),r&&c.querySelectorAll("tr:first-of-type td, tr:first-of-type th").forEach((e,t)=>{const n=getComputedStyle(e).width;this.stylesheet.setRule(`.dash-fixed-row:not(.dash-fixed-column) th:nth-of-type(${t+1})`,`width: ${n}; min-width: ${n}; max-width: ${n};`)}),n&&r&&l.querySelectorAll("tr:first-of-type td, tr:first-of-type th").forEach((e,t)=>{const n=getComputedStyle(e).width;this.stylesheet.setRule(`.dash-fixed-column.dash-fixed-row th:nth-of-type(${t+1})`,`width: ${n}; min-width: ${n}; max-width: ${n};`)})}),this.handleDropdown=(()=>{const e=this.refs.r1c1;(0,h.default)(e.querySelector(".Select-menu-outer"))}),this.onScroll=(e=>{const t=this.refs.r0c1;c.default.trace(`ControlledTable fragment scrolled to (left,top)=(${e.target.scrollLeft},${e.target.scrollTop})`),t.style.marginLeft=`${-e.target.scrollLeft}px`,this.handleDropdown()}),this.state={forcedResizeOnly:!1},this.stylesheet=new u.default(`#${e.id}`),this.tableFn=(0,v.default)(()=>this.props),this.updateStylesheet()}get lexerResult(){const e=this.props.filtering_settings;return this.getLexerResult(e)}updateStylesheet(){const e=this.props.table_style;i.forEach(({selector:e,rule:t})=>{this.stylesheet.setRule(e,t)},e)}componentDidMount(){this.props.selected_cell.length&&!i.contains(this.props.active_cell,this.props.selected_cell)&&this.props.setProps({active_cell:this.props.selected_cell[0]}),this.applyStyle(),this.handleResize()}componentWillMount(){window.addEventListener("resize",this.forceHandleResize),document.addEventListener("paste",this.handlePaste),document.addEventListener("mousedown",this.handleClickOutside)}componentWillUnmount(){window.removeEventListener("resize",this.forceHandleResize),document.removeEventListener("mousedown",this.handleClickOutside),document.removeEventListener("paste",this.handlePaste)}componentWillUpdate(){this.updateStylesheet()}componentDidUpdate(){this.applyStyle(),this.handleResize(),this.handleDropdown()}get $el(){return document.getElementById(this.props.id)}get displayPagination(){var e=this.props;const t=e.dataframe,n=e.navigation,r=e.pagination_mode,o=e.pagination_settings;return"page"===n&&("fe"===r&&o.page_sizeo.default.createElement("div",{key:`r${t}`,ref:`r${t}`,className:`row row-${t}`,onScroll:this.onScroll},e.map((e,n)=>o.default.createElement("div",{key:n,ref:`r${t}c${n}`,className:`cell cell-${t}-${n} ${s[t][n]}`},e)))))),this.displayPagination?o.default.createElement("div",null,o.default.createElement("button",{className:"previous-page",onClick:this.loadPrevious},"Previous"),o.default.createElement("button",{className:"next-page",onClick:this.loadNext},"Next")):null)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(4));class o{constructor(e){this.name=e}get rules(){const e=this.sheet;return Array.from(e.rules||e.cssRules)}addRule(e,t){this.sheet.addRule?this.sheet.addRule(e,t):this.sheet.insertRule(`${e} { ${t} }`,0)}deleteRule(e){this.sheet.deleteRule(e)}findRule(e){const t=this.rules,n=t.findIndex(t=>t.selectorText===e);return-1===n?null:{rule:t[n],index:n}}get sheet(){return(this.__stylesheet=this.__stylesheet||(()=>{const e=document.createElement("style");return e.type="text/css",e.id=this.name,document.getElementsByTagName("head")[0].appendChild(e),e})()).sheet}}class i{constructor(e){this.prefix=e,this.stylesheet=new o(`${e}-dynamic-inline.css`)}static unit(e,t="px"){return i.hasUnit(e)?e:`${e}${t}`}static hasUnit(e){return"string"==typeof e&&/^\d+(\.\d+)?(px|em|rem|%)$/.test(e)}deleteRule(e){e=`${this.prefix} ${e}`;const t=this.stylesheet.findRule(e);t&&this.stylesheet.deleteRule(t.index)}setRule(e,t){e=`${this.prefix} ${e}`;const n=this.stylesheet.findRule(e);if(n){if(n.rule.cssText===t||n.rule.cssText===`${e} { ${t} }`)return;this.stylesheet.deleteRule(n.index)}this.stylesheet.addRule(e,t),r.default.trace("stylesheet",e,t)}}t.default=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var u,a=e[Symbol.iterator]();!(r=(u=a.next()).done)&&(n.push(u.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();t.selectionCycle=function(e,t){const n=o.uniq(o.pluck(0,t)).sort((e,t)=>e-t),i=o.uniq(o.pluck(1,t)).sort((e,t)=>e-t),u=n[0],a=i[0],s=n[n.length-1],l=i[i.length-1];var c=r(e,2);const d=c[0],p=c[1],f=[d,p];d>s&&(f[0]=u,f[1]=p+1>l?a:p+1);dl&&(f[1]=a,f[0]=d+1>s?u:d+1);pe-t)),l=r.uniq(r.pluck(1,t).sort((e,t)=>e-t)),c=r.slice(r.head(s),r.last(s)+1,a).map(e=>r.props(l,r.props(r.pluck("id",n),e))),d=o.default.prototype.stringify(c);u.default.trace("TableClipboard -- set clipboard data: ",d),i.default.set(e,d)}static fromClipboard(e,t,n,l,c,d=!0,p=!0){const f=i.default.get(e);if(u.default.trace("TableClipboard -- get clipboard data: ",f),!f)return;p||u.default.debug("Clipboard -- Sorting or filtering active, do not create new rows"),d||u.default.debug("Clipboard -- Do not create new columns");const h=o.default.prototype.parse(f);let v=c;const y=l;if(d&&h[0].length+t[1]>=l.length)for(let e=l.length;et[`Column ${e}`]="");const g=n[t[0]];if(p&&h.length+g>=c.length){const e={};l.forEach(t=>e[t.id]=""),v=r.concat(v,r.repeat(e,h.length+g-c.length))}return h.forEach((e,o)=>e.forEach((e,i)=>{const u=t[0]+o;if(n.length<=t[0]+o)return;const s=n[u],l=t[1]+i,c=y[l];c&&(0,a.colIsEditable)(!0,c)&&(v=r.set(r.lensPath([s,c.id]),e,v))})),{dataframe:v,columns:y}}}},function(e,t){!function(t){"use strict";function n(){}function r(e){return e.split('"').length-1}n.prototype=Object.create(Object.prototype,{parse:{value:function(e){var t,n,o,i,u,a,s,l=[],c=0;for((o=e.split("\n")).length>1&&""===o[o.length-1]&&o.pop(),t=0,n=o.length;t0&&(u+="\t"),"string"==typeof(i=e[t][r])?i.indexOf("\n")>-1?u+='"'+i.replace(/"/g,'""')+'"':u+=i:u+=null===i||void 0===i?"":i;u+="\n"}return u},enumerable:!0,configurable:!1,writable:!1}}),void 0!==e&&e.exports?e.exports=n:t.SheetClip=n}(this)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.default=class{static set(e,t){e.clipboardData.setData("text/plain",t),e.preventDefault()}static get(e){let t;return t=e.clipboardData?e.clipboardData.getData("text/plain"):void 0}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=u(n(39)),o=u(n(53)),i=u(n(56));function u(e){return e&&e.__esModule?e:{default:e}}const a=(e,t)=>e({filtering_settings:t});t.default=(e=>{const t=new r.default(e),n=new o.default(()=>(function(e){var t=e();const n=t.columns,r=t.filtering,o=t.filtering_settings,i=t.filtering_type,u=t.id,s=t.row_deletable,l=t.row_selectable,c=t.setProps;return{columns:n,fillerColumns:(s?1:0)+(l?1:0),filtering:r,filtering_settings:o,filtering_type:i,id:u,setFilter:a.bind(void 0,c)}})(e)),u=new i.default(e);return function(e,t,n){const r=[];return r.push(...n.createHeaders()),r.push(...t.createFilters()),r.push(...e.createCells()),r}.bind(void 0,t,n,u)})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=d(n(1)),o=d(n(40)),i=d(n(43)),u=d(n(50)),a=d(n(51)),s=d(n(52)),l=n(20),c=n(21);function d(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e,t=(0,a.default)(e().id),n=(0,o.default)(e().id)){this.propsFn=e,this.cellStyles=t,this.cellWrappers=n,this.cellInputs=(0,i.default)(),this.cellOperations=(0,u.default)(),this.cellDropdowns=(0,s.default)()}get props(){return this.propsFn()}createCells(){var e=this.props;const t=e.active_cell,n=e.columns,o=e.column_conditional_dropdowns,i=e.column_conditional_styles,u=e.column_static_dropdown,a=e.column_static_style,s=e.dataframe,d=e.dropdown_properties,p=e.editable,f=e.id,h=e.is_focused,v=e.row_deletable,y=e.row_selectable,g=e.selected_cell,b=e.selected_rows,m=e.setProps,x=e.viewport,w=this.cellOperations(t,s,x.dataframe,x.indices,y,v,b,m),E=this.cellWrappers(t,n,x.dataframe,p,g),O=this.cellStyles(n,i,a,x.dataframe),_=this.cellDropdowns(f)(n,x.dataframe,x.indices,o,u,d),S=this.cellInputs(t,n,x.dataframe,p,!!h,f,_,this.propsFn),C=(0,l.matrixMap3)(E,O,S,(e,t,n)=>r.default.cloneElement(e,{children:[n],style:t}));return(0,c.arrayMap)(w,C,(e,t)=>Array.prototype.concat(e,t))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=d(n(1)),i=n(3),u=n(7),a=d(n(41)),s=d(n(18)),l=d(n(42)),c=d(n(8));function d(e){return e&&e.__esModule?e:{default:e}}function p(e,t,n,o,i,a){return r.addIndex(r.map)((o,c)=>r.addIndex(r.map)((n,r)=>{const o=(0,s.default)(t,c,r),d=(0,l.default)(a,c,r),p="dash-cell"+` column-${r}`+(o?" focused":"")+(i?"":" cell--uneditable")+(d?" cell--selected":"")+(n.type===u.ColumnType.Dropdown?" dropdown":"");return e([c,r],o,p,r,n.id)},n),o)}t.default=(0,i.memoizeAll)(function(e){const t=(0,c.default)((e,t,n,r)=>o.default.createElement(a.default,{active:e,classes:t,key:`column-${n}`,property:r}));return(0,i.memoizeOne)(p).bind(void 0,t)})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(1),i=function(e){return e&&e.__esModule?e:{default:e}}(o);const u=/^children$/;t.default=class extends o.Component{constructor(e){super(e)}get propsWithDefaults(){return this.props}render(){var e=this.propsWithDefaults;const t=e.classes,n=e.property,r=e.style;return i.default.createElement("td",{ref:"td",children:this.props.children,tabIndex:-1,className:t,style:r,"data-dash-column":n})}shouldComponentUpdate(e){const t=this.props,n=this.getChildProps(t),o=this.getChildProps(e);return r.any(n=>!u.test(n)&&t[n]!==e[n],r.keysIn(t))||r.any(e=>n[e]!==o[e],r.keysIn(n))}getChildProps(e){return e&&e.children&&e.children[0]&&e.children[0].props}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));t.default=((e,t,n)=>r.contains([t,n],e))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=l(n(1)),i=n(3),u=l(n(44)),a=l(n(47)),s=l(n(18));function l(e){return e&&e.__esModule?e:{default:e}}const c=r.addIndex(r.map),d=r.addIndex(r.map),p=(0,a.default)();t.default=(0,i.memoizeOneFactory)((e,t,n,r,i,a,l,f)=>c((n,c)=>d((t,d)=>{const h=(0,s.default)(e,c,d),v=l[c][d],y=p(f)(c,d);return o.default.createElement(u.default,Object.assign({key:`column-${d}`,active:h,clearable:t.clearable,datum:n,dropdown:v,editable:r,focused:i,property:t.id,tableId:a,type:t.type,value:n[t.id]},y))},t),n))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=n(1),o=c(r),i=c(n(45)),u=c(n(46)),a=n(15),s=n(7),l=c(n(17));function c(e){return e&&e.__esModule?e:{default:e}}class d extends r.PureComponent{constructor(e){super(e),this.propagateChange=(()=>{if(this.state.value===this.props.value)return;(0,this.props.onChange)(this.state.value)}),this.handleChange=(e=>{this.setState({value:e.target.value})}),this.handleKeyDown=(e=>{e.keyCode!==a.KEY_CODES.ENTER&&e.keyCode!==a.KEY_CODES.TAB||this.propagateChange()}),this.handleOpenDropdown=(()=>{var e=this.refs;const t=e.dropdown,n=e.td;(0,l.default)(t.wrapper.querySelector(".Select-menu-outer"),n)}),this.state={value:e.value}}get propsWithDefaults(){return this.props}renderDropdown(){var e=this.propsWithDefaults;const t=e.clearable,n=e.dropdown,r=e.onChange,u=e.value;return n?o.default.createElement("div",{className:"dash-dropdown-cell-value-container dash-cell-value-container"},this.renderValue({className:"dropdown-cell-value-shadow cell-value-shadow"},(n.find(e=>e.value===u)||{label:void 0}).label),o.default.createElement(i.default,{ref:"dropdown",clearable:t,onChange:e=>{r(e?e.value:e)},onOpen:this.handleOpenDropdown,options:n,placeholder:"",value:u})):this.renderValue()}renderInput(){var e=this.propsWithDefaults;const t=e.active,n=e.focused,r=e.onClick,i=e.onDoubleClick,u=e.onPaste,a={className:[...t?["input-active"]:[],...n?["focused"]:["unfocused"],...["dash-cell-value"]].join(" "),onClick:r,onDoubleClick:i};return!t&&this.state.value===this.props.value?this.renderValue(a):o.default.createElement("div",{className:"dash-input-cell-value-container dash-cell-value-container"},this.renderValue({className:"input-cell-value-shadow cell-value-shadow"}),o.default.createElement("input",Object.assign({ref:"textInput",type:"text",value:this.state.value,onBlur:this.propagateChange,onChange:this.handleChange,onKeyDown:this.handleKeyDown,onPaste:u},a)))}renderValue(e={},t){return t=t||this.propsWithDefaults.value,o.default.createElement("div",Object.assign({},e),t)}render(){switch(this.props.type){case s.ColumnType.Text:case s.ColumnType.Numeric:return this.renderInput();case s.ColumnType.Dropdown:return this.renderDropdown();default:return this.renderValue()}}componentWillReceiveProps(e){const t=e.value;this.state.value!==t&&this.setState({value:t})}componentDidUpdate(){if(!this.propsWithDefaults.active)return;const e=this.refs.textInput,t=this.refs.dropdown;if(e&&document.activeElement!==e&&(e.focus(),e.setSelectionRange(0,e.value?e.value.length:0)),t&&document.activeElement!==t){const e=u.default.getFirstParentOfType(t.wrapper,"td");e&&e.focus()}}}t.default=d,d.defaultProps={conditionalDropdowns:[],type:s.ColumnType.Text}},function(e,t,n){"use strict";n.r(t),n.d(t,"Async",function(){return V}),n.d(t,"AsyncCreatable",function(){return Y}),n.d(t,"Creatable",function(){return L}),n.d(t,"Value",function(){return F}),n.d(t,"Option",function(){return k}),n.d(t,"defaultMenuRenderer",function(){return b}),n.d(t,"defaultArrowRenderer",function(){return p}),n.d(t,"defaultClearRenderer",function(){return f}),n.d(t,"defaultFilterOptions",function(){return g});var r=n(23),o=n.n(r),i=n(5),u=n.n(i),a=n(0),s=n.n(a),l=n(1),c=n.n(l),d=n(6),p=function(e){var t=e.onMouseDown;return c.a.createElement("span",{className:"Select-arrow",onMouseDown:t})};p.propTypes={onMouseDown:s.a.func};var f=function(){return c.a.createElement("span",{className:"Select-clear",dangerouslySetInnerHTML:{__html:"×"}})},h=[{base:"A",letters:/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g},{base:"AA",letters:/[\uA732]/g},{base:"AE",letters:/[\u00C6\u01FC\u01E2]/g},{base:"AO",letters:/[\uA734]/g},{base:"AU",letters:/[\uA736]/g},{base:"AV",letters:/[\uA738\uA73A]/g},{base:"AY",letters:/[\uA73C]/g},{base:"B",letters:/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g},{base:"C",letters:/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g},{base:"D",letters:/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g},{base:"DZ",letters:/[\u01F1\u01C4]/g},{base:"Dz",letters:/[\u01F2\u01C5]/g},{base:"E",letters:/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g},{base:"F",letters:/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g},{base:"G",letters:/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g},{base:"H",letters:/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g},{base:"I",letters:/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g},{base:"J",letters:/[\u004A\u24BF\uFF2A\u0134\u0248]/g},{base:"K",letters:/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g},{base:"L",letters:/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g},{base:"LJ",letters:/[\u01C7]/g},{base:"Lj",letters:/[\u01C8]/g},{base:"M",letters:/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g},{base:"N",letters:/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g},{base:"NJ",letters:/[\u01CA]/g},{base:"Nj",letters:/[\u01CB]/g},{base:"O",letters:/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g},{base:"OI",letters:/[\u01A2]/g},{base:"OO",letters:/[\uA74E]/g},{base:"OU",letters:/[\u0222]/g},{base:"P",letters:/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g},{base:"Q",letters:/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g},{base:"R",letters:/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g},{base:"S",letters:/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g},{base:"T",letters:/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g},{base:"TZ",letters:/[\uA728]/g},{base:"U",letters:/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g},{base:"V",letters:/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g},{base:"VY",letters:/[\uA760]/g},{base:"W",letters:/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g},{base:"X",letters:/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g},{base:"Y",letters:/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g},{base:"Z",letters:/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g},{base:"a",letters:/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},{base:"aa",letters:/[\uA733]/g},{base:"ae",letters:/[\u00E6\u01FD\u01E3]/g},{base:"ao",letters:/[\uA735]/g},{base:"au",letters:/[\uA737]/g},{base:"av",letters:/[\uA739\uA73B]/g},{base:"ay",letters:/[\uA73D]/g},{base:"b",letters:/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},{base:"c",letters:/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},{base:"d",letters:/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},{base:"dz",letters:/[\u01F3\u01C6]/g},{base:"e",letters:/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},{base:"f",letters:/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},{base:"g",letters:/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},{base:"h",letters:/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},{base:"hv",letters:/[\u0195]/g},{base:"i",letters:/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},{base:"j",letters:/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},{base:"k",letters:/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},{base:"l",letters:/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},{base:"lj",letters:/[\u01C9]/g},{base:"m",letters:/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},{base:"n",letters:/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},{base:"nj",letters:/[\u01CC]/g},{base:"o",letters:/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},{base:"oi",letters:/[\u01A3]/g},{base:"ou",letters:/[\u0223]/g},{base:"oo",letters:/[\uA74F]/g},{base:"p",letters:/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},{base:"q",letters:/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},{base:"r",letters:/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},{base:"s",letters:/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},{base:"t",letters:/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},{base:"tz",letters:/[\uA729]/g},{base:"u",letters:/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},{base:"v",letters:/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},{base:"vy",letters:/[\uA761]/g},{base:"w",letters:/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},{base:"x",letters:/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},{base:"y",letters:/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},{base:"z",letters:/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}],v=function(e){for(var t=0;t-1)return!1;if(r.filterOption)return r.filterOption.call(void 0,e,t);if(!t)return!0;var o=e[r.valueKey],i=e[r.labelKey],u=y(o),a=y(i);if(!u&&!a)return!1;var s=u?String(o):null,l=a?String(i):null;return r.ignoreAccents&&(s&&"label"!==r.matchProp&&(s=v(s)),l&&"value"!==r.matchProp&&(l=v(l))),r.ignoreCase&&(s&&"label"!==r.matchProp&&(s=s.toLowerCase()),l&&"value"!==r.matchProp&&(l=l.toLowerCase())),"start"===r.matchPos?s&&"label"!==r.matchProp&&s.substr(0,t.length)===t||l&&"value"!==r.matchProp&&l.substr(0,t.length)===t:s&&"label"!==r.matchProp&&s.indexOf(t)>=0||l&&"value"!==r.matchProp&&l.indexOf(t)>=0})},b=function(e){var t=e.focusedOption,n=e.focusOption,r=e.inputValue,o=e.instancePrefix,i=e.onFocus,a=e.onOptionRef,s=e.onSelect,l=e.optionClassName,d=e.optionComponent,p=e.optionRenderer,f=e.options,h=e.removeValue,v=e.selectValue,y=e.valueArray,g=e.valueKey,b=d;return f.map(function(e,d){var f=y&&y.some(function(t){return t[g]===e[g]}),m=e===t,x=u()(l,{"Select-option":!0,"is-selected":f,"is-focused":m,"is-disabled":e.disabled});return c.a.createElement(b,{className:x,focusOption:n,inputValue:r,instancePrefix:o,isDisabled:e.disabled,isFocused:m,isSelected:f,key:"option-"+d+"-"+e[g],onFocus:i,onSelect:s,option:e,optionIndex:d,ref:function(e){a(e,m)},removeValue:h,selectValue:v},p(e,d,r))})};b.propTypes={focusOption:s.a.func,focusedOption:s.a.object,inputValue:s.a.string,instancePrefix:s.a.string,onFocus:s.a.func,onOptionRef:s.a.func,onSelect:s.a.func,optionClassName:s.a.string,optionComponent:s.a.func,optionRenderer:s.a.func,options:s.a.array,removeValue:s.a.func,selectValue:s.a.func,valueArray:s.a.array,valueKey:s.a.string};var m=function(e){e.preventDefault(),e.stopPropagation(),"A"===e.target.tagName&&"href"in e.target&&(e.target.target?window.open(e.target.href,e.target.target):window.location.href=e.target.href)},x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},w=(function(){function e(e){this.value=e}function t(t){var n,r;function o(n,r){try{var u=t[n](r),a=u.value;a instanceof e?Promise.resolve(a.value).then(function(e){o("next",e)},function(e){o("throw",e)}):i(u.done?"return":"normal",u.value)}catch(e){i("throw",e)}}function i(e,t){switch(e){case"return":n.resolve({value:t,done:!0});break;case"throw":n.reject(t);break;default:n.resolve({value:t,done:!1})}(n=n.next)?o(n.key,n.arg):r=null}this._invoke=function(e,t){return new Promise(function(i,u){var a={key:e,arg:t,resolve:i,reject:u,next:null};r?r=r.next=a:(n=r=a,o(e,t))})},"function"!=typeof t.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(t.prototype[Symbol.asyncIterator]=function(){return this}),t.prototype.next=function(e){return this._invoke("next",e)},t.prototype.throw=function(e){return this._invoke("throw",e)},t.prototype.return=function(e){return this._invoke("return",e)}}(),function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}),E=function(){function e(e,t){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n},A=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t},k=function(e){function t(e){w(this,t);var n=A(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleMouseDown=n.handleMouseDown.bind(n),n.handleMouseEnter=n.handleMouseEnter.bind(n),n.handleMouseMove=n.handleMouseMove.bind(n),n.handleTouchStart=n.handleTouchStart.bind(n),n.handleTouchEnd=n.handleTouchEnd.bind(n),n.handleTouchMove=n.handleTouchMove.bind(n),n.onFocus=n.onFocus.bind(n),n}return S(t,e),E(t,[{key:"handleMouseDown",value:function(e){e.preventDefault(),e.stopPropagation(),this.props.onSelect(this.props.option,e)}},{key:"handleMouseEnter",value:function(e){this.onFocus(e)}},{key:"handleMouseMove",value:function(e){this.onFocus(e)}},{key:"handleTouchEnd",value:function(e){this.dragging||this.handleMouseDown(e)}},{key:"handleTouchMove",value:function(){this.dragging=!0}},{key:"handleTouchStart",value:function(){this.dragging=!1}},{key:"onFocus",value:function(e){this.props.isFocused||this.props.onFocus(this.props.option,e)}},{key:"render",value:function(){var e=this.props,t=e.option,n=e.instancePrefix,r=e.optionIndex,o=u()(this.props.className,t.className);return t.disabled?c.a.createElement("div",{className:o,onMouseDown:m,onClick:m},this.props.children):c.a.createElement("div",{className:o,style:t.style,role:"option","aria-label":t.label,onMouseDown:this.handleMouseDown,onMouseEnter:this.handleMouseEnter,onMouseMove:this.handleMouseMove,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEnd,id:n+"-option-"+r,title:t.title},this.props.children)}}]),t}(c.a.Component);k.propTypes={children:s.a.node,className:s.a.string,instancePrefix:s.a.string.isRequired,isDisabled:s.a.bool,isFocused:s.a.bool,isSelected:s.a.bool,onFocus:s.a.func,onSelect:s.a.func,onUnfocus:s.a.func,option:s.a.object.isRequired,optionIndex:s.a.number};var F=function(e){function t(e){w(this,t);var n=A(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleMouseDown=n.handleMouseDown.bind(n),n.onRemove=n.onRemove.bind(n),n.handleTouchEndRemove=n.handleTouchEndRemove.bind(n),n.handleTouchMove=n.handleTouchMove.bind(n),n.handleTouchStart=n.handleTouchStart.bind(n),n}return S(t,e),E(t,[{key:"handleMouseDown",value:function(e){if("mousedown"!==e.type||0===e.button)return this.props.onClick?(e.stopPropagation(),void this.props.onClick(this.props.value,e)):void(this.props.value.href&&e.stopPropagation())}},{key:"onRemove",value:function(e){e.preventDefault(),e.stopPropagation(),this.props.onRemove(this.props.value)}},{key:"handleTouchEndRemove",value:function(e){this.dragging||this.onRemove(e)}},{key:"handleTouchMove",value:function(){this.dragging=!0}},{key:"handleTouchStart",value:function(){this.dragging=!1}},{key:"renderRemoveIcon",value:function(){if(!this.props.disabled&&this.props.onRemove)return c.a.createElement("span",{className:"Select-value-icon","aria-hidden":"true",onMouseDown:this.onRemove,onTouchEnd:this.handleTouchEndRemove,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove},"×")}},{key:"renderLabel",value:function(){return this.props.onClick||this.props.value.href?c.a.createElement("a",{className:"Select-value-label",href:this.props.value.href,target:this.props.value.target,onMouseDown:this.handleMouseDown,onTouchEnd:this.handleMouseDown},this.props.children):c.a.createElement("span",{className:"Select-value-label",role:"option","aria-selected":"true",id:this.props.id},this.props.children)}},{key:"render",value:function(){return c.a.createElement("div",{className:u()("Select-value",this.props.value.className),style:this.props.value.style,title:this.props.value.title},this.renderRemoveIcon(),this.renderLabel())}}]),t}(c.a.Component);F.propTypes={children:s.a.node,disabled:s.a.bool,id:s.a.string,onClick:s.a.func,onRemove:s.a.func,value:s.a.object.isRequired}; /*! Copyright (c) 2018 Jed Watson. Licensed under the MIT License (MIT), see http://jedwatson.github.io/react-select */ -var D=function(e){return"string"==typeof e?e:null!==e&&JSON.stringify(e)||""},P=a.a.oneOfType([a.a.string,a.a.node]),R=a.a.oneOfType([a.a.string,a.a.number]),T=1,I=function(e,t){var n=void 0===e?"undefined":x(e);if("string"!==n&&"number"!==n&&"boolean"!==n)return e;var r=t.options,o=t.valueKey;if(r)for(var i=0;iu||id.bottom?l.scrollTop=a.offsetTop+a.clientHeight-l.offsetHeight:c.topt.offsetHeight&&t.scrollHeight-t.offsetHeight-t.scrollTop<=0&&this.props.onMenuScrollToBottom()}}},{key:"getOptionLabel",value:function(e){return e[this.props.labelKey]}},{key:"getValueArray",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,n="object"===(void 0===t?"undefined":x(t))?t:this.props;if(n.multi){if("string"==typeof e&&(e=e.split(n.delimiter)),!Array.isArray(e)){if(null===e||void 0===e)return[];e=[e]}return e.map(function(e){return I(e,n)}).filter(function(e){return e})}var r=I(e,n);return r?[r]:[]}},{key:"setValue",value:function(e){var t=this;if(this.props.autoBlur&&this.blurInput(),this.props.required){var n=j(e,this.props.multi);this.setState({required:n})}this.props.simpleValue&&e&&(e=this.props.multi?e.map(function(e){return e[t.props.valueKey]}).join(this.props.delimiter):e[this.props.valueKey]),this.props.onChange&&this.props.onChange(e)}},{key:"selectValue",value:function(e){var t=this;this.props.closeOnSelect&&(this.hasScrolledToOption=!1);var n=this.props.onSelectResetsInput?"":this.state.inputValue;this.props.multi?this.setState({focusedIndex:null,inputValue:this.handleInputValueChange(n),isOpen:!this.props.closeOnSelect},function(){t.getValueArray(t.props.value).some(function(n){return n[t.props.valueKey]===e[t.props.valueKey]})?t.removeValue(e):t.addValue(e)}):this.setState({inputValue:this.handleInputValueChange(n),isOpen:!this.props.closeOnSelect,isPseudoFocused:this.state.isFocused},function(){t.setValue(e)})}},{key:"addValue",value:function(e){var t=this.getValueArray(this.props.value),n=this._visibleOptions.filter(function(e){return!e.disabled}),r=n.indexOf(e);this.setValue(t.concat(e)),n.length-1===r?this.focusOption(n[r-1]):n.length>r&&this.focusOption(n[r+1])}},{key:"popValue",value:function(){var e=this.getValueArray(this.props.value);e.length&&!1!==e[e.length-1].clearableValue&&this.setValue(this.props.multi?e.slice(0,e.length-1):null)}},{key:"removeValue",value:function(e){var t=this,n=this.getValueArray(this.props.value);this.setValue(n.filter(function(n){return n[t.props.valueKey]!==e[t.props.valueKey]})),this.focus()}},{key:"clearValue",value:function(e){e&&"mousedown"===e.type&&0!==e.button||(e.preventDefault(),this.setValue(this.getResetValue()),this.setState({inputValue:this.handleInputValueChange(""),isOpen:!1},this.focus),this._focusAfterClear=!0)}},{key:"getResetValue",value:function(){return void 0!==this.props.resetValue?this.props.resetValue:this.props.multi?[]:null}},{key:"focusOption",value:function(e){this.setState({focusedOption:e})}},{key:"focusNextOption",value:function(){this.focusAdjacentOption("next")}},{key:"focusPreviousOption",value:function(){this.focusAdjacentOption("previous")}},{key:"focusPageUpOption",value:function(){this.focusAdjacentOption("page_up")}},{key:"focusPageDownOption",value:function(){this.focusAdjacentOption("page_down")}},{key:"focusStartOption",value:function(){this.focusAdjacentOption("start")}},{key:"focusEndOption",value:function(){this.focusAdjacentOption("end")}},{key:"focusAdjacentOption",value:function(e){var t=this._visibleOptions.map(function(e,t){return{option:e,index:t}}).filter(function(e){return!e.option.disabled});if(this._scrollToFocusedOptionOnUpdate=!0,!this.state.isOpen){var n={focusedOption:this._focusedOption||(t.length?t["next"===e?0:t.length-1].option:null),isOpen:!0};return this.props.onSelectResetsInput&&(n.inputValue=""),void this.setState(n)}if(t.length){for(var r=-1,o=0;o0?r-=1:r=t.length-1;else if("start"===e)r=0;else if("end"===e)r=t.length-1;else if("page_up"===e){var i=r-this.props.pageSize;r=i<0?0:i}else if("page_down"===e){var u=r+this.props.pageSize;r=u>t.length-1?t.length-1:u}-1===r&&(r=0),this.setState({focusedIndex:t[r].index,focusedOption:t[r].option})}}},{key:"getFocusedOption",value:function(){return this._focusedOption}},{key:"selectFocusedOption",value:function(){if(this._focusedOption)return this.selectValue(this._focusedOption)}},{key:"renderLoading",value:function(){if(this.props.isLoading)return c.a.createElement("span",{className:"Select-loading-zone","aria-hidden":"true"},c.a.createElement("span",{className:"Select-loading"}))}},{key:"renderValue",value:function(e,t){var n=this,r=this.props.valueRenderer||this.getOptionLabel,o=this.props.valueComponent;if(!e.length)return function(e,t,n){var r=e.inputValue,o=e.isPseudoFocused,i=e.isFocused,u=t.onSelectResetsInput;return!r||!u&&!n&&!o&&!i}(this.state,this.props,t)?c.a.createElement("div",{className:"Select-placeholder"},this.props.placeholder):null;var i=this.props.onValueClick?this.handleValueClick:null;return this.props.multi?e.map(function(e,t){return c.a.createElement(o,{disabled:n.props.disabled||!1===e.clearableValue,id:n._instancePrefix+"-value-"+t,instancePrefix:n._instancePrefix,key:"value-"+t+"-"+e[n.props.valueKey],onClick:i,onRemove:n.removeValue,placeholder:n.props.placeholder,value:e},r(e,t),c.a.createElement("span",{className:"Select-aria-only"}," "))}):function(e,t){var n=e.inputValue,r=e.isPseudoFocused,o=e.isFocused,i=t.onSelectResetsInput;return!n||!i&&!(!o&&r||o&&!r)}(this.state,this.props)?(t&&(i=null),c.a.createElement(o,{disabled:this.props.disabled,id:this._instancePrefix+"-value-item",instancePrefix:this._instancePrefix,onClick:i,placeholder:this.props.placeholder,value:e[0]},r(e[0]))):void 0}},{key:"renderInput",value:function(e,t){var n,r=this,i=u()("Select-input",this.props.inputProps.className),s=this.state.isOpen,a=u()((_(n={},this._instancePrefix+"-list",s),_(n,this._instancePrefix+"-backspace-remove-message",this.props.multi&&!this.props.disabled&&this.state.isFocused&&!this.state.inputValue),n)),l=this.state.inputValue;!l||this.props.onSelectResetsInput||this.state.isFocused||(l="");var p=O({},this.props.inputProps,{"aria-activedescendant":s?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value","aria-describedby":this.props["aria-describedby"],"aria-expanded":""+s,"aria-haspopup":""+s,"aria-label":this.props["aria-label"],"aria-labelledby":this.props["aria-labelledby"],"aria-owns":a,className:i,onBlur:this.handleInputBlur,onChange:this.handleInputChange,onFocus:this.handleInputFocus,ref:function(e){return r.input=e},role:"combobox",required:this.state.required,tabIndex:this.props.tabIndex,value:l});if(this.props.inputRenderer)return this.props.inputRenderer(p);if(this.props.disabled||!this.props.searchable){var d=C(this.props.inputProps,[]),f=u()(_({},this._instancePrefix+"-list",s));return c.a.createElement("div",O({},d,{"aria-expanded":s,"aria-owns":f,"aria-activedescendant":s?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value","aria-disabled":""+this.props.disabled,"aria-label":this.props["aria-label"],"aria-labelledby":this.props["aria-labelledby"],className:i,onBlur:this.handleInputBlur,onFocus:this.handleInputFocus,ref:function(e){return r.input=e},role:"combobox",style:{border:0,width:1,display:"inline-block"},tabIndex:this.props.tabIndex||0}))}return this.props.autosize?c.a.createElement(o.a,O({id:this.props.id},p,{minWidth:"5"})):c.a.createElement("div",{className:i,key:"input-wrap",style:{display:"inline-block"}},c.a.createElement("input",O({id:this.props.id},p)))}},{key:"renderClear",value:function(){var e=this.getValueArray(this.props.value);if(this.props.clearable&&e.length&&!this.props.disabled&&!this.props.isLoading){var t=this.props.multi?this.props.clearAllText:this.props.clearValueText,n=this.props.clearRenderer();return c.a.createElement("span",{"aria-label":t,className:"Select-clear-zone",onMouseDown:this.clearValue,onTouchEnd:this.handleTouchEndClearValue,onTouchMove:this.handleTouchMove,onTouchStart:this.handleTouchStart,title:t},n)}}},{key:"renderArrow",value:function(){if(this.props.arrowRenderer){var e=this.handleMouseDownOnArrow,t=this.state.isOpen,n=this.props.arrowRenderer({onMouseDown:e,isOpen:t});return n?c.a.createElement("span",{className:"Select-arrow-zone",onMouseDown:e},n):null}}},{key:"filterOptions",value:function(e){var t=this.state.inputValue,n=this.props.options||[];if(this.props.filterOptions){var r="function"==typeof this.props.filterOptions?this.props.filterOptions:y;return r(n,t,e,{filterOption:this.props.filterOption,ignoreAccents:this.props.ignoreAccents,ignoreCase:this.props.ignoreCase,labelKey:this.props.labelKey,matchPos:this.props.matchPos,matchProp:this.props.matchProp,trimFilter:this.props.trimFilter,valueKey:this.props.valueKey})}return n}},{key:"onOptionRef",value:function(e,t){t&&(this.focused=e)}},{key:"renderMenu",value:function(e,t,n){return e&&e.length?this.props.menuRenderer({focusedOption:n,focusOption:this.focusOption,inputValue:this.state.inputValue,instancePrefix:this._instancePrefix,labelKey:this.props.labelKey,onFocus:this.focusOption,onOptionRef:this.onOptionRef,onSelect:this.selectValue,optionClassName:this.props.optionClassName,optionComponent:this.props.optionComponent,optionRenderer:this.props.optionRenderer||this.getOptionLabel,options:e,removeValue:this.removeValue,selectValue:this.selectValue,valueArray:t,valueKey:this.props.valueKey}):this.props.noResultsText?c.a.createElement("div",{className:"Select-noresults"},this.props.noResultsText):null}},{key:"renderHiddenField",value:function(e){var t=this;if(this.props.name){if(this.props.joinValues){var n=e.map(function(e){return D(e[t.props.valueKey])}).join(this.props.delimiter);return c.a.createElement("input",{disabled:this.props.disabled,name:this.props.name,ref:function(e){return t.value=e},type:"hidden",value:n})}return e.map(function(e,n){return c.a.createElement("input",{disabled:t.props.disabled,key:"hidden."+n,name:t.props.name,ref:"value"+n,type:"hidden",value:D(e[t.props.valueKey])})})}}},{key:"getFocusableOptionIndex",value:function(e){var t=this._visibleOptions;if(!t.length)return null;var n=this.props.valueKey,r=this.state.focusedOption||e;if(r&&!r.disabled){var o=-1;if(t.some(function(e,t){var i=e[n]===r[n];return i&&(o=t),i}),-1!==o)return o}for(var i=0;i{const u=n.slice(-1)[0],s=n.slice(0,-1),a=r.reduce((e,t)=>e.get(t)||e.set(t,new Map).get(t),t,s);return(a.get(u)||a.set(u,function(e){return(0,o.memoizeOne)((...t)=>e(...t))}(e)).get(u))(...i)}};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(5)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=d(n(1)),i=d(n(3)),u=d(n(47)),s=d(n(48)),a=n(49),l=d(n(11)),c=n(16),p=d(n(18));function d(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e){this.propsFn=e,this.handlers=new Map,this.ops=new Map,this.onChange=((e,t,n,o)=>{i.default.debug("Filter -- onChange",e,o.target.value&&o.target.value.trim());const u=o.target.value.trim();u&&u.length?t.set(e,u):t.delete(e),n(r.map(([e,t])=>`${e} ${t}`,r.filter(([e])=>this.isFragmentValid(e),Array.from(t.entries()))).join(" && "))}),this.getEventHandler=((e,t,n,r)=>{const o=this.handlers.get(e)||this.handlers.set(e,new Map).get(e),i=o.get(t)||o.set(t,new Map).get(t);return i.get(r)||i.set(r,e.bind(this,t,n,r)).get(r)})}get props(){return this.propsFn()}respectsBasicSyntax(e,t=!0){const n=[c.LexemeType.BinaryOperator,c.LexemeType.Expression,c.LexemeType.Operand,c.LexemeType.UnaryOperator];if(t&&n.push(c.LexemeType.And),!r.all(e=>r.contains(e.lexeme.name,n),e))return!1;const o=r.map(e=>e.value,r.filter(e=>e.lexeme.name===c.LexemeType.Operand,e)),i=r.uniq(o);return o.length===i.length}isBasicFilter(e,t,n=!0){return e.valid&&t.valid&&this.respectsBasicSyntax(e.lexemes,n)}updateOps(e){const t=(0,l.default)(e),n=(0,p.default)(t);if(!this.isBasicFilter(t,n))return;const r=[n.tree];for(;r.length;){const e=r.pop();e&&(e.lexeme.name===c.LexemeType.UnaryOperator&&e.block?this.ops.set(e.block.value,e.value):e.lexeme.name===c.LexemeType.BinaryOperator&&e.left&&e.right?this.ops.set(e.left.value,`${e.value} ${e.right.value}`):(r.push(e.left),r.push(e.block),r.push(e.right)))}}isFragmentValidOrNull(e){const t=this.ops.get(e);return!t||!t.trim().length||this.isFragmentValid(e)}isFragmentValid(e){const t=this.ops.get(e),n=(0,l.default)(`${e} ${t}`),r=(0,p.default)(n);return r.valid&&this.isBasicFilter(n,r,!1)}createFilters(){var e=this.props;const t=e.columns,n=e.filtering,i=e.filtering_settings,l=e.filtering_type,c=e.offset,p=e.setFilter;if(!n)return[];this.updateOps(i);const d=r.filter(e=>!e.hidden,t),f=r.range(0,c).map(e=>o.default.createElement("th",{key:`offset-${e}`})),h=l===a.FilteringType.Basic?r.addIndex(r.map)((e,t)=>o.default.createElement(u.default,{key:`column-${t+c}`,classes:`filter column-${t+c}`,isValid:this.isFragmentValidOrNull(e.id),property:e.id,setFilter:this.getEventHandler(this.onChange,e.id,this.ops,p),value:this.ops.get(e.id)}),d):[o.default.createElement(s.default,{key:`column-${c}`,classes:[],colSpan:d.length,value:"",setFilter:()=>void 0})];return[r.concat(f,h)]}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=u(r),i=u(n(20));function u(e){return e&&e.__esModule?e:{default:e}}t.default=class extends r.PureComponent{constructor(e){super(e),this.submit=(e=>{(0,this.props.setFilter)({target:{value:e}})}),this.state={value:e.value}}componentWillReceiveProps(e){const t=e.value;this.state.value!==t&&this.setState({value:t})}render(){var e=this.props;const t=e.classes,n=e.isValid,r=e.value;return o.default.createElement("th",{className:t+(n?"":" invalid")},o.default.createElement(i.default,{value:r,stopPropagation:!0,submit:this.submit}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=u(r),i=u(n(20));function u(e){return e&&e.__esModule?e:{default:e}}t.default=class extends r.PureComponent{constructor(e){super(e),this.submit=(e=>this.props.setFilter(e))}render(){var e=this.props;const t=e.colSpan,n=e.value;return o.default.createElement("th",{colSpan:t},o.default.createElement(i.default,{stopPropagation:!0,value:n,submit:this.submit}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=t.FilteringType=void 0;!function(e){e.Advanced="advanced",e.Basic="basic"}(r||(t.FilteringType=r={}));var o=t.ContentStyle=void 0;!function(e){e.Fit="fit",e.Grow="grow"}(o||(t.ContentStyle=o={}))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(5),i=n(7),u=a(i),s=a(n(17));function a(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e){this.target=e,this.getDataframe=(0,o.memoizeOne)((e,t,n,o,a=[],l)=>{const c=new Map;if(r.addIndex(r.forEach)((e,t)=>{c.set(e,t)},e),"fe"===t||!0===t){const t=new s.default(n);e=t.isValid?t.filter(e):e}const p=l?e=>""===e||(0,i.defaultIsNully)(e):void 0;return"fe"!==o&&!0!==o||(e=(0,u.default)(e,a,p)),{dataframe:e,indices:r.map(e=>c.get(e),e)}})}get dataframeAndIndices(){var e=this.target.props;const t=e.dataframe,n=e.filtering,r=e.filtering_settings,o=e.sorting,i=e.sorting_settings,u=e.sorting_treat_empty_string_as_none;return this.getDataframe(t,n,r,o,i,u)}get dataframe(){return this.dataframeAndIndices.dataframe}get indices(){return this.dataframeAndIndices.indices}get settings(){return this.target.props.virtualization_settings}get virtualization(){return this.target.props.virtualization}get viewportDataframe(){return this.target.props.virtual_dataframe}get viewportIndices(){return this.target.props.virtual_dataframe_indices}update(e){const t=this.target.setProps,n=e.settings,o=e.viewportDataframe,i=e.viewportIndices;let u=r.mergeAll([n?{virtualization_settings:n}:{},o?{virtual_dataframe:o}:{},i?{virtual_dataframe_indices:i}:{}]);setTimeout(()=>{t(u)},0)}}},function(e,t,n){var r=n(52);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(9)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(8)(!1)).push([e.i,"/**\n * React Select\n * ============\n * Created by Jed Watson and Joss Mackison for KeystoneJS, http://www.keystonejs.com/\n * https://twitter.com/jedwatson https://twitter.com/jossmackison https://twitter.com/keystonejs\n * MIT License: https://github.com/JedWatson/react-select\n*/\n.Select {\n position: relative;\n}\n.Select input::-webkit-contacts-auto-fill-button,\n.Select input::-webkit-credentials-auto-fill-button {\n display: none !important;\n}\n.Select input::-ms-clear {\n display: none !important;\n}\n.Select input::-ms-reveal {\n display: none !important;\n}\n.Select,\n.Select div,\n.Select input,\n.Select span {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n.Select.is-disabled .Select-arrow-zone {\n cursor: default;\n pointer-events: none;\n opacity: 0.35;\n}\n.Select.is-disabled > .Select-control {\n background-color: #f9f9f9;\n}\n.Select.is-disabled > .Select-control:hover {\n box-shadow: none;\n}\n.Select.is-open > .Select-control {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n background: #fff;\n border-color: #b3b3b3 #ccc #d9d9d9;\n}\n.Select.is-open > .Select-control .Select-arrow {\n top: -2px;\n border-color: transparent transparent #999;\n border-width: 0 5px 5px;\n}\n.Select.is-searchable.is-open > .Select-control {\n cursor: text;\n}\n.Select.is-searchable.is-focused:not(.is-open) > .Select-control {\n cursor: text;\n}\n.Select.is-focused > .Select-control {\n background: #fff;\n}\n.Select.is-focused:not(.is-open) > .Select-control {\n border-color: #007eff;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 3px rgba(0, 126, 255, 0.1);\n background: #fff;\n}\n.Select.has-value.is-clearable.Select--single > .Select-control .Select-value {\n padding-right: 42px;\n}\n.Select.has-value.Select--single > .Select-control .Select-value .Select-value-label,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value .Select-value-label {\n color: #333;\n}\n.Select.has-value.Select--single > .Select-control .Select-value a.Select-value-label,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label {\n cursor: pointer;\n text-decoration: none;\n}\n.Select.has-value.Select--single > .Select-control .Select-value a.Select-value-label:hover,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label:hover,\n.Select.has-value.Select--single > .Select-control .Select-value a.Select-value-label:focus,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label:focus {\n color: #007eff;\n outline: none;\n text-decoration: underline;\n}\n.Select.has-value.Select--single > .Select-control .Select-value a.Select-value-label:focus,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label:focus {\n background: #fff;\n}\n.Select.has-value.is-pseudo-focused .Select-input {\n opacity: 0;\n}\n.Select.is-open .Select-arrow,\n.Select .Select-arrow-zone:hover > .Select-arrow {\n border-top-color: #666;\n}\n.Select.Select--rtl {\n direction: rtl;\n text-align: right;\n}\n.Select-control {\n background-color: #fff;\n border-color: #d9d9d9 #ccc #b3b3b3;\n border-radius: 4px;\n border: 1px solid #ccc;\n color: #333;\n cursor: default;\n display: table;\n border-spacing: 0;\n border-collapse: separate;\n height: 36px;\n outline: none;\n overflow: hidden;\n position: relative;\n width: 100%;\n}\n.Select-control:hover {\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);\n}\n.Select-control .Select-input:focus {\n outline: none;\n background: #fff;\n}\n.Select-placeholder,\n.Select--single > .Select-control .Select-value {\n bottom: 0;\n color: #aaa;\n left: 0;\n line-height: 34px;\n padding-left: 10px;\n padding-right: 10px;\n position: absolute;\n right: 0;\n top: 0;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.Select-input {\n height: 34px;\n padding-left: 10px;\n padding-right: 10px;\n vertical-align: middle;\n}\n.Select-input > input {\n width: 100%;\n background: none transparent;\n border: 0 none;\n box-shadow: none;\n cursor: default;\n display: inline-block;\n font-family: inherit;\n font-size: inherit;\n margin: 0;\n outline: none;\n line-height: 17px;\n /* For IE 8 compatibility */\n padding: 8px 0 12px;\n /* For IE 8 compatibility */\n -webkit-appearance: none;\n}\n.is-focused .Select-input > input {\n cursor: text;\n}\n.has-value.is-pseudo-focused .Select-input {\n opacity: 0;\n}\n.Select-control:not(.is-searchable) > .Select-input {\n outline: none;\n}\n.Select-loading-zone {\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 16px;\n}\n.Select-loading {\n -webkit-animation: Select-animation-spin 400ms infinite linear;\n -o-animation: Select-animation-spin 400ms infinite linear;\n animation: Select-animation-spin 400ms infinite linear;\n width: 16px;\n height: 16px;\n box-sizing: border-box;\n border-radius: 50%;\n border: 2px solid #ccc;\n border-right-color: #333;\n display: inline-block;\n position: relative;\n vertical-align: middle;\n}\n.Select-clear-zone {\n -webkit-animation: Select-animation-fadeIn 200ms;\n -o-animation: Select-animation-fadeIn 200ms;\n animation: Select-animation-fadeIn 200ms;\n color: #999;\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 17px;\n}\n.Select-clear-zone:hover {\n color: #D0021B;\n}\n.Select-clear {\n display: inline-block;\n font-size: 18px;\n line-height: 1;\n}\n.Select--multi .Select-clear-zone {\n width: 17px;\n}\n.Select-arrow-zone {\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 25px;\n padding-right: 5px;\n}\n.Select--rtl .Select-arrow-zone {\n padding-right: 0;\n padding-left: 5px;\n}\n.Select-arrow {\n border-color: #999 transparent transparent;\n border-style: solid;\n border-width: 5px 5px 2.5px;\n display: inline-block;\n height: 0;\n width: 0;\n position: relative;\n}\n.Select-control > *:last-child {\n padding-right: 5px;\n}\n.Select--multi .Select-multi-value-wrapper {\n display: inline-block;\n}\n.Select .Select-aria-only {\n position: absolute;\n display: inline-block;\n height: 1px;\n width: 1px;\n margin: -1px;\n clip: rect(0, 0, 0, 0);\n overflow: hidden;\n float: left;\n}\n@-webkit-keyframes Select-animation-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes Select-animation-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n.Select-menu-outer {\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n background-color: #fff;\n border: 1px solid #ccc;\n border-top-color: #e6e6e6;\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);\n box-sizing: border-box;\n margin-top: -1px;\n max-height: 200px;\n position: absolute;\n left: 0;\n top: 100%;\n width: 100%;\n z-index: 1;\n -webkit-overflow-scrolling: touch;\n}\n.Select-menu {\n max-height: 198px;\n overflow-y: auto;\n}\n.Select-option {\n box-sizing: border-box;\n background-color: #fff;\n color: #666666;\n cursor: pointer;\n display: block;\n padding: 8px 10px;\n}\n.Select-option:last-child {\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.Select-option.is-selected {\n background-color: #f5faff;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 126, 255, 0.04);\n color: #333;\n}\n.Select-option.is-focused {\n background-color: #ebf5ff;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 126, 255, 0.08);\n color: #333;\n}\n.Select-option.is-disabled {\n color: #cccccc;\n cursor: default;\n}\n.Select-noresults {\n box-sizing: border-box;\n color: #999999;\n cursor: default;\n display: block;\n padding: 8px 10px;\n}\n.Select--multi .Select-input {\n vertical-align: middle;\n margin-left: 10px;\n padding: 0;\n}\n.Select--multi.Select--rtl .Select-input {\n margin-left: 0;\n margin-right: 10px;\n}\n.Select--multi.has-value .Select-input {\n margin-left: 5px;\n}\n.Select--multi .Select-value {\n background-color: #ebf5ff;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 126, 255, 0.08);\n border-radius: 2px;\n border: 1px solid #c2e0ff;\n /* Fallback color for IE 8 */\n border: 1px solid rgba(0, 126, 255, 0.24);\n color: #007eff;\n display: inline-block;\n font-size: 0.9em;\n line-height: 1.4;\n margin-left: 5px;\n margin-top: 5px;\n vertical-align: top;\n}\n.Select--multi .Select-value-icon,\n.Select--multi .Select-value-label {\n display: inline-block;\n vertical-align: middle;\n}\n.Select--multi .Select-value-label {\n border-bottom-right-radius: 2px;\n border-top-right-radius: 2px;\n cursor: default;\n padding: 2px 5px;\n}\n.Select--multi a.Select-value-label {\n color: #007eff;\n cursor: pointer;\n text-decoration: none;\n}\n.Select--multi a.Select-value-label:hover {\n text-decoration: underline;\n}\n.Select--multi .Select-value-icon {\n cursor: pointer;\n border-bottom-left-radius: 2px;\n border-top-left-radius: 2px;\n border-right: 1px solid #c2e0ff;\n /* Fallback color for IE 8 */\n border-right: 1px solid rgba(0, 126, 255, 0.24);\n padding: 1px 5px 3px;\n}\n.Select--multi .Select-value-icon:hover,\n.Select--multi .Select-value-icon:focus {\n background-color: #d8eafd;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 113, 230, 0.08);\n color: #0071e6;\n}\n.Select--multi .Select-value-icon:active {\n background-color: #c2e0ff;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 126, 255, 0.24);\n}\n.Select--multi.Select--rtl .Select-value {\n margin-left: 0;\n margin-right: 5px;\n}\n.Select--multi.Select--rtl .Select-value-icon {\n border-right: none;\n border-left: 1px solid #c2e0ff;\n /* Fallback color for IE 8 */\n border-left: 1px solid rgba(0, 126, 255, 0.24);\n}\n.Select--multi.is-disabled .Select-value {\n background-color: #fcfcfc;\n border: 1px solid #e3e3e3;\n color: #333;\n}\n.Select--multi.is-disabled .Select-value-icon {\n cursor: not-allowed;\n border-right: 1px solid #e3e3e3;\n}\n.Select--multi.is-disabled .Select-value-icon:hover,\n.Select--multi.is-disabled .Select-value-icon:focus,\n.Select--multi.is-disabled .Select-value-icon:active {\n background-color: #fcfcfc;\n}\n@keyframes Select-animation-spin {\n to {\n transform: rotate(1turn);\n }\n}\n@-webkit-keyframes Select-animation-spin {\n to {\n -webkit-transform: rotate(1turn);\n }\n}\n",""])},function(e,t){e.exports=function(e){var t="undefined"!=typeof window&&window.location;if(!t)throw new Error("fixUrls requires window.location");if(!e||"string"!=typeof e)return e;var n=t.protocol+"//"+t.host,r=n+t.pathname.replace(/\/[^\/]*$/,"/");return e.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,function(e,t){var o,i=t.trim().replace(/^"(.*)"$/,function(e,t){return t}).replace(/^'(.*)'$/,function(e,t){return t});return/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(i)?e:(o=0===i.indexOf("//")?i:0===i.indexOf("/")?n+i:r+i.replace(/^\.\//,""),"url("+JSON.stringify(o)+")")})}},function(e,t,n){var r=n(55);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(9)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(8)(!1)).push([e.i,".dash-spreadsheet.freeze-left {\n width: auto;\n width: fit-content;\n width: -moz-fit-content;\n width: -webkit-fit-content;\n max-width: 500px;\n}\n.dash-spreadsheet.freeze-top {\n width: auto;\n width: fit-content;\n width: -moz-fit-content;\n width: -webkit-fit-content;\n max-height: 500px;\n}\n.dash-spreadsheet-container {\n display: flex;\n flex-direction: row;\n position: relative;\n}\n.dash-spreadsheet-inner {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n}\n.dash-spreadsheet-inner *,\n.dash-spreadsheet-inner *:after,\n.dash-spreadsheet-inner *:before {\n box-sizing: inherit;\n}\n.dash-spreadsheet-inner .Select {\n overflow: hidden;\n position: static;\n}\n.dash-spreadsheet-inner .Select,\n.dash-spreadsheet-inner .Select-control {\n background-color: inherit;\n}\n.dash-spreadsheet-inner .Select-value {\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin-top: -2px;\n}\n.dash-spreadsheet-inner .marker-row tr {\n visibility: hidden !important;\n}\n.dash-spreadsheet-inner .marker-row td,\n.dash-spreadsheet-inner .marker-row th {\n height: 0 !important;\n padding: 0 !important;\n margin: 0 !important;\n}\n.dash-spreadsheet-inner.freeze-left,\n.dash-spreadsheet-inner.freeze-top {\n overflow: hidden !important;\n}\n.dash-spreadsheet-inner.freeze-left .row-0,\n.dash-spreadsheet-inner.freeze-top .row-0 {\n display: flex;\n flex: 0 0 auto;\n flex-direction: row;\n}\n.dash-spreadsheet-inner.freeze-left .row-1,\n.dash-spreadsheet-inner.freeze-top .row-1 {\n display: flex;\n flex-direction: row;\n overflow: scroll;\n}\n.dash-spreadsheet-inner.freeze-left .cell-0-0,\n.dash-spreadsheet-inner.freeze-top .cell-0-0,\n.dash-spreadsheet-inner.freeze-left .cell-1-0,\n.dash-spreadsheet-inner.freeze-top .cell-1-0 {\n flex: 0 0 auto;\n left: 0;\n position: sticky;\n z-index: 400;\n}\n.dash-spreadsheet-inner.freeze-left .cell-0-1,\n.dash-spreadsheet-inner.freeze-top .cell-0-1 {\n z-index: 300;\n flex: 0 0 auto;\n}\n.dash-spreadsheet-inner.freeze-left .cell-1-1,\n.dash-spreadsheet-inner.freeze-top .cell-1-1 {\n flex: 0 0 auto;\n}\n.dash-spreadsheet-inner.dash-grow .cell-0-1,\n.dash-spreadsheet-inner.dash-grow .cell-1-1 {\n flex: 1 0 auto;\n}\n.dash-spreadsheet-inner.dash-grow table {\n width: 100%;\n}\n.dash-spreadsheet-inner:not(.freeze-top):not(.freeze-left) .cell-1-1 tr td:first-of-type,\n.dash-spreadsheet-inner:not(.freeze-top):not(.freeze-left) .cell-1-1 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.freeze-top):not(.freeze-left) .cell-1-1 tr:first-of-type td,\n.dash-spreadsheet-inner:not(.freeze-top):not(.freeze-left) .cell-1-1 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.freeze-top):not(.freeze-left) .cell-1-1 tr:first-of-type td:first-of-type,\n.dash-spreadsheet-inner:not(.freeze-top):not(.freeze-left) .cell-1-1 tr:first-of-type th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.freeze-top).freeze-left .cell-1-0 tr td:first-of-type,\n.dash-spreadsheet-inner:not(.freeze-top).freeze-left .cell-1-0 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.freeze-top).freeze-left .cell-1-0 tr:first-of-type td,\n.dash-spreadsheet-inner:not(.freeze-top).freeze-left .cell-1-0 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.freeze-top).freeze-left .cell-1-0 tr:first-of-type td:first-of-type,\n.dash-spreadsheet-inner:not(.freeze-top).freeze-left .cell-1-0 tr:first-of-type th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.freeze-top).freeze-left .cell-1-1 tr:first-of-type td,\n.dash-spreadsheet-inner:not(.freeze-top).freeze-left .cell-1-1 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top:not(.freeze-left) .cell-0-1 tr td:first-of-type,\n.dash-spreadsheet-inner.freeze-top:not(.freeze-left) .cell-0-1 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top:not(.freeze-left) .cell-0-1 tr:first-of-type td,\n.dash-spreadsheet-inner.freeze-top:not(.freeze-left) .cell-0-1 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top:not(.freeze-left) .cell-0-1 tr:first-of-type td:first-of-type,\n.dash-spreadsheet-inner.freeze-top:not(.freeze-left) .cell-0-1 tr:first-of-type th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top:not(.freeze-left) .cell-1-1 tr td:first-of-type,\n.dash-spreadsheet-inner.freeze-top:not(.freeze-left) .cell-1-1 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-0-0 tr td:first-of-type,\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-0-0 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-0-0 tr:first-of-type td,\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-0-0 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-0-0 tr:first-of-type td:first-of-type,\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-0-0 tr:first-of-type th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-0-1 tr:first-of-type td,\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-0-1 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-1-0 tr td:first-of-type,\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-1-0 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner .cell td,\n.dash-spreadsheet-inner .cell th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner .cell td:focus,\n.dash-spreadsheet-inner .cell th:focus {\n outline: none;\n}\n.dash-spreadsheet-inner .filter.invalid {\n box-shadow: inset 1px 0px 0px 0px red, inset 0px 1px 0px 0px red, inset -1px 0px 0px red, inset 0px -1px 0px 0px red;\n background-color: pink;\n}\n.dash-spreadsheet-inner .selected-row td,\n.dash-spreadsheet-inner .selected-row th {\n background-color: var(--selected-row);\n}\n.dash-spreadsheet-inner tr {\n background-color: white;\n}\n.dash-spreadsheet-inner td {\n background-color: inherit;\n}\n.dash-spreadsheet-inner td.cell--selected {\n background-color: var(--selected-background);\n}\n.dash-spreadsheet-inner td.focused {\n box-shadow: 1px 0px 0px 0px var(--accent), 0px 1px 0px 0px var(--accent), 0 0px 0px var(--accent), 0px 0 0px 0px var(--accent);\n border: 1px solid var(--accent);\n margin: -1px;\n z-index: 200;\n}\n.dash-spreadsheet-inner td .cell-value {\n height: 100%;\n width: 100%;\n}\n.dash-spreadsheet-inner td div.cell-value {\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n.dash-spreadsheet-inner td,\n.dash-spreadsheet-inner th {\n padding: 2px;\n white-space: nowrap;\n overflow-x: hidden;\n text-overflow: ellipsis;\n height: 30px;\n text-align: right;\n}\n.dash-spreadsheet-inner th .column-header--edit,\n.dash-spreadsheet-inner th .column-header--delete,\n.dash-spreadsheet-inner th .sort {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: default;\n cursor: pointer;\n}\n.dash-spreadsheet-inner textarea {\n white-space: pre;\n}\n.dash-spreadsheet-inner table {\n border-collapse: collapse;\n font-family: monospace;\n --accent: hotpink;\n --border: lightgrey;\n --text-color: #3c3c3c;\n --hover: #fdfdfd;\n --background-color-ellipses: #fdfdfd;\n --faded-text: #fafafa;\n --faded-text-header: #b4b4b4;\n --selected-background: rgba(255, 65, 54, 0.2);\n --faded-dropdown: #f0f0f0;\n --selected-row: #fff0ff;\n --muted: #c8c8c8;\n}\n/* focus happens after copying to clipboard */\n.dash-spreadsheet-inner table:focus {\n outline: none;\n}\n.dash-spreadsheet-inner thead {\n display: table-row-group;\n}\n.elip {\n text-align: center;\n width: 100%;\n background-color: var(--background-color-ellipses);\n}\n.dash-spreadsheet-inner td.dropdown {\n /*\n * To view the dropdown's contents, we need\n * overflow-y: visible.\n * Unfortunately, overflow-x: hidden and overflow-y: visible\n * can't both be set at the same time.\n * So, we have to make both overflow-x: visible and overflow-y: visble\n *\n * See https://stackoverflow.com/questions/6421966/\n *\n * There might be another solution with parent divs, but I haven't\n * tried it.\n */\n overflow-x: visible;\n}\n.dash-spreadsheet-inner th {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner :not(.cell--selected) tr:hover,\ntr:hover input :not(.cell--selected) {\n background-color: var(--hover);\n}\n.dash-spreadsheet-inner th {\n background-color: #fafafa;\n}\n.sort {\n cursor: pointer;\n float: left;\n color: var(--faded-text-header);\n font-size: 20px;\n}\nth:hover .sort {\n color: var(--accent);\n}\n.sort:hover {\n text-decoration: underline;\n}\n.expanded-row--empty-cell {\n box-shadow: none;\n background-color: transparent;\n}\n.expanded-row {\n text-align: center;\n}\n.dash-spreadsheet-inner input:not([type=radio]):not([type=checkbox]) {\n padding: 0px;\n margin: 0px;\n height: calc(100% - 1px);\n width: calc(100% - 1px);\n line-height: 30px;\n border: none;\n font-family: inherit;\n text-align: right;\n box-sizing: border-box;\n color: var(--text-color);\n background-color: transparent;\n /* so as to not overlay the box shadow */\n /* browser's default text-shadow is `$color 0px 0px 0px;`\n * for `input`, which makes it look a little bit heavier than dropdowns\n * or bare `td`\n */\n text-shadow: none;\n}\n.dash-spreadsheet-inner input.unfocused {\n color: transparent;\n text-shadow: 0 0 0 var(--text-color);\n cursor: default;\n}\n.dash-spreadsheet-inner input.unfocused:focus {\n outline: none;\n}\n.numeric {\n font-family: monospace;\n}\n.toggle-row {\n border: none;\n box-shadow: none;\n width: 10px;\n padding-left: 10px;\n padding-right: 10px;\n cursor: pointer;\n color: var(--faded-text);\n}\n.toggle-row--expanded {\n color: var(--accent);\n}\n.dash-spreadsheet-inner tr:hover .toggle-row {\n color: var(--accent);\n}\n.cell--uneditable,\n.cell--uneditable input {\n cursor: not-allowed;\n}\n.expanded-row {\n box-shadow: inset 2px 0px 0px 0px var(--accent), inset -1px 0px 0px 0px var(--border);\n /* inset 0px 1px 0px 0px var(--border); */\n}\n.dash-spreadsheet-inner .delete-cell {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: default;\n font-size: 1.3rem;\n text-align: center;\n cursor: pointer;\n color: var(--muted);\n}\n.dash-spreadsheet-inner .delete-cell:hover {\n color: var(--accent);\n}\n.dash-spreadsheet-inner .column-header--edit {\n float: left;\n opacity: 0.1;\n padding-left: 2px;\n padding-right: 2px;\n cursor: pointer;\n}\n.dash-spreadsheet-inner th:hover .column-header--edit {\n color: var(--accent);\n opacity: 1;\n}\n.dash-spreadsheet-inner .column-header--delete {\n float: left;\n opacity: 0.1;\n padding-left: 2px;\n padding-right: 2px;\n cursor: pointer;\n}\n.dash-spreadsheet-inner th:hover .column-header--delete {\n color: var(--accent);\n opacity: 1;\n}\n",""])},function(e,t,n){var r=n(57);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(9)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(8)(!1)).push([e.i,".dash-spreadsheet .Select,\n.dash-spreadsheet .Select-control {\n border: none;\n cursor: pointer;\n height: 30px; /* matches the td height and line-height */\n border: none;\n}\n\n.dash-spreadsheet .Select-placeholder,\n.dash-spreadsheet .Select--single > .Select-control .Select-value {\n height: 100%;\n line-height: inherit;\n}\n\n.dash-spreadsheet .Select.has-value.Select--single > .Select-control .Select-value .Select-value-label,\n.dash-spreadsheet .Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value .Select-value-label {\n color: var(--text-color);\n}\n\n.dash-spreadsheet .Select:hover,\n.dash-spreadsheet .Select-control:hover {\n border: none;\n box-shadow: none;\n cursor: pointer;\n}\n\n.dash-spreadsheet .Select-menu-outer {\n z-index: 100;\n}\n\n.dash-spreadsheet .Select-arrow {\n border-top-color: var(--faded-dropdown);\n border-left-color: transparent;\n border-right-color: transparent;\n border-bottom-color: transparent;\n}\n\n.dash-spreadsheet .Select-control:hover .Select-arrow {\n border-top-color: var(--accent);\n border-left-color: transparent;\n border-right-color: transparent;\n border-bottom-color: transparent;\n}\n\n.dash-spreadsheet .is-open > .Select-control .Select-arrow {\n border-bottom-color: var(--background-color-8-react-select);\n border-left-color: transparent;\n border-right-color: transparent;\n border-top-color: transparent;\n}\n\n.dash-spreadsheet .Select--multi .Select-value,\n.dash-spreadsheet .Select--multi a.Select-value-label {\n color: var(--color-8-react-select);\n}\n\n.dash-spreadsheet .Select {\n border-radius: 0;\n}\n\n.dash-spreadsheet .Select.is-disabled > .Select-control {\n border: none;\n}\n\n.dash-spreadsheet .Select--multi .Select-value-icon:hover,\n.dash-spreadsheet .Select--multi .Select-value-icon:focus {\n font-weight: bold;\n}\n\n.dash-spreadsheet .Select.is-disabled .Select-control {\n cursor: not-allowed;\n}\n\n.dash-spreadsheet .Select-menu-outer {\n background-color: white;\n border: none;\n border-bottom: thin var(--border) solid;\n border-radius: 0;\n border-top: none;\n}\n\n.dash-spreadsheet .Select-option {\n background-color: inherit;\n color: var(--accent);\n}\n\n.dash-spreadsheet .Select-option:hover {\n font-weight: bold;\n color: var(--accent);\n background-color: var(--hover);\n}\n\n.dash-spreadsheet .Select.is-focused:not(.is-open) > .Select-control {\n border: none;\n -webkit-box-shadow: none;\n box-shadow: none;\n background: #fff;\n}\n\n.dash-spreadsheet .Select-option.is-focused {\n background-color: white;\n color: var(--accent);\n font-weight: bold;\n}\n\n.dash-spreadsheet .Select-clear {\n color: transparent;\n}\n.Select:hover .Select-clear {\n color: var(--accent);\n}\n\n.dash-spreadsheet .Select-control {\n padding-left: 2px;\n}\n\n.dash-spreadsheet .cell--selected .Select-control {\n background-color: var(--selected-background);\n border-radius: 0;\n}\n",""])},function(e,t,n){var r=n(59);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(9)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(8)(!1)).push([e.i,"/*RESET CSS*/\nhtml {\n color: #000;\n background: #FFF;\n}\nbody,\ndiv,\ndl,\ndt,\ndd,\nul,\nol,\nli,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\npre,\ncode,\nform,\nfieldset,\nlegend,\ninput,\ntextarea,\np,\nblockquote,\nth,\ntd {\n margin: 0;\n padding: 0;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\nfieldset,\nimg {\n border: 0;\n}\naddress,\ncaption,\ncite,\ncode,\ndfn,\nem,\nstrong,\nth,\nvar {\n font-style: normal;\n font-weight: normal;\n}\nol,\nul {\n list-style: none;\n}\ncaption,\nth {\n text-align: left;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: 100%;\n font-weight: normal;\n}\nq:before,\nq:after {\n content: '';\n}\nabbr,\nacronym {\n border: 0;\n font-variant: normal;\n}\nsup {\n vertical-align: text-top;\n}\nsub {\n vertical-align: text-bottom;\n}\ninput,\ntextarea,\nselect {\n font-family: inherit;\n font-size: inherit;\n font-weight: inherit;\n *font-size: 100%;\n}\nlegend {\n color: #000;\n}\n#yui3-css-stamp.cssreset {\n display: none;\n}\ninput[type=\"button\"] {\n border-radius: 0;\n -webkit-appearance: none;\n}\n*:focus {\n outline: none;\n}\n.dash-spreadsheet-container input,\n.dash-spreadsheet-container table {\n font-size: 13px;\n}\nbody {\n margin: 0;\n padding: 0;\n font-family: sans-serif;\n}\n",""])}]); \ No newline at end of file +var D=function(e){return"string"==typeof e?e:null!==e&&JSON.stringify(e)||""},P=s.a.oneOfType([s.a.string,s.a.node]),M=s.a.oneOfType([s.a.string,s.a.number]),j=1,R=function(e,t){var n=void 0===e?"undefined":x(e);if("string"!==n&&"number"!==n&&"boolean"!==n)return e;var r=t.options,o=t.valueKey;if(r)for(var i=0;iu||ip.bottom?l.scrollTop=s.offsetTop+s.clientHeight-l.offsetHeight:c.topt.offsetHeight&&t.scrollHeight-t.offsetHeight-t.scrollTop<=0&&this.props.onMenuScrollToBottom()}}},{key:"getOptionLabel",value:function(e){return e[this.props.labelKey]}},{key:"getValueArray",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,n="object"===(void 0===t?"undefined":x(t))?t:this.props;if(n.multi){if("string"==typeof e&&(e=e.split(n.delimiter)),!Array.isArray(e)){if(null===e||void 0===e)return[];e=[e]}return e.map(function(e){return R(e,n)}).filter(function(e){return e})}var r=R(e,n);return r?[r]:[]}},{key:"setValue",value:function(e){var t=this;if(this.props.autoBlur&&this.blurInput(),this.props.required){var n=T(e,this.props.multi);this.setState({required:n})}this.props.simpleValue&&e&&(e=this.props.multi?e.map(function(e){return e[t.props.valueKey]}).join(this.props.delimiter):e[this.props.valueKey]),this.props.onChange&&this.props.onChange(e)}},{key:"selectValue",value:function(e){var t=this;this.props.closeOnSelect&&(this.hasScrolledToOption=!1);var n=this.props.onSelectResetsInput?"":this.state.inputValue;this.props.multi?this.setState({focusedIndex:null,inputValue:this.handleInputValueChange(n),isOpen:!this.props.closeOnSelect},function(){t.getValueArray(t.props.value).some(function(n){return n[t.props.valueKey]===e[t.props.valueKey]})?t.removeValue(e):t.addValue(e)}):this.setState({inputValue:this.handleInputValueChange(n),isOpen:!this.props.closeOnSelect,isPseudoFocused:this.state.isFocused},function(){t.setValue(e)})}},{key:"addValue",value:function(e){var t=this.getValueArray(this.props.value),n=this._visibleOptions.filter(function(e){return!e.disabled}),r=n.indexOf(e);this.setValue(t.concat(e)),n.length-1===r?this.focusOption(n[r-1]):n.length>r&&this.focusOption(n[r+1])}},{key:"popValue",value:function(){var e=this.getValueArray(this.props.value);e.length&&!1!==e[e.length-1].clearableValue&&this.setValue(this.props.multi?e.slice(0,e.length-1):null)}},{key:"removeValue",value:function(e){var t=this,n=this.getValueArray(this.props.value);this.setValue(n.filter(function(n){return n[t.props.valueKey]!==e[t.props.valueKey]})),this.focus()}},{key:"clearValue",value:function(e){e&&"mousedown"===e.type&&0!==e.button||(e.preventDefault(),this.setValue(this.getResetValue()),this.setState({inputValue:this.handleInputValueChange(""),isOpen:!1},this.focus),this._focusAfterClear=!0)}},{key:"getResetValue",value:function(){return void 0!==this.props.resetValue?this.props.resetValue:this.props.multi?[]:null}},{key:"focusOption",value:function(e){this.setState({focusedOption:e})}},{key:"focusNextOption",value:function(){this.focusAdjacentOption("next")}},{key:"focusPreviousOption",value:function(){this.focusAdjacentOption("previous")}},{key:"focusPageUpOption",value:function(){this.focusAdjacentOption("page_up")}},{key:"focusPageDownOption",value:function(){this.focusAdjacentOption("page_down")}},{key:"focusStartOption",value:function(){this.focusAdjacentOption("start")}},{key:"focusEndOption",value:function(){this.focusAdjacentOption("end")}},{key:"focusAdjacentOption",value:function(e){var t=this._visibleOptions.map(function(e,t){return{option:e,index:t}}).filter(function(e){return!e.option.disabled});if(this._scrollToFocusedOptionOnUpdate=!0,!this.state.isOpen){var n={focusedOption:this._focusedOption||(t.length?t["next"===e?0:t.length-1].option:null),isOpen:!0};return this.props.onSelectResetsInput&&(n.inputValue=""),void this.setState(n)}if(t.length){for(var r=-1,o=0;o0?r-=1:r=t.length-1;else if("start"===e)r=0;else if("end"===e)r=t.length-1;else if("page_up"===e){var i=r-this.props.pageSize;r=i<0?0:i}else if("page_down"===e){var u=r+this.props.pageSize;r=u>t.length-1?t.length-1:u}-1===r&&(r=0),this.setState({focusedIndex:t[r].index,focusedOption:t[r].option})}}},{key:"getFocusedOption",value:function(){return this._focusedOption}},{key:"selectFocusedOption",value:function(){if(this._focusedOption)return this.selectValue(this._focusedOption)}},{key:"renderLoading",value:function(){if(this.props.isLoading)return c.a.createElement("span",{className:"Select-loading-zone","aria-hidden":"true"},c.a.createElement("span",{className:"Select-loading"}))}},{key:"renderValue",value:function(e,t){var n=this,r=this.props.valueRenderer||this.getOptionLabel,o=this.props.valueComponent;if(!e.length)return function(e,t,n){var r=e.inputValue,o=e.isPseudoFocused,i=e.isFocused,u=t.onSelectResetsInput;return!r||!u&&!n&&!o&&!i}(this.state,this.props,t)?c.a.createElement("div",{className:"Select-placeholder"},this.props.placeholder):null;var i=this.props.onValueClick?this.handleValueClick:null;return this.props.multi?e.map(function(e,t){return c.a.createElement(o,{disabled:n.props.disabled||!1===e.clearableValue,id:n._instancePrefix+"-value-"+t,instancePrefix:n._instancePrefix,key:"value-"+t+"-"+e[n.props.valueKey],onClick:i,onRemove:n.removeValue,placeholder:n.props.placeholder,value:e},r(e,t),c.a.createElement("span",{className:"Select-aria-only"}," "))}):function(e,t){var n=e.inputValue,r=e.isPseudoFocused,o=e.isFocused,i=t.onSelectResetsInput;return!n||!i&&!(!o&&r||o&&!r)}(this.state,this.props)?(t&&(i=null),c.a.createElement(o,{disabled:this.props.disabled,id:this._instancePrefix+"-value-item",instancePrefix:this._instancePrefix,onClick:i,placeholder:this.props.placeholder,value:e[0]},r(e[0]))):void 0}},{key:"renderInput",value:function(e,t){var n,r=this,i=u()("Select-input",this.props.inputProps.className),a=this.state.isOpen,s=u()((O(n={},this._instancePrefix+"-list",a),O(n,this._instancePrefix+"-backspace-remove-message",this.props.multi&&!this.props.disabled&&this.state.isFocused&&!this.state.inputValue),n)),l=this.state.inputValue;!l||this.props.onSelectResetsInput||this.state.isFocused||(l="");var d=_({},this.props.inputProps,{"aria-activedescendant":a?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value","aria-describedby":this.props["aria-describedby"],"aria-expanded":""+a,"aria-haspopup":""+a,"aria-label":this.props["aria-label"],"aria-labelledby":this.props["aria-labelledby"],"aria-owns":s,className:i,onBlur:this.handleInputBlur,onChange:this.handleInputChange,onFocus:this.handleInputFocus,ref:function(e){return r.input=e},role:"combobox",required:this.state.required,tabIndex:this.props.tabIndex,value:l});if(this.props.inputRenderer)return this.props.inputRenderer(d);if(this.props.disabled||!this.props.searchable){var p=C(this.props.inputProps,[]),f=u()(O({},this._instancePrefix+"-list",a));return c.a.createElement("div",_({},p,{"aria-expanded":a,"aria-owns":f,"aria-activedescendant":a?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value","aria-disabled":""+this.props.disabled,"aria-label":this.props["aria-label"],"aria-labelledby":this.props["aria-labelledby"],className:i,onBlur:this.handleInputBlur,onFocus:this.handleInputFocus,ref:function(e){return r.input=e},role:"combobox",style:{border:0,width:1,display:"inline-block"},tabIndex:this.props.tabIndex||0}))}return this.props.autosize?c.a.createElement(o.a,_({id:this.props.id},d,{minWidth:"5"})):c.a.createElement("div",{className:i,key:"input-wrap",style:{display:"inline-block"}},c.a.createElement("input",_({id:this.props.id},d)))}},{key:"renderClear",value:function(){var e=this.getValueArray(this.props.value);if(this.props.clearable&&e.length&&!this.props.disabled&&!this.props.isLoading){var t=this.props.multi?this.props.clearAllText:this.props.clearValueText,n=this.props.clearRenderer();return c.a.createElement("span",{"aria-label":t,className:"Select-clear-zone",onMouseDown:this.clearValue,onTouchEnd:this.handleTouchEndClearValue,onTouchMove:this.handleTouchMove,onTouchStart:this.handleTouchStart,title:t},n)}}},{key:"renderArrow",value:function(){if(this.props.arrowRenderer){var e=this.handleMouseDownOnArrow,t=this.state.isOpen,n=this.props.arrowRenderer({onMouseDown:e,isOpen:t});return n?c.a.createElement("span",{className:"Select-arrow-zone",onMouseDown:e},n):null}}},{key:"filterOptions",value:function(e){var t=this.state.inputValue,n=this.props.options||[];if(this.props.filterOptions){var r="function"==typeof this.props.filterOptions?this.props.filterOptions:g;return r(n,t,e,{filterOption:this.props.filterOption,ignoreAccents:this.props.ignoreAccents,ignoreCase:this.props.ignoreCase,labelKey:this.props.labelKey,matchPos:this.props.matchPos,matchProp:this.props.matchProp,trimFilter:this.props.trimFilter,valueKey:this.props.valueKey})}return n}},{key:"onOptionRef",value:function(e,t){t&&(this.focused=e)}},{key:"renderMenu",value:function(e,t,n){return e&&e.length?this.props.menuRenderer({focusedOption:n,focusOption:this.focusOption,inputValue:this.state.inputValue,instancePrefix:this._instancePrefix,labelKey:this.props.labelKey,onFocus:this.focusOption,onOptionRef:this.onOptionRef,onSelect:this.selectValue,optionClassName:this.props.optionClassName,optionComponent:this.props.optionComponent,optionRenderer:this.props.optionRenderer||this.getOptionLabel,options:e,removeValue:this.removeValue,selectValue:this.selectValue,valueArray:t,valueKey:this.props.valueKey}):this.props.noResultsText?c.a.createElement("div",{className:"Select-noresults"},this.props.noResultsText):null}},{key:"renderHiddenField",value:function(e){var t=this;if(this.props.name){if(this.props.joinValues){var n=e.map(function(e){return D(e[t.props.valueKey])}).join(this.props.delimiter);return c.a.createElement("input",{disabled:this.props.disabled,name:this.props.name,ref:function(e){return t.value=e},type:"hidden",value:n})}return e.map(function(e,n){return c.a.createElement("input",{disabled:t.props.disabled,key:"hidden."+n,name:t.props.name,ref:"value"+n,type:"hidden",value:D(e[t.props.valueKey])})})}}},{key:"getFocusableOptionIndex",value:function(e){var t=this._visibleOptions;if(!t.length)return null;var n=this.props.valueKey,r=this.state.focusedOption||e;if(r&&!r.disabled){var o=-1;if(t.some(function(e,t){var i=e[n]===r[n];return i&&(o=t),i}),-1!==o)return o}for(var i=0;i{const t=(0,i.default)()(e);return(...e)=>{const n=e[0],r=e[1];return{onChange:t(o.Handler.Change,n,r),onClick:t(o.Handler.Click,n,r),onDoubleClick:t(o.Handler.DoubleClick,n,r),onPaste:t(o.Handler.Paste,n,r)}}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Handler=void 0;var r=n(3),o=function(e){return e&&e.__esModule?e:{default:e}}(n(8)),i=n(49);var u=t.Handler=void 0;!function(e){e.Change="change",e.Click="click",e.DoubleClick="doubleclick",e.Paste="paste"}(u||(t.Handler=u={}));t.default=(0,r.memoizeOneFactory)(e=>{const t=(0,o.default)((...e)=>{let t=e[0],n=e[1],r=e[2];return t&&t.bind(void 0,n,r)}),n=new Map([[u.Change,i.handleChange.bind(void 0,e)],[u.Click,i.handleClick.bind(void 0,e)],[u.DoubleClick,i.handleDoubleClick.bind(void 0,e)],[u.Paste,i.handlePaste.bind(void 0,e)]]);return(...e)=>{let r=e[0],o=e[1],i=e[2];return t(e,n.get(r),o,i)}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.handlePaste=t.handleChange=t.handleDoubleClick=t.handleClick=void 0;var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));t.handleClick=((e,t,n,o)=>{var i=e();const u=i.editable,a=i.is_focused,s=i.selected_cell,l=i.setProps,c=function(e,t,n){return e&&r.contains([t,n],e)}(s,t,n);if(!u)return;if(a||o.preventDefault(),c)return;o.preventDefault();const d=[t,n],p={is_focused:!1,active_cell:d},f=r.uniq(r.pluck(0,s)).sort((e,t)=>e-t),h=r.uniq(r.pluck(1,s)).sort((e,t)=>e-t),v=f[0],y=h[0];o.shiftKey?p.selected_cell=r.xprod(r.range(r.min(v,d[0]),r.max(v,d[0])+1),r.range(r.min(y,d[1]),r.max(y,d[1])+1)):p.selected_cell=[d],l(p)}),t.handleDoubleClick=((e,t,n,r)=>{var o=e();const i=o.editable,u=o.is_focused,a=o.setProps;if(!i)return;const s=[t,n];if(!u){r.preventDefault(),a({selected_cell:[s],active_cell:s,is_focused:!0})}}),t.handleChange=((e,t,n,o)=>{var i=e();const u=i.columns,a=i.dataframe,s=i.editable,l=i.setProps,c=i.viewport,d=u[n],p=c.indices[t];s&&l({dataframe:r.set(r.lensPath([p,d.id]),o,a)})}),t.handlePaste=((e,t,n,r)=>{r.preventDefault()})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=function(e){return e&&e.__esModule?e:{default:e}}(n(1)),i=n(3);t.default=(0,i.memoizeOneFactory)((e,t,n,i,u,a,s,l)=>r.addIndex(r.map)((n,c)=>[...a?[function(e,t){return o.default.createElement("td",{key:"delete",className:"dash-delete-cell",onClick:()=>e(t()),style:{width:"30px",maxWidth:"30px",minWidth:"30px"}},"×")}(l,function(e,t,n,o){const i={dataframe:r.remove(e,1,n)};return r.is(Array,t)&&t[0]===e&&(i.active_cell=[]),r.is(Array,o)&&r.contains(e,o)&&(i.selected_rows=r.without([e],o)),i}.bind(void 0,i[c],e,t,s))]:[],...u?[function(e,t,n,i){return o.default.createElement("td",{key:"select",className:"dash-select-cell",style:{width:"30px",maxWidth:"30px",minWidth:"30px"}},o.default.createElement("input",{type:"single"===t?"radio":"checkbox",name:"row-select",checked:r.contains(e,n),onChange:()=>i({selected_rows:"single"===t?[e]:r.ifElse(r.contains(e),r.without([e]),r.append(e))(n)})}))}(i[c],u,s,l)]:[]],n))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(3),i=a(n(13)),u=a(n(8));function a(e){return e&&e.__esModule?e:{default:e}}const s=[];function l(e,t,n,o,i){const u=r.map(([e])=>e.style,r.filter(([t,r])=>e([o,r],t.condition).evaluate(n),r.addIndex(r.map)((e,t)=>[e,t],t)));if(i&&u.push(i.style),u.length)return r.mergeAll(u)}function c(e,t,n,o,i,u){return r.addIndex(r.map)((u,a)=>r.addIndex(r.map)((n,r)=>{let l=o.find(e=>e.id===n.id),c=i.find(e=>e.id===n.id);return l=l&&l.styles||s,c=c&&c.style,t([a,r],e,l,u[n.id],n.id,c)},n),u)}t.default=(0,o.memoizeAll)(function(e){const t=(0,u.default)(e=>new i.default(e)),n=(0,u.default)(l);return(0,o.memoizeOne)(c).bind(void 0,t,n)})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(3),i=a(n(13)),u=a(n(8));function a(e){return e&&e.__esModule?e:{default:e}}const s=r.addIndex(r.map),l=(0,o.memoizeOneFactory)((e,t,n,o,i,u,a)=>s((n,s)=>r.map(t=>{const l=o[s];let c=(a&&a[t.id]&&(a[t.id].length>l?a[t.id][l]:null)||t||{}).options,d=i.find(e=>e.id===t.id),p=u.find(e=>e.id===t.id);return d=d&&d.dropdowns||[],p=c||p&&p.dropdown,((e,t,n,o,i)=>{const u=[...i?[i]:[],...r.map(([e])=>e.dropdown,r.filter(([t,r])=>e([o,r],t.condition).evaluate(n),r.addIndex(r.map)((e,t)=>[e,t],t)))];return u.length?u.slice(-1)[0]:void 0})(e,d,n,t.id,p)},t),n));t.default=(0,o.memoizeOneFactory)(e=>{const t=(0,u.default)(e=>new i.default(e));return l().bind(void 0,t)})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=p(n(1)),i=p(n(4)),u=p(n(54)),a=p(n(55)),s=n(7),l=p(n(12)),c=n(16),d=p(n(19));function p(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e){this.propsFn=e,this.handlers=new Map,this.ops=new Map,this.onChange=((e,t,n,o)=>{i.default.debug("Filter -- onChange",e,o.target.value&&o.target.value.trim());const u=o.target.value.trim();u&&u.length?t.set(e.toString(),u):t.delete(e.toString()),n(r.map(([e,t])=>`${e} ${t}`,r.filter(([e])=>this.isFragmentValid(e),Array.from(t.entries()))).join(" && "))}),this.getEventHandler=((e,t,n,r)=>{const o=this.handlers.get(e)||this.handlers.set(e,new Map).get(e),i=o.get(t)||o.set(t,new Map).get(t);return i.get(r)||i.set(r,e.bind(this,t,n,r)).get(r)})}get props(){return this.propsFn()}respectsBasicSyntax(e,t=!0){const n=[c.LexemeType.BinaryOperator,c.LexemeType.Expression,c.LexemeType.Operand,c.LexemeType.UnaryOperator];if(t&&n.push(c.LexemeType.And),!r.all(e=>r.contains(e.lexeme.name,n),e))return!1;const o=r.map(e=>e.value,r.filter(e=>e.lexeme.name===c.LexemeType.Operand,e)),i=r.uniq(o);return o.length===i.length}isBasicFilter(e,t,n=!0){return e.valid&&t.valid&&this.respectsBasicSyntax(e.lexemes,n)}updateOps(e){const t=(0,l.default)(e),n=(0,d.default)(t);if(!this.isBasicFilter(t,n))return;const r=[n.tree];for(;r.length;){const e=r.pop();e&&(e.lexeme.name===c.LexemeType.UnaryOperator&&e.block?this.ops.set(e.block.value,e.value):e.lexeme.name===c.LexemeType.BinaryOperator&&e.left&&e.right?this.ops.set(e.left.value,`${e.value} ${e.right.value}`):(r.push(e.left),r.push(e.block),r.push(e.right)))}}isFragmentValidOrNull(e){const t=this.ops.get(e.toString());return!t||!t.trim().length||this.isFragmentValid(e)}isFragmentValid(e){const t=this.ops.get(e.toString()),n=(0,l.default)(`${e} ${t}`),r=(0,d.default)(n);return r.valid&&this.isBasicFilter(n,r,!1)}createFilters(){var e=this.props;const t=e.columns,n=e.fillerColumns,i=e.filtering,l=e.filtering_settings,c=e.filtering_type,d=e.setFilter;if(!i)return[];this.updateOps(l);const p=r.range(0,n).map(e=>o.default.createElement("th",{key:`offset-${e}`})),f=c===s.FilteringType.Basic?r.addIndex(r.map)((e,t)=>o.default.createElement(u.default,{key:`column-${t}`,classes:`dash-filter column-${t}`,columnId:e.id,isValid:this.isFragmentValidOrNull(e.id),property:e.id,setFilter:this.getEventHandler(this.onChange,e.id,this.ops,d),value:this.ops.get(e.id.toString())}),t):[o.default.createElement(a.default,{key:"column-0",classes:[],colSpan:t.length,value:"",setFilter:()=>void 0})];return[r.concat(p,f)]}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=u(r),i=u(n(22));function u(e){return e&&e.__esModule?e:{default:e}}t.default=class extends r.PureComponent{constructor(e){super(e),this.submit=(e=>{(0,this.props.setFilter)({target:{value:e}})}),this.state={value:e.value}}componentWillReceiveProps(e){const t=e.value;this.state.value!==t&&this.setState({value:t})}render(){var e=this.props;const t=e.classes,n=e.columnId,r=e.isValid,u=e.value;return o.default.createElement("th",{className:t+(r?"":" invalid"),"data-dash-column":n},o.default.createElement(i.default,{value:u,stopPropagation:!0,submit:this.submit}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=u(r),i=u(n(22));function u(e){return e&&e.__esModule?e:{default:e}}t.default=class extends r.PureComponent{constructor(e){super(e),this.submit=(e=>this.props.setFilter(e))}render(){var e=this.props;const t=e.colSpan,n=e.value;return o.default.createElement("th",{colSpan:t},o.default.createElement(i.default,{stopPropagation:!0,value:n,submit:this.submit}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=f(n(1)),i=n(21),u=n(20),a=f(n(57)),s=f(n(61)),l=f(n(62)),c=f(n(63)),d=f(n(64)),p=f(n(65));function f(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e){this.propsFn=e,this.headerContent=(0,a.default)(),this.headerOperations=(0,d.default)(),this.headerWrappers=(0,p.default)()}get props(){return this.propsFn()}createHeaders(){const e=this.props;let t=e.columns,n=e.merge_duplicate_headers,a=e.pagination_mode,d=e.row_deletable,p=e.row_selectable,f=e.setProps,h=e.sorting,v=e.sorting_settings,y=e.sorting_type;const g=(0,s.default)(t),b=(0,c.default)(t,g),m=(0,l.default)(t,b,n),x=r.zip(b,m),w=this.headerOperations(g,p,d),E=this.headerWrappers(t,x,n),O=this.headerContent(t,x,h,y,v,a,f,e),_=(0,u.matrixMap)(E,O,(e,t)=>o.default.cloneElement(e,{children:[t]}));return(0,i.arrayMap)(w,_,(e,t)=>Array.prototype.concat(e,t))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=d(n(2)),o=c(n(1)),i=n(3),u=n(9),a=c(n(58)),s=c(n(59)),l=d(n(60));function c(e){return e&&e.__esModule?e:{default:e}}function d(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function p(e,t){const n=r.find(t=>t.columnId===e,t);return n?n.direction:u.SortDirection.None}t.default=(0,i.memoizeOneFactory)(function(e,t,n,i,c,d,f,h){return r.addIndex(r.map)(([v,y],g)=>{const b=g===t.length-1;return r.addIndex(r.map)(t=>{const y=e[t],m=y.editable_name&&"Boolean"===r.type(y.editable_name)||"Number"===r.type(y.editable_name)&&y.editable_name===g,x="be"!==d&&(y.deletable&&"Boolean"===r.type(y.deletable)||"Number"===r.type(y.deletable)&&y.deletable===g);return o.default.createElement("div",null,n&&b?o.default.createElement("span",{className:"sort",onClick:function(e,t,n,r){return()=>{let o;switch(p(e,t)){case u.SortDirection.Descending:o=u.SortDirection.Ascending;break;case u.SortDirection.Ascending:o=u.SortDirection.None;break;case u.SortDirection.None:default:o=u.SortDirection.Descending}const i="single"===n?s.default:a.default;r({sorting_settings:i(t,{columnId:e,direction:o})})}}(y.id,c,i,f)},function(e,t){switch(p(e,t)){case u.SortDirection.Descending:return"↑";case u.SortDirection.Ascending:return"↓";case u.SortDirection.None:default:return"↕"}}(y.id,c)):"",m?o.default.createElement("span",{className:"column-header--edit",onClick:function(e,t,n,r,o){return()=>{r(l.editColumnName(e,t,n,o))}}(y,e,g,f,h)},"✎"):"",x?o.default.createElement("span",{className:"column-header--delete",onClick:function(e,t,n,r,o){return()=>{r(l.deleteColumn(e,t,n,o))}}(y,e,g,f,h)},"×"):"",o.default.createElement("span",null,v[t]))},y)},t)})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=function(e){return e&&e.__esModule?e:{default:e}}(n(4)),i=n(9);t.default=((e,t)=>{if(o.default.trace("multi - updateSettings",e,t),e=r.clone(e),t.direction===i.SortDirection.None){const n=r.findIndex(e=>e.columnId===t.columnId,e);-1!==n&&e.splice(n,1)}else{const n=r.find(e=>e.columnId===t.columnId,e);n?n.direction=t.direction:e.push(t)}return e})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(4)),o=n(9);t.default=((e,t)=>(r.default.trace("single - updateSettings",e,t),t.direction===o.SortDirection.None?[]:[t]))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.deleteColumn=function(e,t,n,i){const u=i.dataframe;var a=o(e,t,n);const s=a.groupIndexFirst,l=a.groupIndexLast,c=r.slice(s,l+1,r.pluck("id",t));return{columns:r.remove(s,1+l-s,t),dataframe:r.map(r.omit(c),u),active_cell:[],end_cell:[],selected_cell:[],start_cell:[0]}},t.editColumnName=function(e,t,n,i){var u=o(e,t,n);const a=u.groupIndexFirst,s=u.groupIndexLast,l=window.prompt("Enter a new column name");let c=r.clone(t);return r.range(a,s+1).map(e=>{let o;o="Array"===r.type(t[e].name)?[e,"name",n]:[e,"name"],c=r.set(r.lensPath(o),l,c)}),{columns:c}};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));function o(e,t,n){const r=t.indexOf(e);if(!e.name||Array.isArray(e.name)&&e.name.lengthn&&r.name[n]===e.name[n]))break;o=i}return{groupIndexFirst:r,groupIndexLast:o}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=e=>Array.isArray(e.name)?e.name.length:1;t.default=(e=>Math.max(...e.map(r)))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));t.default=((e,t,n)=>r.map(t=>{if(n){let e=[0],n=0;return t.forEach((r,o)=>{r!==t[n]&&(e.push(o),n=o)}),e}return r.range(0,e.length)},t))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));t.default=((e,t)=>r.map(n=>e.map(e=>r.isNil(e.name)&&n===t-1?e.id:((e,t)=>Array.isArray(e.name)?e.name[t]:e.name)(e,n)),r.range(0,t)))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=function(e){return e&&e.__esModule?e:{default:e}}(n(1)),i=n(3);t.default=(0,i.memoizeOneFactory)((e,t,n)=>r.addIndex(r.map)(()=>[...n?[o.default.createElement("th",{key:"delete",className:"expanded-row--empty-cell dash-delete-header",style:{width:"30px",maxWidth:"30px",minWidth:"30px"}})]:[],...t?[o.default.createElement("th",{key:"select",className:"expanded-row--empty-cell dash-select-header",style:{width:"30px",maxWidth:"30px",minWidth:"30px"}})]:[]],r.range(0,e)))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=function(e){return e&&e.__esModule?e:{default:e}}(n(1)),i=n(3);t.default=(0,i.memoizeOneFactory)(function(e,t,n){return r.map(([t,i])=>r.addIndex(r.map)((u,a)=>{const s=e[u];let l;return l=n?u===r.last(i)?t.length-u:i[a+1]-u:1,o.default.createElement("th",{key:`header-cell-${u}`,"data-dash-column":s.id,colSpan:l,className:"dash-header "+`column-${u} `+(u===e.length-1||u===r.last(i)?"cell--right-last ":"")})},i),t)})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=function(e){return e&&e.__esModule?e:{default:e}}(n(1));function i(e){return e?o.default.createElement("table",{tabIndex:-1},o.default.createElement("tbody",null,e.map((e,t)=>o.default.createElement("tr",{key:`row-${t}`},e)))):null}t.default=((e,t,n)=>{const o=e?r.map(t=>t.splice(0,r.reduceWhile(t=>t.count(e.cells++,e.count+=t.props.colSpan||1,e),{cells:0,count:0},t).cells),n):null,u=t?n.splice(0,t):null;return[[i(t&&o?o.splice(0,t):null),i(u)],[i(o),i(n)]]})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(3);t.default=(0,o.memoizeOneFactory)((e,t,n,o)=>{switch(e){case!1:return{loadNext:()=>{},loadPrevious:()=>{}};case!0:case"fe":return function(e,t,n){return{loadNext:()=>{let o=Math.floor(n.length/e.page_size);e.current_page>=o||(e=r.merge(e,{current_page:e.current_page+1}),t({pagination_settings:e}))},loadPrevious:()=>{e.current_page<=0||(e=r.merge(e,{current_page:e.current_page-1}),t({pagination_settings:e}))}}}(t,n,o);case"be":return function(e,t){return{loadNext:()=>{e.current_page++,t({pagination_settings:e})},loadPrevious:()=>{e.current_page<=0||(e.current_page--,t({pagination_settings:e}))}}}(t,n);default:throw new Error(`Unknown pagination mode: '${e}'`)}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(3);t.default=(0,r.memoizeOneFactory)((e,t,n,r)=>{switch(e){case!1:return function(e,t){return{dataframe:e,indices:t}}(n,r);case!0:case"fe":return function(e,t,n){let r=Math.min(e.current_page,Math.floor(t.length/e.page_size));const o=e.page_size*r,i=Math.min(o+e.displayed_pages*e.page_size,t.length);return{dataframe:t.slice(o,i),indices:n.slice(o,i)}}(t,n,r);case"be":return function(e,t){return{dataframe:e,indices:t}}(n,r);default:throw new Error(`Unknown pagination mode: '${e}'`)}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(3),i=n(9),u=s(i),a=s(n(13));function s(e){return e&&e.__esModule?e:{default:e}}t.default=(0,o.memoizeOneFactory)((e,t,n,o,s=[],l)=>{const c=new Map;if(r.addIndex(r.forEach)((e,t)=>{c.set(e,t)},e),"fe"===t||!0===t){const t=new a.default(n);e=t.isValid?t.filter(e):e}const d=l?e=>""===e||(0,i.defaultIsNully)(e):void 0;return"fe"!==o&&!0!==o||(e=(0,u.default)(e,s,d)),{dataframe:e,indices:r.map(e=>c.get(e),e)}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(3);t.default=(0,o.memoizeOneFactory)(e=>r.filter(e=>!e.hidden,e))},function(e,t,n){var r=n(72);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(11)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(10)(!1)).push([e.i,"/**\n * React Select\n * ============\n * Created by Jed Watson and Joss Mackison for KeystoneJS, http://www.keystonejs.com/\n * https://twitter.com/jedwatson https://twitter.com/jossmackison https://twitter.com/keystonejs\n * MIT License: https://github.com/JedWatson/react-select\n*/\n.Select {\n position: relative;\n}\n.Select input::-webkit-contacts-auto-fill-button,\n.Select input::-webkit-credentials-auto-fill-button {\n display: none !important;\n}\n.Select input::-ms-clear {\n display: none !important;\n}\n.Select input::-ms-reveal {\n display: none !important;\n}\n.Select,\n.Select div,\n.Select input,\n.Select span {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n.Select.is-disabled .Select-arrow-zone {\n cursor: default;\n pointer-events: none;\n opacity: 0.35;\n}\n.Select.is-disabled > .Select-control {\n background-color: #f9f9f9;\n}\n.Select.is-disabled > .Select-control:hover {\n box-shadow: none;\n}\n.Select.is-open > .Select-control {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n background: #fff;\n border-color: #b3b3b3 #ccc #d9d9d9;\n}\n.Select.is-open > .Select-control .Select-arrow {\n top: -2px;\n border-color: transparent transparent #999;\n border-width: 0 5px 5px;\n}\n.Select.is-searchable.is-open > .Select-control {\n cursor: text;\n}\n.Select.is-searchable.is-focused:not(.is-open) > .Select-control {\n cursor: text;\n}\n.Select.is-focused > .Select-control {\n background: #fff;\n}\n.Select.is-focused:not(.is-open) > .Select-control {\n border-color: #007eff;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 3px rgba(0, 126, 255, 0.1);\n background: #fff;\n}\n.Select.has-value.is-clearable.Select--single > .Select-control .Select-value {\n padding-right: 42px;\n}\n.Select.has-value.Select--single > .Select-control .Select-value .Select-value-label,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value .Select-value-label {\n color: #333;\n}\n.Select.has-value.Select--single > .Select-control .Select-value a.Select-value-label,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label {\n cursor: pointer;\n text-decoration: none;\n}\n.Select.has-value.Select--single > .Select-control .Select-value a.Select-value-label:hover,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label:hover,\n.Select.has-value.Select--single > .Select-control .Select-value a.Select-value-label:focus,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label:focus {\n color: #007eff;\n outline: none;\n text-decoration: underline;\n}\n.Select.has-value.Select--single > .Select-control .Select-value a.Select-value-label:focus,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label:focus {\n background: #fff;\n}\n.Select.has-value.is-pseudo-focused .Select-input {\n opacity: 0;\n}\n.Select.is-open .Select-arrow,\n.Select .Select-arrow-zone:hover > .Select-arrow {\n border-top-color: #666;\n}\n.Select.Select--rtl {\n direction: rtl;\n text-align: right;\n}\n.Select-control {\n background-color: #fff;\n border-color: #d9d9d9 #ccc #b3b3b3;\n border-radius: 4px;\n border: 1px solid #ccc;\n color: #333;\n cursor: default;\n display: table;\n border-spacing: 0;\n border-collapse: separate;\n height: 36px;\n outline: none;\n overflow: hidden;\n position: relative;\n width: 100%;\n}\n.Select-control:hover {\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);\n}\n.Select-control .Select-input:focus {\n outline: none;\n background: #fff;\n}\n.Select-placeholder,\n.Select--single > .Select-control .Select-value {\n bottom: 0;\n color: #aaa;\n left: 0;\n line-height: 34px;\n padding-left: 10px;\n padding-right: 10px;\n position: absolute;\n right: 0;\n top: 0;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.Select-input {\n height: 34px;\n padding-left: 10px;\n padding-right: 10px;\n vertical-align: middle;\n}\n.Select-input > input {\n width: 100%;\n background: none transparent;\n border: 0 none;\n box-shadow: none;\n cursor: default;\n display: inline-block;\n font-family: inherit;\n font-size: inherit;\n margin: 0;\n outline: none;\n line-height: 17px;\n /* For IE 8 compatibility */\n padding: 8px 0 12px;\n /* For IE 8 compatibility */\n -webkit-appearance: none;\n}\n.is-focused .Select-input > input {\n cursor: text;\n}\n.has-value.is-pseudo-focused .Select-input {\n opacity: 0;\n}\n.Select-control:not(.is-searchable) > .Select-input {\n outline: none;\n}\n.Select-loading-zone {\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 16px;\n}\n.Select-loading {\n -webkit-animation: Select-animation-spin 400ms infinite linear;\n -o-animation: Select-animation-spin 400ms infinite linear;\n animation: Select-animation-spin 400ms infinite linear;\n width: 16px;\n height: 16px;\n box-sizing: border-box;\n border-radius: 50%;\n border: 2px solid #ccc;\n border-right-color: #333;\n display: inline-block;\n position: relative;\n vertical-align: middle;\n}\n.Select-clear-zone {\n -webkit-animation: Select-animation-fadeIn 200ms;\n -o-animation: Select-animation-fadeIn 200ms;\n animation: Select-animation-fadeIn 200ms;\n color: #999;\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 17px;\n}\n.Select-clear-zone:hover {\n color: #D0021B;\n}\n.Select-clear {\n display: inline-block;\n font-size: 18px;\n line-height: 1;\n}\n.Select--multi .Select-clear-zone {\n width: 17px;\n}\n.Select-arrow-zone {\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 25px;\n padding-right: 5px;\n}\n.Select--rtl .Select-arrow-zone {\n padding-right: 0;\n padding-left: 5px;\n}\n.Select-arrow {\n border-color: #999 transparent transparent;\n border-style: solid;\n border-width: 5px 5px 2.5px;\n display: inline-block;\n height: 0;\n width: 0;\n position: relative;\n}\n.Select-control > *:last-child {\n padding-right: 5px;\n}\n.Select--multi .Select-multi-value-wrapper {\n display: inline-block;\n}\n.Select .Select-aria-only {\n position: absolute;\n display: inline-block;\n height: 1px;\n width: 1px;\n margin: -1px;\n clip: rect(0, 0, 0, 0);\n overflow: hidden;\n float: left;\n}\n@-webkit-keyframes Select-animation-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes Select-animation-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n.Select-menu-outer {\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n background-color: #fff;\n border: 1px solid #ccc;\n border-top-color: #e6e6e6;\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);\n box-sizing: border-box;\n margin-top: -1px;\n max-height: 200px;\n position: absolute;\n left: 0;\n top: 100%;\n width: 100%;\n z-index: 1;\n -webkit-overflow-scrolling: touch;\n}\n.Select-menu {\n max-height: 198px;\n overflow-y: auto;\n}\n.Select-option {\n box-sizing: border-box;\n background-color: #fff;\n color: #666666;\n cursor: pointer;\n display: block;\n padding: 8px 10px;\n}\n.Select-option:last-child {\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.Select-option.is-selected {\n background-color: #f5faff;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 126, 255, 0.04);\n color: #333;\n}\n.Select-option.is-focused {\n background-color: #ebf5ff;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 126, 255, 0.08);\n color: #333;\n}\n.Select-option.is-disabled {\n color: #cccccc;\n cursor: default;\n}\n.Select-noresults {\n box-sizing: border-box;\n color: #999999;\n cursor: default;\n display: block;\n padding: 8px 10px;\n}\n.Select--multi .Select-input {\n vertical-align: middle;\n margin-left: 10px;\n padding: 0;\n}\n.Select--multi.Select--rtl .Select-input {\n margin-left: 0;\n margin-right: 10px;\n}\n.Select--multi.has-value .Select-input {\n margin-left: 5px;\n}\n.Select--multi .Select-value {\n background-color: #ebf5ff;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 126, 255, 0.08);\n border-radius: 2px;\n border: 1px solid #c2e0ff;\n /* Fallback color for IE 8 */\n border: 1px solid rgba(0, 126, 255, 0.24);\n color: #007eff;\n display: inline-block;\n font-size: 0.9em;\n line-height: 1.4;\n margin-left: 5px;\n margin-top: 5px;\n vertical-align: top;\n}\n.Select--multi .Select-value-icon,\n.Select--multi .Select-value-label {\n display: inline-block;\n vertical-align: middle;\n}\n.Select--multi .Select-value-label {\n border-bottom-right-radius: 2px;\n border-top-right-radius: 2px;\n cursor: default;\n padding: 2px 5px;\n}\n.Select--multi a.Select-value-label {\n color: #007eff;\n cursor: pointer;\n text-decoration: none;\n}\n.Select--multi a.Select-value-label:hover {\n text-decoration: underline;\n}\n.Select--multi .Select-value-icon {\n cursor: pointer;\n border-bottom-left-radius: 2px;\n border-top-left-radius: 2px;\n border-right: 1px solid #c2e0ff;\n /* Fallback color for IE 8 */\n border-right: 1px solid rgba(0, 126, 255, 0.24);\n padding: 1px 5px 3px;\n}\n.Select--multi .Select-value-icon:hover,\n.Select--multi .Select-value-icon:focus {\n background-color: #d8eafd;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 113, 230, 0.08);\n color: #0071e6;\n}\n.Select--multi .Select-value-icon:active {\n background-color: #c2e0ff;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 126, 255, 0.24);\n}\n.Select--multi.Select--rtl .Select-value {\n margin-left: 0;\n margin-right: 5px;\n}\n.Select--multi.Select--rtl .Select-value-icon {\n border-right: none;\n border-left: 1px solid #c2e0ff;\n /* Fallback color for IE 8 */\n border-left: 1px solid rgba(0, 126, 255, 0.24);\n}\n.Select--multi.is-disabled .Select-value {\n background-color: #fcfcfc;\n border: 1px solid #e3e3e3;\n color: #333;\n}\n.Select--multi.is-disabled .Select-value-icon {\n cursor: not-allowed;\n border-right: 1px solid #e3e3e3;\n}\n.Select--multi.is-disabled .Select-value-icon:hover,\n.Select--multi.is-disabled .Select-value-icon:focus,\n.Select--multi.is-disabled .Select-value-icon:active {\n background-color: #fcfcfc;\n}\n@keyframes Select-animation-spin {\n to {\n transform: rotate(1turn);\n }\n}\n@-webkit-keyframes Select-animation-spin {\n to {\n -webkit-transform: rotate(1turn);\n }\n}\n",""])},function(e,t){e.exports=function(e){var t="undefined"!=typeof window&&window.location;if(!t)throw new Error("fixUrls requires window.location");if(!e||"string"!=typeof e)return e;var n=t.protocol+"//"+t.host,r=n+t.pathname.replace(/\/[^\/]*$/,"/");return e.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,function(e,t){var o,i=t.trim().replace(/^"(.*)"$/,function(e,t){return t}).replace(/^'(.*)'$/,function(e,t){return t});return/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(i)?e:(o=0===i.indexOf("//")?i:0===i.indexOf("/")?n+i:r+i.replace(/^\.\//,""),"url("+JSON.stringify(o)+")")})}},function(e,t,n){var r=n(75);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(11)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(10)(!1)).push([e.i,".dash-spreadsheet.dash-freeze-left {\n width: auto;\n width: fit-content;\n width: -moz-fit-content;\n width: -webkit-fit-content;\n max-width: 500px;\n}\n.dash-spreadsheet.dash-freeze-top {\n width: auto;\n width: fit-content;\n width: -moz-fit-content;\n width: -webkit-fit-content;\n max-height: 500px;\n}\n.dash-spreadsheet-container {\n display: flex;\n flex-direction: row;\n position: relative;\n}\n.dash-spreadsheet-inner {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n}\n.dash-spreadsheet-inner *,\n.dash-spreadsheet-inner *:after,\n.dash-spreadsheet-inner *:before {\n box-sizing: inherit;\n}\n.dash-spreadsheet-inner .Select {\n overflow: hidden;\n position: static;\n}\n.dash-spreadsheet-inner .Select,\n.dash-spreadsheet-inner .Select-control {\n background-color: inherit;\n}\n.dash-spreadsheet-inner .Select-value {\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin-top: -2px;\n}\n.dash-spreadsheet-inner .marker-row tr {\n visibility: hidden !important;\n}\n.dash-spreadsheet-inner .marker-row td,\n.dash-spreadsheet-inner .marker-row th {\n height: 0 !important;\n padding: 0 !important;\n margin: 0 !important;\n}\n.dash-spreadsheet-inner.dash-freeze-left,\n.dash-spreadsheet-inner.dash-freeze-top {\n overflow: hidden !important;\n}\n.dash-spreadsheet-inner.dash-freeze-left .row-0,\n.dash-spreadsheet-inner.dash-freeze-top .row-0 {\n display: flex;\n flex: 0 0 auto;\n flex-direction: row;\n}\n.dash-spreadsheet-inner.dash-freeze-left .row-1,\n.dash-spreadsheet-inner.dash-freeze-top .row-1 {\n display: flex;\n flex-direction: row;\n overflow: scroll;\n}\n.dash-spreadsheet-inner.dash-freeze-left .cell-0-0,\n.dash-spreadsheet-inner.dash-freeze-top .cell-0-0,\n.dash-spreadsheet-inner.dash-freeze-left .cell-1-0,\n.dash-spreadsheet-inner.dash-freeze-top .cell-1-0 {\n flex: 0 0 auto;\n left: 0;\n position: sticky;\n z-index: 400;\n}\n.dash-spreadsheet-inner.dash-freeze-left .cell-0-1,\n.dash-spreadsheet-inner.dash-freeze-top .cell-0-1 {\n z-index: 300;\n flex: 0 0 auto;\n}\n.dash-spreadsheet-inner.dash-freeze-left .cell-1-1,\n.dash-spreadsheet-inner.dash-freeze-top .cell-1-1 {\n flex: 0 0 auto;\n}\n.dash-spreadsheet-inner.dash-grow .cell-0-1,\n.dash-spreadsheet-inner.dash-grow .cell-1-1 {\n flex: 1 0 auto;\n}\n.dash-spreadsheet-inner.dash-grow table {\n width: 100%;\n}\n.dash-spreadsheet-inner:not(.dash-freeze-top):not(.dash-freeze-left) .cell-1-1 tr td:first-of-type,\n.dash-spreadsheet-inner:not(.dash-freeze-top):not(.dash-freeze-left) .cell-1-1 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.dash-freeze-top):not(.dash-freeze-left) .cell-1-1 tr:first-of-type td,\n.dash-spreadsheet-inner:not(.dash-freeze-top):not(.dash-freeze-left) .cell-1-1 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.dash-freeze-top):not(.dash-freeze-left) .cell-1-1 tr:first-of-type td:first-of-type,\n.dash-spreadsheet-inner:not(.dash-freeze-top):not(.dash-freeze-left) .cell-1-1 tr:first-of-type th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.dash-freeze-top).dash-freeze-left .cell-1-0 tr td:first-of-type,\n.dash-spreadsheet-inner:not(.dash-freeze-top).dash-freeze-left .cell-1-0 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.dash-freeze-top).dash-freeze-left .cell-1-0 tr:first-of-type td,\n.dash-spreadsheet-inner:not(.dash-freeze-top).dash-freeze-left .cell-1-0 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.dash-freeze-top).dash-freeze-left .cell-1-0 tr:first-of-type td:first-of-type,\n.dash-spreadsheet-inner:not(.dash-freeze-top).dash-freeze-left .cell-1-0 tr:first-of-type th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.dash-freeze-top).dash-freeze-left .cell-1-1 tr:first-of-type td,\n.dash-spreadsheet-inner:not(.dash-freeze-top).dash-freeze-left .cell-1-1 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top:not(.dash-freeze-left) .cell-0-1 tr td:first-of-type,\n.dash-spreadsheet-inner.dash-freeze-top:not(.dash-freeze-left) .cell-0-1 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top:not(.dash-freeze-left) .cell-0-1 tr:first-of-type td,\n.dash-spreadsheet-inner.dash-freeze-top:not(.dash-freeze-left) .cell-0-1 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top:not(.dash-freeze-left) .cell-0-1 tr:first-of-type td:first-of-type,\n.dash-spreadsheet-inner.dash-freeze-top:not(.dash-freeze-left) .cell-0-1 tr:first-of-type th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top:not(.dash-freeze-left) .cell-1-1 tr td:first-of-type,\n.dash-spreadsheet-inner.dash-freeze-top:not(.dash-freeze-left) .cell-1-1 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-0-0 tr td:first-of-type,\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-0-0 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-0-0 tr:first-of-type td,\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-0-0 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-0-0 tr:first-of-type td:first-of-type,\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-0-0 tr:first-of-type th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-0-1 tr:first-of-type td,\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-0-1 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-1-0 tr td:first-of-type,\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-1-0 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner .cell td,\n.dash-spreadsheet-inner .cell th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner .cell td:focus,\n.dash-spreadsheet-inner .cell th:focus {\n outline: none;\n}\n.dash-spreadsheet-inner .filter.invalid {\n box-shadow: inset 1px 0px 0px 0px red, inset 0px 1px 0px 0px red, inset -1px 0px 0px red, inset 0px -1px 0px 0px red;\n background-color: pink;\n}\n.dash-spreadsheet-inner .selected-row td,\n.dash-spreadsheet-inner .selected-row th {\n background-color: var(--selected-row);\n}\n.dash-spreadsheet-inner tr {\n background-color: white;\n}\n.dash-spreadsheet-inner td {\n background-color: inherit;\n}\n.dash-spreadsheet-inner td.cell--selected {\n background-color: var(--selected-background);\n}\n.dash-spreadsheet-inner td.focused {\n box-shadow: 1px 0px 0px 0px var(--accent), 0px 1px 0px 0px var(--accent), 0 0px 0px var(--accent), 0px 0 0px 0px var(--accent);\n border: 1px solid var(--accent);\n margin: -1px;\n z-index: 200;\n}\n.dash-spreadsheet-inner td .dash-cell-value-container {\n width: 100%;\n height: 100%;\n}\n.dash-spreadsheet-inner td .dash-input-cell-value-container {\n position: relative;\n}\n.dash-spreadsheet-inner td .dash-cell-value {\n height: 100%;\n width: 100%;\n}\n.dash-spreadsheet-inner td input.dash-cell-value {\n position: absolute;\n left: 0;\n top: 0;\n}\n.dash-spreadsheet-inner td div.dash-cell-value {\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n.dash-spreadsheet-inner td .cell-value-shadow {\n margin: auto 0;\n opacity: 0;\n}\n.dash-spreadsheet-inner td .input-cell-value-shadow {\n display: inline-block;\n height: initial;\n width: initial;\n}\n.dash-spreadsheet-inner td .dropdown-cell-value-shadow {\n display: block;\n height: 0px;\n padding: 0 42px 0 10px;\n}\n.dash-spreadsheet-inner th.dash-filter {\n position: relative;\n}\n.dash-spreadsheet-inner th.dash-filter input {\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n width: 100%;\n}\n.dash-spreadsheet-inner td,\n.dash-spreadsheet-inner th {\n padding: 2px;\n white-space: nowrap;\n overflow-x: hidden;\n text-overflow: ellipsis;\n height: 30px;\n text-align: right;\n}\n.dash-spreadsheet-inner th .column-header--edit,\n.dash-spreadsheet-inner th .column-header--delete,\n.dash-spreadsheet-inner th .sort {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: default;\n cursor: pointer;\n}\n.dash-spreadsheet-inner textarea {\n white-space: pre;\n}\n.dash-spreadsheet-inner table {\n border-collapse: collapse;\n font-family: monospace;\n --accent: hotpink;\n --border: lightgrey;\n --text-color: #3c3c3c;\n --hover: #fdfdfd;\n --background-color-ellipses: #fdfdfd;\n --faded-text: #fafafa;\n --faded-text-header: #b4b4b4;\n --selected-background: rgba(255, 65, 54, 0.2);\n --faded-dropdown: #f0f0f0;\n --selected-row: #fff0ff;\n --muted: #c8c8c8;\n}\n/* focus happens after copying to clipboard */\n.dash-spreadsheet-inner table:focus {\n outline: none;\n}\n.dash-spreadsheet-inner thead {\n display: table-row-group;\n}\n.elip {\n text-align: center;\n width: 100%;\n background-color: var(--background-color-ellipses);\n}\n.dash-spreadsheet-inner td.dropdown {\n /*\n * To view the dropdown's contents, we need\n * overflow-y: visible.\n * Unfortunately, overflow-x: hidden and overflow-y: visible\n * can't both be set at the same time.\n * So, we have to make both overflow-x: visible and overflow-y: visble\n *\n * See https://stackoverflow.com/questions/6421966/\n *\n * There might be another solution with parent divs, but I haven't\n * tried it.\n */\n overflow-x: visible;\n}\n.dash-spreadsheet-inner th {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner :not(.cell--selected) tr:hover,\ntr:hover input :not(.cell--selected) {\n background-color: var(--hover);\n}\n.dash-spreadsheet-inner th {\n background-color: #fafafa;\n}\n.sort {\n cursor: pointer;\n float: left;\n color: var(--faded-text-header);\n font-size: 20px;\n}\nth:hover .sort {\n color: var(--accent);\n}\n.sort:hover {\n text-decoration: underline;\n}\n.expanded-row--empty-cell {\n box-shadow: none;\n background-color: transparent;\n}\n.expanded-row {\n text-align: center;\n}\n.dash-spreadsheet-inner input:not([type=radio]):not([type=checkbox]) {\n padding: 0px;\n margin: 0px;\n height: calc(100% - 1px);\n line-height: 30px;\n border: none;\n font-family: inherit;\n text-align: right;\n box-sizing: border-box;\n color: var(--text-color);\n background-color: transparent;\n /* so as to not overlay the box shadow */\n /* browser's default text-shadow is `$color 0px 0px 0px;`\n * for `input`, which makes it look a little bit heavier than dropdowns\n * or bare `td`\n */\n text-shadow: none;\n}\n.dash-spreadsheet-inner input.unfocused {\n color: transparent;\n text-shadow: 0 0 0 var(--text-color);\n cursor: default;\n}\n.dash-spreadsheet-inner input.unfocused:focus {\n outline: none;\n}\n.numeric {\n font-family: monospace;\n}\n.toggle-row {\n border: none;\n box-shadow: none;\n width: 10px;\n padding-left: 10px;\n padding-right: 10px;\n cursor: pointer;\n color: var(--faded-text);\n}\n.toggle-row--expanded {\n color: var(--accent);\n}\n.dash-spreadsheet-inner tr:hover .toggle-row {\n color: var(--accent);\n}\n.cell--uneditable,\n.cell--uneditable input {\n cursor: not-allowed;\n}\n.expanded-row {\n box-shadow: inset 2px 0px 0px 0px var(--accent), inset -1px 0px 0px 0px var(--border);\n /* inset 0px 1px 0px 0px var(--border); */\n}\n.dash-spreadsheet-inner .dash-delete-cell,\n.dash-spreadsheet-inner .dash-delete-header {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: default;\n font-size: 1.3rem;\n text-align: center;\n cursor: pointer;\n color: var(--muted);\n}\n.dash-spreadsheet-inner .dash-delete-cell:hover,\n.dash-spreadsheet-inner .dash-delete-header:hover {\n color: var(--accent);\n}\n.dash-spreadsheet-inner .column-header--edit {\n float: left;\n opacity: 0.1;\n padding-left: 2px;\n padding-right: 2px;\n cursor: pointer;\n}\n.dash-spreadsheet-inner th:hover .column-header--edit {\n color: var(--accent);\n opacity: 1;\n}\n.dash-spreadsheet-inner .column-header--delete {\n float: left;\n opacity: 0.1;\n padding-left: 2px;\n padding-right: 2px;\n cursor: pointer;\n}\n.dash-spreadsheet-inner th:hover .column-header--delete {\n color: var(--accent);\n opacity: 1;\n}\n",""])},function(e,t,n){var r=n(77);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(11)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(10)(!1)).push([e.i,".dash-spreadsheet .Select,\n.dash-spreadsheet .Select-control {\n border: none;\n cursor: pointer;\n height: 30px; /* matches the td height and line-height */\n border: none;\n}\n\n.dash-spreadsheet .Select-placeholder,\n.dash-spreadsheet .Select--single > .Select-control .Select-value {\n height: 100%;\n line-height: inherit;\n}\n\n.dash-spreadsheet .Select.has-value.Select--single > .Select-control .Select-value .Select-value-label,\n.dash-spreadsheet .Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value .Select-value-label {\n color: var(--text-color);\n}\n\n.dash-spreadsheet .Select:hover,\n.dash-spreadsheet .Select-control:hover {\n border: none;\n box-shadow: none;\n cursor: pointer;\n}\n\n.dash-spreadsheet .Select-menu-outer {\n z-index: 100;\n}\n\n.dash-spreadsheet .Select-arrow {\n border-top-color: var(--faded-dropdown);\n border-left-color: transparent;\n border-right-color: transparent;\n border-bottom-color: transparent;\n}\n\n.dash-spreadsheet .Select-control:hover .Select-arrow {\n border-top-color: var(--accent);\n border-left-color: transparent;\n border-right-color: transparent;\n border-bottom-color: transparent;\n}\n\n.dash-spreadsheet .is-open > .Select-control .Select-arrow {\n border-bottom-color: var(--background-color-8-react-select);\n border-left-color: transparent;\n border-right-color: transparent;\n border-top-color: transparent;\n}\n\n.dash-spreadsheet .Select--multi .Select-value,\n.dash-spreadsheet .Select--multi a.Select-value-label {\n color: var(--color-8-react-select);\n}\n\n.dash-spreadsheet .Select {\n border-radius: 0;\n}\n\n.dash-spreadsheet .Select.is-disabled > .Select-control {\n border: none;\n}\n\n.dash-spreadsheet .Select--multi .Select-value-icon:hover,\n.dash-spreadsheet .Select--multi .Select-value-icon:focus {\n font-weight: bold;\n}\n\n.dash-spreadsheet .Select.is-disabled .Select-control {\n cursor: not-allowed;\n}\n\n.dash-spreadsheet .Select-menu-outer {\n background-color: white;\n border: none;\n border-bottom: thin var(--border) solid;\n border-radius: 0;\n border-top: none;\n}\n\n.dash-spreadsheet .Select-option {\n background-color: inherit;\n color: var(--accent);\n}\n\n.dash-spreadsheet .Select-option:hover {\n font-weight: bold;\n color: var(--accent);\n background-color: var(--hover);\n}\n\n.dash-spreadsheet .Select.is-focused:not(.is-open) > .Select-control {\n border: none;\n -webkit-box-shadow: none;\n box-shadow: none;\n background: #fff;\n}\n\n.dash-spreadsheet .Select-option.is-focused {\n background-color: white;\n color: var(--accent);\n font-weight: bold;\n}\n\n.dash-spreadsheet .Select-clear {\n color: transparent;\n}\n.Select:hover .Select-clear {\n color: var(--accent);\n}\n\n.dash-spreadsheet .Select-control {\n padding-left: 2px;\n}\n\n.dash-spreadsheet .cell--selected .Select-control {\n background-color: var(--selected-background);\n border-radius: 0;\n}\n",""])},function(e,t,n){var r=n(79);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(11)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(10)(!1)).push([e.i,"/*RESET CSS*/\nhtml {\n color: #000;\n background: #FFF;\n}\nbody,\ndiv,\ndl,\ndt,\ndd,\nul,\nol,\nli,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\npre,\ncode,\nform,\nfieldset,\nlegend,\ninput,\ntextarea,\np,\nblockquote,\nth,\ntd {\n margin: 0;\n padding: 0;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\nfieldset,\nimg {\n border: 0;\n}\naddress,\ncaption,\ncite,\ncode,\ndfn,\nem,\nstrong,\nth,\nvar {\n font-style: normal;\n font-weight: normal;\n}\nol,\nul {\n list-style: none;\n}\ncaption,\nth {\n text-align: left;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: 100%;\n font-weight: normal;\n}\nq:before,\nq:after {\n content: '';\n}\nabbr,\nacronym {\n border: 0;\n font-variant: normal;\n}\nsup {\n vertical-align: text-top;\n}\nsub {\n vertical-align: text-bottom;\n}\ninput,\ntextarea,\nselect {\n font-family: inherit;\n font-size: inherit;\n font-weight: inherit;\n *font-size: 100%;\n}\nlegend {\n color: #000;\n}\n#yui3-css-stamp.cssreset {\n display: none;\n}\ninput[type=\"button\"] {\n border-radius: 0;\n -webkit-appearance: none;\n}\n*:focus {\n outline: none;\n}\n.dash-spreadsheet-container input,\n.dash-spreadsheet-container table {\n font-size: 13px;\n}\nbody {\n margin: 0;\n padding: 0;\n font-family: sans-serif;\n}\n",""])}]); \ No newline at end of file diff --git a/dash_table/demo.js b/dash_table/demo.js index c556fc517..00a13ab72 100644 --- a/dash_table/demo.js +++ b/dash_table/demo.js @@ -1,4 +1,4 @@ -window.dash_table=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=60)}([function(e,t,n){e.exports=n(26)()},function(e,t){e.exports=window.React},function(e,t,n){"use strict";function r(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}function o(e){return function t(n){return 0===arguments.length||r(n)?t:e.apply(this,arguments)}}n.r(t);var i=o(function(e){return function(){return e}}),u=i(!1),a=i(!0),s={"@@functional/placeholder":!0};function l(e){return function t(n,i){switch(arguments.length){case 0:return t;case 1:return r(n)?t:o(function(t){return e(n,t)});default:return r(n)&&r(i)?t:r(n)?o(function(t){return e(t,i)}):r(i)?o(function(t){return e(n,t)}):e(n,i)}}}var c=l(function(e,t){return Number(e)+Number(t)});function p(e,t){var n;e=e||[],t=t||[];var r=e.length,o=t.length,i=[];for(n=0;n=arguments.length)?s=t[a]:(s=arguments[i],i+=1),o[a]=s,r(s)||(u-=1),a+=1}return u<=0?n.apply(this,o):d(u,f(e,o,n))}}var h=l(function(e,t){return 1===e?o(t):d(e,f(e,[],t))}),v=o(function(e){return h(e.length,function(){var t=0,n=arguments[0],r=arguments[arguments.length-1],o=Array.prototype.slice.call(arguments,0);return o[0]=function(){var e=n.apply(this,p(arguments,[t,r]));return t+=1,e},e.apply(this,o)})});function g(e){return function t(n,i,u){switch(arguments.length){case 0:return t;case 1:return r(n)?t:l(function(t,r){return e(n,t,r)});case 2:return r(n)&&r(i)?t:r(n)?l(function(t,n){return e(t,i,n)}):r(i)?l(function(t,r){return e(n,t,r)}):o(function(t){return e(n,i,t)});default:return r(n)&&r(i)&&r(u)?t:r(n)&&r(i)?l(function(t,n){return e(t,n,u)}):r(n)&&r(u)?l(function(t,n){return e(t,i,n)}):r(i)&&r(u)?l(function(t,r){return e(n,t,r)}):r(n)?o(function(t){return e(t,i,u)}):r(i)?o(function(t){return e(n,t,u)}):r(u)?o(function(t){return e(n,i,t)}):e(n,i,u)}}}var y=g(function(e,t,n){if(t>=n.length||t<-n.length)return n;var r=(t<0?n.length:0)+t,o=p(n);return o[r]=e(n[r]),o}),b=Array.isArray||function(e){return null!=e&&e.length>=0&&"[object Array]"===Object.prototype.toString.call(e)};function m(e){return"function"==typeof e["@@transducer/step"]}function x(e,t,n){return function(){if(0===arguments.length)return n();var r=Array.prototype.slice.call(arguments,0),o=r.pop();if(!b(o)){for(var i=0;ie?t:e});function C(e,t){for(var n=0,r=t.length,o=Array(r);n0&&(e.hasOwnProperty(0)&&e.hasOwnProperty(e.length-1)))))}),F=function(){function e(e){this.f=e}return e.prototype["@@transducer/init"]=function(){throw new Error("init not implemented on XWrap")},e.prototype["@@transducer/result"]=function(e){return e},e.prototype["@@transducer/step"]=function(e,t){return this.f(e,t)},e}();function D(e){return new F(e)}var P=l(function(e,t){return d(e.length,function(){return e.apply(t,arguments)})});function T(e,t,n){for(var r=n.next();!r.done;){if((t=e["@@transducer/step"](t,r.value))&&t["@@transducer/reduced"]){t=t["@@transducer/value"];break}r=n.next()}return e["@@transducer/result"](t)}function R(e,t,n,r){return e["@@transducer/result"](n[r](P(e["@@transducer/step"],e),t))}var j="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";function I(e,t,n){if("function"==typeof e&&(e=D(e)),k(n))return function(e,t,n){for(var r=0,o=n.length;r=0;)z(t=W[n],e)&&!$(r,t)&&(r[r.length]=t),n-=1;return r}:function(e){return Object(e)!==e?[]:Object.keys(e)}),U=l(x(["fantasy-land/map","map"],N,function(e,t){switch(Object.prototype.toString.call(t)){case"[object Function]":return h(t.length,function(){return e.call(this,t.apply(this,arguments))});case"[object Object]":return I(function(n,r){return n[r]=e(t[r]),n},{},q(t));default:return C(e,t)}})),H=l(function(e,t){for(var n=t,r=0;r=0?r:0);no?1:0}),de=g(function(e,t,n){var r={};for(var o in n)r[o]=n[o];return r[e]=t,r}),fe=Number.isInteger||function(e){return e<<0===e},he=o(function(e){return null==e}),ve=g(function e(t,n,r){if(0===t.length)return n;var o=t[0];if(t.length>1){var i=!he(r)&&z(o,r)?r[o]:fe(t[1])?[]:{};n=e(Array.prototype.slice.call(t,1),n,i)}if(fe(o)&&b(r)){var u=[].concat(r);return u[o]=n,u}return de(o,n,r)}),ge=l(function(e,t){switch(e){case 0:return function(){return t.call(this)};case 1:return function(e){return t.call(this,e)};case 2:return function(e,n){return t.call(this,e,n)};case 3:return function(e,n,r){return t.call(this,e,n,r)};case 4:return function(e,n,r,o){return t.call(this,e,n,r,o)};case 5:return function(e,n,r,o,i){return t.call(this,e,n,r,o,i)};case 6:return function(e,n,r,o,i,u){return t.call(this,e,n,r,o,i,u)};case 7:return function(e,n,r,o,i,u,a){return t.call(this,e,n,r,o,i,u,a)};case 8:return function(e,n,r,o,i,u,a,s){return t.call(this,e,n,r,o,i,u,a,s)};case 9:return function(e,n,r,o,i,u,a,s,l){return t.call(this,e,n,r,o,i,u,a,s,l)};case 10:return function(e,n,r,o,i,u,a,s,l,c){return t.call(this,e,n,r,o,i,u,a,s,l,c)};default:throw new Error("First argument to nAry must be a non-negative integer no greater than ten")}}),ye=o(function(e){return ge(2,e)});function be(e){return"[object Function]"===Object.prototype.toString.call(e)}var me=l(function(e,t){var n=h(e,t);return h(e,function(){return I(re,U(n,arguments[0]),Array.prototype.slice.call(arguments,1))})}),xe=o(function(e){return me(e.length,e)}),we=l(function(e,t){return be(e)?function(){return e.apply(this,arguments)&&t.apply(this,arguments)}:xe(Z)(e,t)}),Ee=o(function(e){return h(e.length,e)}),_e=Ee(function(e){return e.apply(this,Array.prototype.slice.call(arguments,1))});function Oe(e){return function t(n){for(var r,o,i,u=[],a=0,s=n.length;at)throw new Error("min must not be greater than max in clamp(min, max, value)");return nt?t:n});function ke(e){return new RegExp(e.source,(e.global?"g":"")+(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.sticky?"y":"")+(e.unicode?"u":""))}var Fe=o(function(e){return null===e?"Null":void 0===e?"Undefined":Object.prototype.toString.call(e).slice(8,-1)});function De(e,t,n,r){var o=function(o){for(var i=t.length,u=0;u=0;){if(n[i]===e)return r[i]===t;i-=1}switch(o){case"Map":return e.size===t.size&&Ge(e.entries(),t.entries(),n.concat([e]),r.concat([t]));case"Set":return e.size===t.size&&Ge(e.values(),t.values(),n.concat([e]),r.concat([t]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var u=q(e);if(u.length!==q(t).length)return!1;var a=n.concat([e]),s=r.concat([t]);for(i=u.length-1;i>=0;){var l=u[i];if(!z(l,t)||!Je(t[l],e[l],a,s))return!1;i-=1}return!0}var Xe=l(function(e,t){return Je(e,t,[],[])});function Ze(e,t,n){var r,o;if("function"==typeof e.indexOf)switch(typeof t){case"number":if(0===t){for(r=1/t;n=0}function et(e){return'"'+e.replace(/\\/g,"\\\\").replace(/[\b]/g,"\\b").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0").replace(/"/g,'\\"')+'"'}var tt=function(e){return(e<10?"0":"")+e},nt="function"==typeof Date.prototype.toISOString?function(e){return e.toISOString()}:function(e){return e.getUTCFullYear()+"-"+tt(e.getUTCMonth()+1)+"-"+tt(e.getUTCDate())+"T"+tt(e.getUTCHours())+":"+tt(e.getUTCMinutes())+":"+tt(e.getUTCSeconds())+"."+(e.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+"Z"};function rt(e){return function(){return!e.apply(this,arguments)}}function ot(e,t){for(var n=0,r=t.length,o=[];n":e(r,o)},o=function(e,t){return C(function(t){return et(t)+": "+r(e[t])},t.slice().sort())};switch(Object.prototype.toString.call(t)){case"[object Arguments]":return"(function() { return arguments; }("+C(r,t).join(", ")+"))";case"[object Array]":return"["+C(r,t).concat(o(t,st(function(e){return/^\d+$/.test(e)},q(t)))).join(", ")+"]";case"[object Boolean]":return"object"==typeof t?"new Boolean("+r(t.valueOf())+")":t.toString();case"[object Date]":return"new Date("+(isNaN(t.valueOf())?r(NaN):et(nt(t)))+")";case"[object Null]":return"null";case"[object Number]":return"object"==typeof t?"new Number("+r(t.valueOf())+")":1/t==-1/0?"-0":t.toString(10);case"[object String]":return"object"==typeof t?"new String("+r(t.valueOf())+")":et(t);case"[object Undefined]":return"undefined";default:if("function"==typeof t.toString){var i=t.toString();if("[object Object]"!==i)return i}return"{"+o(t,q(t)).join(", ")+"}"}}(e,[])}),ct=l(function(e,t){if(b(e)){if(b(t))return e.concat(t);throw new TypeError(lt(t)+" is not an array")}if(A(e)){if(A(t))return e+t;throw new TypeError(lt(t)+" is not a string")}if(null!=e&&be(e["fantasy-land/concat"]))return e["fantasy-land/concat"](t);if(null!=e&&be(e.concat))return e.concat(t);throw new TypeError(lt(e)+' does not have a method named "concat" or "fantasy-land/concat"')}),pt=o(function(e){return d(J(S,0,U(function(e){return e[0].length},e)),function(){for(var t=0;t10)throw new Error("Constructor with greater than ten arguments");return 0===e?function(){return new t}:Ee(ge(e,function(e,n,r,o,i,u,a,s,l,c){switch(arguments.length){case 1:return new t(e);case 2:return new t(e,n);case 3:return new t(e,n,r);case 4:return new t(e,n,r,o);case 5:return new t(e,n,r,o,i);case 6:return new t(e,n,r,o,i,u);case 7:return new t(e,n,r,o,i,u,a);case 8:return new t(e,n,r,o,i,u,a,s);case 9:return new t(e,n,r,o,i,u,a,s,l);case 10:return new t(e,n,r,o,i,u,a,s,l,c)}}))}),ft=o(function(e){return dt(e.length,e)}),ht=l(Qe),vt=l(function(e,t){return h(J(S,0,G("length",t)),function(){var n=arguments,r=this;return e.apply(r,C(function(e){return e.apply(r,n)},t))})}),gt=function(){function e(e,t,n,r){this.valueFn=e,this.valueAcc=t,this.keyFn=n,this.xf=r,this.inputs={}}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=function(e){var t;for(t in this.inputs)if(z(t,this.inputs)&&(e=this.xf["@@transducer/step"](e,this.inputs[t]))["@@transducer/reduced"]){e=e["@@transducer/value"];break}return this.inputs=null,this.xf["@@transducer/result"](e)},e.prototype["@@transducer/step"]=function(e,t){var n=this.keyFn(t);return this.inputs[n]=this.inputs[n]||[n,this.valueAcc],this.inputs[n][1]=this.valueFn(this.inputs[n][1],t),e},e}(),yt=f(4,[],x([],f(4,[],function(e,t,n,r){return new gt(e,t,n,r)}),function(e,t,n,r){return I(function(r,o){var i=n(o);return r[i]=e(z(i,r)?r[i]:t,o),r},{},r)})),bt=yt(function(e,t){return e+1},0),mt=c(-1),xt=l(function(e,t){return null==t||t!=t?e:t}),wt=g(function(e,t,n){var r=e(t),o=e(n);return r>o?-1:r0?(this.n-=1,e):this.xf["@@transducer/step"](e,t)},e}(),Dt=l(x(["drop"],l(function(e,t){return new Ft(e,t)}),function(e,t){return Ne(Math.max(0,e),1/0,t)})),Pt=function(){function e(e,t){this.xf=t,this.n=e,this.i=0}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=E.result,e.prototype["@@transducer/step"]=function(e,t){this.i+=1;var n=0===this.n?e:this.xf["@@transducer/step"](e,t);return this.n>=0&&this.i>=this.n?w(n):n},e}(),Tt=l(x(["take"],l(function(e,t){return new Pt(e,t)}),function(e,t){return Ne(0,e<0?1/0:e,t)}));var Rt=function(){function e(e,t){this.xf=t,this.pos=0,this.full=!1,this.acc=new Array(e)}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=function(e){return this.acc=null,this.xf["@@transducer/result"](e)},e.prototype["@@transducer/step"]=function(e,t){return this.full&&(e=this.xf["@@transducer/step"](e,this.acc[this.pos])),this.store(t),e},e.prototype.store=function(e){this.acc[this.pos]=e,this.pos+=1,this.pos===this.acc.length&&(this.pos=0,this.full=!0)},e}(),jt=l(x([],l(function(e,t){return new Rt(e,t)}),function(e,t){return Tt(e=0&&e(t[n]);)n-=1;return Ne(0,n+1,t)})),Nt=function(){function e(e,t){this.xf=t,this.pred=e,this.lastValue=void 0,this.seenFirstValue=!1}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=E.result,e.prototype["@@transducer/step"]=function(e,t){var n=!1;return this.seenFirstValue?this.pred(this.lastValue,t)&&(n=!0):this.seenFirstValue=!0,this.lastValue=t,n?e:this.xf["@@transducer/step"](e,t)},e}(),zt=l(function(e,t){return new Nt(e,t)}),Bt=l(function(e,t){var n=e<0?t.length+e:e;return A(t)?t.charAt(n):t[n]}),Vt=Bt(-1),Lt=l(x([],zt,function(e,t){var n=[],r=1,o=t.length;if(0!==o)for(n[0]=t[0];r=0?t.length-e:0,t)}),Gt=l(function(e,t){return Xe(Yt(e.length,t),e)}),Jt=g(function(e,t,n){return Xe(e(t),e(n))}),Xt=g(function(e,t,n){return Xe(t[e],n[e])}),Zt=l(function e(t,n){var r,o,i,u={};for(o in n)i=typeof(r=t[o]),u[o]="function"===i?r(n[o]):r&&"object"===i?e(r,n[o]):n[o];return u}),Qt=function(){function e(e,t){this.xf=t,this.f=e,this.found=!1}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=function(e){return this.found||(e=this.xf["@@transducer/step"](e,void 0)),this.xf["@@transducer/result"](e)},e.prototype["@@transducer/step"]=function(e,t){return this.f(t)&&(this.found=!0,e=w(this.xf["@@transducer/step"](e,t))),e},e}(),en=l(x(["find"],l(function(e,t){return new Qt(e,t)}),function(e,t){for(var n=0,r=t.length;n=0;){if(e(t[n]))return t[n];n-=1}})),un=function(){function e(e,t){this.xf=t,this.f=e,this.idx=-1,this.lastIdx=-1}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=function(e){return this.xf["@@transducer/result"](this.xf["@@transducer/step"](e,this.lastIdx))},e.prototype["@@transducer/step"]=function(e,t){return this.idx+=1,this.f(t)&&(this.lastIdx=this.idx),e},e}(),an=l(x([],l(function(e,t){return new un(e,t)}),function(e,t){for(var n=t.length-1;n>=0;){if(e(t[n]))return n;n-=1}return-1})),sn=o(Oe(!0)),ln=o(function(e){return h(e.length,function(t,n){var r=Array.prototype.slice.call(arguments,0);return r[0]=n,r[1]=t,e.apply(this,r)})}),cn=l(Me("forEach",function(e,t){for(var n=t.length,r=0;rt}),gn=l(function(e,t){return e>=t}),yn=l(z),bn=l(function(e,t){return e in t}),mn=Bt(0);function xn(e){return e}var wn=o(xn),En=g(function(e,t,n){return h(Math.max(e.length,t.length,n.length),function(){return e.apply(this,arguments)?t.apply(this,arguments):n.apply(this,arguments)})}),_n=c(1),On=yt(function(e,t){return t},null),Sn=l(function(e,t){return"function"!=typeof t.indexOf||b(t)?Ze(t,e,0):t.indexOf(e)}),Cn=Ne(0,-1),An=g(function(e,t,n){return ot(function(t){return He(e,t,n)},t)}),kn=g(function(e,t,n){e=e=0?e:n.length;var r=Array.prototype.slice.call(n,0);return r.splice(e,0,t),r}),Fn=g(function(e,t,n){return e=e=0?e:n.length,[].concat(Array.prototype.slice.call(n,0,e),t,Array.prototype.slice.call(n,e))});function Dn(e,t,n){var r,o=typeof e;switch(o){case"string":case"number":return 0===e&&1/e==-1/0?!!n._items["-0"]||(t&&(n._items["-0"]=!0),!1):null!==n._nativeSet?t?(r=n._nativeSet.size,n._nativeSet.add(e),n._nativeSet.size===r):n._nativeSet.has(e):o in n._items?e in n._items[o]||(t&&(n._items[o][e]=!0),!1):(t&&(n._items[o]={},n._items[o][e]=!0),!1);case"boolean":if(o in n._items){var i=e?1:0;return!!n._items[o][i]||(t&&(n._items[o][i]=!0),!1)}return t&&(n._items[o]=e?[!1,!0]:[!0,!1]),!1;case"function":return null!==n._nativeSet?t?(r=n._nativeSet.size,n._nativeSet.add(e),n._nativeSet.size===r):n._nativeSet.has(e):o in n._items?!!Qe(e,n._items[o])||(t&&n._items[o].push(e),!1):(t&&(n._items[o]=[e]),!1);case"undefined":return!!n._items[o]||(t&&(n._items[o]=!0),!1);case"object":if(null===e)return!!n._items.null||(t&&(n._items.null=!0),!1);default:return(o=Object.prototype.toString.call(e))in n._items?!!Qe(e,n._items[o])||(t&&n._items[o].push(e),!1):(t&&(n._items[o]=[e]),!1)}}var Pn=function(){function e(){this._nativeSet="function"==typeof Set?new Set:null,this._items={}}return e.prototype.add=function(e){return!Dn(e,!0,this)},e.prototype.has=function(e){return Dn(e,!1,this)},e}(),Tn=l(function(e,t){for(var n,r,o=new Pn,i=[],u=0;ut.length?(n=e,r=t):(n=t,r=e),Rn(ot(ln(Qe)(n),r))}),In=l(Me("intersperse",function(e,t){for(var n=[],r=0,o=t.length;r=0;){if(Xe(t[n],e))return n;n-=1}return-1}return t.lastIndexOf(e)});function Xn(e){return"[object Number]"===Object.prototype.toString.call(e)}var Zn=o(function(e){return null!=e&&Xn(e.length)?e.length:NaN}),Qn=l(function(e,t){return function(n){return function(r){return U(function(e){return t(e,r)},n(e(r)))}}}),er=o(function(e){return Qn(Bt(e),Ct(e))}),tr=o(function(e){return Qn(H(e),ve(e))}),nr=o(function(e){return Qn(Y(e),de(e))}),rr=l(function(e,t){return e=0;)i=e(n[r],i[0]),o[r]=i[1],r-=1;return[o,i[0]]}),ar=l(function(e,t){return I(function(n,r){return n[r]=e(t[r],r,t),n},{},q(t))}),sr=l(function(e,t){return t.match(e)||[]}),lr=l(function(e,t){return fe(e)?!fe(t)||t<1?NaN:(e%t+t)%t:NaN}),cr=g(function(e,t,n){return e(n)>e(t)?n:t}),pr=J(c,0),dr=o(function(e){return pr(e)/e.length}),fr=o(function(e){var t=e.length;if(0===t)return NaN;var n=2-t%2,r=(t-n)/2;return dr(Array.prototype.slice.call(e,0).sort(function(e,t){return et?1:0}).slice(r,r+n))}),hr=l(function(e,t){var n={};return d(t.length,function(){var r=e.apply(this,arguments);return z(r,n)||(n[r]=t.apply(this,arguments)),n[r]})}),vr=hr(function(){return lt(arguments)}),gr=l(function(e,t){return Mn({},e,t)}),yr=o(function(e){return Mn.apply(null,[{}].concat(e))}),br=g(function(e,t,n){var r,o={};for(r in t)z(r,t)&&(o[r]=z(r,n)?e(r,t[r],n[r]):t[r]);for(r in n)z(r,n)&&!z(r,o)&&(o[r]=n[r]);return o}),mr=g(function e(t,n,r){return br(function(n,r,o){return it(r)&&it(o)?e(t,r,o):t(n,r,o)},n,r)}),xr=l(function(e,t){return mr(function(e,t,n){return t},e,t)}),wr=l(function(e,t){return mr(function(e,t,n){return n},e,t)}),Er=g(function(e,t,n){return mr(function(t,n,r){return e(n,r)},t,n)}),_r=g(function(e,t,n){return br(function(t,n,r){return e(n,r)},t,n)}),Or=l(function(e,t){return t0&&e(H(t,n))}),qr=l(function(e,t){for(var n={},r=0;r=0;)t=e(n[r],t),r-=1;return t}),uo=f(4,[],function(e,t,n,r){return I(function(n,r){return e(n,r)?t(n,r):w(n)},n,r)}),ao=o(w),so=l(function(e,t){var n,r=Number(t),o=0;if(r<0||isNaN(r))throw new RangeError("n must be a non-negative number");for(n=new Array(r);oo?1:0})}),yo=l(function(e,t){return Array.prototype.slice.call(t,0).sort(function(t,n){for(var r=0,o=0;0===r&&o=0&&e(t[n]);)n-=1;return Ne(n+1,1/0,t)}),Ao=function(){function e(e,t){this.xf=t,this.f=e}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=E.result,e.prototype["@@transducer/step"]=function(e,t){return this.f(t)?this.xf["@@transducer/step"](e,t):w(e)},e}(),ko=l(x(["takeWhile"],l(function(e,t){return new Ao(e,t)}),function(e,t){for(var n=0,r=t.length;n{};let n,a="";switch(e){case o.TRACE:case o.INFO:n=window.console.log,a="color: white; background-color: #3166A2;";break;case r.DEBUG:case o.WARNING:n=window.console.warn,a="color: white; background-color: #E9B606;";break;case o.ERROR:case o.FATAL:n=window.console.error,a="color: white; background-color: #FF0000;"}let s=`${a&&u?"%c":""}[${i[e].toUpperCase()}]`;return a&&u?n.bind(window.console,s,a):n.bind(window.console,s)}u=!1;let c={setDebugLevel(e){s=e},setLogLevel(e){a=e}};Object.defineProperties(c,{trace:{get:()=>l(o.TRACE,a),configurable:!1,enumerable:!1},info:{get:()=>l(o.INFO,a),configurable:!1,enumerable:!1},warning:{get:()=>l(o.WARNING,a),configurable:!1,enumerable:!1},error:{get:()=>l(o.ERROR,a),configurable:!1,enumerable:!1},fatal:{get:()=>l(o.FATAL,a),configurable:!1,enumerable:!1},debug:{get:()=>l(r.DEBUG,s),configurable:!1,enumerable:!1}}),Object.freeze(c),t.default=c},function(e,t,n){var r; +window.dash_table=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=80)}([function(e,t,n){e.exports=n(28)()},function(e,t){e.exports=window.React},function(e,t,n){"use strict";function r(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}function o(e){return function t(n){return 0===arguments.length||r(n)?t:e.apply(this,arguments)}}n.r(t);var i=o(function(e){return function(){return e}}),u=i(!1),a=i(!0),s={"@@functional/placeholder":!0};function l(e){return function t(n,i){switch(arguments.length){case 0:return t;case 1:return r(n)?t:o(function(t){return e(n,t)});default:return r(n)&&r(i)?t:r(n)?o(function(t){return e(t,i)}):r(i)?o(function(t){return e(n,t)}):e(n,i)}}}var c=l(function(e,t){return Number(e)+Number(t)});function d(e,t){var n;e=e||[],t=t||[];var r=e.length,o=t.length,i=[];for(n=0;n=arguments.length)?s=t[a]:(s=arguments[i],i+=1),o[a]=s,r(s)||(u-=1),a+=1}return u<=0?n.apply(this,o):p(u,f(e,o,n))}}var h=l(function(e,t){return 1===e?o(t):p(e,f(e,[],t))}),v=o(function(e){return h(e.length,function(){var t=0,n=arguments[0],r=arguments[arguments.length-1],o=Array.prototype.slice.call(arguments,0);return o[0]=function(){var e=n.apply(this,d(arguments,[t,r]));return t+=1,e},e.apply(this,o)})});function y(e){return function t(n,i,u){switch(arguments.length){case 0:return t;case 1:return r(n)?t:l(function(t,r){return e(n,t,r)});case 2:return r(n)&&r(i)?t:r(n)?l(function(t,n){return e(t,i,n)}):r(i)?l(function(t,r){return e(n,t,r)}):o(function(t){return e(n,i,t)});default:return r(n)&&r(i)&&r(u)?t:r(n)&&r(i)?l(function(t,n){return e(t,n,u)}):r(n)&&r(u)?l(function(t,n){return e(t,i,n)}):r(i)&&r(u)?l(function(t,r){return e(n,t,r)}):r(n)?o(function(t){return e(t,i,u)}):r(i)?o(function(t){return e(n,t,u)}):r(u)?o(function(t){return e(n,i,t)}):e(n,i,u)}}}var g=y(function(e,t,n){if(t>=n.length||t<-n.length)return n;var r=(t<0?n.length:0)+t,o=d(n);return o[r]=e(n[r]),o}),m=Array.isArray||function(e){return null!=e&&e.length>=0&&"[object Array]"===Object.prototype.toString.call(e)};function b(e){return"function"==typeof e["@@transducer/step"]}function x(e,t,n){return function(){if(0===arguments.length)return n();var r=Array.prototype.slice.call(arguments,0),o=r.pop();if(!m(o)){for(var i=0;ie?t:e});function C(e,t){for(var n=0,r=t.length,o=Array(r);n0&&(e.hasOwnProperty(0)&&e.hasOwnProperty(e.length-1)))))}),F=function(){function e(e){this.f=e}return e.prototype["@@transducer/init"]=function(){throw new Error("init not implemented on XWrap")},e.prototype["@@transducer/result"]=function(e){return e},e.prototype["@@transducer/step"]=function(e,t){return this.f(e,t)},e}();function D(e){return new F(e)}var P=l(function(e,t){return p(e.length,function(){return e.apply(t,arguments)})});function M(e,t,n){for(var r=n.next();!r.done;){if((t=e["@@transducer/step"](t,r.value))&&t["@@transducer/reduced"]){t=t["@@transducer/value"];break}r=n.next()}return e["@@transducer/result"](t)}function j(e,t,n,r){return e["@@transducer/result"](n[r](P(e["@@transducer/step"],e),t))}var T="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";function R(e,t,n){if("function"==typeof e&&(e=D(e)),k(n))return function(e,t,n){for(var r=0,o=n.length;r=0;)z(t=W[n],e)&&!U(r,t)&&(r[r.length]=t),n-=1;return r}:function(e){return Object(e)!==e?[]:Object.keys(e)}),$=l(x(["fantasy-land/map","map"],N,function(e,t){switch(Object.prototype.toString.call(t)){case"[object Function]":return h(t.length,function(){return e.call(this,t.apply(this,arguments))});case"[object Object]":return R(function(n,r){return n[r]=e(t[r]),n},{},q(t));default:return C(e,t)}})),H=l(function(e,t){for(var n=t,r=0;r=0?r:0);no?1:0}),pe=y(function(e,t,n){var r={};for(var o in n)r[o]=n[o];return r[e]=t,r}),fe=Number.isInteger||function(e){return e<<0===e},he=o(function(e){return null==e}),ve=y(function e(t,n,r){if(0===t.length)return n;var o=t[0];if(t.length>1){var i=!he(r)&&z(o,r)?r[o]:fe(t[1])?[]:{};n=e(Array.prototype.slice.call(t,1),n,i)}if(fe(o)&&m(r)){var u=[].concat(r);return u[o]=n,u}return pe(o,n,r)}),ye=l(function(e,t){switch(e){case 0:return function(){return t.call(this)};case 1:return function(e){return t.call(this,e)};case 2:return function(e,n){return t.call(this,e,n)};case 3:return function(e,n,r){return t.call(this,e,n,r)};case 4:return function(e,n,r,o){return t.call(this,e,n,r,o)};case 5:return function(e,n,r,o,i){return t.call(this,e,n,r,o,i)};case 6:return function(e,n,r,o,i,u){return t.call(this,e,n,r,o,i,u)};case 7:return function(e,n,r,o,i,u,a){return t.call(this,e,n,r,o,i,u,a)};case 8:return function(e,n,r,o,i,u,a,s){return t.call(this,e,n,r,o,i,u,a,s)};case 9:return function(e,n,r,o,i,u,a,s,l){return t.call(this,e,n,r,o,i,u,a,s,l)};case 10:return function(e,n,r,o,i,u,a,s,l,c){return t.call(this,e,n,r,o,i,u,a,s,l,c)};default:throw new Error("First argument to nAry must be a non-negative integer no greater than ten")}}),ge=o(function(e){return ye(2,e)});function me(e){return"[object Function]"===Object.prototype.toString.call(e)}var be=l(function(e,t){var n=h(e,t);return h(e,function(){return R(re,$(n,arguments[0]),Array.prototype.slice.call(arguments,1))})}),xe=o(function(e){return be(e.length,e)}),we=l(function(e,t){return me(e)?function(){return e.apply(this,arguments)&&t.apply(this,arguments)}:xe(Z)(e,t)}),Ee=o(function(e){return h(e.length,e)}),_e=Ee(function(e){return e.apply(this,Array.prototype.slice.call(arguments,1))});function Oe(e){return function t(n){for(var r,o,i,u=[],a=0,s=n.length;at)throw new Error("min must not be greater than max in clamp(min, max, value)");return nt?t:n});function ke(e){return new RegExp(e.source,(e.global?"g":"")+(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.sticky?"y":"")+(e.unicode?"u":""))}var Fe=o(function(e){return null===e?"Null":void 0===e?"Undefined":Object.prototype.toString.call(e).slice(8,-1)});function De(e,t,n,r){var o=function(o){for(var i=t.length,u=0;u=0;){if(n[i]===e)return r[i]===t;i-=1}switch(o){case"Map":return e.size===t.size&&Ge(e.entries(),t.entries(),n.concat([e]),r.concat([t]));case"Set":return e.size===t.size&&Ge(e.values(),t.values(),n.concat([e]),r.concat([t]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var u=q(e);if(u.length!==q(t).length)return!1;var a=n.concat([e]),s=r.concat([t]);for(i=u.length-1;i>=0;){var l=u[i];if(!z(l,t)||!Je(t[l],e[l],a,s))return!1;i-=1}return!0}var Xe=l(function(e,t){return Je(e,t,[],[])});function Ze(e,t,n){var r,o;if("function"==typeof e.indexOf)switch(typeof t){case"number":if(0===t){for(r=1/t;n=0}function et(e){return'"'+e.replace(/\\/g,"\\\\").replace(/[\b]/g,"\\b").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0").replace(/"/g,'\\"')+'"'}var tt=function(e){return(e<10?"0":"")+e},nt="function"==typeof Date.prototype.toISOString?function(e){return e.toISOString()}:function(e){return e.getUTCFullYear()+"-"+tt(e.getUTCMonth()+1)+"-"+tt(e.getUTCDate())+"T"+tt(e.getUTCHours())+":"+tt(e.getUTCMinutes())+":"+tt(e.getUTCSeconds())+"."+(e.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+"Z"};function rt(e){return function(){return!e.apply(this,arguments)}}function ot(e,t){for(var n=0,r=t.length,o=[];n":e(r,o)},o=function(e,t){return C(function(t){return et(t)+": "+r(e[t])},t.slice().sort())};switch(Object.prototype.toString.call(t)){case"[object Arguments]":return"(function() { return arguments; }("+C(r,t).join(", ")+"))";case"[object Array]":return"["+C(r,t).concat(o(t,st(function(e){return/^\d+$/.test(e)},q(t)))).join(", ")+"]";case"[object Boolean]":return"object"==typeof t?"new Boolean("+r(t.valueOf())+")":t.toString();case"[object Date]":return"new Date("+(isNaN(t.valueOf())?r(NaN):et(nt(t)))+")";case"[object Null]":return"null";case"[object Number]":return"object"==typeof t?"new Number("+r(t.valueOf())+")":1/t==-1/0?"-0":t.toString(10);case"[object String]":return"object"==typeof t?"new String("+r(t.valueOf())+")":et(t);case"[object Undefined]":return"undefined";default:if("function"==typeof t.toString){var i=t.toString();if("[object Object]"!==i)return i}return"{"+o(t,q(t)).join(", ")+"}"}}(e,[])}),ct=l(function(e,t){if(m(e)){if(m(t))return e.concat(t);throw new TypeError(lt(t)+" is not an array")}if(A(e)){if(A(t))return e+t;throw new TypeError(lt(t)+" is not a string")}if(null!=e&&me(e["fantasy-land/concat"]))return e["fantasy-land/concat"](t);if(null!=e&&me(e.concat))return e.concat(t);throw new TypeError(lt(e)+' does not have a method named "concat" or "fantasy-land/concat"')}),dt=o(function(e){return p(J(S,0,$(function(e){return e[0].length},e)),function(){for(var t=0;t10)throw new Error("Constructor with greater than ten arguments");return 0===e?function(){return new t}:Ee(ye(e,function(e,n,r,o,i,u,a,s,l,c){switch(arguments.length){case 1:return new t(e);case 2:return new t(e,n);case 3:return new t(e,n,r);case 4:return new t(e,n,r,o);case 5:return new t(e,n,r,o,i);case 6:return new t(e,n,r,o,i,u);case 7:return new t(e,n,r,o,i,u,a);case 8:return new t(e,n,r,o,i,u,a,s);case 9:return new t(e,n,r,o,i,u,a,s,l);case 10:return new t(e,n,r,o,i,u,a,s,l,c)}}))}),ft=o(function(e){return pt(e.length,e)}),ht=l(Qe),vt=l(function(e,t){return h(J(S,0,G("length",t)),function(){var n=arguments,r=this;return e.apply(r,C(function(e){return e.apply(r,n)},t))})}),yt=function(){function e(e,t,n,r){this.valueFn=e,this.valueAcc=t,this.keyFn=n,this.xf=r,this.inputs={}}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=function(e){var t;for(t in this.inputs)if(z(t,this.inputs)&&(e=this.xf["@@transducer/step"](e,this.inputs[t]))["@@transducer/reduced"]){e=e["@@transducer/value"];break}return this.inputs=null,this.xf["@@transducer/result"](e)},e.prototype["@@transducer/step"]=function(e,t){var n=this.keyFn(t);return this.inputs[n]=this.inputs[n]||[n,this.valueAcc],this.inputs[n][1]=this.valueFn(this.inputs[n][1],t),e},e}(),gt=f(4,[],x([],f(4,[],function(e,t,n,r){return new yt(e,t,n,r)}),function(e,t,n,r){return R(function(r,o){var i=n(o);return r[i]=e(z(i,r)?r[i]:t,o),r},{},r)})),mt=gt(function(e,t){return e+1},0),bt=c(-1),xt=l(function(e,t){return null==t||t!=t?e:t}),wt=y(function(e,t,n){var r=e(t),o=e(n);return r>o?-1:r0?(this.n-=1,e):this.xf["@@transducer/step"](e,t)},e}(),Dt=l(x(["drop"],l(function(e,t){return new Ft(e,t)}),function(e,t){return Ne(Math.max(0,e),1/0,t)})),Pt=function(){function e(e,t){this.xf=t,this.n=e,this.i=0}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=E.result,e.prototype["@@transducer/step"]=function(e,t){this.i+=1;var n=0===this.n?e:this.xf["@@transducer/step"](e,t);return this.n>=0&&this.i>=this.n?w(n):n},e}(),Mt=l(x(["take"],l(function(e,t){return new Pt(e,t)}),function(e,t){return Ne(0,e<0?1/0:e,t)}));var jt=function(){function e(e,t){this.xf=t,this.pos=0,this.full=!1,this.acc=new Array(e)}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=function(e){return this.acc=null,this.xf["@@transducer/result"](e)},e.prototype["@@transducer/step"]=function(e,t){return this.full&&(e=this.xf["@@transducer/step"](e,this.acc[this.pos])),this.store(t),e},e.prototype.store=function(e){this.acc[this.pos]=e,this.pos+=1,this.pos===this.acc.length&&(this.pos=0,this.full=!0)},e}(),Tt=l(x([],l(function(e,t){return new jt(e,t)}),function(e,t){return Mt(e=0&&e(t[n]);)n-=1;return Ne(0,n+1,t)})),Nt=function(){function e(e,t){this.xf=t,this.pred=e,this.lastValue=void 0,this.seenFirstValue=!1}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=E.result,e.prototype["@@transducer/step"]=function(e,t){var n=!1;return this.seenFirstValue?this.pred(this.lastValue,t)&&(n=!0):this.seenFirstValue=!0,this.lastValue=t,n?e:this.xf["@@transducer/step"](e,t)},e}(),zt=l(function(e,t){return new Nt(e,t)}),Bt=l(function(e,t){var n=e<0?t.length+e:e;return A(t)?t.charAt(n):t[n]}),Vt=Bt(-1),Lt=l(x([],zt,function(e,t){var n=[],r=1,o=t.length;if(0!==o)for(n[0]=t[0];r=0?t.length-e:0,t)}),Gt=l(function(e,t){return Xe(Yt(e.length,t),e)}),Jt=y(function(e,t,n){return Xe(e(t),e(n))}),Xt=y(function(e,t,n){return Xe(t[e],n[e])}),Zt=l(function e(t,n){var r,o,i,u={};for(o in n)i=typeof(r=t[o]),u[o]="function"===i?r(n[o]):r&&"object"===i?e(r,n[o]):n[o];return u}),Qt=function(){function e(e,t){this.xf=t,this.f=e,this.found=!1}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=function(e){return this.found||(e=this.xf["@@transducer/step"](e,void 0)),this.xf["@@transducer/result"](e)},e.prototype["@@transducer/step"]=function(e,t){return this.f(t)&&(this.found=!0,e=w(this.xf["@@transducer/step"](e,t))),e},e}(),en=l(x(["find"],l(function(e,t){return new Qt(e,t)}),function(e,t){for(var n=0,r=t.length;n=0;){if(e(t[n]))return t[n];n-=1}})),un=function(){function e(e,t){this.xf=t,this.f=e,this.idx=-1,this.lastIdx=-1}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=function(e){return this.xf["@@transducer/result"](this.xf["@@transducer/step"](e,this.lastIdx))},e.prototype["@@transducer/step"]=function(e,t){return this.idx+=1,this.f(t)&&(this.lastIdx=this.idx),e},e}(),an=l(x([],l(function(e,t){return new un(e,t)}),function(e,t){for(var n=t.length-1;n>=0;){if(e(t[n]))return n;n-=1}return-1})),sn=o(Oe(!0)),ln=o(function(e){return h(e.length,function(t,n){var r=Array.prototype.slice.call(arguments,0);return r[0]=n,r[1]=t,e.apply(this,r)})}),cn=l(Ie("forEach",function(e,t){for(var n=t.length,r=0;rt}),yn=l(function(e,t){return e>=t}),gn=l(z),mn=l(function(e,t){return e in t}),bn=Bt(0);function xn(e){return e}var wn=o(xn),En=y(function(e,t,n){return h(Math.max(e.length,t.length,n.length),function(){return e.apply(this,arguments)?t.apply(this,arguments):n.apply(this,arguments)})}),_n=c(1),On=gt(function(e,t){return t},null),Sn=l(function(e,t){return"function"!=typeof t.indexOf||m(t)?Ze(t,e,0):t.indexOf(e)}),Cn=Ne(0,-1),An=y(function(e,t,n){return ot(function(t){return He(e,t,n)},t)}),kn=y(function(e,t,n){e=e=0?e:n.length;var r=Array.prototype.slice.call(n,0);return r.splice(e,0,t),r}),Fn=y(function(e,t,n){return e=e=0?e:n.length,[].concat(Array.prototype.slice.call(n,0,e),t,Array.prototype.slice.call(n,e))});function Dn(e,t,n){var r,o=typeof e;switch(o){case"string":case"number":return 0===e&&1/e==-1/0?!!n._items["-0"]||(t&&(n._items["-0"]=!0),!1):null!==n._nativeSet?t?(r=n._nativeSet.size,n._nativeSet.add(e),n._nativeSet.size===r):n._nativeSet.has(e):o in n._items?e in n._items[o]||(t&&(n._items[o][e]=!0),!1):(t&&(n._items[o]={},n._items[o][e]=!0),!1);case"boolean":if(o in n._items){var i=e?1:0;return!!n._items[o][i]||(t&&(n._items[o][i]=!0),!1)}return t&&(n._items[o]=e?[!1,!0]:[!0,!1]),!1;case"function":return null!==n._nativeSet?t?(r=n._nativeSet.size,n._nativeSet.add(e),n._nativeSet.size===r):n._nativeSet.has(e):o in n._items?!!Qe(e,n._items[o])||(t&&n._items[o].push(e),!1):(t&&(n._items[o]=[e]),!1);case"undefined":return!!n._items[o]||(t&&(n._items[o]=!0),!1);case"object":if(null===e)return!!n._items.null||(t&&(n._items.null=!0),!1);default:return(o=Object.prototype.toString.call(e))in n._items?!!Qe(e,n._items[o])||(t&&n._items[o].push(e),!1):(t&&(n._items[o]=[e]),!1)}}var Pn=function(){function e(){this._nativeSet="function"==typeof Set?new Set:null,this._items={}}return e.prototype.add=function(e){return!Dn(e,!0,this)},e.prototype.has=function(e){return Dn(e,!1,this)},e}(),Mn=l(function(e,t){for(var n,r,o=new Pn,i=[],u=0;ut.length?(n=e,r=t):(n=t,r=e),jn(ot(ln(Qe)(n),r))}),Rn=l(Ie("intersperse",function(e,t){for(var n=[],r=0,o=t.length;r=0;){if(Xe(t[n],e))return n;n-=1}return-1}return t.lastIndexOf(e)});function Xn(e){return"[object Number]"===Object.prototype.toString.call(e)}var Zn=o(function(e){return null!=e&&Xn(e.length)?e.length:NaN}),Qn=l(function(e,t){return function(n){return function(r){return $(function(e){return t(e,r)},n(e(r)))}}}),er=o(function(e){return Qn(Bt(e),Ct(e))}),tr=o(function(e){return Qn(H(e),ve(e))}),nr=o(function(e){return Qn(Y(e),pe(e))}),rr=l(function(e,t){return e=0;)i=e(n[r],i[0]),o[r]=i[1],r-=1;return[o,i[0]]}),ar=l(function(e,t){return R(function(n,r){return n[r]=e(t[r],r,t),n},{},q(t))}),sr=l(function(e,t){return t.match(e)||[]}),lr=l(function(e,t){return fe(e)?!fe(t)||t<1?NaN:(e%t+t)%t:NaN}),cr=y(function(e,t,n){return e(n)>e(t)?n:t}),dr=J(c,0),pr=o(function(e){return dr(e)/e.length}),fr=o(function(e){var t=e.length;if(0===t)return NaN;var n=2-t%2,r=(t-n)/2;return pr(Array.prototype.slice.call(e,0).sort(function(e,t){return et?1:0}).slice(r,r+n))}),hr=l(function(e,t){var n={};return p(t.length,function(){var r=e.apply(this,arguments);return z(r,n)||(n[r]=t.apply(this,arguments)),n[r]})}),vr=hr(function(){return lt(arguments)}),yr=l(function(e,t){return In({},e,t)}),gr=o(function(e){return In.apply(null,[{}].concat(e))}),mr=y(function(e,t,n){var r,o={};for(r in t)z(r,t)&&(o[r]=z(r,n)?e(r,t[r],n[r]):t[r]);for(r in n)z(r,n)&&!z(r,o)&&(o[r]=n[r]);return o}),br=y(function e(t,n,r){return mr(function(n,r,o){return it(r)&&it(o)?e(t,r,o):t(n,r,o)},n,r)}),xr=l(function(e,t){return br(function(e,t,n){return t},e,t)}),wr=l(function(e,t){return br(function(e,t,n){return n},e,t)}),Er=y(function(e,t,n){return br(function(t,n,r){return e(n,r)},t,n)}),_r=y(function(e,t,n){return mr(function(t,n,r){return e(n,r)},t,n)}),Or=l(function(e,t){return t0&&e(H(t,n))}),qr=l(function(e,t){for(var n={},r=0;r=0;)t=e(n[r],t),r-=1;return t}),uo=f(4,[],function(e,t,n,r){return R(function(n,r){return e(n,r)?t(n,r):w(n)},n,r)}),ao=o(w),so=l(function(e,t){var n,r=Number(t),o=0;if(r<0||isNaN(r))throw new RangeError("n must be a non-negative number");for(n=new Array(r);oo?1:0})}),go=l(function(e,t){return Array.prototype.slice.call(t,0).sort(function(t,n){for(var r=0,o=0;0===r&&o=0&&e(t[n]);)n-=1;return Ne(n+1,1/0,t)}),Ao=function(){function e(e,t){this.xf=t,this.f=e}return e.prototype["@@transducer/init"]=E.init,e.prototype["@@transducer/result"]=E.result,e.prototype["@@transducer/step"]=function(e,t){return this.f(t)?this.xf["@@transducer/step"](e,t):w(e)},e}(),ko=l(x(["takeWhile"],l(function(e,t){return new Ao(e,t)}),function(e,t){for(var n=0,r=t.length;no(e)},t.memoizeOneWithFlag=function(e){let t,n=null,o=!0;return(...i)=>{let u=(0,r.isEqualArgs)(n,i)?{cached:!0,first:o,result:t}:{cached:!1,first:o,result:(n=i)&&(t=e(...i))};return o=!1,u}},t.memoizeAll=function(e){const t=[];return(...n)=>{let o=t.find(e=>(0,r.isEqualArgs)(e.args,n));return(o||t[t.push({args:n,result:e(...n)})-1]).result}};var r=n(31);function o(e){let t,n=null;return(...o)=>(0,r.isEqualArgs)(n,o)?t:(n=o)&&(t=e(...o))}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=t.DebugLevel=void 0;!function(e){e[e.DEBUG=6]="DEBUG",e[e.NONE=7]="NONE"}(r||(t.DebugLevel=r={}));var o=t.LogLevel=void 0;!function(e){e[e.TRACE=0]="TRACE",e[e.INFO=1]="INFO",e[e.WARNING=2]="WARNING",e[e.ERROR=3]="ERROR",e[e.FATAL=4]="FATAL",e[e.NONE=5]="NONE"}(o||(t.LogLevel=o={}));let i=[];i[o.TRACE]="trace",i[o.INFO]="info",i[o.WARNING]="warning",i[o.ERROR]="error",i[o.FATAL]="fatal",i[o.NONE]="none",i[r.DEBUG]="debug",i[r.NONE]="trace";let u,a=o.NONE,s=r.NONE;function l(e,t){if(e{};let n,a="";switch(e){case o.TRACE:case o.INFO:n=window.console.log,a="color: white; background-color: #3166A2;";break;case r.DEBUG:case o.WARNING:n=window.console.warn,a="color: white; background-color: #E9B606;";break;case o.ERROR:case o.FATAL:n=window.console.error,a="color: white; background-color: #FF0000;"}let s=`${a&&u?"%c":""}[${i[e].toUpperCase()}]`;return a&&u?n.bind(window.console,s,a):n.bind(window.console,s)}u=!1;let c={setDebugLevel(e){s=e},setLogLevel(e){a=e}};Object.defineProperties(c,{trace:{get:()=>l(o.TRACE,a),configurable:!1,enumerable:!1},info:{get:()=>l(o.INFO,a),configurable:!1,enumerable:!1},warning:{get:()=>l(o.WARNING,a),configurable:!1,enumerable:!1},error:{get:()=>l(o.ERROR,a),configurable:!1,enumerable:!1},fatal:{get:()=>l(o.FATAL,a),configurable:!1,enumerable:!1},debug:{get:()=>l(r.DEBUG,s),configurable:!1,enumerable:!1}}),Object.freeze(c),t.default=c},function(e,t,n){var r; /*! Copyright (c) 2017 Jed Watson. Licensed under the MIT License (MIT), see @@ -9,10 +9,10 @@ window.dash_table=function(e){var t={};function n(r){if(t[r])return t[r].exports Licensed under the MIT License (MIT), see http://jedwatson.github.io/classnames */ -!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t(0,r.isEqualArgs)(n,o)?t:(n=o)&&(t=e(...o))},t.memoizeAll=function(e){const t=[];return(...n)=>{let o=t.find(e=>(0,r.isEqualArgs)(e.args,n));return(o||t[t.push({args:n,result:e(...n)})-1]).result}};var r=n(12)},function(e,t){e.exports=window.ReactDOM},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.defaultIsNully=t.SortDirection=void 0;var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));var o=t.SortDirection=void 0;!function(e){e.Ascending="asc",e.Descending="desc",e.None="none"}(o||(t.SortDirection=o={}));const i=t.defaultIsNully=(e=>void 0===e||null===e);t.default=((e,t,n=i)=>t.length?r.sortWith(r.map(e=>e.direction===o.Descending?r.comparator((t,r)=>{const o=e.columnId,i=t[o],u=r[o];return!n(i)&&(!!n(u)||i>u)}):r.comparator((t,r)=>{const o=e.columnId,i=t[o],u=r[o];return!n(i)&&(!!n(u)||i=0&&s.splice(t,1)}function h(e){var t=document.createElement("style");return void 0===e.attrs.type&&(e.attrs.type="text/css"),v(t,e.attrs),d(e,t),t}function v(e,t){Object.keys(t).forEach(function(n){e.setAttribute(n,t[n])})}function g(e,t){var n,r,o,i;if(t.transform&&e.css){if(!(i=t.transform(e.css)))return function(){};e.css=i}if(t.singleton){var s=a++;n=u||(u=h(t)),r=b.bind(null,n,s,!1),o=b.bind(null,n,s,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(e){var t=document.createElement("link");return void 0===e.attrs.type&&(e.attrs.type="text/css"),e.attrs.rel="stylesheet",v(t,e.attrs),d(e,t),t}(t),r=function(e,t,n){var r=n.css,o=n.sourceMap,i=void 0===t.convertToAbsoluteUrls&&o;(t.convertToAbsoluteUrls||i)&&(r=l(r));o&&(r+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(o))))+" */");var u=new Blob([r],{type:"text/css"}),a=e.href;e.href=URL.createObjectURL(u),a&&URL.revokeObjectURL(a)}.bind(null,n,t),o=function(){f(n),n.href&&URL.revokeObjectURL(n.href)}):(n=h(t),r=function(e,t){var n=t.css,r=t.media;r&&e.setAttribute("media",r);if(e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}.bind(null,n),o=function(){f(n)});return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else o()}}e.exports=function(e,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||"boolean"==typeof t.singleton||(t.singleton=o()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var n=p(e,t);return c(n,t),function(e){for(var o=[],i=0;ie===this.dataframe[t])||(this.__dataframe=n,this.__indices=o,this.target.update({viewportDataframe:n,viewportIndices:o}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){let t=null,n=[];for(;e.length;){e=e.replace(/^\s+/,"");let o=r.default.filter(e=>t&&e.when&&-1!==e.when.indexOf(t.name));if(o.length||(o=r.default),!(t=o.find(t=>t.regexp.test(e))||null))return{lexemes:n,valid:!1,error:e};const i=(e.match(t.regexp)||[])[0];n.push({lexeme:t,value:i}),e=e.substring(i.length)}return{lexemes:n,valid:!0}};var r=function(e){return e&&e.__esModule?e:{default:e}}(n(16))},function(e,t,n){"use strict";function r(e){return void 0!==e&&null!==e&&"object"==typeof e&&e.constructor===Object}function o(e,t,n=!1){return e===t||i(Object.values(e),Object.values(t),n)}function i(e,t,n=!1){return!!e&&e.length===t.length&&!!e.every((e,u)=>{const a=t[u];return e===a||n&&(Array.isArray(e)&&Array.isArray(a)&&i(e,a,n)||r(e)&&r(a)&&o(e,a,n))})}Object.defineProperty(t,"__esModule",{value:!0}),t.isEqual=o,t.isEqualArgs=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.colIsEditable=function(e,t){return e&&(!r.has("editable",t)||t.editable)};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isPrintableChar=function(e){return 32===e||e>=48&&e<=57||e>=96&&e<=111||e>=186&&e<=192||e>=219&&e<=222||e>=226||e>=65&&e<=90},t.isMetaKey=function(e){return-1!==o.indexOf(e)},t.isNavKey=function(e){return-1!==u.indexOf(e)},t.isArrowKey=function(e){return-1!==i.indexOf(e)},t.isCtrlKey=function(e){const t=[];window.navigator.platform.includes("Mac")?t.push(r.COMMAND_LEFT,r.COMMAND_RIGHT,r.COMMAND_FIREFOX):t.push(r.CONTROL);return t.includes(e)},t.isCtrlMetaKey=function(e){return[r.CONTROL,r.COMMAND_LEFT,r.COMMAND_RIGHT,r.COMMAND_FIREFOX].includes(e)};const r=t.KEY_CODES={MOUSE_LEFT:1,MOUSE_RIGHT:3,MOUSE_MIDDLE:2,BACKSPACE:8,COMMA:188,INSERT:45,DELETE:46,END:35,ENTER:13,ESCAPE:27,CONTROL:17,COMMAND_LEFT:91,COMMAND_RIGHT:93,COMMAND_FIREFOX:224,ALT:18,HOME:36,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,SPACE:32,SHIFT:16,CAPS_LOCK:20,TAB:9,ARROW_RIGHT:39,ARROW_LEFT:37,ARROW_UP:38,ARROW_DOWN:40,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,A:65,X:88,C:67,V:86},o=[r.ARROW_DOWN,r.ARROW_UP,r.ARROW_LEFT,r.ARROW_RIGHT,r.HOME,r.END,r.DELETE,r.BACKSPACE,r.F1,r.F2,r.F3,r.F4,r.F5,r.F6,r.F7,r.F8,r.F9,r.F10,r.F11,r.F12,r.TAB,r.PAGE_DOWN,r.PAGE_UP,r.ENTER,r.ESCAPE,r.SHIFT,r.CAPS_LOCK,r.ALT],i=[r.ARROW_DOWN,r.ARROW_UP,r.ARROW_LEFT,r.ARROW_RIGHT],u=[...i,r.TAB,r.ENTER];t.isCtrlDown=(e=>(e.ctrlKey||e.metaKey)&&!e.altKey)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.deleteRow=function(e,t){const n=t.active_cell,o=t.dataframe,i=t.end_cell,u=t.selected_cell,a=t.selected_rows,s=t.start_cell,l={dataframe:r.remove(e,1,o)};r.is(Array,n)&&n[0]===e&&(l.active_cell=[]);r.is(Array,i)&&i[0]===e&&(l.end_cell=[]);r.is(Array,u)&&u[0]===e&&(l.selected_cell=[]);r.is(Array,s)&&s[0]===e&&(l.start_cell=[0,0]);r.is(Array,a)&&r.contains(e,a)&&(l.selected_rows=r.without([e],a));return l},t.deleteColumn=function(e,t,n){const i=n.columns,u=n.dataframe;var a=o(e,t,n);const s=a.groupIndexFirst,l=a.groupIndexLast,c=r.slice(s,l+1,r.pluck("id",i));return{columns:r.remove(s,1+l-s,i),dataframe:r.map(r.omit(c),u),active_cell:[],end_cell:[],selected_cell:[],start_cell:[0]}},t.editColumnName=function(e,t,n){const i=n.columns;var u=o(e,t,n);const a=u.groupIndexFirst,s=u.groupIndexLast,l=window.prompt("Enter a new column name");let c=r.clone(i);return r.range(a,s+1).map(e=>{let n;n="Array"===r.type(i[e].name)?[e,"name",t]:[e,"name"],c=r.set(r.lensPath(n),l,c)}),{columns:c}};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));function o(e,t,n){const o=n.columns;let i,u;"Null"!==r.type(t)?(i=e.name[t],u=r.pluck(t,r.pluck("name",o))):(i=e.name,u=r.pluck("name",o));const a=r.findIndex(r.propEq("id",e.id),o);let s=a,l=a;for(;u[s-1]===i;)s--;for(;u[l+1]===i;)l++;return{groupIndexFirst:s,groupIndexLast:l}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LexemeType=void 0;var r=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var u,a=e[Symbol.iterator]();!(r=(u=a.next()).done)&&(n.push(u.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),o=function(e){return e&&e.__esModule?e:{default:e}}(n(3));var i=t.LexemeType=void 0;!function(e){e.And="and",e.BlockClose="close-block",e.BlockOpen="open-block",e.BinaryOperator="logical-binary-operator",e.Expression="expression",e.Or="or",e.Operand="operand",e.UnaryNot="unary-not",e.UnaryOperator="logical-unary-operator"}(i||(t.LexemeType=i={}));const u={resolve:(e,t)=>{if(o.default.trace("resolve -> exp",e,t),/^('.*')|(".*")$/.test(t.value))return t.value.slice(1,t.value.length-1);if(!/^\w+\(.*\)$/.test(t.value))return e[t.value];{const e=t.value.match(/^(\w+)\((.*)\)$/);if(!e)throw Error();{var n=r(e,3);const t=n[1],o=n[2];switch(t){case"num":return parseInt(o,10);case"str":default:return o}}}},regexp:/^(((num|str)\([^()]*\))|'([^()']|\\')+'|"([^()"]|\\")+"|\w+)/},a=[{evaluate:(e,t)=>{o.default.trace("evalute -> &&",e,t);const n=t,r=n.left.lexeme.evaluate(e,n.left),i=n.right.lexeme.evaluate(e,n.right);return r&&i},name:i.And,priority:2,regexp:/^(and\s|&&)/i,syntaxer:(e,t,n)=>Object.assign({left:e.slice(0,n),right:e.slice(n+1)},t)},{evaluate:(e,t)=>{o.default.trace("evalute -> ||",e,t);const n=t;return n.left.lexeme.evaluate(e,n.left)||n.right.lexeme.evaluate(e,n.right)},name:i.Or,priority:3,regexp:/^(or\s|\|\|)/i,syntaxer:(e,t,n)=>Object.assign({left:e.slice(0,n),right:e.slice(n+1)},t)},{name:i.BlockClose,nesting:-1,regexp:/^\)/},{evaluate:(e,t)=>{o.default.trace("evaluate -> ()",e,t);const n=t;return n.block.lexeme.evaluate(e,n.block)},name:i.BlockOpen,nesting:1,priority:1,regexp:/^\(/,syntaxer:e=>Object.assign({block:e.slice(1,e.length-1)},e[0]),when:[i.UnaryNot]},Object.assign({name:i.Operand},u),{evaluate:(e,t)=>{o.default.trace("evaluate -> binary",e,t);const n=t,r=n.left.lexeme.resolve(e,n.left),i=n.right.lexeme.resolve(e,n.right);switch(o.default.trace(`opValue: ${r}, expValue: ${i}`),t.value.toLowerCase()){case"eq":case"=":return r===i;case"gt":case">":return r>i;case"ge":case">=":return r>=i;case"lt":case"<":return r=|<=|>|<|!=|=|ge|le|gt|lt|eq|ne)/i,syntaxer:e=>{var t=r(e,3);let n=t[0],o=t[1],i=t[2];return Object.assign({left:n,right:i},o)},when:[i.Operand]},{evaluate:(e,t)=>{o.default.trace("evaluate -> unary",e,t);const n=t,r=n.block.lexeme.resolve(e,n.block);switch(t.value.toLowerCase()){case"is even":return"number"==typeof r&&r%2==0;case"is nil":return void 0===r||null===r;case"is bool":return"boolean"==typeof r;case"is odd":return"number"==typeof r&&r%2==1;case"is num":return"number"==typeof r;case"is object":return null!==r&&"object"==typeof r;case"is str":return"string"==typeof r;case"is prime":return"number"==typeof r&&(e=>{if(2===e)return!0;if(e<2||e%2==0)return!1;for(let t=3;t*t<=e;t+=2)if(e%t==0)return!1;return!0})(r);default:throw new Error}},name:i.UnaryOperator,priority:0,regexp:/^((is nil)|(is odd)|(is even)|(is bool)|(is num)|(is object)|(is str)|(is prime))/i,syntaxer:e=>{var t=r(e,2);let n=t[0],o=t[1];return Object.assign({block:n},o)},when:[i.Operand]},{evaluate:(e,t)=>{o.default.trace("evaluate -> unary not",e,t);const n=t;return!n.block.lexeme.evaluate(e,n.block)},name:i.UnaryNot,priority:1.5,regexp:/^!/,syntaxer:e=>Object.assign({block:e.slice(1,e.length)},e[0]),when:[i.UnaryNot]},Object.assign({name:i.Expression,when:[i.BinaryOperator]},u)];t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=u(n(3)),o=u(n(11)),i=u(n(18));function u(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e){this.query=e,this.evaluate=(e=>{if(!this.isValid||!this.tree){const e=`unable to evaluate target: syntax tree is invalid for query=${this.query}`;throw r.default.error(e),new Error(e)}const t=this.tree.lexeme.evaluate;return!!t&&t(e,this.tree)}),this.filter=(e=>e.filter(this.evaluate)),this.result=(0,i.default)((0,o.default)(this.query))}get isValid(){return this.result.valid}get tree(){return this.result.tree}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(3));const o=e=>{let t=0;const n=e.map(e=>{const n=Object.assign({},e,{nesting:t});return t+=e.lexeme.nesting||0,n}),i=n.filter(e=>0===e.nesting&&"number"==typeof e.lexeme.priority).sort((e,t)=>(t.lexeme.priority||-1)-(e.lexeme.priority||-1))[0];r.default.trace("parser -> pivot",i,e);const u=n.indexOf(i);if(i.lexeme.syntaxer){let t=i.lexeme.syntaxer(e,i,u);return Array.isArray(t.left)&&(t.left=o(t.left)),Array.isArray(t.right)&&(t.right=o(t.right)),Array.isArray(t.block)&&(t.block=o(t.block)),t}throw new Error(i.lexeme.name)};t.default=(e=>{const t=e.lexemes;if(!e.valid)return{valid:!1,error:`lexer -- ${e.error}`};try{return{tree:o(t),valid:!0}}catch(e){return{valid:!1,error:e}}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=((e,t=null)=>{if(t=t||(()=>{for(t=e;t&&"td"!==t.nodeName.toLowerCase();)t=t.parentElement;return t})(),!e||!t)return;let n=e;for(;"relative"!==getComputedStyle(n).position&&"sticky"!==getComputedStyle(n).position&&n.parentElement;)n=n.parentElement;let r=e;for(;"relative"!==getComputedStyle(r).position&&r.parentElement;)r=r.parentElement;const o=n.getBoundingClientRect(),i=r.getBoundingClientRect(),u=t.getBoundingClientRect(),a=u.left-o.left+n.scrollLeft,s=u.top-o.top+n.scrollTop+u.height;e.style.width=`${u.width}px`,e.style.top=`${s}px`,e.style.left=`${a}px`,e.style.position="absolute",u.top+u.height/2>i.bottom||u.top-u.height/2i.left+i.width?e.style.display="none":e.style.display="block"})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=function(e){return e&&e.__esModule?e:{default:e}}(r);class i extends r.PureComponent{constructor(e){super(e),this.handleChange=(e=>this.setState({value:e.target.value})),this.submit=(()=>this.state.value!==this.props.value&&this.props.submit(this.state.value)),this.state={value:e.value}}get propsWithDefaults(){return this.props}render(){var e=this.propsWithDefaults;const t=e.stopPropagation,n=e.updateOnBlur,r=e.updateOnSubmit;let i={onBlur:n?this.submit:void 0,onKeyDown:t?e=>e.stopPropagation():void 0,onSubmit:r?this.submit:void 0};return o.default.createElement("input",Object.assign({ref:"input",type:"text",value:this.state.value||"",onChange:this.handleChange},i))}}t.default=i,i.defaultProps={stopPropagation:!1,updateOnBlur:!0,updateOnSubmit:!0}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(this.props,[]);return function(e){c.forEach(function(t){return delete e[t]})}(o),o.className=this.props.inputClassName,o.id=this.state.inputId,o.style=n,u.default.createElement("div",{className:this.props.className,style:t},this.renderStyles(),u.default.createElement("input",r({},o,{ref:this.inputRef})),u.default.createElement("div",{ref:this.sizerRef,style:l},e),this.props.placeholder?u.default.createElement("div",{ref:this.placeHolderSizerRef,style:l},this.props.placeholder):null)}}]),t}();h.propTypes={className:a.default.string,defaultValue:a.default.any,extraWidth:a.default.oneOfType([a.default.number,a.default.string]),id:a.default.string,injectStyles:a.default.bool,inputClassName:a.default.string,inputRef:a.default.func,inputStyle:a.default.object,minWidth:a.default.oneOfType([a.default.number,a.default.string]),onAutosize:a.default.func,onChange:a.default.func,placeholder:a.default.string,placeholderIsMinWidth:a.default.bool,style:a.default.object,value:a.default.any},h.defaultProps={minWidth:1,injectStyles:!0},t.default=h},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Table=void 0;var r=u(n(23)),o=u(n(3)),i=u(n(25));function u(e){return e&&e.__esModule?e:{default:e}}o.default.setDebugLevel(r.default.debugLevel),o.default.setLogLevel(r.default.logLevel),t.Table=i.default},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),o=function(e){return e&&e.__esModule?e:{default:e}}(n(24));const i="dash_debug",u="dash_log";t.default=class{static get searchParams(){return new URL(window.location.href).searchParams||{get:()=>null}}static get debugLevel(){const e=this.searchParams.get(i)||o.default.get(i);return e&&r.DebugLevel[e]||r.DebugLevel.NONE}static get logLevel(){const e=this.searchParams.get(u)||o.default.get(u);return e&&r.LogLevel[e]||r.LogLevel.ERROR}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=864e5,o=63072e7;class i{static delete(e,t="",n="/"){let o=new Date((new Date).getTime()-r).toUTCString();document.cookie=`${e}=;expires=${o};domain=${t};path=${n}`}static get(e){if(!e.length)return;return e=e.toLowerCase(),(document.cookie.split(";").map(e=>{let t=e.split("=");return{id:t[0].trim(),value:t[1]}}).find(t=>e===t.id.toLocaleLowerCase())||{}).value}static set(e,t,n="",r="/"){let u=`${e}=${t};expires=${new Date((new Date).getTime()+o).toUTCString()};domain=${n};path=${r}`;i.get(e)&&i.delete(e,n,r),document.cookie=u}}t.default=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.propTypes=t.defaultProps=void 0;var r=n(1),o=a(r),i=a(n(0)),u=a(n(28));function a(e){return e&&e.__esModule?e:{default:e}}n(58);class s extends r.Component{render(){return o.default.createElement(u.default,this.props)}}t.default=s;const l=t.defaultProps={virtualization:"fe",virtualization_settings:{displayed_pages:1,current_page:0,page_size:250},navigation:"page",content_style:"fit",filtering:!1,filtering_settings:"",filtering_type:"basic",filtering_types:["basic"],sorting:!1,sorting_type:"single",sorting_settings:[],virtual_dataframe:[],virtual_dataframe_indices:[],column_conditional_dropdowns:[],column_static_dropdown:[],column_conditional_styles:[],column_static_style:[],row_conditional_styles:[],row_static_style:{},changed_data:{},dataframe:[],columns:[],editable:!1,active_cell:[],index_name:"",types:{},merged_styles:{},selected_cell:[[]],selected_rows:[],row_selectable:!1,table_style:[],base_styles:{numeric:{"text-align":"right","font-family":"'Droid Sans Mono', Courier, monospace"},string:{"text-align":"left"},input:{padding:0,margin:0,width:"80px",border:"none","font-size":"1rem"},"input-active":{outline:"#7FDBFF auto 3px"},table:{},thead:{},th:{},td:{}}},c=t.propTypes={active_cell:i.default.array,columns:i.default.arrayOf(i.default.object),content_style:i.default.oneOf(["fit","grow"]),dataframe:i.default.arrayOf(i.default.object),dataframe_previous:i.default.arrayOf(i.default.object),dataframe_timestamp:i.default.any,editable:i.default.bool,end_cell:i.default.arrayOf(i.default.number),id:i.default.string.isRequired,is_focused:i.default.bool,merge_duplicate_headers:i.default.bool,n_fixed_columns:i.default.number,n_fixed_rows:i.default.number,row_deletable:i.default.bool,row_selectable:i.default.oneOf(["single","multi",!1]),selected_cell:i.default.arrayOf(i.default.arrayOf(i.default.number)),selected_rows:i.default.arrayOf(i.default.number),setProps:i.default.any,start_cell:i.default.arrayOf(i.default.number),style_as_list_view:i.default.bool,table_style:i.default.arrayOf(i.default.shape({selector:i.default.string,rule:i.default.string})),virtualization:i.default.oneOf(["fe","be",!0,!1]),virtualization_settings:i.default.shape({displayed_pages:i.default.number,current_page:i.default.number,page_size:i.default.number}),navigation:i.default.string,column_conditional_dropdowns:i.default.arrayOf(i.default.shape({id:i.default.string,dropdowns:i.default.arrayOf(i.default.shape({condition:i.default.string,dropdown:i.default.arrayOf(i.default.shape({label:i.default.string,value:i.default.any}))}))})),column_static_dropdown:i.default.arrayOf(i.default.shape({id:i.default.string,dropdown:i.default.arrayOf(i.default.shape({label:i.default.string,value:i.default.any}))})),column_conditional_style:i.default.arrayOf(i.default.shape({id:i.default.string,styles:i.default.arrayOf(i.default.shape({condition:i.default.string,style:i.default.object}))})),column_static_style:i.default.arrayOf(i.default.shape({id:i.default.string,style:i.default.object})),row_conditional_styles:i.default.arrayOf(i.default.shape({condition:i.default.string,style:i.default.object})),row_static_style:i.default.object,filtering:i.default.oneOf(["fe","be",!0,!1]),filtering_settings:i.default.string,filtering_type:i.default.oneOf(["basic"]),filtering_types:i.default.arrayOf(i.default.oneOf(["basic"])),sorting:i.default.oneOf(["fe","be",!0,!1]),sorting_type:i.default.oneOf(["single","multi"]),sorting_settings:i.default.arrayOf(i.default.shape({columnId:i.default.oneOfType([i.default.string,i.default.number]),direction:i.default.oneOf(["asc","desc"])})),sorting_treat_empty_string_as_none:i.default.bool,virtual_dataframe:i.default.arrayOf(i.default.object),virtual_dataframe_indices:i.default.arrayOf(i.default.number),dropdown_properties:i.default.any};s.defaultProps=l,s.propTypes=c},function(e,t,n){"use strict";var r=n(27);function o(){}e.exports=function(){function e(e,t,n,o,i,u){if(u!==r){var a=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw a.name="Invariant Violation",a}}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t};return n.checkPropTypes=o,n.PropTypes=n,n}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=c(r),i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),u=n(5),a=c(n(29)),s=c(n(33)),l=c(n(50));function c(e){return e&&e.__esModule?e:{default:e}}n(51),n(54),n(56);t.default=class extends r.Component{constructor(e){super(e),this.__adapter=(0,u.memoizeOne)(()=>new l.default(this)),this.__setProps=(0,u.memoizeOne)(e=>e?t=>{if(i.has("dataframe",t)){const e=this.props.dataframe;t.dataframe_timestamp=Date.now(),t.dataframe_previous=e}e(t)}:e=>this.setState(e)),this.__virtualizer=(0,u.memoizeOne)((e,t)=>a.default.getVirtualizer(this.adapter))}get setProps(){return this.__setProps(this.props.setProps)}render(){const e=this.setProps,t=this.virtualizer;return t.refresh(),o.default.createElement(s.default,Object.assign({},i.mergeAll([this.props,this.state,{setProps:e,virtualizer:t}])))}get adapter(){return this.__adapter()}get virtualizer(){var e=this.props;const t=e.virtualization,n=e.virtualization_settings;return this.__virtualizer(t,n)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=u(n(30)),o=u(n(31)),i=u(n(32));function u(e){return e&&e.__esModule?e:{default:e}}t.default=class{static getVirtualizer(e){switch(e.virtualization){case!1:return new i.default(e);case!0:case"fe":return new o.default(e);case"be":return new r.default(e);default:throw new Error(`Unknown virtualization type: '${e.virtualization}'`)}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(10));t.default=class extends r.default{constructor(e){super(e)}getDataframe(){var e=this.target;return{dataframe:e.dataframe,indices:e.indices}}get offset(){return 0}loadNext(){let e=this.target.settings;e.current_page++,this.target.update({settings:e})}loadPrevious(){let e=this.target.settings;e.current_page<=0||(e.current_page--,this.target.update({settings:e}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(10));t.default=class extends r.default{constructor(e){super(e)}getDataframe(){var e=this.target;let t=e.settings,n=e.dataframe,r=e.indices,o=Math.min(t.current_page,Math.floor(n.length/t.page_size));return this.firstIndex=t.page_size*o,this.lastIndex=Math.min(this.firstIndex+t.displayed_pages*t.page_size,n.length),{dataframe:n.slice(this.firstIndex,this.lastIndex),indices:r.slice(this.firstIndex,this.lastIndex)}}get offset(){return this.firstIndex}loadNext(){var e=this.target;let t=e.settings,n=e.dataframe,r=Math.floor(n.length/t.page_size);t.current_page>=r||(t.current_page++,this.target.update({settings:t}))}loadPrevious(){let e=this.target.settings;e.current_page<=0||(e.current_page--,this.target.update({settings:e}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=function(e){return e&&e.__esModule?e:{default:e}}(n(10));t.default=class extends o.default{constructor(e){super(e),this.refresh()}getDataframe(){let e=this.target.dataframe;return{dataframe:e,indices:r.range(0,e.length)}}get offset(){return 0}loadNext(){}loadPrevious(){}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=m(r),i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),u=m(n(34)),a=n(13),s=n(14),l=n(35),c=n(36),p=m(c),d=m(n(3)),f=n(5),h=m(n(11)),v=m(n(39)),g=m(n(42)),y=m(n(19)),b=m(n(46));function m(e){return e&&e.__esModule?e:{default:e}}const x=i.sort((e,t)=>e-t);t.default=class extends r.Component{constructor(e){super(e),this.getLexerResult=(0,f.memoizeOne)(h.default),this.handleClickOutside=(e=>{const t=this.$el;t&&!t.contains(e.target)&&this.props.is_focused&&this.props.setProps({is_focused:!1})}),this.handlePaste=(e=>{const t=this.$el;t&&t.contains(document.activeElement)&&this.onPaste(e)}),this.handleResize=(()=>{var e=this.refs;const t=e.r0c0,n=e.r0c1,r=e.r1c0,o=e.r1c1;var u=this.props;const a=u.n_fixed_columns,s=u.n_fixed_rows,l=u.table_style;i.forEach(({selector:e,rule:t})=>{this.stylesheet.setRule(e,t)},l);let c=n.querySelectorAll("tr");t.querySelectorAll("tr").forEach((e,t)=>{const n=c[t];e.style.height=getComputedStyle(n).height});let p=o.querySelectorAll("tr > th:first-of-type");r.querySelectorAll("tr > th:first-of-type").forEach((e,t)=>{const n=p[t].parentElement;e.parentElement.style.height=getComputedStyle(n).height});const d=o.querySelector("tr > td:first-of-type");if(d){const e=d.parentElement;this.stylesheet.setRule(".cell-1-0 tr",`height: ${getComputedStyle(e).height}`)}s&&o.querySelectorAll("tr:first-of-type td").forEach((e,t)=>{const n=getComputedStyle(e).width;this.stylesheet.setRule(`.dash-fixed-row:not(.dash-fixed-column) th:nth-of-type(${t+1})`,`width: ${n}; min-width: ${n}; max-width: ${n};`)}),a&&s&&r.querySelectorAll("tr:first-of-type td").forEach((e,t)=>{const n=getComputedStyle(e).width;this.stylesheet.setRule(`.dash-fixed-column.dash-fixed-row th:nth-of-type(${t+1})`,`width: ${n}; min-width: ${n}; max-width: ${n};`)})}),this.handleKeyDown=(e=>{var t=this.props;const n=t.active_cell,r=t.columns,o=t.setProps,i=t.is_focused,u=t.editable;if(d.default.trace(`handleKeyDown: ${e.key}`),(0,s.isCtrlMetaKey)(e.keyCode))return;const l=(0,s.isCtrlDown)(e);l&&e.keyCode===s.KEY_CODES.V||e.keyCode===s.KEY_CODES.C&&l&&!i||(e.keyCode!==s.KEY_CODES.ESCAPE?e.keyCode!==s.KEY_CODES.ENTER||i||!(0,a.colIsEditable)(u,r[n[1]])?i&&e.keyCode!==s.KEY_CODES.TAB&&e.keyCode!==s.KEY_CODES.ENTER||((0,s.isNavKey)(e.keyCode)?this.switchCell(e):e.keyCode===s.KEY_CODES.BACKSPACE||e.keyCode===s.KEY_CODES.DELETE?this.deleteCell(e):this.props.is_focused||!(0,a.colIsEditable)(u,r[n[1]])||(0,s.isMetaKey)(e.keyCode)||o({is_focused:!0})):o({is_focused:!0}):o({is_focused:!1}))}),this.switchCell=(e=>{const t=e;var n=this.props;const r=n.active_cell,o=n.columns,u=n.row_deletable,a=n.row_selectable,l=n.selected_cell,c=n.setProps,p=n.virtualizer.dataframe;e.preventDefault(),this.$el.focus();const d=l.length>1,f=t.keyCode===s.KEY_CODES.ENTER||t.keyCode===s.KEY_CODES.TAB;if(d&&f)return void c({is_focused:!1,active_cell:this.getNextCell(t,{currentCell:r,restrictToSelection:!0})});if(!t.shiftKey){const e=this.getNextCell(t,{currentCell:r,restrictToSelection:!1});return void c({is_focused:!1,selected_cell:[e],active_cell:e})}let h=[],v=[];const g=x(i.uniq(i.pluck(0,l))),y=x(i.uniq(i.pluck(1,l))),b=g[0],m=y[0],w=g[g.length-1],E=y[y.length-1],_=(u?1:0)+(a?1:0),O=[];o.forEach((e,t)=>{e.hidden||O.push(t+_)});const S=t.keyCode===s.KEY_CODES.ARROW_DOWN||t.keyCode===s.KEY_CODES.ENTER,C=t.keyCode===s.KEY_CODES.ARROW_UP,A=t.keyCode===s.KEY_CODES.ARROW_RIGHT||t.keyCode===s.KEY_CODES.TAB,k=t.keyCode===s.KEY_CODES.ARROW_LEFT;S&&r[0]>b?v=y.map(e=>[b,e]):S&&w!==p.length-1?h=y.map(e=>[w+1,e]):C&&r[0][w,e]):C&&b>0?h=y.map(e=>[b-1,e]):k&&r[1][e,E]):k&&m>0?h=g.map(e=>[e,m-1]):A&&r[1]>m?v=g.map(e=>[e,m]):A&&E+1<=i.last(O)&&(h=g.map(e=>[e,E+1])),c({is_focused:!1,selected_cell:i.without(v,i.uniq(i.concat(h,l)))})}),this.deleteCell=(e=>{var t=this.props;const n=t.columns,r=t.dataframe,o=t.editable,u=t.row_deletable,s=t.row_selectable,l=t.selected_cell,c=t.setProps,p=t.virtual_dataframe_indices;e.preventDefault();let d=r;const f=(u?1:0)+(s?1:0);i.map(e=>[p[e[0]],e[1]-f],l).forEach(e=>{(0,a.colIsEditable)(o,n[e[1]])&&(d=i.set(i.lensPath([e[0],n[e[1]].id]),"",d))}),c({dataframe:d})}),this.getNextCell=((e,{restrictToSelection:t,currentCell:n})=>{var r=this.props;const o=r.columns,u=r.row_deletable,a=r.row_selectable,c=r.selected_cell,p=r.virtualizer.dataframe,d=e,f=[],h=(u?1:0)+(a?1:0);switch(t||o.forEach((e,t)=>{e.hidden||f.push(t+h)}),d.keyCode){case s.KEY_CODES.ARROW_LEFT:return t?(0,l.selectionCycle)([n[0],n[1]-1],c):[n[0],i.max(f[0],f[i.indexOf(n[1],f)-1])];case s.KEY_CODES.ARROW_RIGHT:case s.KEY_CODES.TAB:return t?(0,l.selectionCycle)([n[0],n[1]+1],c):[n[0],i.min(i.last(f),f[i.indexOf(n[1],f)+1])];case s.KEY_CODES.ARROW_UP:return t?(0,l.selectionCycle)([n[0]-1,n[1]],c):[i.max(0,n[0]-1),n[1]];case s.KEY_CODES.ARROW_DOWN:case s.KEY_CODES.ENTER:return t?(0,l.selectionCycle)([n[0]+1,n[1]],c):[i.min(p.length-1,n[0]+1),n[1]];default:throw new Error(`Table.getNextCell: unknown navigation keycode ${d.keyCode}`)}}),this.onCopy=(e=>{var t=this.props;const n=t.columns,r=t.row_deletable,o=t.row_selectable,u=t.selected_cell,a=t.virtualizer.dataframe,s=(r?1:0)+(o?1:0),l=i.map(e=>[e[0],e[1]-s],u);v.default.toClipboard(e,l,n,a),this.$el.focus()}),this.onPaste=(e=>{var t=this.props;const n=t.active_cell,r=t.columns,o=t.dataframe,i=t.editable,u=t.filtering_settings,a=t.row_deletable,s=t.row_selectable,l=t.setProps,c=t.sorting_settings,p=t.virtual_dataframe_indices;if(!i)return;const d=(a?1:0)+(s?1:0),f=[n[0],n[1]-d],h=v.default.fromClipboard(e,f,p,r,o,!0,!c.length||!u.length);h&&l(h)}),this.loadNext=(()=>{this.props.virtualizer.loadNext()}),this.loadPrevious=(()=>{this.props.virtualizer.loadPrevious()}),this.onContainerScroll=(e=>{if(!this.props.n_fixed_columns)return;const t=this.refs.spreadsheet;e.target===t&&this.stylesheet.setRule(".frozen-left",`margin-top: ${-e.target.scrollTop}px;`)}),this.applyStyle=((e,t,n)=>{let r=0;t&&(this.stylesheet.setRule(`.dash-spreadsheet-inner td.column-${r}`,"width: 30px; max-width: 30px; min-width: 30px;"),++r),n&&(this.stylesheet.setRule(`.dash-spreadsheet-inner td.column-${r}`,"width: 30px; max-width: 30px; min-width: 30px;"),++r),i.forEach(e=>{const t=u.default.unit(e.width||c.DEFAULT_CELL_WIDTH,"px"),n=u.default.unit(e.maxWidth||e.width||c.DEFAULT_CELL_WIDTH,"px"),o=u.default.unit(e.minWidth||e.width||c.DEFAULT_CELL_WIDTH,"px");this.stylesheet.setRule(`.dash-spreadsheet-inner td.column-${r}`,`width: ${t}; max-width: ${n}; min-width: ${o};`),this.stylesheet.setRule(`.dash-spreadsheet-inner th.column-${r}`,`width: ${t}; max-width: ${n}; min-width: ${o};`),++r},e)}),this.renderFragment=(e=>e?o.default.createElement("table",{tabIndex:-1},o.default.createElement("tbody",null,e.map((e,t)=>o.default.createElement("tr",{key:`row-${t}`},e)))):null),this.handleSetFilter=(e=>this.props.setProps({filtering_settings:e})),this.getCells=(()=>[...p.default.createHeaders(this.props),...this.filterFactory.createFilters(),...this.cellFactory.createCells()]),this.getFragments=((e,t,n)=>{const r=t?i.map(e=>e.splice(0,i.reduceWhile(e=>e.count(e.cells++,e.count+=t.props.colSpan||1,e),{cells:0,count:0},e).cells),e):null,o=n?e.splice(0,n):null,u=n&&r?r.splice(0,n):null;return[[this.renderFragment(u),this.renderFragment(o)],[this.renderFragment(r),this.renderFragment(e)]]}),this.handleDropdown=(()=>{const e=this.refs.r1c1;(0,y.default)(e.querySelector(".Select-menu-outer"))}),this.onScroll=(e=>{const t=this.refs.r0c1;d.default.trace(`ControlledTable fragment scrolled to (left,top)=(${e.target.scrollLeft},${e.target.scrollTop})`),t.style.marginLeft=`${-e.target.scrollLeft}px`,this.handleDropdown()}),this.cellFactory=new g.default(()=>this.props),this.filterFactory=new b.default(()=>{var e=this.props;const t=e.row_deletable,n=e.row_selectable,r=(t?1:0)+(n?1:0);return{columns:this.props.columns,filtering:this.props.filtering,filtering_settings:this.props.filtering_settings,filtering_type:this.props.filtering_type,id:this.props.id,offset:r,setFilter:this.handleSetFilter}}),this.stylesheet=new u.default(`#${e.id}`)}get lexerResult(){const e=this.props.filtering_settings;return this.getLexerResult(e)}componentDidMount(){this.props.selected_cell.length&&!i.contains(this.props.active_cell,this.props.selected_cell)&&this.props.setProps({active_cell:this.props.selected_cell[0]}),this.handleResize()}componentWillMount(){window.addEventListener("resize",this.handleResize),document.addEventListener("paste",this.handlePaste),document.addEventListener("mousedown",this.handleClickOutside)}componentWillUnmount(){window.removeEventListener("resize",this.handleResize),document.removeEventListener("mousedown",this.handleClickOutside),document.removeEventListener("paste",this.handlePaste)}componentDidUpdate(){this.handleResize(),this.handleDropdown()}get $el(){return document.getElementById(this.props.id)}get displayPagination(){var e=this.props;const t=e.dataframe,n=e.navigation,r=e.virtualization,o=e.virtualization_settings;return"page"===n&&("fe"===r&&o.page_sizeo.default.createElement("div",{key:`r${t}`,ref:`r${t}`,className:`row row-${t}`,onScroll:this.onScroll},e.map((e,n)=>o.default.createElement("div",{key:n,ref:`r${t}c${n}`,className:`cell cell-${t}-${n} ${p[t][n]}`},e)))))),this.displayPagination?o.default.createElement("div",null,o.default.createElement("button",{className:"previous-page",onClick:this.loadPrevious},"Previous"),o.default.createElement("button",{className:"next-page",onClick:this.loadNext},"Next")):null)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(3));class o{constructor(e){this.name=e}get rules(){const e=this.sheet;return Array.from(e.rules||e.cssRules)}addRule(e,t){this.sheet.addRule?this.sheet.addRule(e,t):this.sheet.insertRule(`${e} { ${t} }`,0)}deleteRule(e){this.sheet.deleteRule(e)}findRule(e){const t=this.rules,n=t.findIndex(t=>t.selectorText===e);return-1===n?null:{rule:t[n],index:n}}get sheet(){return(this.__stylesheet=this.__stylesheet||(()=>{const e=document.createElement("style");return e.type="text/css",e.id=this.name,document.getElementsByTagName("head")[0].appendChild(e),e})()).sheet}}class i{constructor(e){this.prefix=e,this.stylesheet=new o(`${e}-dynamic-inline.css`)}static unit(e,t="px"){return i.hasUnit(e)?e:`${e}${t}`}static hasUnit(e){return"string"==typeof e&&/^\d+(\.\d+)?(px|em|rem|%)$/.test(e)}deleteRule(e){e=`${this.prefix} ${e}`;const t=this.stylesheet.findRule(e);t&&this.stylesheet.deleteRule(t.index)}setRule(e,t){e=`${this.prefix} ${e}`;const n=this.stylesheet.findRule(e);if(n){if(n.rule.cssText===t||n.rule.cssText===`${e} { ${t} }`)return;this.stylesheet.deleteRule(n.index)}this.stylesheet.addRule(e,t),r.default.trace("stylesheet",e,t)}}t.default=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var u,a=e[Symbol.iterator]();!(r=(u=a.next()).done)&&(n.push(u.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();t.selectionCycle=function(e,t){const n=o.uniq(o.pluck(0,t)).sort((e,t)=>e-t),i=o.uniq(o.pluck(1,t)).sort((e,t)=>e-t),u=n[0],a=i[0],s=n[n.length-1],l=i[i.length-1];var c=r(e,2);const p=c[0],d=c[1],f=[p,d];p>s&&(f[0]=u,f[1]=d+1>l?a:d+1);pl&&(f[1]=a,f[0]=p+1>s?u:p+1);dArray.isArray(e.name)?e.name.length:1,d=(e,t)=>Array.isArray(e.name)?e.name[t]:"";class f{static getSorting(e,t){const n=o.find(t=>t.columnId===e,t);return n?n.direction:i.SortDirection.None}static doSort(e,t){return()=>{const n=t.sorting_settings,r=t.sorting_type;let o;switch(f.getSorting(e,n)){case i.SortDirection.Descending:o=i.SortDirection.Ascending;break;case i.SortDirection.Ascending:o=i.SortDirection.None;break;case i.SortDirection.None:default:o=i.SortDirection.Descending}const s="single"===r?a.default:u.default;t.setProps({sorting_settings:s(n,{columnId:e,direction:o})})}}static getSortingIcon(e,t){const n=t.sorting_settings;switch(f.getSorting(e,n)){case i.SortDirection.Descending:return"↑";case i.SortDirection.Ascending:return"↓";case i.SortDirection.None:default:return"↕"}}static createHeaderCells(e){const t=e.columns,n=e.columnRowIndex,i=e.labels,u=e.mergeCells,a=e.offset,l=e.rowSorting,c=e.virtualization;let p=[];if(u){p=[0];let e=0;i.forEach((n,r)=>{t[r].hidden||n===i[e]||(p.push(r),e=r)})}else p=o.range(0,t.length);return o.filter(e=>!!e,p.map((d,h)=>{const v=t[d];if(v.hidden)return null;let g;if(u){const e=o.slice(d,p[h+1]||1/0,t).filter(o.propEq("hidden",!0)).length;g=d===o.last(p)?i.length-d-e:p[h+1]-d-e}else g=1;return r.default.createElement("th",{key:`header-cell-${d}`,colSpan:g,className:`column-${d+a} `+(d===t.length-1||d===o.last(p)?"cell--right-last ":"")},l?r.default.createElement("span",{className:"sort",onClick:f.doSort(v.id,e)},f.getSortingIcon(v.id,e)):"",v.editable_name&&"Boolean"===o.type(v.editable_name)||"Number"===o.type(v.editable_name)&&v.editable_name===n?r.default.createElement("span",{className:"column-header--edit",onClick:function(e,t,n){return()=>{(0,n.setProps)(s.editColumnName(e,t,n))}}(v,n,e)},"✎"):"",v.deletable&&"be"!==c&&"Boolean"===o.type(v.deletable)||"Number"===o.type(v.deletable)&&v.deletable===n?r.default.createElement("span",{className:"column-header--delete",onClick:function(e,t,n){return()=>{(0,n.setProps)(s.deleteColumn(e,t,n))}}(v,n,e)},"×"):"",r.default.createElement("span",null,i[d]))}))}static createDeletableHeader(e){return e.row_deletable?r.default.createElement("th",{key:"delete",className:"expanded-row--empty-cell",style:{width:"30px",maxWidth:"30px",minWidth:"30px"}}):null}static createSelectableHeader(e){return e.row_selectable?r.default.createElement("th",{key:"select",className:"expanded-row--empty-cell",style:{width:"30px",maxWidth:"30px",minWidth:"30px"}}):null}static createHeaders(e){let t=e.columns,n=e.dataframe,r=e.sorting,i=e.merge_duplicate_headers,u=e.n_fixed_columns,a=e.row_deletable,s=e.row_selectable,l=e.setProps,c=e.sorting_settings,h=e.sorting_type,v=e.virtualization;const g=(a?1:0)+(s?1:0),y=this.createDeletableHeader(e),b=this.createSelectableHeader(e),m=Math.max.apply(Math,t.map(p));let x;return x=1===m?[[...y?[y]:[],...b?[b]:[],...f.createHeaderCells({columns:t,columnRowIndex:0,dataframe:n,labels:o.pluck("name",t),n_fixed_columns:u,offset:g,rowSorting:r,setProps:l,sorting_settings:c,sorting_type:h,virtualization:v})]]:o.range(0,m).map(e=>[...y?[y]:[],...b?[b]:[],...f.createHeaderCells({columns:t,columnRowIndex:e,dataframe:n,labels:t.map(t=>o.isNil(t.name)&&e===m-1?t.id:d(t,e)),n_fixed_columns:u,offset:g,rowSorting:!!r&&e+1===m,mergeCells:i&&e+1!==m,setProps:l,sorting_settings:c,sorting_type:h,virtualization:v})])}}t.default=f},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=function(e){return e&&e.__esModule?e:{default:e}}(n(3)),i=n(7);t.default=((e,t)=>{if(o.default.trace("multi - updateSettings",e,t),e=r.clone(e),t.direction===i.SortDirection.None){const n=r.findIndex(e=>e.columnId===t.columnId,e);-1!==n&&e.splice(n,1)}else{const n=r.find(e=>e.columnId===t.columnId,e);n?n.direction=t.direction:e.push(t)}return e})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(3)),o=n(7);t.default=((e,t)=>(r.default.trace("single - updateSettings",e,t),t.direction===o.SortDirection.None?[]:[t]))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=s(n(40)),i=s(n(41)),u=s(n(3)),a=n(13);function s(e){return e&&e.__esModule?e:{default:e}}t.default=class{static toClipboard(e,t,n,a){const s=r.uniq(r.pluck(0,t).sort((e,t)=>e-t)),l=r.uniq(r.pluck(1,t).sort((e,t)=>e-t)),c=r.slice(r.head(s),r.last(s)+1,a).map(e=>r.props(l,r.props(r.pluck("id",n),e))),p=o.default.prototype.stringify(c);u.default.trace("TableClipboard -- set clipboard data: ",p),i.default.set(e,p)}static fromClipboard(e,t,n,s,l,c=!0,p=!0){const d=i.default.get(e);if(u.default.trace("TableClipboard -- get clipboard data: ",d),!d)return;const f=o.default.prototype.parse(d);let h=l;const v=s;if(c&&f[0].length+t[1]>=s.length)for(let e=s.length;et[`Column ${e}`]="");p&&u.default.debug("Clipboard -- Sorting or filtering active, do not create new rows");const g=n[t[0]];if(p&&f.length+g>=l.length){const e={};s.forEach(t=>e[t.id]=""),h=r.concat(h,r.repeat(e,f.length+g-l.length))}return f.forEach((e,o)=>e.forEach((e,i)=>{const u=t[0]+o;if(n.length<=t[0]+o)return;const s=n[u],l=t[1]+i,c=v[l];c&&(0,a.colIsEditable)(!0,c)&&(h=r.set(r.lensPath([s,c.id]),e,h))})),{dataframe:h,columns:v}}}},function(e,t){!function(t){"use strict";function n(){}function r(e){return e.split('"').length-1}n.prototype=Object.create(Object.prototype,{parse:{value:function(e){var t,n,o,i,u,a,s,l=[],c=0;for((o=e.split("\n")).length>1&&""===o[o.length-1]&&o.pop(),t=0,n=o.length;t0&&(u+="\t"),"string"==typeof(i=e[t][r])?i.indexOf("\n")>-1?u+='"'+i.replace(/"/g,'""')+'"':u+=i:u+=null===i||void 0===i?"":i;u+="\n"}return u},enumerable:!0,configurable:!1,writable:!1}}),void 0!==e&&e.exports?e.exports=n:t.SheetClip=n}(this)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.default=class{static set(e,t){e.clipboardData.setData("text/plain",t),e.preventDefault()}static get(e){let t;return t=e.clipboardData?e.clipboardData.getData("text/plain"):void 0}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=s(n(2)),o=a(n(1)),i=a(n(43)),u=s(n(15));function a(e){return e&&e.__esModule?e:{default:e}}function s(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}t.default=class{constructor(e){this.propsFn=e,this.handlers=new Map,this.isCellSelected=((e,t,n)=>e&&r.contains([t,n],e)),this.getEventHandler=((e,t,n)=>{const r=this.handlers.get(e)||this.handlers.set(e,new Map).get(e),o=r.get(t)||r.set(t,new Map).get(t);return o.get(n)||o.set(n,e.bind(this,t,n)).get(n)}),this.handleClick=((e,t,n)=>{var o=this.props;const i=o.columns,u=o.editable,a=o.is_focused,s=o.row_deletable,l=o.row_selectable,c=o.selected_cell,p=o.setProps,d=this.isCellSelected(c,e,t);if(!u)return;if(a||n.preventDefault(),d)return;const f=(s?1:0)+(l?1:0);n.preventDefault();const h=[e,t+f],v={is_focused:!1,active_cell:h},g=[];i.forEach((e,t)=>{e.hidden||g.push(t+f)});const y=r.uniq(r.pluck(0,c)).sort((e,t)=>e-t),b=r.uniq(r.pluck(1,c)).sort((e,t)=>e-t),m=y[0],x=b[0];n.shiftKey?v.selected_cell=r.xprod(r.range(r.min(m,h[0]),r.max(m,h[0])+1),r.range(r.min(x,h[1]),r.max(x,h[1])+1)).filter(e=>r.contains(e[1],g)):v.selected_cell=[h],p(v)}),this.handleDoubleClick=((e,t,n)=>{var r=this.props;const o=r.editable,i=r.is_focused,u=r.row_deletable,a=r.row_selectable,s=r.setProps;if(!o)return;const l=[e,t+((u?1:0)+(a?1:0))];i||(n.preventDefault(),s({selected_cell:[l],active_cell:l,is_focused:!0}))}),this.handleChange=((e,t,n)=>{var o=this.props;const i=o.columns,u=o.dataframe,a=o.editable,s=o.setProps,l=i[t];a&&s({dataframe:r.set(r.lensPath([e,l.id]),n,u)})}),this.handlePaste=(e=>{e.preventDefault()})}get props(){return this.propsFn()}rowSelectCell(e){var t=this.props;const n=t.setProps,i=t.selected_rows,u=t.row_selectable;return u?o.default.createElement("td",{key:"select",className:"select-cell",style:{width:"30px",maxWidth:"30px",minWidth:"30px"}},o.default.createElement("input",{type:"single"===u?"radio":"checkbox",name:"row-select",checked:r.contains(e,i),onChange:()=>n({selected_rows:"single"===u?[e]:r.ifElse(r.contains(e),r.without([e]),r.append(e))(i)})})):null}rowDeleteCell(e){var t=this.props;const n=t.setProps;return t.row_deletable?o.default.createElement("td",{key:"delete",className:"delete-cell",onClick:()=>n(u.deleteRow(e,this.props)),style:{width:"30px",maxWidth:"30px",minWidth:"30px"}},"×"):null}createCells(){var e=this.props;const t=e.active_cell,n=e.columns,u=e.column_conditional_dropdowns,a=e.column_conditional_styles,s=e.column_static_dropdown,l=e.column_static_style,c=e.dropdown_properties,p=e.editable,d=e.id,f=e.is_focused,h=e.row_deletable,v=e.row_selectable,g=e.selected_cell,y=e.virtualizer,b=y.dataframe,m=y.indices,x=n.filter(e=>!e.hidden),w=(h?1:0)+(v?1:0);return b.map((e,h)=>{const v=m[h],y=this.rowDeleteCell(v),b=this.rowSelectCell(v),E=x.map((y,b)=>{b+=w;let m=(c&&c[y.id]&&(c[y.id].length>v?c[y.id][v]:null)||y||{}).options;const x=n.indexOf(y),E=[`column-${x+w}`];let _=u.find(e=>e.id===y.id),O=s.find(e=>e.id===y.id);_=_&&_.dropdowns,O=m||O&&O.dropdown;let S=a.find(e=>e.id===y.id),C=l.find(e=>e.id===y.id);return S=S&&S.styles,C=C&&C.style,o.default.createElement(i.default,{key:`${y.id}-${b}`,active:t[0]===h&&t[1]===x+w,classes:E,clearable:y.clearable,conditionalDropdowns:_,conditionalStyles:S,datum:e,editable:p,focused:!!f,onClick:this.getEventHandler(this.handleClick,h,x),onDoubleClick:this.getEventHandler(this.handleDoubleClick,h,x),onPaste:this.handlePaste,onChange:this.getEventHandler(this.handleChange,v,x),property:y.id,selected:r.contains([h,x+w],g),staticDropdown:O,staticStyle:C,tableId:d,type:y.type,value:e[y.id]})});return b&&E.unshift(b),y&&E.unshift(y),E})}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(1),i=f(o),u=f(n(44)),a=n(12),s=n(5),l=f(n(45)),c=f(n(17)),p=n(14),d=f(n(19));function f(e){return e&&e.__esModule?e:{default:e}}class h extends o.Component{constructor(e){super(e),this.getDropdown=(0,s.memoizeOne)((...e)=>e.length?e.slice(-1)[0]:void 0),this.getStyle=(0,s.memoizeOne)((...e)=>e.length?r.mergeAll(e):void 0),this.propagateChange=(()=>{if(this.state.value===this.props.value)return;(0,this.props.onChange)(this.state.value)}),this.handleChange=(e=>{this.setState({value:e.target.value})}),this.handleKeyDown=(e=>{e.keyCode!==p.KEY_CODES.ENTER&&e.keyCode!==p.KEY_CODES.TAB||this.propagateChange()}),this.handleOpenDropdown=(()=>{var e=this.refs;const t=e.dropdown,n=e.td;(0,d.default)(t.wrapper.querySelector(".Select-menu-outer"),n)}),this.state={value:e.value}}get propsWithDefaults(){return this.props}get classes(){var e=this.propsWithDefaults;let t=e.active,n=e.classes,r=e.editable,o=e.selected,i=e.type;return[...t?["focused"]:[],...r?[]:["cell--uneditable"],...o?["cell--selected"]:[],..."dropdown"===i?["dropdown"]:[],...n]}renderDropdown(){var e=this.propsWithDefaults;const t=e.clearable,n=e.onChange,r=e.value,o=this.dropdown;return o?i.default.createElement(u.default,{ref:"dropdown",clearable:t,onChange:e=>{n(e?e.value:e)},onOpen:this.handleOpenDropdown,options:o,placeholder:"",value:r}):this.renderValue()}renderInput(){var e=this.propsWithDefaults;const t=e.active,n=e.focused,r=e.onClick,o=e.onDoubleClick,u=e.onPaste,a={className:[...t?["input-active"]:[],...n?["focused"]:["unfocused"],...["cell-value"]].join(" "),onClick:r,onDoubleClick:o};return t||this.state.value!==this.props.value?i.default.createElement("input",Object.assign({ref:"textInput",type:"text",value:this.state.value,onBlur:this.propagateChange,onChange:this.handleChange,onKeyDown:this.handleKeyDown,onPaste:u},a)):this.renderValue(a)}renderValue(e={}){const t=this.propsWithDefaults.value;return i.default.createElement("div",Object.assign({},e),t)}renderInner(){switch(this.props.type){case"text":case"numeric":return this.renderInput();case"dropdown":return this.renderDropdown();default:return this.renderValue()}}get dropdown(){var e=this.propsWithDefaults;let t=e.conditionalDropdowns,n=e.datum,o=e.property,i=e.staticDropdown,u=e.tableId;const a=[...i?[i]:[],...r.map(([e])=>e.dropdown,r.filter(([e,t])=>h.dropdownAstCache([u,o,t],[e.condition]).evaluate(n),r.addIndex(r.map)((e,t)=>[e,t],t)))];return this.getDropdown(...a)}get style(){var e=this.propsWithDefaults;let t=e.conditionalStyles,n=e.datum,o=e.property,i=e.staticStyle,u=e.tableId;const a=[i,...r.map(([e])=>e.style,r.filter(([e,t])=>h.styleAstCache([u,o,t],[e.condition]).evaluate(n),r.addIndex(r.map)((e,t)=>[e,t],t)))];return this.getStyle(...a)}render(){return i.default.createElement("td",{ref:"td",tabIndex:-1,className:this.classes.join(" "),style:this.style},this.renderInner())}componentWillReceiveProps(e){const t=e.value;this.state.value!==t&&this.setState({value:t})}componentDidUpdate(){const e=this.propsWithDefaults.active,t=this.refs.textInput;e&&t&&document.activeElement!==t&&(t.focus(),t.setSelectionRange(0,t.value?t.value.length:0)),e&&this.refs.dropdown&&this.refs.td.focus()}shouldComponentUpdate(e,t){const n=this.props,r=this.state;return!(0,a.isEqual)(n,e,!0)||!(0,a.isEqual)(r,t,!0)}}t.default=h,h.dropdownAstCache=(0,l.default)(e=>new c.default(e)),h.styleAstCache=(0,l.default)(e=>new c.default(e)),h.defaultProps={classes:[],conditionalDropdowns:[],conditionalStyles:[],staticStyle:{},type:"text"}},function(e,t,n){"use strict";n.r(t),n.d(t,"Async",function(){return V}),n.d(t,"AsyncCreatable",function(){return Y}),n.d(t,"Creatable",function(){return L}),n.d(t,"Value",function(){return F}),n.d(t,"Option",function(){return k}),n.d(t,"defaultMenuRenderer",function(){return b}),n.d(t,"defaultArrowRenderer",function(){return d}),n.d(t,"defaultClearRenderer",function(){return f}),n.d(t,"defaultFilterOptions",function(){return y});var r=n(21),o=n.n(r),i=n(4),u=n.n(i),a=n(0),s=n.n(a),l=n(1),c=n.n(l),p=n(6),d=function(e){var t=e.onMouseDown;return c.a.createElement("span",{className:"Select-arrow",onMouseDown:t})};d.propTypes={onMouseDown:s.a.func};var f=function(){return c.a.createElement("span",{className:"Select-clear",dangerouslySetInnerHTML:{__html:"×"}})},h=[{base:"A",letters:/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g},{base:"AA",letters:/[\uA732]/g},{base:"AE",letters:/[\u00C6\u01FC\u01E2]/g},{base:"AO",letters:/[\uA734]/g},{base:"AU",letters:/[\uA736]/g},{base:"AV",letters:/[\uA738\uA73A]/g},{base:"AY",letters:/[\uA73C]/g},{base:"B",letters:/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g},{base:"C",letters:/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g},{base:"D",letters:/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g},{base:"DZ",letters:/[\u01F1\u01C4]/g},{base:"Dz",letters:/[\u01F2\u01C5]/g},{base:"E",letters:/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g},{base:"F",letters:/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g},{base:"G",letters:/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g},{base:"H",letters:/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g},{base:"I",letters:/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g},{base:"J",letters:/[\u004A\u24BF\uFF2A\u0134\u0248]/g},{base:"K",letters:/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g},{base:"L",letters:/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g},{base:"LJ",letters:/[\u01C7]/g},{base:"Lj",letters:/[\u01C8]/g},{base:"M",letters:/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g},{base:"N",letters:/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g},{base:"NJ",letters:/[\u01CA]/g},{base:"Nj",letters:/[\u01CB]/g},{base:"O",letters:/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g},{base:"OI",letters:/[\u01A2]/g},{base:"OO",letters:/[\uA74E]/g},{base:"OU",letters:/[\u0222]/g},{base:"P",letters:/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g},{base:"Q",letters:/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g},{base:"R",letters:/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g},{base:"S",letters:/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g},{base:"T",letters:/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g},{base:"TZ",letters:/[\uA728]/g},{base:"U",letters:/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g},{base:"V",letters:/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g},{base:"VY",letters:/[\uA760]/g},{base:"W",letters:/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g},{base:"X",letters:/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g},{base:"Y",letters:/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g},{base:"Z",letters:/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g},{base:"a",letters:/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},{base:"aa",letters:/[\uA733]/g},{base:"ae",letters:/[\u00E6\u01FD\u01E3]/g},{base:"ao",letters:/[\uA735]/g},{base:"au",letters:/[\uA737]/g},{base:"av",letters:/[\uA739\uA73B]/g},{base:"ay",letters:/[\uA73D]/g},{base:"b",letters:/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},{base:"c",letters:/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},{base:"d",letters:/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},{base:"dz",letters:/[\u01F3\u01C6]/g},{base:"e",letters:/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},{base:"f",letters:/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},{base:"g",letters:/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},{base:"h",letters:/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},{base:"hv",letters:/[\u0195]/g},{base:"i",letters:/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},{base:"j",letters:/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},{base:"k",letters:/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},{base:"l",letters:/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},{base:"lj",letters:/[\u01C9]/g},{base:"m",letters:/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},{base:"n",letters:/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},{base:"nj",letters:/[\u01CC]/g},{base:"o",letters:/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},{base:"oi",letters:/[\u01A3]/g},{base:"ou",letters:/[\u0223]/g},{base:"oo",letters:/[\uA74F]/g},{base:"p",letters:/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},{base:"q",letters:/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},{base:"r",letters:/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},{base:"s",letters:/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},{base:"t",letters:/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},{base:"tz",letters:/[\uA729]/g},{base:"u",letters:/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},{base:"v",letters:/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},{base:"vy",letters:/[\uA761]/g},{base:"w",letters:/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},{base:"x",letters:/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},{base:"y",letters:/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},{base:"z",letters:/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}],v=function(e){for(var t=0;t-1)return!1;if(r.filterOption)return r.filterOption.call(void 0,e,t);if(!t)return!0;var o=e[r.valueKey],i=e[r.labelKey],u=g(o),a=g(i);if(!u&&!a)return!1;var s=u?String(o):null,l=a?String(i):null;return r.ignoreAccents&&(s&&"label"!==r.matchProp&&(s=v(s)),l&&"value"!==r.matchProp&&(l=v(l))),r.ignoreCase&&(s&&"label"!==r.matchProp&&(s=s.toLowerCase()),l&&"value"!==r.matchProp&&(l=l.toLowerCase())),"start"===r.matchPos?s&&"label"!==r.matchProp&&s.substr(0,t.length)===t||l&&"value"!==r.matchProp&&l.substr(0,t.length)===t:s&&"label"!==r.matchProp&&s.indexOf(t)>=0||l&&"value"!==r.matchProp&&l.indexOf(t)>=0})},b=function(e){var t=e.focusedOption,n=e.focusOption,r=e.inputValue,o=e.instancePrefix,i=e.onFocus,a=e.onOptionRef,s=e.onSelect,l=e.optionClassName,p=e.optionComponent,d=e.optionRenderer,f=e.options,h=e.removeValue,v=e.selectValue,g=e.valueArray,y=e.valueKey,b=p;return f.map(function(e,p){var f=g&&g.some(function(t){return t[y]===e[y]}),m=e===t,x=u()(l,{"Select-option":!0,"is-selected":f,"is-focused":m,"is-disabled":e.disabled});return c.a.createElement(b,{className:x,focusOption:n,inputValue:r,instancePrefix:o,isDisabled:e.disabled,isFocused:m,isSelected:f,key:"option-"+p+"-"+e[y],onFocus:i,onSelect:s,option:e,optionIndex:p,ref:function(e){a(e,m)},removeValue:h,selectValue:v},d(e,p,r))})};b.propTypes={focusOption:s.a.func,focusedOption:s.a.object,inputValue:s.a.string,instancePrefix:s.a.string,onFocus:s.a.func,onOptionRef:s.a.func,onSelect:s.a.func,optionClassName:s.a.string,optionComponent:s.a.func,optionRenderer:s.a.func,options:s.a.array,removeValue:s.a.func,selectValue:s.a.func,valueArray:s.a.array,valueKey:s.a.string};var m=function(e){e.preventDefault(),e.stopPropagation(),"A"===e.target.tagName&&"href"in e.target&&(e.target.target?window.open(e.target.href,e.target.target):window.location.href=e.target.href)},x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},w=(function(){function e(e){this.value=e}function t(t){var n,r;function o(n,r){try{var u=t[n](r),a=u.value;a instanceof e?Promise.resolve(a.value).then(function(e){o("next",e)},function(e){o("throw",e)}):i(u.done?"return":"normal",u.value)}catch(e){i("throw",e)}}function i(e,t){switch(e){case"return":n.resolve({value:t,done:!0});break;case"throw":n.reject(t);break;default:n.resolve({value:t,done:!1})}(n=n.next)?o(n.key,n.arg):r=null}this._invoke=function(e,t){return new Promise(function(i,u){var a={key:e,arg:t,resolve:i,reject:u,next:null};r?r=r.next=a:(n=r=a,o(e,t))})},"function"!=typeof t.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(t.prototype[Symbol.asyncIterator]=function(){return this}),t.prototype.next=function(e){return this._invoke("next",e)},t.prototype.throw=function(e){return this._invoke("throw",e)},t.prototype.return=function(e){return this._invoke("return",e)}}(),function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}),E=function(){function e(e,t){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n},A=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t},k=function(e){function t(e){w(this,t);var n=A(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleMouseDown=n.handleMouseDown.bind(n),n.handleMouseEnter=n.handleMouseEnter.bind(n),n.handleMouseMove=n.handleMouseMove.bind(n),n.handleTouchStart=n.handleTouchStart.bind(n),n.handleTouchEnd=n.handleTouchEnd.bind(n),n.handleTouchMove=n.handleTouchMove.bind(n),n.onFocus=n.onFocus.bind(n),n}return S(t,e),E(t,[{key:"handleMouseDown",value:function(e){e.preventDefault(),e.stopPropagation(),this.props.onSelect(this.props.option,e)}},{key:"handleMouseEnter",value:function(e){this.onFocus(e)}},{key:"handleMouseMove",value:function(e){this.onFocus(e)}},{key:"handleTouchEnd",value:function(e){this.dragging||this.handleMouseDown(e)}},{key:"handleTouchMove",value:function(){this.dragging=!0}},{key:"handleTouchStart",value:function(){this.dragging=!1}},{key:"onFocus",value:function(e){this.props.isFocused||this.props.onFocus(this.props.option,e)}},{key:"render",value:function(){var e=this.props,t=e.option,n=e.instancePrefix,r=e.optionIndex,o=u()(this.props.className,t.className);return t.disabled?c.a.createElement("div",{className:o,onMouseDown:m,onClick:m},this.props.children):c.a.createElement("div",{className:o,style:t.style,role:"option","aria-label":t.label,onMouseDown:this.handleMouseDown,onMouseEnter:this.handleMouseEnter,onMouseMove:this.handleMouseMove,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEnd,id:n+"-option-"+r,title:t.title},this.props.children)}}]),t}(c.a.Component);k.propTypes={children:s.a.node,className:s.a.string,instancePrefix:s.a.string.isRequired,isDisabled:s.a.bool,isFocused:s.a.bool,isSelected:s.a.bool,onFocus:s.a.func,onSelect:s.a.func,onUnfocus:s.a.func,option:s.a.object.isRequired,optionIndex:s.a.number};var F=function(e){function t(e){w(this,t);var n=A(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleMouseDown=n.handleMouseDown.bind(n),n.onRemove=n.onRemove.bind(n),n.handleTouchEndRemove=n.handleTouchEndRemove.bind(n),n.handleTouchMove=n.handleTouchMove.bind(n),n.handleTouchStart=n.handleTouchStart.bind(n),n}return S(t,e),E(t,[{key:"handleMouseDown",value:function(e){if("mousedown"!==e.type||0===e.button)return this.props.onClick?(e.stopPropagation(),void this.props.onClick(this.props.value,e)):void(this.props.value.href&&e.stopPropagation())}},{key:"onRemove",value:function(e){e.preventDefault(),e.stopPropagation(),this.props.onRemove(this.props.value)}},{key:"handleTouchEndRemove",value:function(e){this.dragging||this.onRemove(e)}},{key:"handleTouchMove",value:function(){this.dragging=!0}},{key:"handleTouchStart",value:function(){this.dragging=!1}},{key:"renderRemoveIcon",value:function(){if(!this.props.disabled&&this.props.onRemove)return c.a.createElement("span",{className:"Select-value-icon","aria-hidden":"true",onMouseDown:this.onRemove,onTouchEnd:this.handleTouchEndRemove,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove},"×")}},{key:"renderLabel",value:function(){return this.props.onClick||this.props.value.href?c.a.createElement("a",{className:"Select-value-label",href:this.props.value.href,target:this.props.value.target,onMouseDown:this.handleMouseDown,onTouchEnd:this.handleMouseDown},this.props.children):c.a.createElement("span",{className:"Select-value-label",role:"option","aria-selected":"true",id:this.props.id},this.props.children)}},{key:"render",value:function(){return c.a.createElement("div",{className:u()("Select-value",this.props.value.className),style:this.props.value.style,title:this.props.value.title},this.renderRemoveIcon(),this.renderLabel())}}]),t}(c.a.Component);F.propTypes={children:s.a.node,disabled:s.a.bool,id:s.a.string,onClick:s.a.func,onRemove:s.a.func,value:s.a.object.isRequired}; +!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t{const u=n.slice(-1)[0],a=n.slice(0,-1),s=r.reduce((e,t)=>e.get(t)||e.set(t,new Map).get(t),t,a);return(s.get(u)||s.set(u,function(e){return(0,o.memoizeOne)((...t)=>e(...t))}(e)).get(u))(...i)}};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(3)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.defaultIsNully=t.SortDirection=void 0;var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));var o=t.SortDirection=void 0;!function(e){e.Ascending="asc",e.Descending="desc",e.None="none"}(o||(t.SortDirection=o={}));const i=t.defaultIsNully=(e=>void 0===e||null===e);t.default=((e,t,n=i)=>t.length?r.sortWith(r.map(e=>e.direction===o.Descending?r.comparator((t,r)=>{const o=e.columnId,i=t[o],u=r[o];return!n(i)&&(!!n(u)||i>u)}):r.comparator((t,r)=>{const o=e.columnId,i=t[o],u=r[o];return!n(i)&&(!!n(u)||i=0&&s.splice(t,1)}function h(e){var t=document.createElement("style");return void 0===e.attrs.type&&(e.attrs.type="text/css"),v(t,e.attrs),p(e,t),t}function v(e,t){Object.keys(t).forEach(function(n){e.setAttribute(n,t[n])})}function y(e,t){var n,r,o,i;if(t.transform&&e.css){if(!(i=t.transform(e.css)))return function(){};e.css=i}if(t.singleton){var s=a++;n=u||(u=h(t)),r=m.bind(null,n,s,!1),o=m.bind(null,n,s,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(e){var t=document.createElement("link");return void 0===e.attrs.type&&(e.attrs.type="text/css"),e.attrs.rel="stylesheet",v(t,e.attrs),p(e,t),t}(t),r=function(e,t,n){var r=n.css,o=n.sourceMap,i=void 0===t.convertToAbsoluteUrls&&o;(t.convertToAbsoluteUrls||i)&&(r=l(r));o&&(r+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(o))))+" */");var u=new Blob([r],{type:"text/css"}),a=e.href;e.href=URL.createObjectURL(u),a&&URL.revokeObjectURL(a)}.bind(null,n,t),o=function(){f(n),n.href&&URL.revokeObjectURL(n.href)}):(n=h(t),r=function(e,t){var n=t.css,r=t.media;r&&e.setAttribute("media",r);if(e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}.bind(null,n),o=function(){f(n)});return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else o()}}e.exports=function(e,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||"boolean"==typeof t.singleton||(t.singleton=o()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var n=d(e,t);return c(n,t),function(e){for(var o=[],i=0;it&&e.when&&-1!==e.when.indexOf(t.name));if(o.length||(o=r.default),!(t=o.find(t=>t.regexp.test(e))||null))return{lexemes:n,valid:!1,error:e};const i=(e.match(t.regexp)||[])[0];n.push({lexeme:t,value:i}),e=e.substring(i.length)}return{lexemes:n,valid:!0}};var r=function(e){return e&&e.__esModule?e:{default:e}}(n(16))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=u(n(4)),o=u(n(12)),i=u(n(19));function u(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e){this.query=e,this.evaluate=(e=>{if(!this.isValid||!this.tree){const e=`unable to evaluate target: syntax tree is invalid for query=${this.query}`;throw r.default.error(e),new Error(e)}const t=this.tree.lexeme.evaluate;return!!t&&t(e,this.tree)}),this.filter=(e=>e.filter(this.evaluate)),this.result=(0,i.default)((0,o.default)(this.query))}get isValid(){return this.result.valid}get tree(){return this.result.tree}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.colIsEditable=function(e,t){return e&&(!r.has("editable",t)||t.editable)};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isPrintableChar=function(e){return 32===e||e>=48&&e<=57||e>=96&&e<=111||e>=186&&e<=192||e>=219&&e<=222||e>=226||e>=65&&e<=90},t.isMetaKey=function(e){return-1!==o.indexOf(e)},t.isNavKey=function(e){return-1!==u.indexOf(e)},t.isArrowKey=function(e){return-1!==i.indexOf(e)},t.isCtrlKey=function(e){const t=[];window.navigator.platform.includes("Mac")?t.push(r.COMMAND_LEFT,r.COMMAND_RIGHT,r.COMMAND_FIREFOX):t.push(r.CONTROL);return t.includes(e)},t.isCtrlMetaKey=function(e){return[r.CONTROL,r.COMMAND_LEFT,r.COMMAND_RIGHT,r.COMMAND_FIREFOX].includes(e)};const r=t.KEY_CODES={MOUSE_LEFT:1,MOUSE_RIGHT:3,MOUSE_MIDDLE:2,BACKSPACE:8,COMMA:188,INSERT:45,DELETE:46,END:35,ENTER:13,ESCAPE:27,CONTROL:17,COMMAND_LEFT:91,COMMAND_RIGHT:93,COMMAND_FIREFOX:224,ALT:18,HOME:36,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,SPACE:32,SHIFT:16,CAPS_LOCK:20,TAB:9,ARROW_RIGHT:39,ARROW_LEFT:37,ARROW_UP:38,ARROW_DOWN:40,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,A:65,X:88,C:67,V:86},o=[r.ARROW_DOWN,r.ARROW_UP,r.ARROW_LEFT,r.ARROW_RIGHT,r.HOME,r.END,r.DELETE,r.BACKSPACE,r.F1,r.F2,r.F3,r.F4,r.F5,r.F6,r.F7,r.F8,r.F9,r.F10,r.F11,r.F12,r.TAB,r.PAGE_DOWN,r.PAGE_UP,r.ENTER,r.ESCAPE,r.SHIFT,r.CAPS_LOCK,r.ALT],i=[r.ARROW_DOWN,r.ARROW_UP,r.ARROW_LEFT,r.ARROW_RIGHT],u=[...i,r.TAB,r.ENTER];t.isCtrlDown=(e=>(e.ctrlKey||e.metaKey)&&!e.altKey)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LexemeType=void 0;var r=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var u,a=e[Symbol.iterator]();!(r=(u=a.next()).done)&&(n.push(u.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),o=function(e){return e&&e.__esModule?e:{default:e}}(n(4));var i=t.LexemeType=void 0;!function(e){e.And="and",e.BlockClose="close-block",e.BlockOpen="open-block",e.BinaryOperator="logical-binary-operator",e.Expression="expression",e.Or="or",e.Operand="operand",e.UnaryNot="unary-not",e.UnaryOperator="logical-unary-operator"}(i||(t.LexemeType=i={}));const u={resolve:(e,t)=>{if(o.default.trace("resolve -> exp",e,t),/^('.*')|(".*")$/.test(t.value))return t.value.slice(1,t.value.length-1);if(!/^\w+\(.*\)$/.test(t.value))return e[t.value];{const e=t.value.match(/^(\w+)\((.*)\)$/);if(!e)throw Error();{var n=r(e,3);const t=n[1],o=n[2];switch(t){case"num":return parseInt(o,10);case"str":default:return o}}}},regexp:/^(((num|str)\([^()]*\))|'([^()']|\\')+'|"([^()"]|\\")+"|\w+)/},a=[{evaluate:(e,t)=>{o.default.trace("evalute -> &&",e,t);const n=t,r=n.left.lexeme.evaluate(e,n.left),i=n.right.lexeme.evaluate(e,n.right);return r&&i},name:i.And,priority:2,regexp:/^(and\s|&&)/i,syntaxer:(e,t,n)=>Object.assign({left:e.slice(0,n),right:e.slice(n+1)},t)},{evaluate:(e,t)=>{o.default.trace("evalute -> ||",e,t);const n=t;return n.left.lexeme.evaluate(e,n.left)||n.right.lexeme.evaluate(e,n.right)},name:i.Or,priority:3,regexp:/^(or\s|\|\|)/i,syntaxer:(e,t,n)=>Object.assign({left:e.slice(0,n),right:e.slice(n+1)},t)},{name:i.BlockClose,nesting:-1,regexp:/^\)/},{evaluate:(e,t)=>{o.default.trace("evaluate -> ()",e,t);const n=t;return n.block.lexeme.evaluate(e,n.block)},name:i.BlockOpen,nesting:1,priority:1,regexp:/^\(/,syntaxer:e=>Object.assign({block:e.slice(1,e.length-1)},e[0]),when:[i.UnaryNot]},Object.assign({name:i.Operand},u),{evaluate:(e,t)=>{o.default.trace("evaluate -> binary",e,t);const n=t,r=n.left.lexeme.resolve(e,n.left),i=n.right.lexeme.resolve(e,n.right);switch(o.default.trace(`opValue: ${r}, expValue: ${i}`),t.value.toLowerCase()){case"eq":case"=":return r===i;case"gt":case">":return r>i;case"ge":case">=":return r>=i;case"lt":case"<":return r=|<=|>|<|!=|=|ge|le|gt|lt|eq|ne)/i,syntaxer:e=>{var t=r(e,3);let n=t[0],o=t[1],i=t[2];return Object.assign({left:n,right:i},o)},when:[i.Operand]},{evaluate:(e,t)=>{o.default.trace("evaluate -> unary",e,t);const n=t,r=n.block.lexeme.resolve(e,n.block);switch(t.value.toLowerCase()){case"is even":return"number"==typeof r&&r%2==0;case"is nil":return void 0===r||null===r;case"is bool":return"boolean"==typeof r;case"is odd":return"number"==typeof r&&r%2==1;case"is num":return"number"==typeof r;case"is object":return null!==r&&"object"==typeof r;case"is str":return"string"==typeof r;case"is prime":return"number"==typeof r&&(e=>{if(2===e)return!0;if(e<2||e%2==0)return!1;for(let t=3;t*t<=e;t+=2)if(e%t==0)return!1;return!0})(r);default:throw new Error}},name:i.UnaryOperator,priority:0,regexp:/^((is nil)|(is odd)|(is even)|(is bool)|(is num)|(is object)|(is str)|(is prime))/i,syntaxer:e=>{var t=r(e,2);let n=t[0],o=t[1];return Object.assign({block:n},o)},when:[i.Operand]},{evaluate:(e,t)=>{o.default.trace("evaluate -> unary not",e,t);const n=t;return!n.block.lexeme.evaluate(e,n.block)},name:i.UnaryNot,priority:1.5,regexp:/^!/,syntaxer:e=>Object.assign({block:e.slice(1,e.length)},e[0]),when:[i.UnaryNot]},Object.assign({name:i.Expression,when:[i.BinaryOperator]},u)];t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=((e,t=null)=>{if(t=t||(()=>{for(t=e;t&&"td"!==t.nodeName.toLowerCase();)t=t.parentElement;return t})(),!e||!t)return;let n=e;for(;"relative"!==getComputedStyle(n).position&&"sticky"!==getComputedStyle(n).position&&n.parentElement;)n=n.parentElement;let r=e;for(;"relative"!==getComputedStyle(r).position&&r.parentElement;)r=r.parentElement;const o=n.getBoundingClientRect(),i=r.getBoundingClientRect(),u=t.getBoundingClientRect(),a=u.left-o.left+n.scrollLeft,s=u.top-o.top+n.scrollTop+u.height;e.style.width=`${u.width}px`,e.style.top=`${s}px`,e.style.left=`${a}px`,e.style.position="absolute",u.top+u.height/2>i.bottom||u.top-u.height/2i.left+i.width?e.style.display="none":e.style.display="block"})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=((e,t,n)=>e[0]===t&&e[1]===n)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(4));const o=e=>{let t=0;const n=e.map(e=>{const n=Object.assign({},e,{nesting:t});return t+=e.lexeme.nesting||0,n}),i=n.filter(e=>0===e.nesting&&"number"==typeof e.lexeme.priority).sort((e,t)=>(t.lexeme.priority||-1)-(e.lexeme.priority||-1))[0];r.default.trace("parser -> pivot",i,e);const u=n.indexOf(i);if(i.lexeme.syntaxer){let t=i.lexeme.syntaxer(e,i,u);return Array.isArray(t.left)&&(t.left=o(t.left)),Array.isArray(t.right)&&(t.right=o(t.right)),Array.isArray(t.block)&&(t.block=o(t.block)),t}throw new Error(i.lexeme.name)};t.default=(e=>{const t=e.lexemes;if(!e.valid)return{valid:!1,error:`lexer -- ${e.error}`};try{return{tree:o(t),valid:!0}}catch(e){return{valid:!1,error:e}}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.matrixMap=function(e,t,n){const o=r.addIndex(r.map),i=r.addIndex(r.map);return o((e,r)=>i((e,o)=>n(e,t[r][o],r,o),e),e)},t.matrixMap3=function(e,t,n,o){const i=r.addIndex(r.map),u=r.addIndex(r.map);return i((e,r)=>u((e,i)=>o(e,t[r][i],n[r][i],r,i),e),e)},t.matrixMap4=function(e,t,n,o,i){const u=r.addIndex(r.map),a=r.addIndex(r.map);return u((e,r)=>a((e,u)=>i(e,t[r][u],n[r][u],o[r][u],r,u),e),e)},t.matrixMapN=function(e,...t){const n=t.slice(0,1),o=t.slice(1),i=r.addIndex(r.map),u=r.addIndex(r.map);return i((t,n)=>u((t,r)=>e(n,r,[t,...o.map(e=>e[n][r])]),t),n)};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.arrayMap=function(e,t,n){return r.addIndex(r.map)((e,r)=>n(e,t[r],r),e)},t.arrayMap3=function(e,t,n,o){return r.addIndex(r.map)((e,r)=>o(e,t[r],n[r],r),e)},t.arrayMapN=function(e,...t){const n=t.slice(0,1),o=t.slice(1);return r.addIndex(r.map)((t,n)=>e(n,[t,...o.map(e=>e[n])]),n)};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=function(e){return e&&e.__esModule?e:{default:e}}(r);class i extends r.PureComponent{constructor(e){super(e),this.handleChange=(e=>this.setState({value:e.target.value})),this.submit=(()=>this.state.value!==this.props.value&&this.props.submit(this.state.value)),this.state={value:e.value}}get propsWithDefaults(){return this.props}render(){var e=this.propsWithDefaults;const t=e.stopPropagation,n=e.updateOnBlur,r=e.updateOnSubmit;let i={onBlur:n?this.submit:void 0,onKeyDown:t?e=>e.stopPropagation():void 0,onSubmit:r?this.submit:void 0};return o.default.createElement("input",Object.assign({ref:"input",type:"text",value:this.state.value||"",onChange:this.handleChange},i))}}t.default=i,i.defaultProps={stopPropagation:!1,updateOnBlur:!0,updateOnSubmit:!0}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(this.props,[]);return function(e){c.forEach(function(t){return delete e[t]})}(o),o.className=this.props.inputClassName,o.id=this.state.inputId,o.style=n,u.default.createElement("div",{className:this.props.className,style:t},this.renderStyles(),u.default.createElement("input",r({},o,{ref:this.inputRef})),u.default.createElement("div",{ref:this.sizerRef,style:l},e),this.props.placeholder?u.default.createElement("div",{ref:this.placeHolderSizerRef,style:l},this.props.placeholder):null)}}]),t}();h.propTypes={className:a.default.string,defaultValue:a.default.any,extraWidth:a.default.oneOfType([a.default.number,a.default.string]),id:a.default.string,injectStyles:a.default.bool,inputClassName:a.default.string,inputRef:a.default.func,inputStyle:a.default.object,minWidth:a.default.oneOfType([a.default.number,a.default.string]),onAutosize:a.default.func,onChange:a.default.func,placeholder:a.default.string,placeholderIsMinWidth:a.default.bool,style:a.default.object,value:a.default.any},h.defaultProps={minWidth:1,injectStyles:!0},t.default=h},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Table=void 0;var r=u(n(25)),o=u(n(4)),i=u(n(27));function u(e){return e&&e.__esModule?e:{default:e}}o.default.setDebugLevel(r.default.debugLevel),o.default.setLogLevel(r.default.logLevel),t.Table=i.default},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(4),o=function(e){return e&&e.__esModule?e:{default:e}}(n(26));const i="dash_debug",u="dash_log";t.default=class{static get searchParams(){return new URL(window.location.href).searchParams||{get:()=>null}}static get debugLevel(){const e=this.searchParams.get(i)||o.default.get(i);return e&&r.DebugLevel[e]||r.DebugLevel.NONE}static get logLevel(){const e=this.searchParams.get(u)||o.default.get(u);return e&&r.LogLevel[e]||r.LogLevel.ERROR}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=864e5,o=63072e7;class i{static delete(e,t="",n="/"){let o=new Date((new Date).getTime()-r).toUTCString();document.cookie=`${e}=;expires=${o};domain=${t};path=${n}`}static get(e){if(!e.length)return;return e=e.toLowerCase(),(document.cookie.split(";").map(e=>{let t=e.split("=");return{id:t[0].trim(),value:t[1]}}).find(t=>e===t.id.toLocaleLowerCase())||{}).value}static set(e,t,n="",r="/"){let u=`${e}=${t};expires=${new Date((new Date).getTime()+o).toUTCString()};domain=${n};path=${r}`;i.get(e)&&i.delete(e,n,r),document.cookie=u}}t.default=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.propTypes=t.defaultProps=void 0;var r=n(1),o=s(r),i=s(n(0)),u=s(n(30));n(78);var a=s(n(4));function s(e){return e&&e.__esModule?e:{default:e}}class l extends r.Component{render(){var e=this.props;const t=e.filtering,n=e.sorting,r=e.pagination_mode;function i(e){return-1!==["be",!1].indexOf(e)}return function(e){return-1!==["fe",!0,!1].indexOf(e)}(r)||i(t)&&i(n)?o.default.createElement(u.default,this.props):(a.default.error("Invalid combination of filtering / sorting / pagination",t,n,r),o.default.createElement("div",null,"Invalid props combination"))}}t.default=l;const c=t.defaultProps={pagination_mode:"fe",pagination_settings:{displayed_pages:1,current_page:0,page_size:250},navigation:"page",content_style:"fit",filtering:!1,filtering_settings:"",filtering_type:"basic",filtering_types:["basic"],sorting:!1,sorting_type:"single",sorting_settings:[],derived_viewport_dataframe:[],derived_viewport_indices:[],derived_virtual_dataframe:[],derived_virtual_indices:[],column_conditional_dropdowns:[],column_static_dropdown:[],column_conditional_styles:[],column_static_style:[],row_conditional_styles:[],row_static_style:{},dataframe:[],columns:[],editable:!1,active_cell:[],selected_cell:[[]],selected_rows:[],row_selectable:!1,table_style:[]},d=t.propTypes={active_cell:i.default.array,columns:i.default.arrayOf(i.default.object),content_style:i.default.oneOf(["fit","grow"]),dataframe:i.default.arrayOf(i.default.object),dataframe_previous:i.default.arrayOf(i.default.object),dataframe_timestamp:i.default.any,editable:i.default.bool,end_cell:i.default.arrayOf(i.default.number),id:i.default.string.isRequired,is_focused:i.default.bool,merge_duplicate_headers:i.default.bool,n_fixed_columns:i.default.number,n_fixed_rows:i.default.number,row_deletable:i.default.bool,row_selectable:i.default.oneOf(["single","multi",!1]),selected_cell:i.default.arrayOf(i.default.arrayOf(i.default.number)),selected_rows:i.default.arrayOf(i.default.number),setProps:i.default.any,start_cell:i.default.arrayOf(i.default.number),style_as_list_view:i.default.bool,table_style:i.default.arrayOf(i.default.shape({selector:i.default.string,rule:i.default.string})),pagination_mode:i.default.oneOf(["fe","be",!0,!1]),pagination_settings:i.default.shape({displayed_pages:i.default.number,current_page:i.default.number,page_size:i.default.number}),navigation:i.default.string,column_conditional_dropdowns:i.default.arrayOf(i.default.shape({id:i.default.string,dropdowns:i.default.arrayOf(i.default.shape({condition:i.default.string,dropdown:i.default.arrayOf(i.default.shape({label:i.default.string,value:i.default.any}))}))})),column_static_dropdown:i.default.arrayOf(i.default.shape({id:i.default.string,dropdown:i.default.arrayOf(i.default.shape({label:i.default.string,value:i.default.any}))})),column_conditional_style:i.default.arrayOf(i.default.shape({id:i.default.string,styles:i.default.arrayOf(i.default.shape({condition:i.default.string,style:i.default.object}))})),column_static_style:i.default.arrayOf(i.default.shape({id:i.default.string,style:i.default.object})),row_conditional_styles:i.default.arrayOf(i.default.shape({condition:i.default.string,style:i.default.object})),row_static_style:i.default.object,filtering:i.default.oneOf(["fe","be",!0,!1]),filtering_settings:i.default.string,filtering_type:i.default.oneOf(["basic"]),filtering_types:i.default.arrayOf(i.default.oneOf(["basic"])),sorting:i.default.oneOf(["fe","be",!0,!1]),sorting_type:i.default.oneOf(["single","multi"]),sorting_settings:i.default.arrayOf(i.default.shape({columnId:i.default.oneOfType([i.default.string,i.default.number]),direction:i.default.oneOf(["asc","desc"])})),sorting_treat_empty_string_as_none:i.default.bool,derived_viewport_dataframe:i.default.arrayOf(i.default.object),derived_viewport_indices:i.default.arrayOf(i.default.number),derived_virtual_dataframe:i.default.arrayOf(i.default.object),derived_virtual_indices:i.default.arrayOf(i.default.number),dropdown_properties:i.default.any};l.defaultProps=c,l.propTypes=d},function(e,t,n){"use strict";var r=n(29);function o(){}e.exports=function(){function e(e,t,n,o,i,u){if(u!==r){var a=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw a.name="Invariant Violation",a}}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t};return n.checkPropTypes=o,n.PropTypes=n,n}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=p(r),i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),u=n(3),a=p(n(32)),s=p(n(67)),l=p(n(68)),c=p(n(69)),d=p(n(70));function p(e){return e&&e.__esModule?e:{default:e}}n(71),n(74),n(76);const f=/^derived_/;t.default=class extends r.Component{constructor(e){super(e),this.__setProps=(0,u.memoizeOne)(e=>e?t=>{if(i.has("dataframe",t)){const e=this.props.dataframe;t.dataframe_timestamp=Date.now(),t.dataframe_previous=e}e(t)}:e=>this.setState(e)),this.paginator=(0,s.default)(),this.viewport=(0,l.default)(),this.virtual=(0,c.default)(),this.visibleColumns=(0,d.default)(),this.filterCache=(0,u.memoizeOneWithFlag)(e=>e),this.paginationCache=(0,u.memoizeOneWithFlag)(e=>e),this.sortCache=(0,u.memoizeOneWithFlag)(e=>e),this.viewportCache=(0,u.memoizeOneWithFlag)(e=>e),this.virtualCache=(0,u.memoizeOneWithFlag)(e=>e),this.controlled=this.getControlledProps(this.props),this.updateDerivedProps()}componentWillReceiveProps(e){this.controlled=this.getControlledProps(e),this.updateDerivedProps()}shouldComponentUpdate(e){const t=this.props;return i.any(n=>!f.test(n)&&t[n]!==e[n],i.keysIn(t))}render(){return o.default.createElement(a.default,Object.assign({},this.controlled))}getControlledProps(e){const t=this.setProps,n=e.columns,r=e.dataframe,o=e.filtering,u=e.filtering_settings,a=e.pagination_mode,s=e.pagination_settings,l=e.sorting,c=e.sorting_settings,d=e.sorting_treat_empty_string_as_none,p=this.virtual(r,o,u,l,c,d),f=this.viewport(a,s,p.dataframe,p.indices),h=this.paginator(a,s,t,p.dataframe),v=this.visibleColumns(n);return i.mergeAll([e,{columns:v,paginator:h,setProps:t,viewport:f,virtual:p}])}updateDerivedProps(){var e=this.controlled;const t=e.filtering,n=e.filtering_settings,r=e.pagination_mode,o=e.pagination_settings,i=e.sorting,u=e.sorting_settings,a=e.viewport,s=e.virtual,l=this.viewportCache(a).cached,c=this.virtualCache(s).cached,d=this.filterCache(n),p=this.paginationCache(o),f=this.sortCache(u),h=!d.cached&&!d.first&&"be"===t||!p.cached&&!p.first&&"be"===r||!f.cached&&!f.first&&"be"===i;if(c&&l&&!h)return;const v=this.setProps;let y={};c||(y.derived_virtual_dataframe=s.dataframe,y.derived_virtual_indices=s.indices),l||(y.derived_viewport_dataframe=a.dataframe,y.derived_viewport_indices=a.indices),h&&(y.active_cell=void 0,y.selected_cell=void 0,y.selected_rows=void 0),setTimeout(()=>v(y),0)}get setProps(){return this.__setProps(this.props.setProps)}}},function(e,t,n){"use strict";function r(e){return void 0!==e&&null!==e&&"object"==typeof e&&e.constructor===Object}function o(e,t,n=!1){return e===t||i(Object.values(e),Object.values(t),n)}function i(e,t,n=!1){return!!e&&e.length===t.length&&!!e.every((e,u)=>{const a=t[u];return e===a||n&&(Array.isArray(e)&&Array.isArray(a)&&i(e,a,n)||r(e)&&r(a)&&o(e,a,n))})}Object.defineProperty(t,"__esModule",{value:!0}),t.isEqual=o,t.isEqualArgs=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=g(r),i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),u=g(n(33)),a=n(14),s=n(15),l=n(34),c=g(n(4)),d=n(3),p=g(n(12)),f=g(n(35)),h=g(n(17)),v=g(n(38)),y=g(n(66));function g(e){return e&&e.__esModule?e:{default:e}}const m=i.sort((e,t)=>e-t);t.default=class extends r.PureComponent{constructor(e){super(e),this.getLexerResult=(0,d.memoizeOne)(p.default),this.handleClickOutside=(e=>{const t=this.$el;t&&!t.contains(e.target)&&this.props.is_focused&&this.props.setProps({is_focused:!1})}),this.handlePaste=(e=>{const t=this.$el;t&&t.contains(document.activeElement)&&this.onPaste(e)}),this.forceHandleResize=(()=>this.handleResize(!0)),this.handleResize=((e=!1)=>{if(this.state.forcedResizeOnly&&!e)return;e||this.setState({forcedResizeOnly:!0}),this.updateStylesheet();var t=this.refs;const n=t.r0c0,r=t.r0c1,o=t.r1c0,i=t.r1c1;let u=r.querySelectorAll("tr");n.querySelectorAll("tr").forEach((e,t)=>{const n=u[t];e.style.height=`${n.clientHeight}px`});let a=i.querySelectorAll("tr > th:first-of-type");o.querySelectorAll("tr > th:first-of-type").forEach((e,t)=>{const n=a[t].parentElement;e.parentElement.style.height=getComputedStyle(n).height});const s=i.querySelector("tr > td:first-of-type");if(s){const e=s.parentElement;this.stylesheet.setRule(".dash-fixed-column tr",`height: ${getComputedStyle(e).height};`)}}),this.handleKeyDown=(e=>{var t=this.props;const n=t.active_cell,r=t.columns,o=t.setProps,i=t.is_focused,u=t.editable;if(c.default.trace(`handleKeyDown: ${e.key}`),(0,s.isCtrlMetaKey)(e.keyCode))return;const l=(0,s.isCtrlDown)(e);l&&e.keyCode===s.KEY_CODES.V||e.keyCode===s.KEY_CODES.C&&l&&!i||(e.keyCode!==s.KEY_CODES.ESCAPE?e.keyCode!==s.KEY_CODES.ENTER||i||!(0,a.colIsEditable)(u,r[n[1]])?i&&e.keyCode!==s.KEY_CODES.TAB&&e.keyCode!==s.KEY_CODES.ENTER||((0,s.isNavKey)(e.keyCode)?this.switchCell(e):e.keyCode===s.KEY_CODES.BACKSPACE||e.keyCode===s.KEY_CODES.DELETE?this.deleteCell(e):this.props.is_focused||!(0,a.colIsEditable)(u,r[n[1]])||(0,s.isMetaKey)(e.keyCode)||o({is_focused:!0})):o({is_focused:!0}):o({is_focused:!1}))}),this.switchCell=(e=>{const t=e;var n=this.props;const r=n.active_cell,o=n.columns,u=n.selected_cell,a=n.setProps,l=n.viewport;e.preventDefault(),this.$el.focus();const c=u.length>1,d=t.keyCode===s.KEY_CODES.ENTER||t.keyCode===s.KEY_CODES.TAB;if(c&&d)return void a({is_focused:!1,active_cell:this.getNextCell(t,{currentCell:r,restrictToSelection:!0})});if(!t.shiftKey){const e=this.getNextCell(t,{currentCell:r,restrictToSelection:!1});return void a({is_focused:!1,selected_cell:[e],active_cell:e})}let p=[],f=[];const h=m(i.uniq(i.pluck(0,u))),v=m(i.uniq(i.pluck(1,u))),y=h[0],g=v[0],b=h[h.length-1],x=v[v.length-1],w=t.keyCode===s.KEY_CODES.ARROW_DOWN||t.keyCode===s.KEY_CODES.ENTER,E=t.keyCode===s.KEY_CODES.ARROW_UP,_=t.keyCode===s.KEY_CODES.ARROW_RIGHT||t.keyCode===s.KEY_CODES.TAB,O=t.keyCode===s.KEY_CODES.ARROW_LEFT;w&&r[0]>y?f=v.map(e=>[y,e]):w&&b!==l.dataframe.length-1?p=v.map(e=>[b+1,e]):E&&r[0][b,e]):E&&y>0?p=v.map(e=>[y-1,e]):O&&r[1][e,x]):O&&g>0?p=h.map(e=>[e,g-1]):_&&r[1]>g?f=h.map(e=>[e,g]):_&&x+1<=o.length-1&&(p=h.map(e=>[e,x+1])),a({is_focused:!1,selected_cell:i.without(f,i.uniq(i.concat(p,u)))})}),this.deleteCell=(e=>{var t=this.props;const n=t.columns,r=t.dataframe,o=t.editable,u=t.selected_cell,s=t.setProps,l=t.viewport;e.preventDefault();let c=r;i.map(e=>[l.indices[e[0]],e[1]],u).forEach(e=>{(0,a.colIsEditable)(o,n[e[1]])&&(c=i.set(i.lensPath([e[0],n[e[1]].id]),"",c))}),s({dataframe:c})}),this.getNextCell=((e,{restrictToSelection:t,currentCell:n})=>{var r=this.props;const o=r.columns,u=r.selected_cell,a=r.viewport,c=e;switch(c.keyCode){case s.KEY_CODES.ARROW_LEFT:return t?(0,l.selectionCycle)([n[0],n[1]-1],u):[n[0],i.max(0,n[1]-1)];case s.KEY_CODES.ARROW_RIGHT:case s.KEY_CODES.TAB:return t?(0,l.selectionCycle)([n[0],n[1]+1],u):[n[0],i.min(o.length-1,n[1]+1)];case s.KEY_CODES.ARROW_UP:return t?(0,l.selectionCycle)([n[0]-1,n[1]],u):[i.max(0,n[0]-1),n[1]];case s.KEY_CODES.ARROW_DOWN:case s.KEY_CODES.ENTER:return t?(0,l.selectionCycle)([n[0]+1,n[1]],u):[i.min(a.dataframe.length-1,n[0]+1),n[1]];default:throw new Error(`Table.getNextCell: unknown navigation keycode ${c.keyCode}`)}}),this.onCopy=(e=>{var t=this.props;const n=t.columns,r=t.selected_cell,o=t.viewport;f.default.toClipboard(e,r,n,o.dataframe),this.$el.focus()}),this.onPaste=(e=>{var t=this.props;const n=t.active_cell,r=t.columns,o=t.dataframe,i=t.editable,u=t.filtering_settings,a=t.setProps,s=t.sorting_settings,l=t.viewport;if(!i)return;const c=f.default.fromClipboard(e,n,l.indices,r,o,!0,!s.length||!u.length);c&&a(c)}),this.loadNext=(()=>{this.props.paginator.loadNext()}),this.loadPrevious=(()=>{this.props.paginator.loadPrevious()}),this.applyStyle=(()=>{var e=this.props;const t=e.columns,n=e.n_fixed_columns,r=e.n_fixed_rows,o=e.row_deletable,a=e.row_selectable;var s=this.refs;const l=s.r1c0,c=s.r1c1;o&&(this.stylesheet.setRule(".dash-spreadsheet-inner td.dash-delete-cell","width: 30px; max-width: 30px; min-width: 30px;"),this.stylesheet.setRule(".dash-spreadsheet-inner th.dash-delete-header","width: 30px; max-width: 30px; min-width: 30px;")),a&&(this.stylesheet.setRule(".dash-spreadsheet-inner td.dash-select-cell","width: 30px; max-width: 30px; min-width: 30px;"),this.stylesheet.setRule(".dash-spreadsheet-inner th.dash-select-header","width: 30px; max-width: 30px; min-width: 30px;")),i.addIndex(i.forEach)((e,t)=>{const n=[];if(e.width&&n.push(`width: ${u.default.unit(e.width,"px")};`),e.minWidth&&n.push(`min-width: ${u.default.unit(e.minWidth,"px")};`),e.maxWidth&&n.push(`max-width: ${u.default.unit(e.maxWidth,"px")};`),n.length){const e=n.join(" ");this.stylesheet.setRule(`.dash-spreadsheet-inner td.column-${t}`,e),this.stylesheet.setRule(`.dash-spreadsheet-inner th.column-${t}`,e)}},t),r&&c.querySelectorAll("tr:first-of-type td, tr:first-of-type th").forEach((e,t)=>{const n=getComputedStyle(e).width;this.stylesheet.setRule(`.dash-fixed-row:not(.dash-fixed-column) th:nth-of-type(${t+1})`,`width: ${n}; min-width: ${n}; max-width: ${n};`)}),n&&r&&l.querySelectorAll("tr:first-of-type td, tr:first-of-type th").forEach((e,t)=>{const n=getComputedStyle(e).width;this.stylesheet.setRule(`.dash-fixed-column.dash-fixed-row th:nth-of-type(${t+1})`,`width: ${n}; min-width: ${n}; max-width: ${n};`)})}),this.handleDropdown=(()=>{const e=this.refs.r1c1;(0,h.default)(e.querySelector(".Select-menu-outer"))}),this.onScroll=(e=>{const t=this.refs.r0c1;c.default.trace(`ControlledTable fragment scrolled to (left,top)=(${e.target.scrollLeft},${e.target.scrollTop})`),t.style.marginLeft=`${-e.target.scrollLeft}px`,this.handleDropdown()}),this.state={forcedResizeOnly:!1},this.stylesheet=new u.default(`#${e.id}`),this.tableFn=(0,v.default)(()=>this.props),this.updateStylesheet()}get lexerResult(){const e=this.props.filtering_settings;return this.getLexerResult(e)}updateStylesheet(){const e=this.props.table_style;i.forEach(({selector:e,rule:t})=>{this.stylesheet.setRule(e,t)},e)}componentDidMount(){this.props.selected_cell.length&&!i.contains(this.props.active_cell,this.props.selected_cell)&&this.props.setProps({active_cell:this.props.selected_cell[0]}),this.applyStyle(),this.handleResize()}componentWillMount(){window.addEventListener("resize",this.forceHandleResize),document.addEventListener("paste",this.handlePaste),document.addEventListener("mousedown",this.handleClickOutside)}componentWillUnmount(){window.removeEventListener("resize",this.forceHandleResize),document.removeEventListener("mousedown",this.handleClickOutside),document.removeEventListener("paste",this.handlePaste)}componentWillUpdate(){this.updateStylesheet()}componentDidUpdate(){this.applyStyle(),this.handleResize(),this.handleDropdown()}get $el(){return document.getElementById(this.props.id)}get displayPagination(){var e=this.props;const t=e.dataframe,n=e.navigation,r=e.pagination_mode,o=e.pagination_settings;return"page"===n&&("fe"===r&&o.page_sizeo.default.createElement("div",{key:`r${t}`,ref:`r${t}`,className:`row row-${t}`,onScroll:this.onScroll},e.map((e,n)=>o.default.createElement("div",{key:n,ref:`r${t}c${n}`,className:`cell cell-${t}-${n} ${s[t][n]}`},e)))))),this.displayPagination?o.default.createElement("div",null,o.default.createElement("button",{className:"previous-page",onClick:this.loadPrevious},"Previous"),o.default.createElement("button",{className:"next-page",onClick:this.loadNext},"Next")):null)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(4));class o{constructor(e){this.name=e}get rules(){const e=this.sheet;return Array.from(e.rules||e.cssRules)}addRule(e,t){this.sheet.addRule?this.sheet.addRule(e,t):this.sheet.insertRule(`${e} { ${t} }`,0)}deleteRule(e){this.sheet.deleteRule(e)}findRule(e){const t=this.rules,n=t.findIndex(t=>t.selectorText===e);return-1===n?null:{rule:t[n],index:n}}get sheet(){return(this.__stylesheet=this.__stylesheet||(()=>{const e=document.createElement("style");return e.type="text/css",e.id=this.name,document.getElementsByTagName("head")[0].appendChild(e),e})()).sheet}}class i{constructor(e){this.prefix=e,this.stylesheet=new o(`${e}-dynamic-inline.css`)}static unit(e,t="px"){return i.hasUnit(e)?e:`${e}${t}`}static hasUnit(e){return"string"==typeof e&&/^\d+(\.\d+)?(px|em|rem|%)$/.test(e)}deleteRule(e){e=`${this.prefix} ${e}`;const t=this.stylesheet.findRule(e);t&&this.stylesheet.deleteRule(t.index)}setRule(e,t){e=`${this.prefix} ${e}`;const n=this.stylesheet.findRule(e);if(n){if(n.rule.cssText===t||n.rule.cssText===`${e} { ${t} }`)return;this.stylesheet.deleteRule(n.index)}this.stylesheet.addRule(e,t),r.default.trace("stylesheet",e,t)}}t.default=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var u,a=e[Symbol.iterator]();!(r=(u=a.next()).done)&&(n.push(u.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();t.selectionCycle=function(e,t){const n=o.uniq(o.pluck(0,t)).sort((e,t)=>e-t),i=o.uniq(o.pluck(1,t)).sort((e,t)=>e-t),u=n[0],a=i[0],s=n[n.length-1],l=i[i.length-1];var c=r(e,2);const d=c[0],p=c[1],f=[d,p];d>s&&(f[0]=u,f[1]=p+1>l?a:p+1);dl&&(f[1]=a,f[0]=d+1>s?u:d+1);pe-t)),l=r.uniq(r.pluck(1,t).sort((e,t)=>e-t)),c=r.slice(r.head(s),r.last(s)+1,a).map(e=>r.props(l,r.props(r.pluck("id",n),e))),d=o.default.prototype.stringify(c);u.default.trace("TableClipboard -- set clipboard data: ",d),i.default.set(e,d)}static fromClipboard(e,t,n,l,c,d=!0,p=!0){const f=i.default.get(e);if(u.default.trace("TableClipboard -- get clipboard data: ",f),!f)return;p||u.default.debug("Clipboard -- Sorting or filtering active, do not create new rows"),d||u.default.debug("Clipboard -- Do not create new columns");const h=o.default.prototype.parse(f);let v=c;const y=l;if(d&&h[0].length+t[1]>=l.length)for(let e=l.length;et[`Column ${e}`]="");const g=n[t[0]];if(p&&h.length+g>=c.length){const e={};l.forEach(t=>e[t.id]=""),v=r.concat(v,r.repeat(e,h.length+g-c.length))}return h.forEach((e,o)=>e.forEach((e,i)=>{const u=t[0]+o;if(n.length<=t[0]+o)return;const s=n[u],l=t[1]+i,c=y[l];c&&(0,a.colIsEditable)(!0,c)&&(v=r.set(r.lensPath([s,c.id]),e,v))})),{dataframe:v,columns:y}}}},function(e,t){!function(t){"use strict";function n(){}function r(e){return e.split('"').length-1}n.prototype=Object.create(Object.prototype,{parse:{value:function(e){var t,n,o,i,u,a,s,l=[],c=0;for((o=e.split("\n")).length>1&&""===o[o.length-1]&&o.pop(),t=0,n=o.length;t0&&(u+="\t"),"string"==typeof(i=e[t][r])?i.indexOf("\n")>-1?u+='"'+i.replace(/"/g,'""')+'"':u+=i:u+=null===i||void 0===i?"":i;u+="\n"}return u},enumerable:!0,configurable:!1,writable:!1}}),void 0!==e&&e.exports?e.exports=n:t.SheetClip=n}(this)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.default=class{static set(e,t){e.clipboardData.setData("text/plain",t),e.preventDefault()}static get(e){let t;return t=e.clipboardData?e.clipboardData.getData("text/plain"):void 0}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=u(n(39)),o=u(n(53)),i=u(n(56));function u(e){return e&&e.__esModule?e:{default:e}}const a=(e,t)=>e({filtering_settings:t});t.default=(e=>{const t=new r.default(e),n=new o.default(()=>(function(e){var t=e();const n=t.columns,r=t.filtering,o=t.filtering_settings,i=t.filtering_type,u=t.id,s=t.row_deletable,l=t.row_selectable,c=t.setProps;return{columns:n,fillerColumns:(s?1:0)+(l?1:0),filtering:r,filtering_settings:o,filtering_type:i,id:u,setFilter:a.bind(void 0,c)}})(e)),u=new i.default(e);return function(e,t,n){const r=[];return r.push(...n.createHeaders()),r.push(...t.createFilters()),r.push(...e.createCells()),r}.bind(void 0,t,n,u)})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=d(n(1)),o=d(n(40)),i=d(n(43)),u=d(n(50)),a=d(n(51)),s=d(n(52)),l=n(20),c=n(21);function d(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e,t=(0,a.default)(e().id),n=(0,o.default)(e().id)){this.propsFn=e,this.cellStyles=t,this.cellWrappers=n,this.cellInputs=(0,i.default)(),this.cellOperations=(0,u.default)(),this.cellDropdowns=(0,s.default)()}get props(){return this.propsFn()}createCells(){var e=this.props;const t=e.active_cell,n=e.columns,o=e.column_conditional_dropdowns,i=e.column_conditional_styles,u=e.column_static_dropdown,a=e.column_static_style,s=e.dataframe,d=e.dropdown_properties,p=e.editable,f=e.id,h=e.is_focused,v=e.row_deletable,y=e.row_selectable,g=e.selected_cell,m=e.selected_rows,b=e.setProps,x=e.viewport,w=this.cellOperations(t,s,x.dataframe,x.indices,y,v,m,b),E=this.cellWrappers(t,n,x.dataframe,p,g),_=this.cellStyles(n,i,a,x.dataframe),O=this.cellDropdowns(f)(n,x.dataframe,x.indices,o,u,d),S=this.cellInputs(t,n,x.dataframe,p,!!h,f,O,this.propsFn),C=(0,l.matrixMap3)(E,_,S,(e,t,n)=>r.default.cloneElement(e,{children:[n],style:t}));return(0,c.arrayMap)(w,C,(e,t)=>Array.prototype.concat(e,t))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=d(n(1)),i=n(3),u=n(7),a=d(n(41)),s=d(n(18)),l=d(n(42)),c=d(n(8));function d(e){return e&&e.__esModule?e:{default:e}}function p(e,t,n,o,i,a){return r.addIndex(r.map)((o,c)=>r.addIndex(r.map)((n,r)=>{const o=(0,s.default)(t,c,r),d=(0,l.default)(a,c,r),p="dash-cell"+` column-${r}`+(o?" focused":"")+(i?"":" cell--uneditable")+(d?" cell--selected":"")+(n.type===u.ColumnType.Dropdown?" dropdown":"");return e([c,r],o,p,r,n.id)},n),o)}t.default=(0,i.memoizeAll)(function(e){const t=(0,c.default)((e,t,n,r)=>o.default.createElement(a.default,{active:e,classes:t,key:`column-${n}`,property:r}));return(0,i.memoizeOne)(p).bind(void 0,t)})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(1),i=function(e){return e&&e.__esModule?e:{default:e}}(o);const u=/^children$/;t.default=class extends o.Component{constructor(e){super(e)}get propsWithDefaults(){return this.props}render(){var e=this.propsWithDefaults;const t=e.classes,n=e.property,r=e.style;return i.default.createElement("td",{ref:"td",children:this.props.children,tabIndex:-1,className:t,style:r,"data-dash-column":n})}shouldComponentUpdate(e){const t=this.props,n=this.getChildProps(t),o=this.getChildProps(e);return r.any(n=>!u.test(n)&&t[n]!==e[n],r.keysIn(t))||r.any(e=>n[e]!==o[e],r.keysIn(n))}getChildProps(e){return e&&e.children&&e.children[0]&&e.children[0].props}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));t.default=((e,t,n)=>r.contains([t,n],e))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=l(n(1)),i=n(3),u=l(n(44)),a=l(n(47)),s=l(n(18));function l(e){return e&&e.__esModule?e:{default:e}}const c=r.addIndex(r.map),d=r.addIndex(r.map),p=(0,a.default)();t.default=(0,i.memoizeOneFactory)((e,t,n,r,i,a,l,f)=>c((n,c)=>d((t,d)=>{const h=(0,s.default)(e,c,d),v=l[c][d],y=p(f)(c,d);return o.default.createElement(u.default,Object.assign({key:`column-${d}`,active:h,clearable:t.clearable,datum:n,dropdown:v,editable:r,focused:i,property:t.id,tableId:a,type:t.type,value:n[t.id]},y))},t),n))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=n(1),o=c(r),i=c(n(45)),u=c(n(46)),a=n(15),s=n(7),l=c(n(17));function c(e){return e&&e.__esModule?e:{default:e}}class d extends r.PureComponent{constructor(e){super(e),this.propagateChange=(()=>{if(this.state.value===this.props.value)return;(0,this.props.onChange)(this.state.value)}),this.handleChange=(e=>{this.setState({value:e.target.value})}),this.handleKeyDown=(e=>{e.keyCode!==a.KEY_CODES.ENTER&&e.keyCode!==a.KEY_CODES.TAB||this.propagateChange()}),this.handleOpenDropdown=(()=>{var e=this.refs;const t=e.dropdown,n=e.td;(0,l.default)(t.wrapper.querySelector(".Select-menu-outer"),n)}),this.state={value:e.value}}get propsWithDefaults(){return this.props}renderDropdown(){var e=this.propsWithDefaults;const t=e.clearable,n=e.dropdown,r=e.onChange,u=e.value;return n?o.default.createElement("div",{className:"dash-dropdown-cell-value-container dash-cell-value-container"},this.renderValue({className:"dropdown-cell-value-shadow cell-value-shadow"},(n.find(e=>e.value===u)||{label:void 0}).label),o.default.createElement(i.default,{ref:"dropdown",clearable:t,onChange:e=>{r(e?e.value:e)},onOpen:this.handleOpenDropdown,options:n,placeholder:"",value:u})):this.renderValue()}renderInput(){var e=this.propsWithDefaults;const t=e.active,n=e.focused,r=e.onClick,i=e.onDoubleClick,u=e.onPaste,a={className:[...t?["input-active"]:[],...n?["focused"]:["unfocused"],...["dash-cell-value"]].join(" "),onClick:r,onDoubleClick:i};return!t&&this.state.value===this.props.value?this.renderValue(a):o.default.createElement("div",{className:"dash-input-cell-value-container dash-cell-value-container"},this.renderValue({className:"input-cell-value-shadow cell-value-shadow"}),o.default.createElement("input",Object.assign({ref:"textInput",type:"text",value:this.state.value,onBlur:this.propagateChange,onChange:this.handleChange,onKeyDown:this.handleKeyDown,onPaste:u},a)))}renderValue(e={},t){return t=t||this.propsWithDefaults.value,o.default.createElement("div",Object.assign({},e),t)}render(){switch(this.props.type){case s.ColumnType.Text:case s.ColumnType.Numeric:return this.renderInput();case s.ColumnType.Dropdown:return this.renderDropdown();default:return this.renderValue()}}componentWillReceiveProps(e){const t=e.value;this.state.value!==t&&this.setState({value:t})}componentDidUpdate(){if(!this.propsWithDefaults.active)return;const e=this.refs.textInput,t=this.refs.dropdown;if(e&&document.activeElement!==e&&(e.focus(),e.setSelectionRange(0,e.value?e.value.length:0)),t&&document.activeElement!==t){const e=u.default.getFirstParentOfType(t.wrapper,"td");e&&e.focus()}}}t.default=d,d.defaultProps={conditionalDropdowns:[],type:s.ColumnType.Text}},function(e,t,n){"use strict";n.r(t),n.d(t,"Async",function(){return V}),n.d(t,"AsyncCreatable",function(){return Y}),n.d(t,"Creatable",function(){return L}),n.d(t,"Value",function(){return F}),n.d(t,"Option",function(){return k}),n.d(t,"defaultMenuRenderer",function(){return m}),n.d(t,"defaultArrowRenderer",function(){return p}),n.d(t,"defaultClearRenderer",function(){return f}),n.d(t,"defaultFilterOptions",function(){return g});var r=n(23),o=n.n(r),i=n(5),u=n.n(i),a=n(0),s=n.n(a),l=n(1),c=n.n(l),d=n(6),p=function(e){var t=e.onMouseDown;return c.a.createElement("span",{className:"Select-arrow",onMouseDown:t})};p.propTypes={onMouseDown:s.a.func};var f=function(){return c.a.createElement("span",{className:"Select-clear",dangerouslySetInnerHTML:{__html:"×"}})},h=[{base:"A",letters:/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g},{base:"AA",letters:/[\uA732]/g},{base:"AE",letters:/[\u00C6\u01FC\u01E2]/g},{base:"AO",letters:/[\uA734]/g},{base:"AU",letters:/[\uA736]/g},{base:"AV",letters:/[\uA738\uA73A]/g},{base:"AY",letters:/[\uA73C]/g},{base:"B",letters:/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g},{base:"C",letters:/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g},{base:"D",letters:/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g},{base:"DZ",letters:/[\u01F1\u01C4]/g},{base:"Dz",letters:/[\u01F2\u01C5]/g},{base:"E",letters:/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g},{base:"F",letters:/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g},{base:"G",letters:/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g},{base:"H",letters:/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g},{base:"I",letters:/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g},{base:"J",letters:/[\u004A\u24BF\uFF2A\u0134\u0248]/g},{base:"K",letters:/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g},{base:"L",letters:/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g},{base:"LJ",letters:/[\u01C7]/g},{base:"Lj",letters:/[\u01C8]/g},{base:"M",letters:/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g},{base:"N",letters:/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g},{base:"NJ",letters:/[\u01CA]/g},{base:"Nj",letters:/[\u01CB]/g},{base:"O",letters:/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g},{base:"OI",letters:/[\u01A2]/g},{base:"OO",letters:/[\uA74E]/g},{base:"OU",letters:/[\u0222]/g},{base:"P",letters:/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g},{base:"Q",letters:/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g},{base:"R",letters:/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g},{base:"S",letters:/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g},{base:"T",letters:/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g},{base:"TZ",letters:/[\uA728]/g},{base:"U",letters:/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g},{base:"V",letters:/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g},{base:"VY",letters:/[\uA760]/g},{base:"W",letters:/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g},{base:"X",letters:/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g},{base:"Y",letters:/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g},{base:"Z",letters:/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g},{base:"a",letters:/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},{base:"aa",letters:/[\uA733]/g},{base:"ae",letters:/[\u00E6\u01FD\u01E3]/g},{base:"ao",letters:/[\uA735]/g},{base:"au",letters:/[\uA737]/g},{base:"av",letters:/[\uA739\uA73B]/g},{base:"ay",letters:/[\uA73D]/g},{base:"b",letters:/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},{base:"c",letters:/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},{base:"d",letters:/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},{base:"dz",letters:/[\u01F3\u01C6]/g},{base:"e",letters:/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},{base:"f",letters:/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},{base:"g",letters:/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},{base:"h",letters:/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},{base:"hv",letters:/[\u0195]/g},{base:"i",letters:/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},{base:"j",letters:/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},{base:"k",letters:/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},{base:"l",letters:/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},{base:"lj",letters:/[\u01C9]/g},{base:"m",letters:/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},{base:"n",letters:/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},{base:"nj",letters:/[\u01CC]/g},{base:"o",letters:/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},{base:"oi",letters:/[\u01A3]/g},{base:"ou",letters:/[\u0223]/g},{base:"oo",letters:/[\uA74F]/g},{base:"p",letters:/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},{base:"q",letters:/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},{base:"r",letters:/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},{base:"s",letters:/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},{base:"t",letters:/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},{base:"tz",letters:/[\uA729]/g},{base:"u",letters:/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},{base:"v",letters:/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},{base:"vy",letters:/[\uA761]/g},{base:"w",letters:/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},{base:"x",letters:/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},{base:"y",letters:/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},{base:"z",letters:/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}],v=function(e){for(var t=0;t-1)return!1;if(r.filterOption)return r.filterOption.call(void 0,e,t);if(!t)return!0;var o=e[r.valueKey],i=e[r.labelKey],u=y(o),a=y(i);if(!u&&!a)return!1;var s=u?String(o):null,l=a?String(i):null;return r.ignoreAccents&&(s&&"label"!==r.matchProp&&(s=v(s)),l&&"value"!==r.matchProp&&(l=v(l))),r.ignoreCase&&(s&&"label"!==r.matchProp&&(s=s.toLowerCase()),l&&"value"!==r.matchProp&&(l=l.toLowerCase())),"start"===r.matchPos?s&&"label"!==r.matchProp&&s.substr(0,t.length)===t||l&&"value"!==r.matchProp&&l.substr(0,t.length)===t:s&&"label"!==r.matchProp&&s.indexOf(t)>=0||l&&"value"!==r.matchProp&&l.indexOf(t)>=0})},m=function(e){var t=e.focusedOption,n=e.focusOption,r=e.inputValue,o=e.instancePrefix,i=e.onFocus,a=e.onOptionRef,s=e.onSelect,l=e.optionClassName,d=e.optionComponent,p=e.optionRenderer,f=e.options,h=e.removeValue,v=e.selectValue,y=e.valueArray,g=e.valueKey,m=d;return f.map(function(e,d){var f=y&&y.some(function(t){return t[g]===e[g]}),b=e===t,x=u()(l,{"Select-option":!0,"is-selected":f,"is-focused":b,"is-disabled":e.disabled});return c.a.createElement(m,{className:x,focusOption:n,inputValue:r,instancePrefix:o,isDisabled:e.disabled,isFocused:b,isSelected:f,key:"option-"+d+"-"+e[g],onFocus:i,onSelect:s,option:e,optionIndex:d,ref:function(e){a(e,b)},removeValue:h,selectValue:v},p(e,d,r))})};m.propTypes={focusOption:s.a.func,focusedOption:s.a.object,inputValue:s.a.string,instancePrefix:s.a.string,onFocus:s.a.func,onOptionRef:s.a.func,onSelect:s.a.func,optionClassName:s.a.string,optionComponent:s.a.func,optionRenderer:s.a.func,options:s.a.array,removeValue:s.a.func,selectValue:s.a.func,valueArray:s.a.array,valueKey:s.a.string};var b=function(e){e.preventDefault(),e.stopPropagation(),"A"===e.target.tagName&&"href"in e.target&&(e.target.target?window.open(e.target.href,e.target.target):window.location.href=e.target.href)},x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},w=(function(){function e(e){this.value=e}function t(t){var n,r;function o(n,r){try{var u=t[n](r),a=u.value;a instanceof e?Promise.resolve(a.value).then(function(e){o("next",e)},function(e){o("throw",e)}):i(u.done?"return":"normal",u.value)}catch(e){i("throw",e)}}function i(e,t){switch(e){case"return":n.resolve({value:t,done:!0});break;case"throw":n.reject(t);break;default:n.resolve({value:t,done:!1})}(n=n.next)?o(n.key,n.arg):r=null}this._invoke=function(e,t){return new Promise(function(i,u){var a={key:e,arg:t,resolve:i,reject:u,next:null};r?r=r.next=a:(n=r=a,o(e,t))})},"function"!=typeof t.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(t.prototype[Symbol.asyncIterator]=function(){return this}),t.prototype.next=function(e){return this._invoke("next",e)},t.prototype.throw=function(e){return this._invoke("throw",e)},t.prototype.return=function(e){return this._invoke("return",e)}}(),function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}),E=function(){function e(e,t){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n},A=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t},k=function(e){function t(e){w(this,t);var n=A(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleMouseDown=n.handleMouseDown.bind(n),n.handleMouseEnter=n.handleMouseEnter.bind(n),n.handleMouseMove=n.handleMouseMove.bind(n),n.handleTouchStart=n.handleTouchStart.bind(n),n.handleTouchEnd=n.handleTouchEnd.bind(n),n.handleTouchMove=n.handleTouchMove.bind(n),n.onFocus=n.onFocus.bind(n),n}return S(t,e),E(t,[{key:"handleMouseDown",value:function(e){e.preventDefault(),e.stopPropagation(),this.props.onSelect(this.props.option,e)}},{key:"handleMouseEnter",value:function(e){this.onFocus(e)}},{key:"handleMouseMove",value:function(e){this.onFocus(e)}},{key:"handleTouchEnd",value:function(e){this.dragging||this.handleMouseDown(e)}},{key:"handleTouchMove",value:function(){this.dragging=!0}},{key:"handleTouchStart",value:function(){this.dragging=!1}},{key:"onFocus",value:function(e){this.props.isFocused||this.props.onFocus(this.props.option,e)}},{key:"render",value:function(){var e=this.props,t=e.option,n=e.instancePrefix,r=e.optionIndex,o=u()(this.props.className,t.className);return t.disabled?c.a.createElement("div",{className:o,onMouseDown:b,onClick:b},this.props.children):c.a.createElement("div",{className:o,style:t.style,role:"option","aria-label":t.label,onMouseDown:this.handleMouseDown,onMouseEnter:this.handleMouseEnter,onMouseMove:this.handleMouseMove,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEnd,id:n+"-option-"+r,title:t.title},this.props.children)}}]),t}(c.a.Component);k.propTypes={children:s.a.node,className:s.a.string,instancePrefix:s.a.string.isRequired,isDisabled:s.a.bool,isFocused:s.a.bool,isSelected:s.a.bool,onFocus:s.a.func,onSelect:s.a.func,onUnfocus:s.a.func,option:s.a.object.isRequired,optionIndex:s.a.number};var F=function(e){function t(e){w(this,t);var n=A(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleMouseDown=n.handleMouseDown.bind(n),n.onRemove=n.onRemove.bind(n),n.handleTouchEndRemove=n.handleTouchEndRemove.bind(n),n.handleTouchMove=n.handleTouchMove.bind(n),n.handleTouchStart=n.handleTouchStart.bind(n),n}return S(t,e),E(t,[{key:"handleMouseDown",value:function(e){if("mousedown"!==e.type||0===e.button)return this.props.onClick?(e.stopPropagation(),void this.props.onClick(this.props.value,e)):void(this.props.value.href&&e.stopPropagation())}},{key:"onRemove",value:function(e){e.preventDefault(),e.stopPropagation(),this.props.onRemove(this.props.value)}},{key:"handleTouchEndRemove",value:function(e){this.dragging||this.onRemove(e)}},{key:"handleTouchMove",value:function(){this.dragging=!0}},{key:"handleTouchStart",value:function(){this.dragging=!1}},{key:"renderRemoveIcon",value:function(){if(!this.props.disabled&&this.props.onRemove)return c.a.createElement("span",{className:"Select-value-icon","aria-hidden":"true",onMouseDown:this.onRemove,onTouchEnd:this.handleTouchEndRemove,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove},"×")}},{key:"renderLabel",value:function(){return this.props.onClick||this.props.value.href?c.a.createElement("a",{className:"Select-value-label",href:this.props.value.href,target:this.props.value.target,onMouseDown:this.handleMouseDown,onTouchEnd:this.handleMouseDown},this.props.children):c.a.createElement("span",{className:"Select-value-label",role:"option","aria-selected":"true",id:this.props.id},this.props.children)}},{key:"render",value:function(){return c.a.createElement("div",{className:u()("Select-value",this.props.value.className),style:this.props.value.style,title:this.props.value.title},this.renderRemoveIcon(),this.renderLabel())}}]),t}(c.a.Component);F.propTypes={children:s.a.node,disabled:s.a.bool,id:s.a.string,onClick:s.a.func,onRemove:s.a.func,value:s.a.object.isRequired}; /*! Copyright (c) 2018 Jed Watson. Licensed under the MIT License (MIT), see http://jedwatson.github.io/react-select */ -var D=function(e){return"string"==typeof e?e:null!==e&&JSON.stringify(e)||""},P=s.a.oneOfType([s.a.string,s.a.node]),T=s.a.oneOfType([s.a.string,s.a.number]),R=1,j=function(e,t){var n=void 0===e?"undefined":x(e);if("string"!==n&&"number"!==n&&"boolean"!==n)return e;var r=t.options,o=t.valueKey;if(r)for(var i=0;iu||id.bottom?l.scrollTop=s.offsetTop+s.clientHeight-l.offsetHeight:c.topt.offsetHeight&&t.scrollHeight-t.offsetHeight-t.scrollTop<=0&&this.props.onMenuScrollToBottom()}}},{key:"getOptionLabel",value:function(e){return e[this.props.labelKey]}},{key:"getValueArray",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,n="object"===(void 0===t?"undefined":x(t))?t:this.props;if(n.multi){if("string"==typeof e&&(e=e.split(n.delimiter)),!Array.isArray(e)){if(null===e||void 0===e)return[];e=[e]}return e.map(function(e){return j(e,n)}).filter(function(e){return e})}var r=j(e,n);return r?[r]:[]}},{key:"setValue",value:function(e){var t=this;if(this.props.autoBlur&&this.blurInput(),this.props.required){var n=I(e,this.props.multi);this.setState({required:n})}this.props.simpleValue&&e&&(e=this.props.multi?e.map(function(e){return e[t.props.valueKey]}).join(this.props.delimiter):e[this.props.valueKey]),this.props.onChange&&this.props.onChange(e)}},{key:"selectValue",value:function(e){var t=this;this.props.closeOnSelect&&(this.hasScrolledToOption=!1);var n=this.props.onSelectResetsInput?"":this.state.inputValue;this.props.multi?this.setState({focusedIndex:null,inputValue:this.handleInputValueChange(n),isOpen:!this.props.closeOnSelect},function(){t.getValueArray(t.props.value).some(function(n){return n[t.props.valueKey]===e[t.props.valueKey]})?t.removeValue(e):t.addValue(e)}):this.setState({inputValue:this.handleInputValueChange(n),isOpen:!this.props.closeOnSelect,isPseudoFocused:this.state.isFocused},function(){t.setValue(e)})}},{key:"addValue",value:function(e){var t=this.getValueArray(this.props.value),n=this._visibleOptions.filter(function(e){return!e.disabled}),r=n.indexOf(e);this.setValue(t.concat(e)),n.length-1===r?this.focusOption(n[r-1]):n.length>r&&this.focusOption(n[r+1])}},{key:"popValue",value:function(){var e=this.getValueArray(this.props.value);e.length&&!1!==e[e.length-1].clearableValue&&this.setValue(this.props.multi?e.slice(0,e.length-1):null)}},{key:"removeValue",value:function(e){var t=this,n=this.getValueArray(this.props.value);this.setValue(n.filter(function(n){return n[t.props.valueKey]!==e[t.props.valueKey]})),this.focus()}},{key:"clearValue",value:function(e){e&&"mousedown"===e.type&&0!==e.button||(e.preventDefault(),this.setValue(this.getResetValue()),this.setState({inputValue:this.handleInputValueChange(""),isOpen:!1},this.focus),this._focusAfterClear=!0)}},{key:"getResetValue",value:function(){return void 0!==this.props.resetValue?this.props.resetValue:this.props.multi?[]:null}},{key:"focusOption",value:function(e){this.setState({focusedOption:e})}},{key:"focusNextOption",value:function(){this.focusAdjacentOption("next")}},{key:"focusPreviousOption",value:function(){this.focusAdjacentOption("previous")}},{key:"focusPageUpOption",value:function(){this.focusAdjacentOption("page_up")}},{key:"focusPageDownOption",value:function(){this.focusAdjacentOption("page_down")}},{key:"focusStartOption",value:function(){this.focusAdjacentOption("start")}},{key:"focusEndOption",value:function(){this.focusAdjacentOption("end")}},{key:"focusAdjacentOption",value:function(e){var t=this._visibleOptions.map(function(e,t){return{option:e,index:t}}).filter(function(e){return!e.option.disabled});if(this._scrollToFocusedOptionOnUpdate=!0,!this.state.isOpen){var n={focusedOption:this._focusedOption||(t.length?t["next"===e?0:t.length-1].option:null),isOpen:!0};return this.props.onSelectResetsInput&&(n.inputValue=""),void this.setState(n)}if(t.length){for(var r=-1,o=0;o0?r-=1:r=t.length-1;else if("start"===e)r=0;else if("end"===e)r=t.length-1;else if("page_up"===e){var i=r-this.props.pageSize;r=i<0?0:i}else if("page_down"===e){var u=r+this.props.pageSize;r=u>t.length-1?t.length-1:u}-1===r&&(r=0),this.setState({focusedIndex:t[r].index,focusedOption:t[r].option})}}},{key:"getFocusedOption",value:function(){return this._focusedOption}},{key:"selectFocusedOption",value:function(){if(this._focusedOption)return this.selectValue(this._focusedOption)}},{key:"renderLoading",value:function(){if(this.props.isLoading)return c.a.createElement("span",{className:"Select-loading-zone","aria-hidden":"true"},c.a.createElement("span",{className:"Select-loading"}))}},{key:"renderValue",value:function(e,t){var n=this,r=this.props.valueRenderer||this.getOptionLabel,o=this.props.valueComponent;if(!e.length)return function(e,t,n){var r=e.inputValue,o=e.isPseudoFocused,i=e.isFocused,u=t.onSelectResetsInput;return!r||!u&&!n&&!o&&!i}(this.state,this.props,t)?c.a.createElement("div",{className:"Select-placeholder"},this.props.placeholder):null;var i=this.props.onValueClick?this.handleValueClick:null;return this.props.multi?e.map(function(e,t){return c.a.createElement(o,{disabled:n.props.disabled||!1===e.clearableValue,id:n._instancePrefix+"-value-"+t,instancePrefix:n._instancePrefix,key:"value-"+t+"-"+e[n.props.valueKey],onClick:i,onRemove:n.removeValue,placeholder:n.props.placeholder,value:e},r(e,t),c.a.createElement("span",{className:"Select-aria-only"}," "))}):function(e,t){var n=e.inputValue,r=e.isPseudoFocused,o=e.isFocused,i=t.onSelectResetsInput;return!n||!i&&!(!o&&r||o&&!r)}(this.state,this.props)?(t&&(i=null),c.a.createElement(o,{disabled:this.props.disabled,id:this._instancePrefix+"-value-item",instancePrefix:this._instancePrefix,onClick:i,placeholder:this.props.placeholder,value:e[0]},r(e[0]))):void 0}},{key:"renderInput",value:function(e,t){var n,r=this,i=u()("Select-input",this.props.inputProps.className),a=this.state.isOpen,s=u()((_(n={},this._instancePrefix+"-list",a),_(n,this._instancePrefix+"-backspace-remove-message",this.props.multi&&!this.props.disabled&&this.state.isFocused&&!this.state.inputValue),n)),l=this.state.inputValue;!l||this.props.onSelectResetsInput||this.state.isFocused||(l="");var p=O({},this.props.inputProps,{"aria-activedescendant":a?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value","aria-describedby":this.props["aria-describedby"],"aria-expanded":""+a,"aria-haspopup":""+a,"aria-label":this.props["aria-label"],"aria-labelledby":this.props["aria-labelledby"],"aria-owns":s,className:i,onBlur:this.handleInputBlur,onChange:this.handleInputChange,onFocus:this.handleInputFocus,ref:function(e){return r.input=e},role:"combobox",required:this.state.required,tabIndex:this.props.tabIndex,value:l});if(this.props.inputRenderer)return this.props.inputRenderer(p);if(this.props.disabled||!this.props.searchable){var d=C(this.props.inputProps,[]),f=u()(_({},this._instancePrefix+"-list",a));return c.a.createElement("div",O({},d,{"aria-expanded":a,"aria-owns":f,"aria-activedescendant":a?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value","aria-disabled":""+this.props.disabled,"aria-label":this.props["aria-label"],"aria-labelledby":this.props["aria-labelledby"],className:i,onBlur:this.handleInputBlur,onFocus:this.handleInputFocus,ref:function(e){return r.input=e},role:"combobox",style:{border:0,width:1,display:"inline-block"},tabIndex:this.props.tabIndex||0}))}return this.props.autosize?c.a.createElement(o.a,O({id:this.props.id},p,{minWidth:"5"})):c.a.createElement("div",{className:i,key:"input-wrap",style:{display:"inline-block"}},c.a.createElement("input",O({id:this.props.id},p)))}},{key:"renderClear",value:function(){var e=this.getValueArray(this.props.value);if(this.props.clearable&&e.length&&!this.props.disabled&&!this.props.isLoading){var t=this.props.multi?this.props.clearAllText:this.props.clearValueText,n=this.props.clearRenderer();return c.a.createElement("span",{"aria-label":t,className:"Select-clear-zone",onMouseDown:this.clearValue,onTouchEnd:this.handleTouchEndClearValue,onTouchMove:this.handleTouchMove,onTouchStart:this.handleTouchStart,title:t},n)}}},{key:"renderArrow",value:function(){if(this.props.arrowRenderer){var e=this.handleMouseDownOnArrow,t=this.state.isOpen,n=this.props.arrowRenderer({onMouseDown:e,isOpen:t});return n?c.a.createElement("span",{className:"Select-arrow-zone",onMouseDown:e},n):null}}},{key:"filterOptions",value:function(e){var t=this.state.inputValue,n=this.props.options||[];if(this.props.filterOptions){var r="function"==typeof this.props.filterOptions?this.props.filterOptions:y;return r(n,t,e,{filterOption:this.props.filterOption,ignoreAccents:this.props.ignoreAccents,ignoreCase:this.props.ignoreCase,labelKey:this.props.labelKey,matchPos:this.props.matchPos,matchProp:this.props.matchProp,trimFilter:this.props.trimFilter,valueKey:this.props.valueKey})}return n}},{key:"onOptionRef",value:function(e,t){t&&(this.focused=e)}},{key:"renderMenu",value:function(e,t,n){return e&&e.length?this.props.menuRenderer({focusedOption:n,focusOption:this.focusOption,inputValue:this.state.inputValue,instancePrefix:this._instancePrefix,labelKey:this.props.labelKey,onFocus:this.focusOption,onOptionRef:this.onOptionRef,onSelect:this.selectValue,optionClassName:this.props.optionClassName,optionComponent:this.props.optionComponent,optionRenderer:this.props.optionRenderer||this.getOptionLabel,options:e,removeValue:this.removeValue,selectValue:this.selectValue,valueArray:t,valueKey:this.props.valueKey}):this.props.noResultsText?c.a.createElement("div",{className:"Select-noresults"},this.props.noResultsText):null}},{key:"renderHiddenField",value:function(e){var t=this;if(this.props.name){if(this.props.joinValues){var n=e.map(function(e){return D(e[t.props.valueKey])}).join(this.props.delimiter);return c.a.createElement("input",{disabled:this.props.disabled,name:this.props.name,ref:function(e){return t.value=e},type:"hidden",value:n})}return e.map(function(e,n){return c.a.createElement("input",{disabled:t.props.disabled,key:"hidden."+n,name:t.props.name,ref:"value"+n,type:"hidden",value:D(e[t.props.valueKey])})})}}},{key:"getFocusableOptionIndex",value:function(e){var t=this._visibleOptions;if(!t.length)return null;var n=this.props.valueKey,r=this.state.focusedOption||e;if(r&&!r.disabled){var o=-1;if(t.some(function(e,t){var i=e[n]===r[n];return i&&(o=t),i}),-1!==o)return o}for(var i=0;i{const u=n.slice(-1)[0],a=n.slice(0,-1),s=r.reduce((e,t)=>e.get(t)||e.set(t,new Map).get(t),t,a);return(s.get(u)||s.set(u,function(e){return(0,o.memoizeOne)((...t)=>e(...t))}(e)).get(u))(...i)}};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(5)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=d(n(1)),i=d(n(3)),u=d(n(47)),a=d(n(48)),s=n(49),l=d(n(11)),c=n(16),p=d(n(18));function d(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e){this.propsFn=e,this.handlers=new Map,this.ops=new Map,this.onChange=((e,t,n,o)=>{i.default.debug("Filter -- onChange",e,o.target.value&&o.target.value.trim());const u=o.target.value.trim();u&&u.length?t.set(e,u):t.delete(e),n(r.map(([e,t])=>`${e} ${t}`,r.filter(([e])=>this.isFragmentValid(e),Array.from(t.entries()))).join(" && "))}),this.getEventHandler=((e,t,n,r)=>{const o=this.handlers.get(e)||this.handlers.set(e,new Map).get(e),i=o.get(t)||o.set(t,new Map).get(t);return i.get(r)||i.set(r,e.bind(this,t,n,r)).get(r)})}get props(){return this.propsFn()}respectsBasicSyntax(e,t=!0){const n=[c.LexemeType.BinaryOperator,c.LexemeType.Expression,c.LexemeType.Operand,c.LexemeType.UnaryOperator];if(t&&n.push(c.LexemeType.And),!r.all(e=>r.contains(e.lexeme.name,n),e))return!1;const o=r.map(e=>e.value,r.filter(e=>e.lexeme.name===c.LexemeType.Operand,e)),i=r.uniq(o);return o.length===i.length}isBasicFilter(e,t,n=!0){return e.valid&&t.valid&&this.respectsBasicSyntax(e.lexemes,n)}updateOps(e){const t=(0,l.default)(e),n=(0,p.default)(t);if(!this.isBasicFilter(t,n))return;const r=[n.tree];for(;r.length;){const e=r.pop();e&&(e.lexeme.name===c.LexemeType.UnaryOperator&&e.block?this.ops.set(e.block.value,e.value):e.lexeme.name===c.LexemeType.BinaryOperator&&e.left&&e.right?this.ops.set(e.left.value,`${e.value} ${e.right.value}`):(r.push(e.left),r.push(e.block),r.push(e.right)))}}isFragmentValidOrNull(e){const t=this.ops.get(e);return!t||!t.trim().length||this.isFragmentValid(e)}isFragmentValid(e){const t=this.ops.get(e),n=(0,l.default)(`${e} ${t}`),r=(0,p.default)(n);return r.valid&&this.isBasicFilter(n,r,!1)}createFilters(){var e=this.props;const t=e.columns,n=e.filtering,i=e.filtering_settings,l=e.filtering_type,c=e.offset,p=e.setFilter;if(!n)return[];this.updateOps(i);const d=r.filter(e=>!e.hidden,t),f=r.range(0,c).map(e=>o.default.createElement("th",{key:`offset-${e}`})),h=l===s.FilteringType.Basic?r.addIndex(r.map)((e,t)=>o.default.createElement(u.default,{key:`column-${t+c}`,classes:`filter column-${t+c}`,isValid:this.isFragmentValidOrNull(e.id),property:e.id,setFilter:this.getEventHandler(this.onChange,e.id,this.ops,p),value:this.ops.get(e.id)}),d):[o.default.createElement(a.default,{key:`column-${c}`,classes:[],colSpan:d.length,value:"",setFilter:()=>void 0})];return[r.concat(f,h)]}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=u(r),i=u(n(20));function u(e){return e&&e.__esModule?e:{default:e}}t.default=class extends r.PureComponent{constructor(e){super(e),this.submit=(e=>{(0,this.props.setFilter)({target:{value:e}})}),this.state={value:e.value}}componentWillReceiveProps(e){const t=e.value;this.state.value!==t&&this.setState({value:t})}render(){var e=this.props;const t=e.classes,n=e.isValid,r=e.value;return o.default.createElement("th",{className:t+(n?"":" invalid")},o.default.createElement(i.default,{value:r,stopPropagation:!0,submit:this.submit}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=u(r),i=u(n(20));function u(e){return e&&e.__esModule?e:{default:e}}t.default=class extends r.PureComponent{constructor(e){super(e),this.submit=(e=>this.props.setFilter(e))}render(){var e=this.props;const t=e.colSpan,n=e.value;return o.default.createElement("th",{colSpan:t},o.default.createElement(i.default,{stopPropagation:!0,value:n,submit:this.submit}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=t.FilteringType=void 0;!function(e){e.Advanced="advanced",e.Basic="basic"}(r||(t.FilteringType=r={}));var o=t.ContentStyle=void 0;!function(e){e.Fit="fit",e.Grow="grow"}(o||(t.ContentStyle=o={}))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(5),i=n(7),u=s(i),a=s(n(17));function s(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e){this.target=e,this.getDataframe=(0,o.memoizeOne)((e,t,n,o,s=[],l)=>{const c=new Map;if(r.addIndex(r.forEach)((e,t)=>{c.set(e,t)},e),"fe"===t||!0===t){const t=new a.default(n);e=t.isValid?t.filter(e):e}const p=l?e=>""===e||(0,i.defaultIsNully)(e):void 0;return"fe"!==o&&!0!==o||(e=(0,u.default)(e,s,p)),{dataframe:e,indices:r.map(e=>c.get(e),e)}})}get dataframeAndIndices(){var e=this.target.props;const t=e.dataframe,n=e.filtering,r=e.filtering_settings,o=e.sorting,i=e.sorting_settings,u=e.sorting_treat_empty_string_as_none;return this.getDataframe(t,n,r,o,i,u)}get dataframe(){return this.dataframeAndIndices.dataframe}get indices(){return this.dataframeAndIndices.indices}get settings(){return this.target.props.virtualization_settings}get virtualization(){return this.target.props.virtualization}get viewportDataframe(){return this.target.props.virtual_dataframe}get viewportIndices(){return this.target.props.virtual_dataframe_indices}update(e){const t=this.target.setProps,n=e.settings,o=e.viewportDataframe,i=e.viewportIndices;let u=r.mergeAll([n?{virtualization_settings:n}:{},o?{virtual_dataframe:o}:{},i?{virtual_dataframe_indices:i}:{}]);setTimeout(()=>{t(u)},0)}}},function(e,t,n){var r=n(52);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(9)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(8)(!1)).push([e.i,"/**\n * React Select\n * ============\n * Created by Jed Watson and Joss Mackison for KeystoneJS, http://www.keystonejs.com/\n * https://twitter.com/jedwatson https://twitter.com/jossmackison https://twitter.com/keystonejs\n * MIT License: https://github.com/JedWatson/react-select\n*/\n.Select {\n position: relative;\n}\n.Select input::-webkit-contacts-auto-fill-button,\n.Select input::-webkit-credentials-auto-fill-button {\n display: none !important;\n}\n.Select input::-ms-clear {\n display: none !important;\n}\n.Select input::-ms-reveal {\n display: none !important;\n}\n.Select,\n.Select div,\n.Select input,\n.Select span {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n.Select.is-disabled .Select-arrow-zone {\n cursor: default;\n pointer-events: none;\n opacity: 0.35;\n}\n.Select.is-disabled > .Select-control {\n background-color: #f9f9f9;\n}\n.Select.is-disabled > .Select-control:hover {\n box-shadow: none;\n}\n.Select.is-open > .Select-control {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n background: #fff;\n border-color: #b3b3b3 #ccc #d9d9d9;\n}\n.Select.is-open > .Select-control .Select-arrow {\n top: -2px;\n border-color: transparent transparent #999;\n border-width: 0 5px 5px;\n}\n.Select.is-searchable.is-open > .Select-control {\n cursor: text;\n}\n.Select.is-searchable.is-focused:not(.is-open) > .Select-control {\n cursor: text;\n}\n.Select.is-focused > .Select-control {\n background: #fff;\n}\n.Select.is-focused:not(.is-open) > .Select-control {\n border-color: #007eff;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 3px rgba(0, 126, 255, 0.1);\n background: #fff;\n}\n.Select.has-value.is-clearable.Select--single > .Select-control .Select-value {\n padding-right: 42px;\n}\n.Select.has-value.Select--single > .Select-control .Select-value .Select-value-label,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value .Select-value-label {\n color: #333;\n}\n.Select.has-value.Select--single > .Select-control .Select-value a.Select-value-label,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label {\n cursor: pointer;\n text-decoration: none;\n}\n.Select.has-value.Select--single > .Select-control .Select-value a.Select-value-label:hover,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label:hover,\n.Select.has-value.Select--single > .Select-control .Select-value a.Select-value-label:focus,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label:focus {\n color: #007eff;\n outline: none;\n text-decoration: underline;\n}\n.Select.has-value.Select--single > .Select-control .Select-value a.Select-value-label:focus,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label:focus {\n background: #fff;\n}\n.Select.has-value.is-pseudo-focused .Select-input {\n opacity: 0;\n}\n.Select.is-open .Select-arrow,\n.Select .Select-arrow-zone:hover > .Select-arrow {\n border-top-color: #666;\n}\n.Select.Select--rtl {\n direction: rtl;\n text-align: right;\n}\n.Select-control {\n background-color: #fff;\n border-color: #d9d9d9 #ccc #b3b3b3;\n border-radius: 4px;\n border: 1px solid #ccc;\n color: #333;\n cursor: default;\n display: table;\n border-spacing: 0;\n border-collapse: separate;\n height: 36px;\n outline: none;\n overflow: hidden;\n position: relative;\n width: 100%;\n}\n.Select-control:hover {\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);\n}\n.Select-control .Select-input:focus {\n outline: none;\n background: #fff;\n}\n.Select-placeholder,\n.Select--single > .Select-control .Select-value {\n bottom: 0;\n color: #aaa;\n left: 0;\n line-height: 34px;\n padding-left: 10px;\n padding-right: 10px;\n position: absolute;\n right: 0;\n top: 0;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.Select-input {\n height: 34px;\n padding-left: 10px;\n padding-right: 10px;\n vertical-align: middle;\n}\n.Select-input > input {\n width: 100%;\n background: none transparent;\n border: 0 none;\n box-shadow: none;\n cursor: default;\n display: inline-block;\n font-family: inherit;\n font-size: inherit;\n margin: 0;\n outline: none;\n line-height: 17px;\n /* For IE 8 compatibility */\n padding: 8px 0 12px;\n /* For IE 8 compatibility */\n -webkit-appearance: none;\n}\n.is-focused .Select-input > input {\n cursor: text;\n}\n.has-value.is-pseudo-focused .Select-input {\n opacity: 0;\n}\n.Select-control:not(.is-searchable) > .Select-input {\n outline: none;\n}\n.Select-loading-zone {\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 16px;\n}\n.Select-loading {\n -webkit-animation: Select-animation-spin 400ms infinite linear;\n -o-animation: Select-animation-spin 400ms infinite linear;\n animation: Select-animation-spin 400ms infinite linear;\n width: 16px;\n height: 16px;\n box-sizing: border-box;\n border-radius: 50%;\n border: 2px solid #ccc;\n border-right-color: #333;\n display: inline-block;\n position: relative;\n vertical-align: middle;\n}\n.Select-clear-zone {\n -webkit-animation: Select-animation-fadeIn 200ms;\n -o-animation: Select-animation-fadeIn 200ms;\n animation: Select-animation-fadeIn 200ms;\n color: #999;\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 17px;\n}\n.Select-clear-zone:hover {\n color: #D0021B;\n}\n.Select-clear {\n display: inline-block;\n font-size: 18px;\n line-height: 1;\n}\n.Select--multi .Select-clear-zone {\n width: 17px;\n}\n.Select-arrow-zone {\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 25px;\n padding-right: 5px;\n}\n.Select--rtl .Select-arrow-zone {\n padding-right: 0;\n padding-left: 5px;\n}\n.Select-arrow {\n border-color: #999 transparent transparent;\n border-style: solid;\n border-width: 5px 5px 2.5px;\n display: inline-block;\n height: 0;\n width: 0;\n position: relative;\n}\n.Select-control > *:last-child {\n padding-right: 5px;\n}\n.Select--multi .Select-multi-value-wrapper {\n display: inline-block;\n}\n.Select .Select-aria-only {\n position: absolute;\n display: inline-block;\n height: 1px;\n width: 1px;\n margin: -1px;\n clip: rect(0, 0, 0, 0);\n overflow: hidden;\n float: left;\n}\n@-webkit-keyframes Select-animation-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes Select-animation-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n.Select-menu-outer {\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n background-color: #fff;\n border: 1px solid #ccc;\n border-top-color: #e6e6e6;\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);\n box-sizing: border-box;\n margin-top: -1px;\n max-height: 200px;\n position: absolute;\n left: 0;\n top: 100%;\n width: 100%;\n z-index: 1;\n -webkit-overflow-scrolling: touch;\n}\n.Select-menu {\n max-height: 198px;\n overflow-y: auto;\n}\n.Select-option {\n box-sizing: border-box;\n background-color: #fff;\n color: #666666;\n cursor: pointer;\n display: block;\n padding: 8px 10px;\n}\n.Select-option:last-child {\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.Select-option.is-selected {\n background-color: #f5faff;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 126, 255, 0.04);\n color: #333;\n}\n.Select-option.is-focused {\n background-color: #ebf5ff;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 126, 255, 0.08);\n color: #333;\n}\n.Select-option.is-disabled {\n color: #cccccc;\n cursor: default;\n}\n.Select-noresults {\n box-sizing: border-box;\n color: #999999;\n cursor: default;\n display: block;\n padding: 8px 10px;\n}\n.Select--multi .Select-input {\n vertical-align: middle;\n margin-left: 10px;\n padding: 0;\n}\n.Select--multi.Select--rtl .Select-input {\n margin-left: 0;\n margin-right: 10px;\n}\n.Select--multi.has-value .Select-input {\n margin-left: 5px;\n}\n.Select--multi .Select-value {\n background-color: #ebf5ff;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 126, 255, 0.08);\n border-radius: 2px;\n border: 1px solid #c2e0ff;\n /* Fallback color for IE 8 */\n border: 1px solid rgba(0, 126, 255, 0.24);\n color: #007eff;\n display: inline-block;\n font-size: 0.9em;\n line-height: 1.4;\n margin-left: 5px;\n margin-top: 5px;\n vertical-align: top;\n}\n.Select--multi .Select-value-icon,\n.Select--multi .Select-value-label {\n display: inline-block;\n vertical-align: middle;\n}\n.Select--multi .Select-value-label {\n border-bottom-right-radius: 2px;\n border-top-right-radius: 2px;\n cursor: default;\n padding: 2px 5px;\n}\n.Select--multi a.Select-value-label {\n color: #007eff;\n cursor: pointer;\n text-decoration: none;\n}\n.Select--multi a.Select-value-label:hover {\n text-decoration: underline;\n}\n.Select--multi .Select-value-icon {\n cursor: pointer;\n border-bottom-left-radius: 2px;\n border-top-left-radius: 2px;\n border-right: 1px solid #c2e0ff;\n /* Fallback color for IE 8 */\n border-right: 1px solid rgba(0, 126, 255, 0.24);\n padding: 1px 5px 3px;\n}\n.Select--multi .Select-value-icon:hover,\n.Select--multi .Select-value-icon:focus {\n background-color: #d8eafd;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 113, 230, 0.08);\n color: #0071e6;\n}\n.Select--multi .Select-value-icon:active {\n background-color: #c2e0ff;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 126, 255, 0.24);\n}\n.Select--multi.Select--rtl .Select-value {\n margin-left: 0;\n margin-right: 5px;\n}\n.Select--multi.Select--rtl .Select-value-icon {\n border-right: none;\n border-left: 1px solid #c2e0ff;\n /* Fallback color for IE 8 */\n border-left: 1px solid rgba(0, 126, 255, 0.24);\n}\n.Select--multi.is-disabled .Select-value {\n background-color: #fcfcfc;\n border: 1px solid #e3e3e3;\n color: #333;\n}\n.Select--multi.is-disabled .Select-value-icon {\n cursor: not-allowed;\n border-right: 1px solid #e3e3e3;\n}\n.Select--multi.is-disabled .Select-value-icon:hover,\n.Select--multi.is-disabled .Select-value-icon:focus,\n.Select--multi.is-disabled .Select-value-icon:active {\n background-color: #fcfcfc;\n}\n@keyframes Select-animation-spin {\n to {\n transform: rotate(1turn);\n }\n}\n@-webkit-keyframes Select-animation-spin {\n to {\n -webkit-transform: rotate(1turn);\n }\n}\n",""])},function(e,t){e.exports=function(e){var t="undefined"!=typeof window&&window.location;if(!t)throw new Error("fixUrls requires window.location");if(!e||"string"!=typeof e)return e;var n=t.protocol+"//"+t.host,r=n+t.pathname.replace(/\/[^\/]*$/,"/");return e.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,function(e,t){var o,i=t.trim().replace(/^"(.*)"$/,function(e,t){return t}).replace(/^'(.*)'$/,function(e,t){return t});return/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(i)?e:(o=0===i.indexOf("//")?i:0===i.indexOf("/")?n+i:r+i.replace(/^\.\//,""),"url("+JSON.stringify(o)+")")})}},function(e,t,n){var r=n(55);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(9)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(8)(!1)).push([e.i,".dash-spreadsheet.freeze-left {\n width: auto;\n width: fit-content;\n width: -moz-fit-content;\n width: -webkit-fit-content;\n max-width: 500px;\n}\n.dash-spreadsheet.freeze-top {\n width: auto;\n width: fit-content;\n width: -moz-fit-content;\n width: -webkit-fit-content;\n max-height: 500px;\n}\n.dash-spreadsheet-container {\n display: flex;\n flex-direction: row;\n position: relative;\n}\n.dash-spreadsheet-inner {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n}\n.dash-spreadsheet-inner *,\n.dash-spreadsheet-inner *:after,\n.dash-spreadsheet-inner *:before {\n box-sizing: inherit;\n}\n.dash-spreadsheet-inner .Select {\n overflow: hidden;\n position: static;\n}\n.dash-spreadsheet-inner .Select,\n.dash-spreadsheet-inner .Select-control {\n background-color: inherit;\n}\n.dash-spreadsheet-inner .Select-value {\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin-top: -2px;\n}\n.dash-spreadsheet-inner .marker-row tr {\n visibility: hidden !important;\n}\n.dash-spreadsheet-inner .marker-row td,\n.dash-spreadsheet-inner .marker-row th {\n height: 0 !important;\n padding: 0 !important;\n margin: 0 !important;\n}\n.dash-spreadsheet-inner.freeze-left,\n.dash-spreadsheet-inner.freeze-top {\n overflow: hidden !important;\n}\n.dash-spreadsheet-inner.freeze-left .row-0,\n.dash-spreadsheet-inner.freeze-top .row-0 {\n display: flex;\n flex: 0 0 auto;\n flex-direction: row;\n}\n.dash-spreadsheet-inner.freeze-left .row-1,\n.dash-spreadsheet-inner.freeze-top .row-1 {\n display: flex;\n flex-direction: row;\n overflow: scroll;\n}\n.dash-spreadsheet-inner.freeze-left .cell-0-0,\n.dash-spreadsheet-inner.freeze-top .cell-0-0,\n.dash-spreadsheet-inner.freeze-left .cell-1-0,\n.dash-spreadsheet-inner.freeze-top .cell-1-0 {\n flex: 0 0 auto;\n left: 0;\n position: sticky;\n z-index: 400;\n}\n.dash-spreadsheet-inner.freeze-left .cell-0-1,\n.dash-spreadsheet-inner.freeze-top .cell-0-1 {\n z-index: 300;\n flex: 0 0 auto;\n}\n.dash-spreadsheet-inner.freeze-left .cell-1-1,\n.dash-spreadsheet-inner.freeze-top .cell-1-1 {\n flex: 0 0 auto;\n}\n.dash-spreadsheet-inner.dash-grow .cell-0-1,\n.dash-spreadsheet-inner.dash-grow .cell-1-1 {\n flex: 1 0 auto;\n}\n.dash-spreadsheet-inner.dash-grow table {\n width: 100%;\n}\n.dash-spreadsheet-inner:not(.freeze-top):not(.freeze-left) .cell-1-1 tr td:first-of-type,\n.dash-spreadsheet-inner:not(.freeze-top):not(.freeze-left) .cell-1-1 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.freeze-top):not(.freeze-left) .cell-1-1 tr:first-of-type td,\n.dash-spreadsheet-inner:not(.freeze-top):not(.freeze-left) .cell-1-1 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.freeze-top):not(.freeze-left) .cell-1-1 tr:first-of-type td:first-of-type,\n.dash-spreadsheet-inner:not(.freeze-top):not(.freeze-left) .cell-1-1 tr:first-of-type th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.freeze-top).freeze-left .cell-1-0 tr td:first-of-type,\n.dash-spreadsheet-inner:not(.freeze-top).freeze-left .cell-1-0 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.freeze-top).freeze-left .cell-1-0 tr:first-of-type td,\n.dash-spreadsheet-inner:not(.freeze-top).freeze-left .cell-1-0 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.freeze-top).freeze-left .cell-1-0 tr:first-of-type td:first-of-type,\n.dash-spreadsheet-inner:not(.freeze-top).freeze-left .cell-1-0 tr:first-of-type th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.freeze-top).freeze-left .cell-1-1 tr:first-of-type td,\n.dash-spreadsheet-inner:not(.freeze-top).freeze-left .cell-1-1 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top:not(.freeze-left) .cell-0-1 tr td:first-of-type,\n.dash-spreadsheet-inner.freeze-top:not(.freeze-left) .cell-0-1 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top:not(.freeze-left) .cell-0-1 tr:first-of-type td,\n.dash-spreadsheet-inner.freeze-top:not(.freeze-left) .cell-0-1 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top:not(.freeze-left) .cell-0-1 tr:first-of-type td:first-of-type,\n.dash-spreadsheet-inner.freeze-top:not(.freeze-left) .cell-0-1 tr:first-of-type th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top:not(.freeze-left) .cell-1-1 tr td:first-of-type,\n.dash-spreadsheet-inner.freeze-top:not(.freeze-left) .cell-1-1 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-0-0 tr td:first-of-type,\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-0-0 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-0-0 tr:first-of-type td,\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-0-0 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-0-0 tr:first-of-type td:first-of-type,\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-0-0 tr:first-of-type th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-0-1 tr:first-of-type td,\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-0-1 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-1-0 tr td:first-of-type,\n.dash-spreadsheet-inner.freeze-top.freeze-left .cell-1-0 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner .cell td,\n.dash-spreadsheet-inner .cell th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner .cell td:focus,\n.dash-spreadsheet-inner .cell th:focus {\n outline: none;\n}\n.dash-spreadsheet-inner .filter.invalid {\n box-shadow: inset 1px 0px 0px 0px red, inset 0px 1px 0px 0px red, inset -1px 0px 0px red, inset 0px -1px 0px 0px red;\n background-color: pink;\n}\n.dash-spreadsheet-inner .selected-row td,\n.dash-spreadsheet-inner .selected-row th {\n background-color: var(--selected-row);\n}\n.dash-spreadsheet-inner tr {\n background-color: white;\n}\n.dash-spreadsheet-inner td {\n background-color: inherit;\n}\n.dash-spreadsheet-inner td.cell--selected {\n background-color: var(--selected-background);\n}\n.dash-spreadsheet-inner td.focused {\n box-shadow: 1px 0px 0px 0px var(--accent), 0px 1px 0px 0px var(--accent), 0 0px 0px var(--accent), 0px 0 0px 0px var(--accent);\n border: 1px solid var(--accent);\n margin: -1px;\n z-index: 200;\n}\n.dash-spreadsheet-inner td .cell-value {\n height: 100%;\n width: 100%;\n}\n.dash-spreadsheet-inner td div.cell-value {\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n.dash-spreadsheet-inner td,\n.dash-spreadsheet-inner th {\n padding: 2px;\n white-space: nowrap;\n overflow-x: hidden;\n text-overflow: ellipsis;\n height: 30px;\n text-align: right;\n}\n.dash-spreadsheet-inner th .column-header--edit,\n.dash-spreadsheet-inner th .column-header--delete,\n.dash-spreadsheet-inner th .sort {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: default;\n cursor: pointer;\n}\n.dash-spreadsheet-inner textarea {\n white-space: pre;\n}\n.dash-spreadsheet-inner table {\n border-collapse: collapse;\n font-family: monospace;\n --accent: hotpink;\n --border: lightgrey;\n --text-color: #3c3c3c;\n --hover: #fdfdfd;\n --background-color-ellipses: #fdfdfd;\n --faded-text: #fafafa;\n --faded-text-header: #b4b4b4;\n --selected-background: rgba(255, 65, 54, 0.2);\n --faded-dropdown: #f0f0f0;\n --selected-row: #fff0ff;\n --muted: #c8c8c8;\n}\n/* focus happens after copying to clipboard */\n.dash-spreadsheet-inner table:focus {\n outline: none;\n}\n.dash-spreadsheet-inner thead {\n display: table-row-group;\n}\n.elip {\n text-align: center;\n width: 100%;\n background-color: var(--background-color-ellipses);\n}\n.dash-spreadsheet-inner td.dropdown {\n /*\n * To view the dropdown's contents, we need\n * overflow-y: visible.\n * Unfortunately, overflow-x: hidden and overflow-y: visible\n * can't both be set at the same time.\n * So, we have to make both overflow-x: visible and overflow-y: visble\n *\n * See https://stackoverflow.com/questions/6421966/\n *\n * There might be another solution with parent divs, but I haven't\n * tried it.\n */\n overflow-x: visible;\n}\n.dash-spreadsheet-inner th {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner :not(.cell--selected) tr:hover,\ntr:hover input :not(.cell--selected) {\n background-color: var(--hover);\n}\n.dash-spreadsheet-inner th {\n background-color: #fafafa;\n}\n.sort {\n cursor: pointer;\n float: left;\n color: var(--faded-text-header);\n font-size: 20px;\n}\nth:hover .sort {\n color: var(--accent);\n}\n.sort:hover {\n text-decoration: underline;\n}\n.expanded-row--empty-cell {\n box-shadow: none;\n background-color: transparent;\n}\n.expanded-row {\n text-align: center;\n}\n.dash-spreadsheet-inner input:not([type=radio]):not([type=checkbox]) {\n padding: 0px;\n margin: 0px;\n height: calc(100% - 1px);\n width: calc(100% - 1px);\n line-height: 30px;\n border: none;\n font-family: inherit;\n text-align: right;\n box-sizing: border-box;\n color: var(--text-color);\n background-color: transparent;\n /* so as to not overlay the box shadow */\n /* browser's default text-shadow is `$color 0px 0px 0px;`\n * for `input`, which makes it look a little bit heavier than dropdowns\n * or bare `td`\n */\n text-shadow: none;\n}\n.dash-spreadsheet-inner input.unfocused {\n color: transparent;\n text-shadow: 0 0 0 var(--text-color);\n cursor: default;\n}\n.dash-spreadsheet-inner input.unfocused:focus {\n outline: none;\n}\n.numeric {\n font-family: monospace;\n}\n.toggle-row {\n border: none;\n box-shadow: none;\n width: 10px;\n padding-left: 10px;\n padding-right: 10px;\n cursor: pointer;\n color: var(--faded-text);\n}\n.toggle-row--expanded {\n color: var(--accent);\n}\n.dash-spreadsheet-inner tr:hover .toggle-row {\n color: var(--accent);\n}\n.cell--uneditable,\n.cell--uneditable input {\n cursor: not-allowed;\n}\n.expanded-row {\n box-shadow: inset 2px 0px 0px 0px var(--accent), inset -1px 0px 0px 0px var(--border);\n /* inset 0px 1px 0px 0px var(--border); */\n}\n.dash-spreadsheet-inner .delete-cell {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: default;\n font-size: 1.3rem;\n text-align: center;\n cursor: pointer;\n color: var(--muted);\n}\n.dash-spreadsheet-inner .delete-cell:hover {\n color: var(--accent);\n}\n.dash-spreadsheet-inner .column-header--edit {\n float: left;\n opacity: 0.1;\n padding-left: 2px;\n padding-right: 2px;\n cursor: pointer;\n}\n.dash-spreadsheet-inner th:hover .column-header--edit {\n color: var(--accent);\n opacity: 1;\n}\n.dash-spreadsheet-inner .column-header--delete {\n float: left;\n opacity: 0.1;\n padding-left: 2px;\n padding-right: 2px;\n cursor: pointer;\n}\n.dash-spreadsheet-inner th:hover .column-header--delete {\n color: var(--accent);\n opacity: 1;\n}\n",""])},function(e,t,n){var r=n(57);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(9)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(8)(!1)).push([e.i,".dash-spreadsheet .Select,\n.dash-spreadsheet .Select-control {\n border: none;\n cursor: pointer;\n height: 30px; /* matches the td height and line-height */\n border: none;\n}\n\n.dash-spreadsheet .Select-placeholder,\n.dash-spreadsheet .Select--single > .Select-control .Select-value {\n height: 100%;\n line-height: inherit;\n}\n\n.dash-spreadsheet .Select.has-value.Select--single > .Select-control .Select-value .Select-value-label,\n.dash-spreadsheet .Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value .Select-value-label {\n color: var(--text-color);\n}\n\n.dash-spreadsheet .Select:hover,\n.dash-spreadsheet .Select-control:hover {\n border: none;\n box-shadow: none;\n cursor: pointer;\n}\n\n.dash-spreadsheet .Select-menu-outer {\n z-index: 100;\n}\n\n.dash-spreadsheet .Select-arrow {\n border-top-color: var(--faded-dropdown);\n border-left-color: transparent;\n border-right-color: transparent;\n border-bottom-color: transparent;\n}\n\n.dash-spreadsheet .Select-control:hover .Select-arrow {\n border-top-color: var(--accent);\n border-left-color: transparent;\n border-right-color: transparent;\n border-bottom-color: transparent;\n}\n\n.dash-spreadsheet .is-open > .Select-control .Select-arrow {\n border-bottom-color: var(--background-color-8-react-select);\n border-left-color: transparent;\n border-right-color: transparent;\n border-top-color: transparent;\n}\n\n.dash-spreadsheet .Select--multi .Select-value,\n.dash-spreadsheet .Select--multi a.Select-value-label {\n color: var(--color-8-react-select);\n}\n\n.dash-spreadsheet .Select {\n border-radius: 0;\n}\n\n.dash-spreadsheet .Select.is-disabled > .Select-control {\n border: none;\n}\n\n.dash-spreadsheet .Select--multi .Select-value-icon:hover,\n.dash-spreadsheet .Select--multi .Select-value-icon:focus {\n font-weight: bold;\n}\n\n.dash-spreadsheet .Select.is-disabled .Select-control {\n cursor: not-allowed;\n}\n\n.dash-spreadsheet .Select-menu-outer {\n background-color: white;\n border: none;\n border-bottom: thin var(--border) solid;\n border-radius: 0;\n border-top: none;\n}\n\n.dash-spreadsheet .Select-option {\n background-color: inherit;\n color: var(--accent);\n}\n\n.dash-spreadsheet .Select-option:hover {\n font-weight: bold;\n color: var(--accent);\n background-color: var(--hover);\n}\n\n.dash-spreadsheet .Select.is-focused:not(.is-open) > .Select-control {\n border: none;\n -webkit-box-shadow: none;\n box-shadow: none;\n background: #fff;\n}\n\n.dash-spreadsheet .Select-option.is-focused {\n background-color: white;\n color: var(--accent);\n font-weight: bold;\n}\n\n.dash-spreadsheet .Select-clear {\n color: transparent;\n}\n.Select:hover .Select-clear {\n color: var(--accent);\n}\n\n.dash-spreadsheet .Select-control {\n padding-left: 2px;\n}\n\n.dash-spreadsheet .cell--selected .Select-control {\n background-color: var(--selected-background);\n border-radius: 0;\n}\n",""])},function(e,t,n){var r=n(59);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(9)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(8)(!1)).push([e.i,"/*RESET CSS*/\nhtml {\n color: #000;\n background: #FFF;\n}\nbody,\ndiv,\ndl,\ndt,\ndd,\nul,\nol,\nli,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\npre,\ncode,\nform,\nfieldset,\nlegend,\ninput,\ntextarea,\np,\nblockquote,\nth,\ntd {\n margin: 0;\n padding: 0;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\nfieldset,\nimg {\n border: 0;\n}\naddress,\ncaption,\ncite,\ncode,\ndfn,\nem,\nstrong,\nth,\nvar {\n font-style: normal;\n font-weight: normal;\n}\nol,\nul {\n list-style: none;\n}\ncaption,\nth {\n text-align: left;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: 100%;\n font-weight: normal;\n}\nq:before,\nq:after {\n content: '';\n}\nabbr,\nacronym {\n border: 0;\n font-variant: normal;\n}\nsup {\n vertical-align: text-top;\n}\nsub {\n vertical-align: text-bottom;\n}\ninput,\ntextarea,\nselect {\n font-family: inherit;\n font-size: inherit;\n font-weight: inherit;\n *font-size: 100%;\n}\nlegend {\n color: #000;\n}\n#yui3-css-stamp.cssreset {\n display: none;\n}\ninput[type=\"button\"] {\n border-radius: 0;\n -webkit-appearance: none;\n}\n*:focus {\n outline: none;\n}\n.dash-spreadsheet-container input,\n.dash-spreadsheet-container table {\n font-size: 13px;\n}\nbody {\n margin: 0;\n padding: 0;\n font-family: sans-serif;\n}\n",""])},function(e,t,n){n(61),e.exports=n(64)},function(e,t,n){"use strict";var r=s(n(1)),o=s(n(6)),i=s(n(62)),u=n(3),a=s(u);function s(e){return e&&e.__esModule?e:{default:e}}a.default.setDebugLevel(u.DebugLevel.DEBUG),a.default.setLogLevel(u.LogLevel.WARNING),o.default.render(r.default.createElement(i.default,null),document.getElementById("root"))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;tJSON.parse(JSON.stringify(e));class f extends i.Component{constructor(){super();const e=d(l.mockData.dataframe);this.state={filter:"",tableProps:{id:"table",dataframe:e,columns:d(l.mockData.columns).map(e=>o.merge(e,{editable_name:!0,deletable:!0})),content_style:"grow",editable:!0,sorting:!0,n_fixed_rows:4,n_fixed_columns:2,merge_duplicate_headers:!1,row_deletable:!0,row_selectable:"single",column_static_dropdown:[{id:"bbb",dropdown:["Humid","Wet","Snowy","Tropical Beaches"].map(e=>({label:e,value:e}))}],table_style:[{selector:".dash-spreadsheet.freeze-left",rule:"width: 1000px; max-width: 1000px;"}]}};const t=(0,c.memoizeOne)(()=>e=>{console.info("---\x3e",e),this.setState(t=>({tableProps:o.merge(t.tableProps,e)}))});Object.defineProperty(this,"setProps",{get:()=>t()})}render(){return u.default.createElement(s.Table,r({setProps:this.setProps},this.state.tableProps,{filtering:"fe"}))}}f.propTypes={value:a.default.any},t.default=f},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.miniData=t.mockDataSimple=t.mockData=void 0;var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));const o=5e3;t.mockData=i([{id:"rows",type:"numeric",width:40,editable:!1,data:u(e=>e)},{id:"ccc",name:["City","Canada","Toronto"],type:"numeric",width:150,data:u(e=>e)},{id:"ddd",name:["City","Canada","Montréal"],type:"numeric",width:150,data:u(e=>100*e)},{id:"eee",name:["City","America","New York City"],type:"numeric",width:150,data:u(e=>e)},{id:"fff",name:["City","America","Boston"],type:"numeric",width:150,data:u(e=>e+1)},{id:"ggg",name:["City","France","Paris"],type:"numeric",editable:!0,width:150,data:u(e=>10*e)},{id:"bbb",name:["","Weather","Climate"],type:"dropdown",clearable:!0,width:200,data:u(e=>["Humid","Wet","Snowy","Tropical Beaches"][e%4])},{id:"aaa",name:["","Weather","Temperature"],type:"numeric",width:150,data:u(e=>e+1)}]),t.mockDataSimple=i([{id:"aaa",name:"Temperature",type:"numeric",width:150,data:u(e=>e+1)},{id:"bbb",name:"Climate",type:"numeric",options:["Humid","Wet","Snowy","Tropical Beaches"].map(e=>({label:e,value:e})),clearable:!0,width:200,data:u(e=>["Humid","Wet","Snowy","Tropical Beaches"][e%4])}]),t.miniData=i([{id:"aaa",name:"cheese",data:[1,2,3]},{id:"bbb",name:"tomato",data:[3,2,1]}]);function i(e){const t={columns:[],dataframe:[]};return e.forEach(e=>{e.data.forEach((n,r)=>{t.dataframe[r]||(t.dataframe[r]={}),t.dataframe[r][e.id]=n}),t.columns.push(r.dissoc("data",e))}),t}function u(e,t=o){return r.range(1,t).map(e)}},function(e,t,n){e.exports=n.p+"index.html"}]); \ No newline at end of file +var D=function(e){return"string"==typeof e?e:null!==e&&JSON.stringify(e)||""},P=s.a.oneOfType([s.a.string,s.a.node]),M=s.a.oneOfType([s.a.string,s.a.number]),j=1,T=function(e,t){var n=void 0===e?"undefined":x(e);if("string"!==n&&"number"!==n&&"boolean"!==n)return e;var r=t.options,o=t.valueKey;if(r)for(var i=0;iu||ip.bottom?l.scrollTop=s.offsetTop+s.clientHeight-l.offsetHeight:c.topt.offsetHeight&&t.scrollHeight-t.offsetHeight-t.scrollTop<=0&&this.props.onMenuScrollToBottom()}}},{key:"getOptionLabel",value:function(e){return e[this.props.labelKey]}},{key:"getValueArray",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,n="object"===(void 0===t?"undefined":x(t))?t:this.props;if(n.multi){if("string"==typeof e&&(e=e.split(n.delimiter)),!Array.isArray(e)){if(null===e||void 0===e)return[];e=[e]}return e.map(function(e){return T(e,n)}).filter(function(e){return e})}var r=T(e,n);return r?[r]:[]}},{key:"setValue",value:function(e){var t=this;if(this.props.autoBlur&&this.blurInput(),this.props.required){var n=R(e,this.props.multi);this.setState({required:n})}this.props.simpleValue&&e&&(e=this.props.multi?e.map(function(e){return e[t.props.valueKey]}).join(this.props.delimiter):e[this.props.valueKey]),this.props.onChange&&this.props.onChange(e)}},{key:"selectValue",value:function(e){var t=this;this.props.closeOnSelect&&(this.hasScrolledToOption=!1);var n=this.props.onSelectResetsInput?"":this.state.inputValue;this.props.multi?this.setState({focusedIndex:null,inputValue:this.handleInputValueChange(n),isOpen:!this.props.closeOnSelect},function(){t.getValueArray(t.props.value).some(function(n){return n[t.props.valueKey]===e[t.props.valueKey]})?t.removeValue(e):t.addValue(e)}):this.setState({inputValue:this.handleInputValueChange(n),isOpen:!this.props.closeOnSelect,isPseudoFocused:this.state.isFocused},function(){t.setValue(e)})}},{key:"addValue",value:function(e){var t=this.getValueArray(this.props.value),n=this._visibleOptions.filter(function(e){return!e.disabled}),r=n.indexOf(e);this.setValue(t.concat(e)),n.length-1===r?this.focusOption(n[r-1]):n.length>r&&this.focusOption(n[r+1])}},{key:"popValue",value:function(){var e=this.getValueArray(this.props.value);e.length&&!1!==e[e.length-1].clearableValue&&this.setValue(this.props.multi?e.slice(0,e.length-1):null)}},{key:"removeValue",value:function(e){var t=this,n=this.getValueArray(this.props.value);this.setValue(n.filter(function(n){return n[t.props.valueKey]!==e[t.props.valueKey]})),this.focus()}},{key:"clearValue",value:function(e){e&&"mousedown"===e.type&&0!==e.button||(e.preventDefault(),this.setValue(this.getResetValue()),this.setState({inputValue:this.handleInputValueChange(""),isOpen:!1},this.focus),this._focusAfterClear=!0)}},{key:"getResetValue",value:function(){return void 0!==this.props.resetValue?this.props.resetValue:this.props.multi?[]:null}},{key:"focusOption",value:function(e){this.setState({focusedOption:e})}},{key:"focusNextOption",value:function(){this.focusAdjacentOption("next")}},{key:"focusPreviousOption",value:function(){this.focusAdjacentOption("previous")}},{key:"focusPageUpOption",value:function(){this.focusAdjacentOption("page_up")}},{key:"focusPageDownOption",value:function(){this.focusAdjacentOption("page_down")}},{key:"focusStartOption",value:function(){this.focusAdjacentOption("start")}},{key:"focusEndOption",value:function(){this.focusAdjacentOption("end")}},{key:"focusAdjacentOption",value:function(e){var t=this._visibleOptions.map(function(e,t){return{option:e,index:t}}).filter(function(e){return!e.option.disabled});if(this._scrollToFocusedOptionOnUpdate=!0,!this.state.isOpen){var n={focusedOption:this._focusedOption||(t.length?t["next"===e?0:t.length-1].option:null),isOpen:!0};return this.props.onSelectResetsInput&&(n.inputValue=""),void this.setState(n)}if(t.length){for(var r=-1,o=0;o0?r-=1:r=t.length-1;else if("start"===e)r=0;else if("end"===e)r=t.length-1;else if("page_up"===e){var i=r-this.props.pageSize;r=i<0?0:i}else if("page_down"===e){var u=r+this.props.pageSize;r=u>t.length-1?t.length-1:u}-1===r&&(r=0),this.setState({focusedIndex:t[r].index,focusedOption:t[r].option})}}},{key:"getFocusedOption",value:function(){return this._focusedOption}},{key:"selectFocusedOption",value:function(){if(this._focusedOption)return this.selectValue(this._focusedOption)}},{key:"renderLoading",value:function(){if(this.props.isLoading)return c.a.createElement("span",{className:"Select-loading-zone","aria-hidden":"true"},c.a.createElement("span",{className:"Select-loading"}))}},{key:"renderValue",value:function(e,t){var n=this,r=this.props.valueRenderer||this.getOptionLabel,o=this.props.valueComponent;if(!e.length)return function(e,t,n){var r=e.inputValue,o=e.isPseudoFocused,i=e.isFocused,u=t.onSelectResetsInput;return!r||!u&&!n&&!o&&!i}(this.state,this.props,t)?c.a.createElement("div",{className:"Select-placeholder"},this.props.placeholder):null;var i=this.props.onValueClick?this.handleValueClick:null;return this.props.multi?e.map(function(e,t){return c.a.createElement(o,{disabled:n.props.disabled||!1===e.clearableValue,id:n._instancePrefix+"-value-"+t,instancePrefix:n._instancePrefix,key:"value-"+t+"-"+e[n.props.valueKey],onClick:i,onRemove:n.removeValue,placeholder:n.props.placeholder,value:e},r(e,t),c.a.createElement("span",{className:"Select-aria-only"}," "))}):function(e,t){var n=e.inputValue,r=e.isPseudoFocused,o=e.isFocused,i=t.onSelectResetsInput;return!n||!i&&!(!o&&r||o&&!r)}(this.state,this.props)?(t&&(i=null),c.a.createElement(o,{disabled:this.props.disabled,id:this._instancePrefix+"-value-item",instancePrefix:this._instancePrefix,onClick:i,placeholder:this.props.placeholder,value:e[0]},r(e[0]))):void 0}},{key:"renderInput",value:function(e,t){var n,r=this,i=u()("Select-input",this.props.inputProps.className),a=this.state.isOpen,s=u()((_(n={},this._instancePrefix+"-list",a),_(n,this._instancePrefix+"-backspace-remove-message",this.props.multi&&!this.props.disabled&&this.state.isFocused&&!this.state.inputValue),n)),l=this.state.inputValue;!l||this.props.onSelectResetsInput||this.state.isFocused||(l="");var d=O({},this.props.inputProps,{"aria-activedescendant":a?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value","aria-describedby":this.props["aria-describedby"],"aria-expanded":""+a,"aria-haspopup":""+a,"aria-label":this.props["aria-label"],"aria-labelledby":this.props["aria-labelledby"],"aria-owns":s,className:i,onBlur:this.handleInputBlur,onChange:this.handleInputChange,onFocus:this.handleInputFocus,ref:function(e){return r.input=e},role:"combobox",required:this.state.required,tabIndex:this.props.tabIndex,value:l});if(this.props.inputRenderer)return this.props.inputRenderer(d);if(this.props.disabled||!this.props.searchable){var p=C(this.props.inputProps,[]),f=u()(_({},this._instancePrefix+"-list",a));return c.a.createElement("div",O({},p,{"aria-expanded":a,"aria-owns":f,"aria-activedescendant":a?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value","aria-disabled":""+this.props.disabled,"aria-label":this.props["aria-label"],"aria-labelledby":this.props["aria-labelledby"],className:i,onBlur:this.handleInputBlur,onFocus:this.handleInputFocus,ref:function(e){return r.input=e},role:"combobox",style:{border:0,width:1,display:"inline-block"},tabIndex:this.props.tabIndex||0}))}return this.props.autosize?c.a.createElement(o.a,O({id:this.props.id},d,{minWidth:"5"})):c.a.createElement("div",{className:i,key:"input-wrap",style:{display:"inline-block"}},c.a.createElement("input",O({id:this.props.id},d)))}},{key:"renderClear",value:function(){var e=this.getValueArray(this.props.value);if(this.props.clearable&&e.length&&!this.props.disabled&&!this.props.isLoading){var t=this.props.multi?this.props.clearAllText:this.props.clearValueText,n=this.props.clearRenderer();return c.a.createElement("span",{"aria-label":t,className:"Select-clear-zone",onMouseDown:this.clearValue,onTouchEnd:this.handleTouchEndClearValue,onTouchMove:this.handleTouchMove,onTouchStart:this.handleTouchStart,title:t},n)}}},{key:"renderArrow",value:function(){if(this.props.arrowRenderer){var e=this.handleMouseDownOnArrow,t=this.state.isOpen,n=this.props.arrowRenderer({onMouseDown:e,isOpen:t});return n?c.a.createElement("span",{className:"Select-arrow-zone",onMouseDown:e},n):null}}},{key:"filterOptions",value:function(e){var t=this.state.inputValue,n=this.props.options||[];if(this.props.filterOptions){var r="function"==typeof this.props.filterOptions?this.props.filterOptions:g;return r(n,t,e,{filterOption:this.props.filterOption,ignoreAccents:this.props.ignoreAccents,ignoreCase:this.props.ignoreCase,labelKey:this.props.labelKey,matchPos:this.props.matchPos,matchProp:this.props.matchProp,trimFilter:this.props.trimFilter,valueKey:this.props.valueKey})}return n}},{key:"onOptionRef",value:function(e,t){t&&(this.focused=e)}},{key:"renderMenu",value:function(e,t,n){return e&&e.length?this.props.menuRenderer({focusedOption:n,focusOption:this.focusOption,inputValue:this.state.inputValue,instancePrefix:this._instancePrefix,labelKey:this.props.labelKey,onFocus:this.focusOption,onOptionRef:this.onOptionRef,onSelect:this.selectValue,optionClassName:this.props.optionClassName,optionComponent:this.props.optionComponent,optionRenderer:this.props.optionRenderer||this.getOptionLabel,options:e,removeValue:this.removeValue,selectValue:this.selectValue,valueArray:t,valueKey:this.props.valueKey}):this.props.noResultsText?c.a.createElement("div",{className:"Select-noresults"},this.props.noResultsText):null}},{key:"renderHiddenField",value:function(e){var t=this;if(this.props.name){if(this.props.joinValues){var n=e.map(function(e){return D(e[t.props.valueKey])}).join(this.props.delimiter);return c.a.createElement("input",{disabled:this.props.disabled,name:this.props.name,ref:function(e){return t.value=e},type:"hidden",value:n})}return e.map(function(e,n){return c.a.createElement("input",{disabled:t.props.disabled,key:"hidden."+n,name:t.props.name,ref:"value"+n,type:"hidden",value:D(e[t.props.valueKey])})})}}},{key:"getFocusableOptionIndex",value:function(e){var t=this._visibleOptions;if(!t.length)return null;var n=this.props.valueKey,r=this.state.focusedOption||e;if(r&&!r.disabled){var o=-1;if(t.some(function(e,t){var i=e[n]===r[n];return i&&(o=t),i}),-1!==o)return o}for(var i=0;i{const t=(0,i.default)()(e);return(...e)=>{const n=e[0],r=e[1];return{onChange:t(o.Handler.Change,n,r),onClick:t(o.Handler.Click,n,r),onDoubleClick:t(o.Handler.DoubleClick,n,r),onPaste:t(o.Handler.Paste,n,r)}}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Handler=void 0;var r=n(3),o=function(e){return e&&e.__esModule?e:{default:e}}(n(8)),i=n(49);var u=t.Handler=void 0;!function(e){e.Change="change",e.Click="click",e.DoubleClick="doubleclick",e.Paste="paste"}(u||(t.Handler=u={}));t.default=(0,r.memoizeOneFactory)(e=>{const t=(0,o.default)((...e)=>{let t=e[0],n=e[1],r=e[2];return t&&t.bind(void 0,n,r)}),n=new Map([[u.Change,i.handleChange.bind(void 0,e)],[u.Click,i.handleClick.bind(void 0,e)],[u.DoubleClick,i.handleDoubleClick.bind(void 0,e)],[u.Paste,i.handlePaste.bind(void 0,e)]]);return(...e)=>{let r=e[0],o=e[1],i=e[2];return t(e,n.get(r),o,i)}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.handlePaste=t.handleChange=t.handleDoubleClick=t.handleClick=void 0;var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));t.handleClick=((e,t,n,o)=>{var i=e();const u=i.editable,a=i.is_focused,s=i.selected_cell,l=i.setProps,c=function(e,t,n){return e&&r.contains([t,n],e)}(s,t,n);if(!u)return;if(a||o.preventDefault(),c)return;o.preventDefault();const d=[t,n],p={is_focused:!1,active_cell:d},f=r.uniq(r.pluck(0,s)).sort((e,t)=>e-t),h=r.uniq(r.pluck(1,s)).sort((e,t)=>e-t),v=f[0],y=h[0];o.shiftKey?p.selected_cell=r.xprod(r.range(r.min(v,d[0]),r.max(v,d[0])+1),r.range(r.min(y,d[1]),r.max(y,d[1])+1)):p.selected_cell=[d],l(p)}),t.handleDoubleClick=((e,t,n,r)=>{var o=e();const i=o.editable,u=o.is_focused,a=o.setProps;if(!i)return;const s=[t,n];if(!u){r.preventDefault(),a({selected_cell:[s],active_cell:s,is_focused:!0})}}),t.handleChange=((e,t,n,o)=>{var i=e();const u=i.columns,a=i.dataframe,s=i.editable,l=i.setProps,c=i.viewport,d=u[n],p=c.indices[t];s&&l({dataframe:r.set(r.lensPath([p,d.id]),o,a)})}),t.handlePaste=((e,t,n,r)=>{r.preventDefault()})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=function(e){return e&&e.__esModule?e:{default:e}}(n(1)),i=n(3);t.default=(0,i.memoizeOneFactory)((e,t,n,i,u,a,s,l)=>r.addIndex(r.map)((n,c)=>[...a?[function(e,t){return o.default.createElement("td",{key:"delete",className:"dash-delete-cell",onClick:()=>e(t()),style:{width:"30px",maxWidth:"30px",minWidth:"30px"}},"×")}(l,function(e,t,n,o){const i={dataframe:r.remove(e,1,n)};return r.is(Array,t)&&t[0]===e&&(i.active_cell=[]),r.is(Array,o)&&r.contains(e,o)&&(i.selected_rows=r.without([e],o)),i}.bind(void 0,i[c],e,t,s))]:[],...u?[function(e,t,n,i){return o.default.createElement("td",{key:"select",className:"dash-select-cell",style:{width:"30px",maxWidth:"30px",minWidth:"30px"}},o.default.createElement("input",{type:"single"===t?"radio":"checkbox",name:"row-select",checked:r.contains(e,n),onChange:()=>i({selected_rows:"single"===t?[e]:r.ifElse(r.contains(e),r.without([e]),r.append(e))(n)})}))}(i[c],u,s,l)]:[]],n))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(3),i=a(n(13)),u=a(n(8));function a(e){return e&&e.__esModule?e:{default:e}}const s=[];function l(e,t,n,o,i){const u=r.map(([e])=>e.style,r.filter(([t,r])=>e([o,r],t.condition).evaluate(n),r.addIndex(r.map)((e,t)=>[e,t],t)));if(i&&u.push(i.style),u.length)return r.mergeAll(u)}function c(e,t,n,o,i,u){return r.addIndex(r.map)((u,a)=>r.addIndex(r.map)((n,r)=>{let l=o.find(e=>e.id===n.id),c=i.find(e=>e.id===n.id);return l=l&&l.styles||s,c=c&&c.style,t([a,r],e,l,u[n.id],n.id,c)},n),u)}t.default=(0,o.memoizeAll)(function(e){const t=(0,u.default)(e=>new i.default(e)),n=(0,u.default)(l);return(0,o.memoizeOne)(c).bind(void 0,t,n)})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(3),i=a(n(13)),u=a(n(8));function a(e){return e&&e.__esModule?e:{default:e}}const s=r.addIndex(r.map),l=(0,o.memoizeOneFactory)((e,t,n,o,i,u,a)=>s((n,s)=>r.map(t=>{const l=o[s];let c=(a&&a[t.id]&&(a[t.id].length>l?a[t.id][l]:null)||t||{}).options,d=i.find(e=>e.id===t.id),p=u.find(e=>e.id===t.id);return d=d&&d.dropdowns||[],p=c||p&&p.dropdown,((e,t,n,o,i)=>{const u=[...i?[i]:[],...r.map(([e])=>e.dropdown,r.filter(([t,r])=>e([o,r],t.condition).evaluate(n),r.addIndex(r.map)((e,t)=>[e,t],t)))];return u.length?u.slice(-1)[0]:void 0})(e,d,n,t.id,p)},t),n));t.default=(0,o.memoizeOneFactory)(e=>{const t=(0,u.default)(e=>new i.default(e));return l().bind(void 0,t)})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=p(n(1)),i=p(n(4)),u=p(n(54)),a=p(n(55)),s=n(7),l=p(n(12)),c=n(16),d=p(n(19));function p(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e){this.propsFn=e,this.handlers=new Map,this.ops=new Map,this.onChange=((e,t,n,o)=>{i.default.debug("Filter -- onChange",e,o.target.value&&o.target.value.trim());const u=o.target.value.trim();u&&u.length?t.set(e.toString(),u):t.delete(e.toString()),n(r.map(([e,t])=>`${e} ${t}`,r.filter(([e])=>this.isFragmentValid(e),Array.from(t.entries()))).join(" && "))}),this.getEventHandler=((e,t,n,r)=>{const o=this.handlers.get(e)||this.handlers.set(e,new Map).get(e),i=o.get(t)||o.set(t,new Map).get(t);return i.get(r)||i.set(r,e.bind(this,t,n,r)).get(r)})}get props(){return this.propsFn()}respectsBasicSyntax(e,t=!0){const n=[c.LexemeType.BinaryOperator,c.LexemeType.Expression,c.LexemeType.Operand,c.LexemeType.UnaryOperator];if(t&&n.push(c.LexemeType.And),!r.all(e=>r.contains(e.lexeme.name,n),e))return!1;const o=r.map(e=>e.value,r.filter(e=>e.lexeme.name===c.LexemeType.Operand,e)),i=r.uniq(o);return o.length===i.length}isBasicFilter(e,t,n=!0){return e.valid&&t.valid&&this.respectsBasicSyntax(e.lexemes,n)}updateOps(e){const t=(0,l.default)(e),n=(0,d.default)(t);if(!this.isBasicFilter(t,n))return;const r=[n.tree];for(;r.length;){const e=r.pop();e&&(e.lexeme.name===c.LexemeType.UnaryOperator&&e.block?this.ops.set(e.block.value,e.value):e.lexeme.name===c.LexemeType.BinaryOperator&&e.left&&e.right?this.ops.set(e.left.value,`${e.value} ${e.right.value}`):(r.push(e.left),r.push(e.block),r.push(e.right)))}}isFragmentValidOrNull(e){const t=this.ops.get(e.toString());return!t||!t.trim().length||this.isFragmentValid(e)}isFragmentValid(e){const t=this.ops.get(e.toString()),n=(0,l.default)(`${e} ${t}`),r=(0,d.default)(n);return r.valid&&this.isBasicFilter(n,r,!1)}createFilters(){var e=this.props;const t=e.columns,n=e.fillerColumns,i=e.filtering,l=e.filtering_settings,c=e.filtering_type,d=e.setFilter;if(!i)return[];this.updateOps(l);const p=r.range(0,n).map(e=>o.default.createElement("th",{key:`offset-${e}`})),f=c===s.FilteringType.Basic?r.addIndex(r.map)((e,t)=>o.default.createElement(u.default,{key:`column-${t}`,classes:`dash-filter column-${t}`,columnId:e.id,isValid:this.isFragmentValidOrNull(e.id),property:e.id,setFilter:this.getEventHandler(this.onChange,e.id,this.ops,d),value:this.ops.get(e.id.toString())}),t):[o.default.createElement(a.default,{key:"column-0",classes:[],colSpan:t.length,value:"",setFilter:()=>void 0})];return[r.concat(p,f)]}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=u(r),i=u(n(22));function u(e){return e&&e.__esModule?e:{default:e}}t.default=class extends r.PureComponent{constructor(e){super(e),this.submit=(e=>{(0,this.props.setFilter)({target:{value:e}})}),this.state={value:e.value}}componentWillReceiveProps(e){const t=e.value;this.state.value!==t&&this.setState({value:t})}render(){var e=this.props;const t=e.classes,n=e.columnId,r=e.isValid,u=e.value;return o.default.createElement("th",{className:t+(r?"":" invalid"),"data-dash-column":n},o.default.createElement(i.default,{value:u,stopPropagation:!0,submit:this.submit}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o=u(r),i=u(n(22));function u(e){return e&&e.__esModule?e:{default:e}}t.default=class extends r.PureComponent{constructor(e){super(e),this.submit=(e=>this.props.setFilter(e))}render(){var e=this.props;const t=e.colSpan,n=e.value;return o.default.createElement("th",{colSpan:t},o.default.createElement(i.default,{stopPropagation:!0,value:n,submit:this.submit}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=f(n(1)),i=n(21),u=n(20),a=f(n(57)),s=f(n(61)),l=f(n(62)),c=f(n(63)),d=f(n(64)),p=f(n(65));function f(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e){this.propsFn=e,this.headerContent=(0,a.default)(),this.headerOperations=(0,d.default)(),this.headerWrappers=(0,p.default)()}get props(){return this.propsFn()}createHeaders(){const e=this.props;let t=e.columns,n=e.merge_duplicate_headers,a=e.pagination_mode,d=e.row_deletable,p=e.row_selectable,f=e.setProps,h=e.sorting,v=e.sorting_settings,y=e.sorting_type;const g=(0,s.default)(t),m=(0,c.default)(t,g),b=(0,l.default)(t,m,n),x=r.zip(m,b),w=this.headerOperations(g,p,d),E=this.headerWrappers(t,x,n),_=this.headerContent(t,x,h,y,v,a,f,e),O=(0,u.matrixMap)(E,_,(e,t)=>o.default.cloneElement(e,{children:[t]}));return(0,i.arrayMap)(w,O,(e,t)=>Array.prototype.concat(e,t))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=d(n(2)),o=c(n(1)),i=n(3),u=n(9),a=c(n(58)),s=c(n(59)),l=d(n(60));function c(e){return e&&e.__esModule?e:{default:e}}function d(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function p(e,t){const n=r.find(t=>t.columnId===e,t);return n?n.direction:u.SortDirection.None}t.default=(0,i.memoizeOneFactory)(function(e,t,n,i,c,d,f,h){return r.addIndex(r.map)(([v,y],g)=>{const m=g===t.length-1;return r.addIndex(r.map)(t=>{const y=e[t],b=y.editable_name&&"Boolean"===r.type(y.editable_name)||"Number"===r.type(y.editable_name)&&y.editable_name===g,x="be"!==d&&(y.deletable&&"Boolean"===r.type(y.deletable)||"Number"===r.type(y.deletable)&&y.deletable===g);return o.default.createElement("div",null,n&&m?o.default.createElement("span",{className:"sort",onClick:function(e,t,n,r){return()=>{let o;switch(p(e,t)){case u.SortDirection.Descending:o=u.SortDirection.Ascending;break;case u.SortDirection.Ascending:o=u.SortDirection.None;break;case u.SortDirection.None:default:o=u.SortDirection.Descending}const i="single"===n?s.default:a.default;r({sorting_settings:i(t,{columnId:e,direction:o})})}}(y.id,c,i,f)},function(e,t){switch(p(e,t)){case u.SortDirection.Descending:return"↑";case u.SortDirection.Ascending:return"↓";case u.SortDirection.None:default:return"↕"}}(y.id,c)):"",b?o.default.createElement("span",{className:"column-header--edit",onClick:function(e,t,n,r,o){return()=>{r(l.editColumnName(e,t,n,o))}}(y,e,g,f,h)},"✎"):"",x?o.default.createElement("span",{className:"column-header--delete",onClick:function(e,t,n,r,o){return()=>{r(l.deleteColumn(e,t,n,o))}}(y,e,g,f,h)},"×"):"",o.default.createElement("span",null,v[t]))},y)},t)})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=function(e){return e&&e.__esModule?e:{default:e}}(n(4)),i=n(9);t.default=((e,t)=>{if(o.default.trace("multi - updateSettings",e,t),e=r.clone(e),t.direction===i.SortDirection.None){const n=r.findIndex(e=>e.columnId===t.columnId,e);-1!==n&&e.splice(n,1)}else{const n=r.find(e=>e.columnId===t.columnId,e);n?n.direction=t.direction:e.push(t)}return e})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(4)),o=n(9);t.default=((e,t)=>(r.default.trace("single - updateSettings",e,t),t.direction===o.SortDirection.None?[]:[t]))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.deleteColumn=function(e,t,n,i){const u=i.dataframe;var a=o(e,t,n);const s=a.groupIndexFirst,l=a.groupIndexLast,c=r.slice(s,l+1,r.pluck("id",t));return{columns:r.remove(s,1+l-s,t),dataframe:r.map(r.omit(c),u),active_cell:[],end_cell:[],selected_cell:[],start_cell:[0]}},t.editColumnName=function(e,t,n,i){var u=o(e,t,n);const a=u.groupIndexFirst,s=u.groupIndexLast,l=window.prompt("Enter a new column name");let c=r.clone(t);return r.range(a,s+1).map(e=>{let o;o="Array"===r.type(t[e].name)?[e,"name",n]:[e,"name"],c=r.set(r.lensPath(o),l,c)}),{columns:c}};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));function o(e,t,n){const r=t.indexOf(e);if(!e.name||Array.isArray(e.name)&&e.name.lengthn&&r.name[n]===e.name[n]))break;o=i}return{groupIndexFirst:r,groupIndexLast:o}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=e=>Array.isArray(e.name)?e.name.length:1;t.default=(e=>Math.max(...e.map(r)))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));t.default=((e,t,n)=>r.map(t=>{if(n){let e=[0],n=0;return t.forEach((r,o)=>{r!==t[n]&&(e.push(o),n=o)}),e}return r.range(0,e.length)},t))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));t.default=((e,t)=>r.map(n=>e.map(e=>r.isNil(e.name)&&n===t-1?e.id:((e,t)=>Array.isArray(e.name)?e.name[t]:e.name)(e,n)),r.range(0,t)))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=function(e){return e&&e.__esModule?e:{default:e}}(n(1)),i=n(3);t.default=(0,i.memoizeOneFactory)((e,t,n)=>r.addIndex(r.map)(()=>[...n?[o.default.createElement("th",{key:"delete",className:"expanded-row--empty-cell dash-delete-header",style:{width:"30px",maxWidth:"30px",minWidth:"30px"}})]:[],...t?[o.default.createElement("th",{key:"select",className:"expanded-row--empty-cell dash-select-header",style:{width:"30px",maxWidth:"30px",minWidth:"30px"}})]:[]],r.range(0,e)))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=function(e){return e&&e.__esModule?e:{default:e}}(n(1)),i=n(3);t.default=(0,i.memoizeOneFactory)(function(e,t,n){return r.map(([t,i])=>r.addIndex(r.map)((u,a)=>{const s=e[u];let l;return l=n?u===r.last(i)?t.length-u:i[a+1]-u:1,o.default.createElement("th",{key:`header-cell-${u}`,"data-dash-column":s.id,colSpan:l,className:"dash-header "+`column-${u} `+(u===e.length-1||u===r.last(i)?"cell--right-last ":"")})},i),t)})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=function(e){return e&&e.__esModule?e:{default:e}}(n(1));function i(e){return e?o.default.createElement("table",{tabIndex:-1},o.default.createElement("tbody",null,e.map((e,t)=>o.default.createElement("tr",{key:`row-${t}`},e)))):null}t.default=((e,t,n)=>{const o=e?r.map(t=>t.splice(0,r.reduceWhile(t=>t.count(e.cells++,e.count+=t.props.colSpan||1,e),{cells:0,count:0},t).cells),n):null,u=t?n.splice(0,t):null;return[[i(t&&o?o.splice(0,t):null),i(u)],[i(o),i(n)]]})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(3);t.default=(0,o.memoizeOneFactory)((e,t,n,o)=>{switch(e){case!1:return{loadNext:()=>{},loadPrevious:()=>{}};case!0:case"fe":return function(e,t,n){return{loadNext:()=>{let o=Math.floor(n.length/e.page_size);e.current_page>=o||(e=r.merge(e,{current_page:e.current_page+1}),t({pagination_settings:e}))},loadPrevious:()=>{e.current_page<=0||(e=r.merge(e,{current_page:e.current_page-1}),t({pagination_settings:e}))}}}(t,n,o);case"be":return function(e,t){return{loadNext:()=>{e.current_page++,t({pagination_settings:e})},loadPrevious:()=>{e.current_page<=0||(e.current_page--,t({pagination_settings:e}))}}}(t,n);default:throw new Error(`Unknown pagination mode: '${e}'`)}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(3);t.default=(0,r.memoizeOneFactory)((e,t,n,r)=>{switch(e){case!1:return function(e,t){return{dataframe:e,indices:t}}(n,r);case!0:case"fe":return function(e,t,n){let r=Math.min(e.current_page,Math.floor(t.length/e.page_size));const o=e.page_size*r,i=Math.min(o+e.displayed_pages*e.page_size,t.length);return{dataframe:t.slice(o,i),indices:n.slice(o,i)}}(t,n,r);case"be":return function(e,t){return{dataframe:e,indices:t}}(n,r);default:throw new Error(`Unknown pagination mode: '${e}'`)}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(3),i=n(9),u=s(i),a=s(n(13));function s(e){return e&&e.__esModule?e:{default:e}}t.default=(0,o.memoizeOneFactory)((e,t,n,o,s=[],l)=>{const c=new Map;if(r.addIndex(r.forEach)((e,t)=>{c.set(e,t)},e),"fe"===t||!0===t){const t=new a.default(n);e=t.isValid?t.filter(e):e}const d=l?e=>""===e||(0,i.defaultIsNully)(e):void 0;return"fe"!==o&&!0!==o||(e=(0,u.default)(e,s,d)),{dataframe:e,indices:r.map(e=>c.get(e),e)}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2)),o=n(3);t.default=(0,o.memoizeOneFactory)(e=>r.filter(e=>!e.hidden,e))},function(e,t,n){var r=n(72);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(11)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(10)(!1)).push([e.i,"/**\n * React Select\n * ============\n * Created by Jed Watson and Joss Mackison for KeystoneJS, http://www.keystonejs.com/\n * https://twitter.com/jedwatson https://twitter.com/jossmackison https://twitter.com/keystonejs\n * MIT License: https://github.com/JedWatson/react-select\n*/\n.Select {\n position: relative;\n}\n.Select input::-webkit-contacts-auto-fill-button,\n.Select input::-webkit-credentials-auto-fill-button {\n display: none !important;\n}\n.Select input::-ms-clear {\n display: none !important;\n}\n.Select input::-ms-reveal {\n display: none !important;\n}\n.Select,\n.Select div,\n.Select input,\n.Select span {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n.Select.is-disabled .Select-arrow-zone {\n cursor: default;\n pointer-events: none;\n opacity: 0.35;\n}\n.Select.is-disabled > .Select-control {\n background-color: #f9f9f9;\n}\n.Select.is-disabled > .Select-control:hover {\n box-shadow: none;\n}\n.Select.is-open > .Select-control {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n background: #fff;\n border-color: #b3b3b3 #ccc #d9d9d9;\n}\n.Select.is-open > .Select-control .Select-arrow {\n top: -2px;\n border-color: transparent transparent #999;\n border-width: 0 5px 5px;\n}\n.Select.is-searchable.is-open > .Select-control {\n cursor: text;\n}\n.Select.is-searchable.is-focused:not(.is-open) > .Select-control {\n cursor: text;\n}\n.Select.is-focused > .Select-control {\n background: #fff;\n}\n.Select.is-focused:not(.is-open) > .Select-control {\n border-color: #007eff;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 3px rgba(0, 126, 255, 0.1);\n background: #fff;\n}\n.Select.has-value.is-clearable.Select--single > .Select-control .Select-value {\n padding-right: 42px;\n}\n.Select.has-value.Select--single > .Select-control .Select-value .Select-value-label,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value .Select-value-label {\n color: #333;\n}\n.Select.has-value.Select--single > .Select-control .Select-value a.Select-value-label,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label {\n cursor: pointer;\n text-decoration: none;\n}\n.Select.has-value.Select--single > .Select-control .Select-value a.Select-value-label:hover,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label:hover,\n.Select.has-value.Select--single > .Select-control .Select-value a.Select-value-label:focus,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label:focus {\n color: #007eff;\n outline: none;\n text-decoration: underline;\n}\n.Select.has-value.Select--single > .Select-control .Select-value a.Select-value-label:focus,\n.Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label:focus {\n background: #fff;\n}\n.Select.has-value.is-pseudo-focused .Select-input {\n opacity: 0;\n}\n.Select.is-open .Select-arrow,\n.Select .Select-arrow-zone:hover > .Select-arrow {\n border-top-color: #666;\n}\n.Select.Select--rtl {\n direction: rtl;\n text-align: right;\n}\n.Select-control {\n background-color: #fff;\n border-color: #d9d9d9 #ccc #b3b3b3;\n border-radius: 4px;\n border: 1px solid #ccc;\n color: #333;\n cursor: default;\n display: table;\n border-spacing: 0;\n border-collapse: separate;\n height: 36px;\n outline: none;\n overflow: hidden;\n position: relative;\n width: 100%;\n}\n.Select-control:hover {\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);\n}\n.Select-control .Select-input:focus {\n outline: none;\n background: #fff;\n}\n.Select-placeholder,\n.Select--single > .Select-control .Select-value {\n bottom: 0;\n color: #aaa;\n left: 0;\n line-height: 34px;\n padding-left: 10px;\n padding-right: 10px;\n position: absolute;\n right: 0;\n top: 0;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.Select-input {\n height: 34px;\n padding-left: 10px;\n padding-right: 10px;\n vertical-align: middle;\n}\n.Select-input > input {\n width: 100%;\n background: none transparent;\n border: 0 none;\n box-shadow: none;\n cursor: default;\n display: inline-block;\n font-family: inherit;\n font-size: inherit;\n margin: 0;\n outline: none;\n line-height: 17px;\n /* For IE 8 compatibility */\n padding: 8px 0 12px;\n /* For IE 8 compatibility */\n -webkit-appearance: none;\n}\n.is-focused .Select-input > input {\n cursor: text;\n}\n.has-value.is-pseudo-focused .Select-input {\n opacity: 0;\n}\n.Select-control:not(.is-searchable) > .Select-input {\n outline: none;\n}\n.Select-loading-zone {\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 16px;\n}\n.Select-loading {\n -webkit-animation: Select-animation-spin 400ms infinite linear;\n -o-animation: Select-animation-spin 400ms infinite linear;\n animation: Select-animation-spin 400ms infinite linear;\n width: 16px;\n height: 16px;\n box-sizing: border-box;\n border-radius: 50%;\n border: 2px solid #ccc;\n border-right-color: #333;\n display: inline-block;\n position: relative;\n vertical-align: middle;\n}\n.Select-clear-zone {\n -webkit-animation: Select-animation-fadeIn 200ms;\n -o-animation: Select-animation-fadeIn 200ms;\n animation: Select-animation-fadeIn 200ms;\n color: #999;\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 17px;\n}\n.Select-clear-zone:hover {\n color: #D0021B;\n}\n.Select-clear {\n display: inline-block;\n font-size: 18px;\n line-height: 1;\n}\n.Select--multi .Select-clear-zone {\n width: 17px;\n}\n.Select-arrow-zone {\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 25px;\n padding-right: 5px;\n}\n.Select--rtl .Select-arrow-zone {\n padding-right: 0;\n padding-left: 5px;\n}\n.Select-arrow {\n border-color: #999 transparent transparent;\n border-style: solid;\n border-width: 5px 5px 2.5px;\n display: inline-block;\n height: 0;\n width: 0;\n position: relative;\n}\n.Select-control > *:last-child {\n padding-right: 5px;\n}\n.Select--multi .Select-multi-value-wrapper {\n display: inline-block;\n}\n.Select .Select-aria-only {\n position: absolute;\n display: inline-block;\n height: 1px;\n width: 1px;\n margin: -1px;\n clip: rect(0, 0, 0, 0);\n overflow: hidden;\n float: left;\n}\n@-webkit-keyframes Select-animation-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes Select-animation-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n.Select-menu-outer {\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n background-color: #fff;\n border: 1px solid #ccc;\n border-top-color: #e6e6e6;\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);\n box-sizing: border-box;\n margin-top: -1px;\n max-height: 200px;\n position: absolute;\n left: 0;\n top: 100%;\n width: 100%;\n z-index: 1;\n -webkit-overflow-scrolling: touch;\n}\n.Select-menu {\n max-height: 198px;\n overflow-y: auto;\n}\n.Select-option {\n box-sizing: border-box;\n background-color: #fff;\n color: #666666;\n cursor: pointer;\n display: block;\n padding: 8px 10px;\n}\n.Select-option:last-child {\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.Select-option.is-selected {\n background-color: #f5faff;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 126, 255, 0.04);\n color: #333;\n}\n.Select-option.is-focused {\n background-color: #ebf5ff;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 126, 255, 0.08);\n color: #333;\n}\n.Select-option.is-disabled {\n color: #cccccc;\n cursor: default;\n}\n.Select-noresults {\n box-sizing: border-box;\n color: #999999;\n cursor: default;\n display: block;\n padding: 8px 10px;\n}\n.Select--multi .Select-input {\n vertical-align: middle;\n margin-left: 10px;\n padding: 0;\n}\n.Select--multi.Select--rtl .Select-input {\n margin-left: 0;\n margin-right: 10px;\n}\n.Select--multi.has-value .Select-input {\n margin-left: 5px;\n}\n.Select--multi .Select-value {\n background-color: #ebf5ff;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 126, 255, 0.08);\n border-radius: 2px;\n border: 1px solid #c2e0ff;\n /* Fallback color for IE 8 */\n border: 1px solid rgba(0, 126, 255, 0.24);\n color: #007eff;\n display: inline-block;\n font-size: 0.9em;\n line-height: 1.4;\n margin-left: 5px;\n margin-top: 5px;\n vertical-align: top;\n}\n.Select--multi .Select-value-icon,\n.Select--multi .Select-value-label {\n display: inline-block;\n vertical-align: middle;\n}\n.Select--multi .Select-value-label {\n border-bottom-right-radius: 2px;\n border-top-right-radius: 2px;\n cursor: default;\n padding: 2px 5px;\n}\n.Select--multi a.Select-value-label {\n color: #007eff;\n cursor: pointer;\n text-decoration: none;\n}\n.Select--multi a.Select-value-label:hover {\n text-decoration: underline;\n}\n.Select--multi .Select-value-icon {\n cursor: pointer;\n border-bottom-left-radius: 2px;\n border-top-left-radius: 2px;\n border-right: 1px solid #c2e0ff;\n /* Fallback color for IE 8 */\n border-right: 1px solid rgba(0, 126, 255, 0.24);\n padding: 1px 5px 3px;\n}\n.Select--multi .Select-value-icon:hover,\n.Select--multi .Select-value-icon:focus {\n background-color: #d8eafd;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 113, 230, 0.08);\n color: #0071e6;\n}\n.Select--multi .Select-value-icon:active {\n background-color: #c2e0ff;\n /* Fallback color for IE 8 */\n background-color: rgba(0, 126, 255, 0.24);\n}\n.Select--multi.Select--rtl .Select-value {\n margin-left: 0;\n margin-right: 5px;\n}\n.Select--multi.Select--rtl .Select-value-icon {\n border-right: none;\n border-left: 1px solid #c2e0ff;\n /* Fallback color for IE 8 */\n border-left: 1px solid rgba(0, 126, 255, 0.24);\n}\n.Select--multi.is-disabled .Select-value {\n background-color: #fcfcfc;\n border: 1px solid #e3e3e3;\n color: #333;\n}\n.Select--multi.is-disabled .Select-value-icon {\n cursor: not-allowed;\n border-right: 1px solid #e3e3e3;\n}\n.Select--multi.is-disabled .Select-value-icon:hover,\n.Select--multi.is-disabled .Select-value-icon:focus,\n.Select--multi.is-disabled .Select-value-icon:active {\n background-color: #fcfcfc;\n}\n@keyframes Select-animation-spin {\n to {\n transform: rotate(1turn);\n }\n}\n@-webkit-keyframes Select-animation-spin {\n to {\n -webkit-transform: rotate(1turn);\n }\n}\n",""])},function(e,t){e.exports=function(e){var t="undefined"!=typeof window&&window.location;if(!t)throw new Error("fixUrls requires window.location");if(!e||"string"!=typeof e)return e;var n=t.protocol+"//"+t.host,r=n+t.pathname.replace(/\/[^\/]*$/,"/");return e.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,function(e,t){var o,i=t.trim().replace(/^"(.*)"$/,function(e,t){return t}).replace(/^'(.*)'$/,function(e,t){return t});return/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(i)?e:(o=0===i.indexOf("//")?i:0===i.indexOf("/")?n+i:r+i.replace(/^\.\//,""),"url("+JSON.stringify(o)+")")})}},function(e,t,n){var r=n(75);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(11)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(10)(!1)).push([e.i,".dash-spreadsheet.dash-freeze-left {\n width: auto;\n width: fit-content;\n width: -moz-fit-content;\n width: -webkit-fit-content;\n max-width: 500px;\n}\n.dash-spreadsheet.dash-freeze-top {\n width: auto;\n width: fit-content;\n width: -moz-fit-content;\n width: -webkit-fit-content;\n max-height: 500px;\n}\n.dash-spreadsheet-container {\n display: flex;\n flex-direction: row;\n position: relative;\n}\n.dash-spreadsheet-inner {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n}\n.dash-spreadsheet-inner *,\n.dash-spreadsheet-inner *:after,\n.dash-spreadsheet-inner *:before {\n box-sizing: inherit;\n}\n.dash-spreadsheet-inner .Select {\n overflow: hidden;\n position: static;\n}\n.dash-spreadsheet-inner .Select,\n.dash-spreadsheet-inner .Select-control {\n background-color: inherit;\n}\n.dash-spreadsheet-inner .Select-value {\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin-top: -2px;\n}\n.dash-spreadsheet-inner .marker-row tr {\n visibility: hidden !important;\n}\n.dash-spreadsheet-inner .marker-row td,\n.dash-spreadsheet-inner .marker-row th {\n height: 0 !important;\n padding: 0 !important;\n margin: 0 !important;\n}\n.dash-spreadsheet-inner.dash-freeze-left,\n.dash-spreadsheet-inner.dash-freeze-top {\n overflow: hidden !important;\n}\n.dash-spreadsheet-inner.dash-freeze-left .row-0,\n.dash-spreadsheet-inner.dash-freeze-top .row-0 {\n display: flex;\n flex: 0 0 auto;\n flex-direction: row;\n}\n.dash-spreadsheet-inner.dash-freeze-left .row-1,\n.dash-spreadsheet-inner.dash-freeze-top .row-1 {\n display: flex;\n flex-direction: row;\n overflow: scroll;\n}\n.dash-spreadsheet-inner.dash-freeze-left .cell-0-0,\n.dash-spreadsheet-inner.dash-freeze-top .cell-0-0,\n.dash-spreadsheet-inner.dash-freeze-left .cell-1-0,\n.dash-spreadsheet-inner.dash-freeze-top .cell-1-0 {\n flex: 0 0 auto;\n left: 0;\n position: sticky;\n z-index: 400;\n}\n.dash-spreadsheet-inner.dash-freeze-left .cell-0-1,\n.dash-spreadsheet-inner.dash-freeze-top .cell-0-1 {\n z-index: 300;\n flex: 0 0 auto;\n}\n.dash-spreadsheet-inner.dash-freeze-left .cell-1-1,\n.dash-spreadsheet-inner.dash-freeze-top .cell-1-1 {\n flex: 0 0 auto;\n}\n.dash-spreadsheet-inner.dash-grow .cell-0-1,\n.dash-spreadsheet-inner.dash-grow .cell-1-1 {\n flex: 1 0 auto;\n}\n.dash-spreadsheet-inner.dash-grow table {\n width: 100%;\n}\n.dash-spreadsheet-inner:not(.dash-freeze-top):not(.dash-freeze-left) .cell-1-1 tr td:first-of-type,\n.dash-spreadsheet-inner:not(.dash-freeze-top):not(.dash-freeze-left) .cell-1-1 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.dash-freeze-top):not(.dash-freeze-left) .cell-1-1 tr:first-of-type td,\n.dash-spreadsheet-inner:not(.dash-freeze-top):not(.dash-freeze-left) .cell-1-1 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.dash-freeze-top):not(.dash-freeze-left) .cell-1-1 tr:first-of-type td:first-of-type,\n.dash-spreadsheet-inner:not(.dash-freeze-top):not(.dash-freeze-left) .cell-1-1 tr:first-of-type th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.dash-freeze-top).dash-freeze-left .cell-1-0 tr td:first-of-type,\n.dash-spreadsheet-inner:not(.dash-freeze-top).dash-freeze-left .cell-1-0 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.dash-freeze-top).dash-freeze-left .cell-1-0 tr:first-of-type td,\n.dash-spreadsheet-inner:not(.dash-freeze-top).dash-freeze-left .cell-1-0 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.dash-freeze-top).dash-freeze-left .cell-1-0 tr:first-of-type td:first-of-type,\n.dash-spreadsheet-inner:not(.dash-freeze-top).dash-freeze-left .cell-1-0 tr:first-of-type th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner:not(.dash-freeze-top).dash-freeze-left .cell-1-1 tr:first-of-type td,\n.dash-spreadsheet-inner:not(.dash-freeze-top).dash-freeze-left .cell-1-1 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top:not(.dash-freeze-left) .cell-0-1 tr td:first-of-type,\n.dash-spreadsheet-inner.dash-freeze-top:not(.dash-freeze-left) .cell-0-1 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top:not(.dash-freeze-left) .cell-0-1 tr:first-of-type td,\n.dash-spreadsheet-inner.dash-freeze-top:not(.dash-freeze-left) .cell-0-1 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top:not(.dash-freeze-left) .cell-0-1 tr:first-of-type td:first-of-type,\n.dash-spreadsheet-inner.dash-freeze-top:not(.dash-freeze-left) .cell-0-1 tr:first-of-type th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top:not(.dash-freeze-left) .cell-1-1 tr td:first-of-type,\n.dash-spreadsheet-inner.dash-freeze-top:not(.dash-freeze-left) .cell-1-1 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-0-0 tr td:first-of-type,\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-0-0 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-0-0 tr:first-of-type td,\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-0-0 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-0-0 tr:first-of-type td:first-of-type,\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-0-0 tr:first-of-type th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-0-1 tr:first-of-type td,\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-0-1 tr:first-of-type th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-1-0 tr td:first-of-type,\n.dash-spreadsheet-inner.dash-freeze-top.dash-freeze-left .cell-1-0 tr th:first-of-type {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner .cell td,\n.dash-spreadsheet-inner .cell th {\n box-shadow: inset 0px 0px 0px 0px var(--border), inset 0px 0px 0px 0px var(--border), inset -1px 0px 0px var(--border), inset 0px -1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner .cell td:focus,\n.dash-spreadsheet-inner .cell th:focus {\n outline: none;\n}\n.dash-spreadsheet-inner .filter.invalid {\n box-shadow: inset 1px 0px 0px 0px red, inset 0px 1px 0px 0px red, inset -1px 0px 0px red, inset 0px -1px 0px 0px red;\n background-color: pink;\n}\n.dash-spreadsheet-inner .selected-row td,\n.dash-spreadsheet-inner .selected-row th {\n background-color: var(--selected-row);\n}\n.dash-spreadsheet-inner tr {\n background-color: white;\n}\n.dash-spreadsheet-inner td {\n background-color: inherit;\n}\n.dash-spreadsheet-inner td.cell--selected {\n background-color: var(--selected-background);\n}\n.dash-spreadsheet-inner td.focused {\n box-shadow: 1px 0px 0px 0px var(--accent), 0px 1px 0px 0px var(--accent), 0 0px 0px var(--accent), 0px 0 0px 0px var(--accent);\n border: 1px solid var(--accent);\n margin: -1px;\n z-index: 200;\n}\n.dash-spreadsheet-inner td .dash-cell-value-container {\n width: 100%;\n height: 100%;\n}\n.dash-spreadsheet-inner td .dash-input-cell-value-container {\n position: relative;\n}\n.dash-spreadsheet-inner td .dash-cell-value {\n height: 100%;\n width: 100%;\n}\n.dash-spreadsheet-inner td input.dash-cell-value {\n position: absolute;\n left: 0;\n top: 0;\n}\n.dash-spreadsheet-inner td div.dash-cell-value {\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n.dash-spreadsheet-inner td .cell-value-shadow {\n margin: auto 0;\n opacity: 0;\n}\n.dash-spreadsheet-inner td .input-cell-value-shadow {\n display: inline-block;\n height: initial;\n width: initial;\n}\n.dash-spreadsheet-inner td .dropdown-cell-value-shadow {\n display: block;\n height: 0px;\n padding: 0 42px 0 10px;\n}\n.dash-spreadsheet-inner th.dash-filter {\n position: relative;\n}\n.dash-spreadsheet-inner th.dash-filter input {\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n width: 100%;\n}\n.dash-spreadsheet-inner td,\n.dash-spreadsheet-inner th {\n padding: 2px;\n white-space: nowrap;\n overflow-x: hidden;\n text-overflow: ellipsis;\n height: 30px;\n text-align: right;\n}\n.dash-spreadsheet-inner th .column-header--edit,\n.dash-spreadsheet-inner th .column-header--delete,\n.dash-spreadsheet-inner th .sort {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: default;\n cursor: pointer;\n}\n.dash-spreadsheet-inner textarea {\n white-space: pre;\n}\n.dash-spreadsheet-inner table {\n border-collapse: collapse;\n font-family: monospace;\n --accent: hotpink;\n --border: lightgrey;\n --text-color: #3c3c3c;\n --hover: #fdfdfd;\n --background-color-ellipses: #fdfdfd;\n --faded-text: #fafafa;\n --faded-text-header: #b4b4b4;\n --selected-background: rgba(255, 65, 54, 0.2);\n --faded-dropdown: #f0f0f0;\n --selected-row: #fff0ff;\n --muted: #c8c8c8;\n}\n/* focus happens after copying to clipboard */\n.dash-spreadsheet-inner table:focus {\n outline: none;\n}\n.dash-spreadsheet-inner thead {\n display: table-row-group;\n}\n.elip {\n text-align: center;\n width: 100%;\n background-color: var(--background-color-ellipses);\n}\n.dash-spreadsheet-inner td.dropdown {\n /*\n * To view the dropdown's contents, we need\n * overflow-y: visible.\n * Unfortunately, overflow-x: hidden and overflow-y: visible\n * can't both be set at the same time.\n * So, we have to make both overflow-x: visible and overflow-y: visble\n *\n * See https://stackoverflow.com/questions/6421966/\n *\n * There might be another solution with parent divs, but I haven't\n * tried it.\n */\n overflow-x: visible;\n}\n.dash-spreadsheet-inner th {\n box-shadow: inset 1px 0px 0px 0px var(--border), inset 0px 1px 0px 0px var(--border);\n}\n.dash-spreadsheet-inner :not(.cell--selected) tr:hover,\ntr:hover input :not(.cell--selected) {\n background-color: var(--hover);\n}\n.dash-spreadsheet-inner th {\n background-color: #fafafa;\n}\n.sort {\n cursor: pointer;\n float: left;\n color: var(--faded-text-header);\n font-size: 20px;\n}\nth:hover .sort {\n color: var(--accent);\n}\n.sort:hover {\n text-decoration: underline;\n}\n.expanded-row--empty-cell {\n box-shadow: none;\n background-color: transparent;\n}\n.expanded-row {\n text-align: center;\n}\n.dash-spreadsheet-inner input:not([type=radio]):not([type=checkbox]) {\n padding: 0px;\n margin: 0px;\n height: calc(100% - 1px);\n line-height: 30px;\n border: none;\n font-family: inherit;\n text-align: right;\n box-sizing: border-box;\n color: var(--text-color);\n background-color: transparent;\n /* so as to not overlay the box shadow */\n /* browser's default text-shadow is `$color 0px 0px 0px;`\n * for `input`, which makes it look a little bit heavier than dropdowns\n * or bare `td`\n */\n text-shadow: none;\n}\n.dash-spreadsheet-inner input.unfocused {\n color: transparent;\n text-shadow: 0 0 0 var(--text-color);\n cursor: default;\n}\n.dash-spreadsheet-inner input.unfocused:focus {\n outline: none;\n}\n.numeric {\n font-family: monospace;\n}\n.toggle-row {\n border: none;\n box-shadow: none;\n width: 10px;\n padding-left: 10px;\n padding-right: 10px;\n cursor: pointer;\n color: var(--faded-text);\n}\n.toggle-row--expanded {\n color: var(--accent);\n}\n.dash-spreadsheet-inner tr:hover .toggle-row {\n color: var(--accent);\n}\n.cell--uneditable,\n.cell--uneditable input {\n cursor: not-allowed;\n}\n.expanded-row {\n box-shadow: inset 2px 0px 0px 0px var(--accent), inset -1px 0px 0px 0px var(--border);\n /* inset 0px 1px 0px 0px var(--border); */\n}\n.dash-spreadsheet-inner .dash-delete-cell,\n.dash-spreadsheet-inner .dash-delete-header {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: default;\n font-size: 1.3rem;\n text-align: center;\n cursor: pointer;\n color: var(--muted);\n}\n.dash-spreadsheet-inner .dash-delete-cell:hover,\n.dash-spreadsheet-inner .dash-delete-header:hover {\n color: var(--accent);\n}\n.dash-spreadsheet-inner .column-header--edit {\n float: left;\n opacity: 0.1;\n padding-left: 2px;\n padding-right: 2px;\n cursor: pointer;\n}\n.dash-spreadsheet-inner th:hover .column-header--edit {\n color: var(--accent);\n opacity: 1;\n}\n.dash-spreadsheet-inner .column-header--delete {\n float: left;\n opacity: 0.1;\n padding-left: 2px;\n padding-right: 2px;\n cursor: pointer;\n}\n.dash-spreadsheet-inner th:hover .column-header--delete {\n color: var(--accent);\n opacity: 1;\n}\n",""])},function(e,t,n){var r=n(77);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(11)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(10)(!1)).push([e.i,".dash-spreadsheet .Select,\n.dash-spreadsheet .Select-control {\n border: none;\n cursor: pointer;\n height: 30px; /* matches the td height and line-height */\n border: none;\n}\n\n.dash-spreadsheet .Select-placeholder,\n.dash-spreadsheet .Select--single > .Select-control .Select-value {\n height: 100%;\n line-height: inherit;\n}\n\n.dash-spreadsheet .Select.has-value.Select--single > .Select-control .Select-value .Select-value-label,\n.dash-spreadsheet .Select.has-value.is-pseudo-focused.Select--single > .Select-control .Select-value .Select-value-label {\n color: var(--text-color);\n}\n\n.dash-spreadsheet .Select:hover,\n.dash-spreadsheet .Select-control:hover {\n border: none;\n box-shadow: none;\n cursor: pointer;\n}\n\n.dash-spreadsheet .Select-menu-outer {\n z-index: 100;\n}\n\n.dash-spreadsheet .Select-arrow {\n border-top-color: var(--faded-dropdown);\n border-left-color: transparent;\n border-right-color: transparent;\n border-bottom-color: transparent;\n}\n\n.dash-spreadsheet .Select-control:hover .Select-arrow {\n border-top-color: var(--accent);\n border-left-color: transparent;\n border-right-color: transparent;\n border-bottom-color: transparent;\n}\n\n.dash-spreadsheet .is-open > .Select-control .Select-arrow {\n border-bottom-color: var(--background-color-8-react-select);\n border-left-color: transparent;\n border-right-color: transparent;\n border-top-color: transparent;\n}\n\n.dash-spreadsheet .Select--multi .Select-value,\n.dash-spreadsheet .Select--multi a.Select-value-label {\n color: var(--color-8-react-select);\n}\n\n.dash-spreadsheet .Select {\n border-radius: 0;\n}\n\n.dash-spreadsheet .Select.is-disabled > .Select-control {\n border: none;\n}\n\n.dash-spreadsheet .Select--multi .Select-value-icon:hover,\n.dash-spreadsheet .Select--multi .Select-value-icon:focus {\n font-weight: bold;\n}\n\n.dash-spreadsheet .Select.is-disabled .Select-control {\n cursor: not-allowed;\n}\n\n.dash-spreadsheet .Select-menu-outer {\n background-color: white;\n border: none;\n border-bottom: thin var(--border) solid;\n border-radius: 0;\n border-top: none;\n}\n\n.dash-spreadsheet .Select-option {\n background-color: inherit;\n color: var(--accent);\n}\n\n.dash-spreadsheet .Select-option:hover {\n font-weight: bold;\n color: var(--accent);\n background-color: var(--hover);\n}\n\n.dash-spreadsheet .Select.is-focused:not(.is-open) > .Select-control {\n border: none;\n -webkit-box-shadow: none;\n box-shadow: none;\n background: #fff;\n}\n\n.dash-spreadsheet .Select-option.is-focused {\n background-color: white;\n color: var(--accent);\n font-weight: bold;\n}\n\n.dash-spreadsheet .Select-clear {\n color: transparent;\n}\n.Select:hover .Select-clear {\n color: var(--accent);\n}\n\n.dash-spreadsheet .Select-control {\n padding-left: 2px;\n}\n\n.dash-spreadsheet .cell--selected .Select-control {\n background-color: var(--selected-background);\n border-radius: 0;\n}\n",""])},function(e,t,n){var r=n(79);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(11)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(10)(!1)).push([e.i,"/*RESET CSS*/\nhtml {\n color: #000;\n background: #FFF;\n}\nbody,\ndiv,\ndl,\ndt,\ndd,\nul,\nol,\nli,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\npre,\ncode,\nform,\nfieldset,\nlegend,\ninput,\ntextarea,\np,\nblockquote,\nth,\ntd {\n margin: 0;\n padding: 0;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\nfieldset,\nimg {\n border: 0;\n}\naddress,\ncaption,\ncite,\ncode,\ndfn,\nem,\nstrong,\nth,\nvar {\n font-style: normal;\n font-weight: normal;\n}\nol,\nul {\n list-style: none;\n}\ncaption,\nth {\n text-align: left;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: 100%;\n font-weight: normal;\n}\nq:before,\nq:after {\n content: '';\n}\nabbr,\nacronym {\n border: 0;\n font-variant: normal;\n}\nsup {\n vertical-align: text-top;\n}\nsub {\n vertical-align: text-bottom;\n}\ninput,\ntextarea,\nselect {\n font-family: inherit;\n font-size: inherit;\n font-weight: inherit;\n *font-size: 100%;\n}\nlegend {\n color: #000;\n}\n#yui3-css-stamp.cssreset {\n display: none;\n}\ninput[type=\"button\"] {\n border-radius: 0;\n -webkit-appearance: none;\n}\n*:focus {\n outline: none;\n}\n.dash-spreadsheet-container input,\n.dash-spreadsheet-container table {\n font-size: 13px;\n}\nbody {\n margin: 0;\n padding: 0;\n font-family: sans-serif;\n}\n",""])},function(e,t,n){n(81),e.exports=n(84)},function(e,t,n){"use strict";var r=s(n(1)),o=s(n(6)),i=s(n(82)),u=n(4),a=s(u);function s(e){return e&&e.__esModule?e:{default:e}}a.default.setDebugLevel(u.DebugLevel.DEBUG),a.default.setLogLevel(u.LogLevel.NONE),o.default.render(r.default.createElement(i.default,null),document.getElementById("root"))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;tJSON.parse(JSON.stringify(e));class h extends i.Component{constructor(){super();const e=f(l.mockData.dataframe);this.state={filter:"",tableProps:{id:"table",dataframe:e,columns:f(l.mockData.columns).map(e=>o.merge(e,{editable_name:!0,deletable:!0,minWidth:e.width,maxWidth:e.width})),editable:!0,sorting:!0,n_fixed_rows:4,n_fixed_columns:2,merge_duplicate_headers:!1,row_deletable:!0,row_selectable:"single",column_static_dropdown:[{id:"bbb",dropdown:["Humid","Wet","Snowy","Tropical Beaches"].map(e=>({label:e,value:e}))}],table_style:[{selector:".dash-spreadsheet.dash-freeze-left",rule:"width: 1000px; max-width: 1000px;"}]}};const t=(0,c.memoizeOne)(()=>e=>{d.default.debug("---\x3e",e),this.setState(t=>({tableProps:o.merge(t.tableProps,e)}))});Object.defineProperty(this,"setProps",{get:()=>t()})}render(){return u.default.createElement(s.Table,r({setProps:this.setProps},this.state.tableProps,{filtering:"fe"}))}}h.propTypes={value:a.default.any},t.default=h},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.miniData=t.mockDataSimple=t.mockData=void 0;var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(2));const o=5e3;t.mockData=i([{id:"rows",type:"numeric",width:40,editable:!1,data:u(e=>e)},{id:"ccc",name:["City","Canada","Toronto"],type:"numeric",width:150,data:u(e=>e)},{id:"ddd",name:["City","Canada","Montréal"],type:"numeric",width:150,data:u(e=>100*e)},{id:"eee",name:["City","America","New York City"],type:"numeric",width:150,data:u(e=>e)},{id:"fff",name:["City","America","Boston"],type:"numeric",width:150,data:u(e=>e+1)},{id:"ggg",name:["City","France","Paris"],type:"numeric",editable:!0,width:150,data:u(e=>10*e)},{id:"bbb",name:["","Weather","Climate"],type:"dropdown",clearable:!0,width:200,data:u(e=>["Humid","Wet","Snowy","Tropical Beaches"][e%4])},{id:"aaa",name:["","Weather","Temperature"],type:"numeric",width:150,data:u(e=>e+1)}]),t.mockDataSimple=i([{id:"aaa",name:"Temperature",type:"numeric",width:150,data:u(e=>e+1)},{id:"bbb",name:"Climate",type:"numeric",options:["Humid","Wet","Snowy","Tropical Beaches"].map(e=>({label:e,value:e})),clearable:!0,width:200,data:u(e=>["Humid","Wet","Snowy","Tropical Beaches"][e%4])}]),t.miniData=i([{id:"aaa",name:"cheese",data:[1,2,3]},{id:"bbb",name:"tomato",data:[3,2,1]}]);function i(e){const t={columns:[],dataframe:[]};return e.forEach(e=>{e.data.forEach((n,r)=>{t.dataframe[r]||(t.dataframe[r]={}),t.dataframe[r][e.id]=n}),t.columns.push(r.dissoc("data",e))}),t}function u(e,t=o){return r.range(1,t).map(e)}},function(e,t,n){e.exports=n.p+"index.html"}]); \ No newline at end of file diff --git a/dash_table/metadata.json b/dash_table/metadata.json index ba7d8d157..dafcabafe 100644 --- a/dash_table/metadata.json +++ b/dash_table/metadata.json @@ -248,7 +248,7 @@ "computed": false } }, - "virtualization": { + "pagination_mode": { "type": { "name": "enum", "value": [ @@ -277,7 +277,7 @@ "computed": false } }, - "virtualization_settings": { + "pagination_settings": { "type": { "name": "shape", "value": { @@ -668,7 +668,7 @@ "required": false, "description": "" }, - "virtual_dataframe": { + "derived_viewport_dataframe": { "type": { "name": "arrayOf", "value": { @@ -682,7 +682,7 @@ "computed": false } }, - "virtual_dataframe_indices": { + "derived_viewport_indices": { "type": { "name": "arrayOf", "value": { @@ -696,51 +696,44 @@ "computed": false } }, - "dropdown_properties": { + "derived_virtual_dataframe": { "type": { - "name": "any" + "name": "arrayOf", + "value": { + "name": "object" + } }, "required": false, - "description": "" - }, - "column_conditional_styles": { + "description": "", "defaultValue": { "value": "[]", "computed": false - }, - "required": false - }, - "changed_data": { - "defaultValue": { - "value": "{}", - "computed": false - }, - "required": false + } }, - "index_name": { - "defaultValue": { - "value": "''", - "computed": false + "derived_virtual_indices": { + "type": { + "name": "arrayOf", + "value": { + "name": "number" + } }, - "required": false - }, - "types": { + "required": false, + "description": "", "defaultValue": { - "value": "{}", + "value": "[]", "computed": false - }, - "required": false + } }, - "merged_styles": { - "defaultValue": { - "value": "{}", - "computed": false + "dropdown_properties": { + "type": { + "name": "any" }, - "required": false + "required": false, + "description": "" }, - "base_styles": { + "column_conditional_styles": { "defaultValue": { - "value": "{\n numeric: {\n 'text-align': 'right',\n 'font-family': `'Droid Sans Mono', Courier, monospace`\n },\n\n string: {\n 'text-align': 'left'\n },\n\n input: {\n padding: 0,\n margin: 0,\n width: '80px',\n border: 'none',\n 'font-size': '1rem'\n },\n\n 'input-active': {\n outline: '#7FDBFF auto 3px'\n },\n\n table: {},\n\n thead: {},\n\n th: {},\n\n td: {}\n}", + "value": "[]", "computed": false }, "required": false diff --git a/dash_table/package.json b/dash_table/package.json index 5fcdb5c70..d400e45b0 100644 --- a/dash_table/package.json +++ b/dash_table/package.json @@ -1,14 +1,14 @@ { "name": "dash-table", - "version": "3.0.0rc23", + "version": "3.1.0rc4", "description": "Dash table", "main": "build/index.js", "scripts": { "preprivate::opentests": "run-s private::wait*", "preprivate::runtests": "run-s private::wait*", "private::build": "webpack --display-reasons --bail", - "private::host_dash8081": "python tests/e2e/dash/v_be_page.py", - "private::host_dash8082": "python tests/e2e/dash/v_copy_paste.py", + "private::host_dash8081": "python tests/cypress/dash/v_be_page.py", + "private::host_dash8082": "python tests/cypress/dash/v_copy_paste.py", "private::host_js": "http-server ./dash_table -c-1 --silent", "private::wait_dash8081": "wait-on http://localhost:8081", "private::wait_dash8082": "wait-on http://localhost:8082", @@ -17,15 +17,14 @@ "private::lint.ts": "tslint --project . src/**/*.ts", "private::opentests": "cypress open", "private::runtests": "cypress run --browser chrome", - "private::test-e2e": "run-p --race private::host* private::runtests", - "private::test-visual": "build-storybook && percy-storybook", "build.watch": "webpack-dev-server --content-base dash_table --mode development", "build:js": "run-s \"private::build -- --mode production\"", "build:js-dev": "run-s \"private::build -- --mode development\"", "build:js-test": "webpack --display-reasons --bail --config webpack.test.config.js", "build:py": "./extract-meta src/dash-table/Table.js > dash_table/metadata.json && cp package.json dash_table", "lint": "run-s private::lint.js private::lint.ts", - "test": "run-s private::test-*", + "test": "run-p --race private::host* private::runtests", + "test.visual": "build-storybook && percy-storybook", "test.watch": "run-p --race \"build:js-test -- --watch\" --race private::host* private::opentests" }, "author": "Chris P JSON.parse(JSON.stringify(o)); @@ -23,9 +24,10 @@ class App extends Component { columns: clone(mockData.columns).map(col => R.merge(col, { editable_name: true, deletable: true, + minWidth: col.width, + maxWidth: col.width // type: 'dropdown' })), - content_style: 'grow', editable: true, sorting: true, n_fixed_rows: 4, @@ -43,14 +45,14 @@ class App extends Component { } ], table_style: [ - { selector: '.dash-spreadsheet.freeze-left', rule: 'width: 1000px; max-width: 1000px;' } + { selector: '.dash-spreadsheet.dash-freeze-left', rule: 'width: 1000px; max-width: 1000px;' } ] } }; const setProps = memoizeOne(() => { return newProps => { - console.info('--->', newProps); + Logger.debug('--->', newProps); this.setState(prevState => ({ tableProps: R.merge(prevState.tableProps, newProps) })); diff --git a/demo/index.js b/demo/index.js index 80274b2d6..768563213 100644 --- a/demo/index.js +++ b/demo/index.js @@ -5,6 +5,6 @@ import App from './App'; import Logger, { DebugLevel, LogLevel } from 'core/Logger'; Logger.setDebugLevel(DebugLevel.DEBUG); -Logger.setLogLevel(LogLevel.WARNING); +Logger.setLogLevel(LogLevel.NONE); ReactDOM.render(, document.getElementById('root')); diff --git a/package.json b/package.json index 5fcdb5c70..d400e45b0 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { "name": "dash-table", - "version": "3.0.0rc23", + "version": "3.1.0rc4", "description": "Dash table", "main": "build/index.js", "scripts": { "preprivate::opentests": "run-s private::wait*", "preprivate::runtests": "run-s private::wait*", "private::build": "webpack --display-reasons --bail", - "private::host_dash8081": "python tests/e2e/dash/v_be_page.py", - "private::host_dash8082": "python tests/e2e/dash/v_copy_paste.py", + "private::host_dash8081": "python tests/cypress/dash/v_be_page.py", + "private::host_dash8082": "python tests/cypress/dash/v_copy_paste.py", "private::host_js": "http-server ./dash_table -c-1 --silent", "private::wait_dash8081": "wait-on http://localhost:8081", "private::wait_dash8082": "wait-on http://localhost:8082", @@ -17,15 +17,14 @@ "private::lint.ts": "tslint --project . src/**/*.ts", "private::opentests": "cypress open", "private::runtests": "cypress run --browser chrome", - "private::test-e2e": "run-p --race private::host* private::runtests", - "private::test-visual": "build-storybook && percy-storybook", "build.watch": "webpack-dev-server --content-base dash_table --mode development", "build:js": "run-s \"private::build -- --mode production\"", "build:js-dev": "run-s \"private::build -- --mode development\"", "build:js-test": "webpack --display-reasons --bail --config webpack.test.config.js", "build:py": "./extract-meta src/dash-table/Table.js > dash_table/metadata.json && cp package.json dash_table", "lint": "run-s private::lint.js private::lint.ts", - "test": "run-s private::test-*", + "test": "run-p --race private::host* private::runtests", + "test.visual": "build-storybook && percy-storybook", "test.watch": "run-p --race \"build:js-test -- --watch\" --race private::host* private::opentests" }, "author": "Chris P = T[]; + +export function arrayMap( + a1: Array, + a2: Array, + cb: (d1: T1, d2: T2, i: number) => TR +) { + const mapArray = R.addIndex(R.map); + + return mapArray((iValue, i) => cb(iValue, a2[i], i), a1); +} + +export function arrayMap3( + a1: Array, + a2: Array, + a3: Array, + cb: (d1: T1, d2: T2, d3: T3, i: number) => TR +) { + const mapArray = R.addIndex(R.map); + + return mapArray((iValue, i) => cb(iValue, a2[i], a3[i], i), a1); + +} + +export function arrayMapN( + cb: (i: number, ...args: any[]) => TR, + ...arrays: (any[])[] +) { + const a1 = arrays.slice(0, 1); + const as = arrays.slice(1); + + const mapArray = R.addIndex(R.map); + + return mapArray((iValue, i) => cb(i, [iValue, ...as.map(a => a[i])]), a1); +} \ No newline at end of file diff --git a/src/core/math/matrixZipMap.ts b/src/core/math/matrixZipMap.ts new file mode 100644 index 000000000..874da4af6 --- /dev/null +++ b/src/core/math/matrixZipMap.ts @@ -0,0 +1,72 @@ +import * as R from 'ramda'; + +type Matrix = T[][]; + +export function matrixMap( + m1: Matrix, + m2: Matrix, + cb: (d1: T1, d2: T2, i: number, j: number) => TR +) { + const mapMatrix = R.addIndex(R.map); + const mapRow = R.addIndex(R.map); + + return mapMatrix((iRow, i) => + mapRow( + (ijValue, j) => cb(ijValue, m2[i][j], i, j), + iRow + ), m1 + ); +} + +export function matrixMap3( + m1: Matrix, + m2: Matrix, + m3: Matrix, + cb: (d1: T1, d2: T2, d3: T3, i: number, j: number) => TR +) { + const mapMatrix = R.addIndex(R.map); + const mapRow = R.addIndex(R.map); + + return mapMatrix((iRow, i) => + mapRow( + (ijValue, j) => cb(ijValue, m2[i][j], m3[i][j], i, j), + iRow + ), m1 + ); +} + +export function matrixMap4( + m1: Matrix, + m2: Matrix, + m3: Matrix, + m4: Matrix, + cb: (d1: T1, d2: T2, d3: T3, d4: T4, i: number, j: number) => TR +) { + const mapMatrix = R.addIndex(R.map); + const mapRow = R.addIndex(R.map); + + return mapMatrix((iRow, i) => + mapRow( + (ijValue, j) => cb(ijValue, m2[i][j], m3[i][j], m4[i][j], i, j), + iRow + ), m1 + ); +} + +export function matrixMapN( + cb: (i: number, j: number, ...args: any[]) => TR, + ...matrices: (any[][])[] +) { + const m1 = matrices.slice(0, 1); + const ms = matrices.slice(1); + + const mapMatrix = R.addIndex(R.map); + const mapRow = R.addIndex(R.map); + + return mapMatrix((iRow, i) => + mapRow( + (ijValue, j) => cb(i, j, [ijValue, ...ms.map(m => m[i][j])]), + iRow + ), m1 + ); +} \ No newline at end of file diff --git a/src/core/memoizer.ts b/src/core/memoizer.ts index cd43ebea3..0d6f97142 100644 --- a/src/core/memoizer.ts +++ b/src/core/memoizer.ts @@ -1,6 +1,12 @@ import { isEqualArgs } from 'core/comparer'; import { ResultFn } from 'core/generic'; +interface ICachedResultFn { + result: TEntry; + cached: boolean; + first: boolean; +} + export function memoizeOne< TArgs extends any[], TEntry @@ -8,10 +14,34 @@ export function memoizeOne< let lastArgs: any[] | null = null; let lastResult: any; - return (...args: TArgs): TEntry => { - return isEqualArgs(lastArgs, args) ? + return (...args: TArgs): TEntry => + isEqualArgs(lastArgs, args) ? lastResult : (lastArgs = args) && (lastResult = fn(...args)); +} + +export function memoizeOneFactory< + TArgs extends any[], + TEntry + >(fn: ResultFn): () => ResultFn { + return () => memoizeOne(fn); +} + +export function memoizeOneWithFlag< + TArgs extends any[], + TEntry + >(fn: ResultFn): ResultFn> { + let lastArgs: any[] | null = null; + let lastResult: any; + let isFirst = true; + + return (...args: TArgs): ICachedResultFn => { + let res = isEqualArgs(lastArgs, args) ? + { cached: true, first: isFirst, result: lastResult } : + { cached: false, first: isFirst, result: (lastArgs = args) && (lastResult = fn(...args)) }; + isFirst = false; + + return res; }; } diff --git a/src/core/memoizerCache.ts b/src/core/memoizerCache.ts index f492d45d5..567e0653e 100644 --- a/src/core/memoizerCache.ts +++ b/src/core/memoizerCache.ts @@ -15,7 +15,7 @@ export default function memoizerCache< { const cache = new Map(); - return (key: TKey, args: TArgs): TEntry => { + return (key: TKey, ...args: TArgs): TEntry => { const lastKey = key.slice(-1)[0]; const cacheKeys = key.slice(0, -1); diff --git a/src/dash-table/Table.js b/src/dash-table/Table.js index 582773640..a9ab76231 100644 --- a/src/dash-table/Table.js +++ b/src/dash-table/Table.js @@ -4,16 +4,39 @@ import PropTypes from 'prop-types'; import RealTable from 'dash-table/components/Table'; import 'dash-table/style/component.less'; +import Logger from 'core/Logger'; export default class Table extends Component { render() { + const { + filtering, + sorting, + pagination_mode + } = this.props; + + function isFrontEnd(value: any) { + return ['fe', true, false].indexOf(value) !== -1; + } + + function isBackEnd(value: any) { + return ['be', false].indexOf(value) !== -1; + } + + const isValid = isFrontEnd(pagination_mode) || + (isBackEnd(filtering) && isBackEnd(sorting)); + + if (!isValid) { + Logger.error(`Invalid combination of filtering / sorting / pagination`, filtering, sorting, pagination_mode); + return (
Invalid props combination
); + } + return (); } } export const defaultProps = { - virtualization: 'fe', - virtualization_settings: { + pagination_mode: 'fe', + pagination_settings: { displayed_pages: 1, current_page: 0, page_size: 250 @@ -29,8 +52,10 @@ export const defaultProps = { sorting_type: 'single', sorting_settings: [], - virtual_dataframe: [], - virtual_dataframe_indices: [], + derived_viewport_dataframe: [], + derived_viewport_indices: [], + derived_virtual_dataframe: [], + derived_virtual_indices: [], column_conditional_dropdowns: [], column_static_dropdown: [], @@ -41,48 +66,14 @@ export const defaultProps = { row_conditional_styles: [], row_static_style: {}, - changed_data: {}, dataframe: [], columns: [], editable: false, active_cell: [], - index_name: '', - types: {}, - merged_styles: {}, selected_cell: [[]], selected_rows: [], row_selectable: false, - table_style: [], - base_styles: { - numeric: { - 'text-align': 'right', - 'font-family': `'Droid Sans Mono', Courier, monospace` - }, - - string: { - 'text-align': 'left' - }, - - input: { - padding: 0, - margin: 0, - width: '80px', - border: 'none', - 'font-size': '1rem' - }, - - 'input-active': { - outline: '#7FDBFF auto 3px' - }, - - table: {}, - - thead: {}, - - th: {}, - - td: {} - } + table_style: [] }; export const propTypes = { @@ -113,8 +104,8 @@ export const propTypes = { rule: PropTypes.string })), - virtualization: PropTypes.oneOf(['fe', 'be', true, false]), - virtualization_settings: PropTypes.shape({ + pagination_mode: PropTypes.oneOf(['fe', 'be', true, false]), + pagination_settings: PropTypes.shape({ displayed_pages: PropTypes.number, current_page: PropTypes.number, page_size: PropTypes.number @@ -173,8 +164,10 @@ export const propTypes = { })), sorting_treat_empty_string_as_none: PropTypes.bool, - virtual_dataframe: PropTypes.arrayOf(PropTypes.object), - virtual_dataframe_indices: PropTypes.arrayOf(PropTypes.number), + derived_viewport_dataframe: PropTypes.arrayOf(PropTypes.object), + derived_viewport_indices: PropTypes.arrayOf(PropTypes.number), + derived_virtual_dataframe: PropTypes.arrayOf(PropTypes.object), + derived_virtual_indices: PropTypes.arrayOf(PropTypes.number), dropdown_properties: PropTypes.any, }; diff --git a/src/dash-table/components/Cell/index.tsx b/src/dash-table/components/Cell/index.tsx index 92b19fab6..18f223a2c 100644 --- a/src/dash-table/components/Cell/index.tsx +++ b/src/dash-table/components/Cell/index.tsx @@ -1,294 +1,53 @@ import * as R from 'ramda'; import React, { - Component, - CSSProperties, - KeyboardEvent + Component } from 'react'; -import Dropdown from 'react-select'; - -import { isEqual } from 'core/comparer'; -import { memoizeOne } from 'core/memoizer'; -import memoizerCache from 'core/memoizerCache'; -import SyntaxTree from 'core/syntax-tree'; import { - ICellDefaultProps, ICellProps, - ICellPropsWithDefaults, - ICellState + ICellPropsWithDefaults } from 'dash-table/components/Cell/props'; -import { - IDropdownOptions, - IConditionalDropdown, - IConditionalStyle -} from 'dash-table/components/Cell/types'; - -import { - KEY_CODES -} from 'dash-table/utils/unicode'; -import { ColumnId } from 'dash-table/components/Table/props'; -import dropdownHelper from 'dash-table/components/dropdownHelper'; - -export default class Cell extends Component { - private static readonly dropdownAstCache = memoizerCache<[string, ColumnId, number], [string], SyntaxTree>( - (query: string) => new SyntaxTree(query) - ); - - private static readonly styleAstCache = memoizerCache<[string, ColumnId, number], [string], SyntaxTree>( - (query: string) => new SyntaxTree(query) - ); - - public static defaultProps: ICellDefaultProps = { - classes: [], - conditionalDropdowns: [], - conditionalStyles: [], - staticStyle: {}, - type: 'text' - }; +const CHILDREN_REGEX = /^children$/; +export default class Cell extends Component { constructor(props: ICellProps) { super(props); - - this.state = { - value: props.value - }; } private get propsWithDefaults(): ICellPropsWithDefaults { return this.props as ICellPropsWithDefaults; } - private get classes(): string[] { - let { - active, - classes, - editable, - selected, - type - } = this.propsWithDefaults; - - return [ - ...(active ? ['focused'] : []), - ...(!editable ? ['cell--uneditable'] : []), - ...(selected ? ['cell--selected'] : []), - ...(type === 'dropdown' ? ['dropdown'] : []), - ...classes - ]; - } - - private renderDropdown() { - const { - clearable, - onChange, - value - } = this.propsWithDefaults; - - const dropdown = this.dropdown; - - return !dropdown ? - this.renderValue() : - ( { - onChange(newValue ? newValue.value : newValue); - }} - onOpen={this.handleOpenDropdown} - options={dropdown} - placeholder={''} - value={value} - />); - } - - private renderInput() { - const { - active, - focused, - onClick, - onDoubleClick, - onPaste - } = this.propsWithDefaults; - - const classes = [ - ...(active ? ['input-active'] : []), - ...(focused ? ['focused'] : ['unfocused']), - ...['cell-value'] - ]; - - const attributes = { - className: classes.join(' '), - onClick: onClick, - onDoubleClick: onDoubleClick - }; - - return (!active && this.state.value === this.props.value) ? - this.renderValue(attributes) : - (); - } - - private renderValue(attributes = {}) { - const { value } = this.propsWithDefaults; - - return (
- {value} -
); - } - - private renderInner() { - const { - type - } = this.props; - - switch (type) { - case 'text': - case 'numeric': - return this.renderInput(); - case 'dropdown': - return this.renderDropdown(); - default: - return this.renderValue(); - } - } - - private getDropdown = memoizeOne((...dropdowns: IDropdownOptions[]): IDropdownOptions | undefined => { - return dropdowns.length ? dropdowns.slice(-1)[0] : undefined; - }); - - private get dropdown() { - let { - conditionalDropdowns, - datum, - property, - staticDropdown, - tableId - } = this.propsWithDefaults; - - const dropdowns = [ - ...(staticDropdown ? [staticDropdown] : []), - ...R.map( - ([cd]) => cd.dropdown, - R.filter( - ([cd, i]) => Cell.dropdownAstCache([tableId, property, i], [cd.condition]).evaluate(datum), - R.addIndex(R.map)( - (cd, i) => [cd, i], - conditionalDropdowns - )) - ) - ]; - - return this.getDropdown(...dropdowns); - } - - private getStyle = memoizeOne((...styles: CSSProperties[]) => { - return styles.length ? R.mergeAll(styles) : undefined; - }); - - private get style() { - let { - conditionalStyles, - datum, - property, - staticStyle, - tableId - } = this.propsWithDefaults; - - const styles = [staticStyle, ...R.map( - ([cs]) => cs.style, - R.filter( - ([cs, i]) => Cell.styleAstCache([tableId, property, i], [cs.condition]).evaluate(datum), - R.addIndex(R.map)( - (cs, i) => [cs, i], - conditionalStyles - ) - ) - )]; - - return this.getStyle(...styles); - } - render() { + const { classes, property, style } = this.propsWithDefaults; + return ( - {this.renderInner()} - ); - } - - propagateChange = () => { - if (this.state.value === this.props.value) { - return; - } - - const { onChange } = this.props; - - onChange(this.state.value); - } - - handleChange = (e: any) => { - this.setState({ value: e.target.value }); + className={classes} + style={style} + data-dash-column={property} + />); } - handleKeyDown = (e: KeyboardEvent) => { - if (e.keyCode !== KEY_CODES.ENTER && e.keyCode !== KEY_CODES.TAB) { - return; - } + shouldComponentUpdate(nextProps: any) { + const props: any = this.props; - this.propagateChange(); - } + const childProps: any = this.getChildProps(props); + const nextChildProps: any = this.getChildProps(nextProps); - handleOpenDropdown = () => { - const { dropdown, td }: { [key: string]: any } = this.refs; - - dropdownHelper( - dropdown.wrapper.querySelector('.Select-menu-outer'), - td + return R.any(key => + !CHILDREN_REGEX.test(key) && props[key] !== nextProps[key], + R.keysIn(props) + ) || R.any( + key => childProps[key] !== nextChildProps[key], + R.keysIn(childProps) ); } - componentWillReceiveProps(nextProps: ICellPropsWithDefaults) { - const { value: nextValue } = nextProps; - - if (this.state.value !== nextValue) { - this.setState({ - value: nextValue - }); - } - } - - componentDidUpdate() { - const { active } = this.propsWithDefaults; - const input = this.refs.textInput as HTMLInputElement; - - if (active && input && document.activeElement !== input) { - input.focus(); - input.setSelectionRange(0, input.value ? input.value.length : 0); - } - - if (active && this.refs.dropdown) { - (this.refs.td as HTMLElement).focus(); - } - } - - shouldComponentUpdate(nextProps: ICellPropsWithDefaults, nextState: ICellState) { - const props = this.props; - const state = this.state; - - return !isEqual(props, nextProps, true) || - !isEqual(state, nextState, true); + private getChildProps(props: any) { + return props && props.children && props.children[0] && props.children[0].props; } } \ No newline at end of file diff --git a/src/dash-table/components/Cell/props.ts b/src/dash-table/components/Cell/props.ts index a958624a3..97837784c 100644 --- a/src/dash-table/components/Cell/props.ts +++ b/src/dash-table/components/Cell/props.ts @@ -1,45 +1,14 @@ -import { ChangeEvent, CSSProperties } from 'react'; +import { CSSProperties } from 'react'; import { - IConditionalDropdown, - IConditionalStyle, - IDropdownOptions, - IStyle -} from 'dash-table/components/Cell/types'; -import { ColumnId } from 'dash-table/components/Table/props'; + ColumnId +} from 'dash-table/components/Table/props'; export interface ICellProps { active: boolean; - classes?: string[]; - clearable: boolean; - conditionalDropdowns?: IConditionalDropdown[]; - conditionalStyles?: IConditionalStyle[]; - datum: any; - editable: boolean; - focused: boolean; - onChange: (e: ChangeEvent) => void; - onClick: (e: React.MouseEvent) => void; - onDoubleClick: (e: React.MouseEvent) => void; - onPaste: (e: React.ClipboardEvent) => void; + classes: string; property: ColumnId; - selected: boolean; - staticDropdown?: IDropdownOptions; - staticStyle?: IStyle; - tableId: string; - type?: string; - value: any; + style?: CSSProperties; } -export interface ICellDefaultProps { - classes: string[]; - conditionalDropdowns: IConditionalDropdown[]; - conditionalStyles: IConditionalStyle[]; - staticStyle: CSSProperties; - type: string; -} - -export interface ICellState { - value: any; -} - -export type ICellPropsWithDefaults = ICellProps & ICellDefaultProps; +export type ICellPropsWithDefaults = ICellProps; diff --git a/src/dash-table/components/CellFactory.tsx b/src/dash-table/components/CellFactory.tsx index 6ca80d2e3..fedbbeadc 100644 --- a/src/dash-table/components/CellFactory.tsx +++ b/src/dash-table/components/CellFactory.tsx @@ -1,303 +1,108 @@ -import * as R from 'ramda'; -import React, { ClipboardEvent } from 'react'; +import React from 'react'; -import Cell from 'dash-table/components/Cell'; -import { ICellFactoryOptions, SelectedCells } from 'dash-table/components/Table/props'; -import * as actions from 'dash-table/utils/actions'; +import { ICellFactoryOptions } from 'dash-table/components/Table/props'; +import derivedCellWrappers from 'dash-table/derived/cell/wrappers'; +import derivedCellInputs from 'dash-table/derived/cell/inputs'; +import derivedCellOperations from 'dash-table/derived/cell/operations'; +import derivedCellStyles from 'dash-table/derived/cell/wrapperStyles'; +import derivedDropdowns from 'dash-table/derived/cell/dropdowns'; + +import { matrixMap3 } from 'core/math/matrixZipMap'; +import { arrayMap } from 'core/math/arrayZipMap'; export default class CellFactory { - private readonly handlers = new Map(); + private readonly cellInputs = derivedCellInputs(); + private readonly cellOperations = derivedCellOperations(); + private readonly cellDropdowns = derivedDropdowns(); private get props() { return this.propsFn(); } - constructor(private readonly propsFn: () => ICellFactoryOptions) { - - } - - private isCellSelected = (selectedCells: SelectedCells, idx: number, i: number) => { - return selectedCells && R.contains([idx, i], selectedCells); - } - - private getEventHandler = (fn: Function, idx: number, i: number): any => { - const fnHandler = (this.handlers.get(fn) || this.handlers.set(fn, new Map()).get(fn)); - const idxHandler = (fnHandler.get(idx) || fnHandler.set(idx, new Map()).get(idx)); - - return ( - idxHandler.get(i) || - (idxHandler.set(i, fn.bind(this, idx, i)).get(i)) - ); - } + constructor( + private readonly propsFn: () => ICellFactoryOptions, + private readonly cellStyles = derivedCellStyles(propsFn().id), + private readonly cellWrappers = derivedCellWrappers(propsFn().id) + ) { } - private handleClick = (idx: number, i: number, e: any) => { + public createCells() { const { + active_cell, columns, + column_conditional_dropdowns, + column_conditional_styles, + column_static_dropdown, + column_static_style, + dataframe, + dropdown_properties, // legacy editable, + id, is_focused, row_deletable, row_selectable, selected_cell, - setProps + selected_rows, + setProps, + viewport } = this.props; - const selected = this.isCellSelected(selected_cell, idx, i); - - if (!editable) { - return; - } - if (!is_focused) { - e.preventDefault(); - } - - // don't update if already selected - if (selected) { - return; - } - - // visible col indices - const columnIndexOffset = - (row_deletable ? 1 : 0) + - (row_selectable ? 1 : 0); - - e.preventDefault(); - const cellLocation: [number, number] = [idx, i + columnIndexOffset]; - const newProps: Partial = { - is_focused: false, - active_cell: cellLocation - }; - - const vci: any[] = []; - columns.forEach((c, ci: number) => { - if (!c.hidden) { - vci.push(ci + columnIndexOffset); - } - }); - - const selectedRows = R.uniq(R.pluck(0, selected_cell)).sort((a, b) => a - b); - const selectedCols = R.uniq(R.pluck(1, selected_cell)).sort((a, b) => a - b); - const minRow = selectedRows[0]; - const minCol = selectedCols[0]; - - if (e.shiftKey) { - newProps.selected_cell = R.xprod( - R.range( - R.min(minRow, cellLocation[0]), - R.max(minRow, cellLocation[0]) + 1 - ), - R.range( - R.min(minCol, cellLocation[1]), - R.max(minCol, cellLocation[1]) + 1 - ) - ).filter(c => R.contains(c[1], vci)) as any; - } else { - newProps.selected_cell = [cellLocation]; - } - - setProps(newProps); - } - - private handleDoubleClick = (idx: number, i: number, e: any) => { - const { - editable, - is_focused, - row_deletable, + const operations = this.cellOperations( + active_cell, + dataframe, + viewport.dataframe, + viewport.indices, row_selectable, + row_deletable, + selected_rows, setProps - } = this.props; - - if (!editable) { - return; - } - - // visible col indices - const columnIndexOffset = - (row_deletable ? 1 : 0) + - (row_selectable ? 1 : 0); - - const cellLocation: [number, number] = [idx, i + columnIndexOffset]; - - if (!is_focused) { - e.preventDefault(); - const newProps = { - selected_cell: [cellLocation], - active_cell: cellLocation, - is_focused: true - }; - setProps(newProps); - } - } + ); - private handleChange = (idx: number, i: number, value: any) => { - const { + const wrappers = this.cellWrappers( + active_cell, columns, - dataframe, + viewport.dataframe, editable, - setProps - } = this.props; - - const c = columns[i]; - - if (!editable) { - return; - } - - const newDataframe = R.set( - R.lensPath([idx, c.id]), - value, - dataframe + selected_cell ); - setProps({ - dataframe: newDataframe - }); - } - - private handlePaste = (e: ClipboardEvent) => { - e.preventDefault(); - } - - private rowSelectCell(idx: number) { - const { - setProps, - selected_rows, - row_selectable - } = this.props; - - return !row_selectable ? null : ( - setProps({ - selected_rows: - row_selectable === 'single' ? - [idx] : - R.ifElse( - R.contains(idx), - R.without([idx]), - R.append(idx) - )(selected_rows) - })} - /> - ); - } - private rowDeleteCell(idx: number) { - const { - setProps, - row_deletable - } = this.props; - - return !row_deletable ? null : ( setProps(actions.deleteRow(idx, this.props))} - style={{ width: `30px`, maxWidth: `30px`, minWidth: `30px` }} - > - {'×'} - ); - } + const wrapperStyles = this.cellStyles( + columns, + column_conditional_styles, + column_static_style, + viewport.dataframe + ); - public createCells() { - const { - active_cell, + const dropdowns = this.cellDropdowns(id)( columns, + viewport.dataframe, + viewport.indices, column_conditional_dropdowns, - column_conditional_styles, column_static_dropdown, - column_static_style, - dropdown_properties, // legacy + dropdown_properties + ); + + const inputs = this.cellInputs( + active_cell, + columns, + viewport.dataframe, editable, + !!is_focused, id, - is_focused, - row_deletable, - row_selectable, - selected_cell, - virtualizer - } = this.props; - - const { dataframe, indices } = virtualizer; - - const visibleColumns = columns.filter(column => !column.hidden); - - const offset = - (row_deletable ? 1 : 0) + - (row_selectable ? 1 : 0); - - return dataframe.map((datum, virtualIdx) => { - const realIdx = indices[virtualIdx]; - - const deleteCell = this.rowDeleteCell(realIdx); - const selectCell = this.rowSelectCell(realIdx); - - const cells = visibleColumns.map((column, visibleIndex) => { - visibleIndex += offset; - - let legacyDropdown: any = ( - ( - dropdown_properties && - dropdown_properties[column.id] && - ( - dropdown_properties[column.id].length > realIdx ? - dropdown_properties[column.id][realIdx] : - null - ) - ) || column || {} - ).options; - - const index = columns.indexOf(column); - - const classes = [`column-${index + offset}`]; - - let conditionalDropdowns = column_conditional_dropdowns.find((cd: any) => cd.id === column.id); - let staticDropdown = column_static_dropdown.find((sd: any) => sd.id === column.id); - - conditionalDropdowns = conditionalDropdowns && conditionalDropdowns.dropdowns; - staticDropdown = legacyDropdown || (staticDropdown && staticDropdown.dropdown); - - let conditionalStyles = column_conditional_styles.find((cs: any) => cs.id === column.id); - let staticStyle = column_static_style.find((ss: any) => ss.id === column.id); - - conditionalStyles = conditionalStyles && conditionalStyles.styles; - staticStyle = staticStyle && staticStyle.style; - - return (); - }); - - if (selectCell) { - cells.unshift(selectCell); - } + dropdowns, + this.propsFn + ); - if (deleteCell) { - cells.unshift(deleteCell); - } + const cells = matrixMap3( + wrappers, + wrapperStyles, + inputs, + (w, s, i) => React.cloneElement(w, { children: [i], style: s }) + ); - return cells; - }); + return arrayMap( + operations, + cells, + (o, c) => Array.prototype.concat(o, c) + ); } } \ No newline at end of file diff --git a/src/dash-table/components/CellInput/index.tsx b/src/dash-table/components/CellInput/index.tsx new file mode 100644 index 000000000..75624f623 --- /dev/null +++ b/src/dash-table/components/CellInput/index.tsx @@ -0,0 +1,197 @@ +import React, { + PureComponent, + KeyboardEvent +} from 'react'; +import Dropdown from 'react-select'; + +import DOM from 'core/browser/DOM'; + +import { + ICellDefaultProps, + ICellProps, + ICellPropsWithDefaults, + ICellState +} from 'dash-table/components/CellInput/props'; + +import { + KEY_CODES +} from 'dash-table/utils/unicode'; +import { ColumnType } from 'dash-table/components/Table/props'; +import dropdownHelper from 'dash-table/components/dropdownHelper'; + +export default class CellInput extends PureComponent { + + public static defaultProps: ICellDefaultProps = { + conditionalDropdowns: [], + type: ColumnType.Text + }; + + constructor(props: ICellProps) { + super(props); + + this.state = { + value: props.value + }; + } + + private get propsWithDefaults(): ICellPropsWithDefaults { + return this.props as ICellPropsWithDefaults; + } + + private renderDropdown() { + const { + clearable, + dropdown, + onChange, + value + } = this.propsWithDefaults; + + return !dropdown ? + this.renderValue() : + (
+ {this.renderValue( + { className: 'dropdown-cell-value-shadow cell-value-shadow' }, + (dropdown.find(entry => entry.value === value) || { label: undefined }).label + )} + { + onChange(newValue ? newValue.value : newValue); + }} + onOpen={this.handleOpenDropdown} + options={dropdown} + placeholder={''} + value={value} + /> +
); + } + + private renderInput() { + const { + active, + focused, + onClick, + onDoubleClick, + onPaste + } = this.propsWithDefaults; + + const classes = [ + ...(active ? ['input-active'] : []), + ...(focused ? ['focused'] : ['unfocused']), + ...['dash-cell-value'] + ]; + + const attributes = { + className: classes.join(' '), + onClick: onClick, + onDoubleClick: onDoubleClick + }; + + const readonly = !active && this.state.value === this.props.value; + + return readonly ? + this.renderValue(attributes) : + (
+ {this.renderValue({ className: 'input-cell-value-shadow cell-value-shadow' })} + +
); + } + + private renderValue(attributes = {}, value?: string) { + value = value || this.propsWithDefaults.value; + + return (
+ {value} +
); + } + + render() { + const { type } = this.props; + + switch (type) { + case ColumnType.Text: + case ColumnType.Numeric: + return this.renderInput(); + case ColumnType.Dropdown: + return this.renderDropdown(); + default: + return this.renderValue(); + } + } + + propagateChange = () => { + if (this.state.value === this.props.value) { + return; + } + + const { onChange } = this.props; + + onChange(this.state.value); + } + + handleChange = (e: any) => { + this.setState({ value: e.target.value }); + } + + handleKeyDown = (e: KeyboardEvent) => { + if (e.keyCode !== KEY_CODES.ENTER && e.keyCode !== KEY_CODES.TAB) { + return; + } + + this.propagateChange(); + } + + handleOpenDropdown = () => { + const { dropdown, td }: { [key: string]: any } = this.refs; + + dropdownHelper( + dropdown.wrapper.querySelector('.Select-menu-outer'), + td + ); + } + + componentWillReceiveProps(nextProps: ICellPropsWithDefaults) { + const { value: nextValue } = nextProps; + + if (this.state.value !== nextValue) { + this.setState({ + value: nextValue + }); + } + } + + componentDidUpdate() { + const { active } = this.propsWithDefaults; + if (!active) { + return; + } + + const input = this.refs.textInput as HTMLInputElement; + const dropdown = this.refs.dropdown as any; + + if (input && document.activeElement !== input) { + input.focus(); + input.setSelectionRange(0, input.value ? input.value.length : 0); + } + + if (dropdown && document.activeElement !== dropdown) { + // Limitation. If React >= 16 --> Use React.createRef instead to pass parent ref to child + const tdParent = DOM.getFirstParentOfType(dropdown.wrapper, 'td'); + if (tdParent) { + tdParent.focus(); + } + } + } +} \ No newline at end of file diff --git a/src/dash-table/components/CellInput/props.ts b/src/dash-table/components/CellInput/props.ts new file mode 100644 index 000000000..1ad1b9846 --- /dev/null +++ b/src/dash-table/components/CellInput/props.ts @@ -0,0 +1,42 @@ +import { ChangeEvent } from 'react'; + +import { + IConditionalDropdown, + IDropdownOptions +} from 'dash-table/components/CellInput/types'; + +import { + ColumnId, + ColumnType +} from 'dash-table/components/Table/props'; + +export interface ICellHandlerProps { + onChange: (e: ChangeEvent) => void; + onClick: (e: React.MouseEvent) => void; + onDoubleClick: (e: React.MouseEvent) => void; + onPaste: (e: React.ClipboardEvent) => void; +} + +export interface ICellProps extends ICellHandlerProps { + active: boolean; + clearable?: boolean; + datum: any; + dropdown: IDropdownOptions | undefined; + editable: boolean; + focused: boolean; + property: ColumnId; + tableId: string; + type?: string; + value: any; +} + +export interface ICellDefaultProps { + conditionalDropdowns: IConditionalDropdown[]; + type: ColumnType; +} + +export interface ICellState { + value: any; +} + +export type ICellPropsWithDefaults = ICellProps & ICellDefaultProps; diff --git a/src/dash-table/components/Cell/types.ts b/src/dash-table/components/CellInput/types.ts similarity index 100% rename from src/dash-table/components/Cell/types.ts rename to src/dash-table/components/CellInput/types.ts diff --git a/src/dash-table/components/ControlledTable/index.tsx b/src/dash-table/components/ControlledTable/index.tsx index ff835aa2e..dbbda6e14 100644 --- a/src/dash-table/components/ControlledTable/index.tsx +++ b/src/dash-table/components/ControlledTable/index.tsx @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import React, { PureComponent } from 'react'; import * as R from 'ramda'; import Stylesheet from 'core/Stylesheet'; import { colIsEditable } from 'dash-table/components/derivedState'; @@ -11,51 +11,37 @@ import { } from 'dash-table/utils/unicode'; import { selectionCycle } from 'dash-table/utils/navigation'; -import HeaderCellFactory, { DEFAULT_CELL_WIDTH } from 'dash-table/components/HeaderFactory'; import Logger from 'core/Logger'; import { memoizeOne } from 'core/memoizer'; import lexer from 'core/syntax-tree/lexer'; import TableClipboardHelper from 'dash-table/utils/TableClipboardHelper'; -import CellFactory from 'dash-table/components/CellFactory'; -import { ControlledTableProps, Columns, RowSelection } from 'dash-table/components/Table/props'; +import { ControlledTableProps, IColumn } from 'dash-table/components/Table/props'; import dropdownHelper from 'dash-table/components/dropdownHelper'; -import HeaderFilterFactory from 'dash-table/components/FilterFactory'; + +import derivedTable from 'dash-table/derived/table'; +import derivedTableFragments from 'dash-table/derived/table/fragments'; const sortNumerical = R.sort((a, b) => a - b); -interface IAccumulator { - cells: number; - count: number; +interface IState { + forcedResizeOnly: boolean; } -export default class ControlledTable extends Component { - private stylesheet: Stylesheet; - private cellFactory: CellFactory; - private filterFactory: HeaderFilterFactory; +export default class ControlledTable extends PureComponent { + private readonly stylesheet: Stylesheet; + private readonly tableFn: () => JSX.Element[][]; constructor(props: ControlledTableProps) { super(props); - this.cellFactory = new CellFactory(() => this.props); - this.filterFactory = new HeaderFilterFactory(() => { - const { row_deletable, row_selectable } = this.props; - - const offset = - (row_deletable ? 1 : 0) + - (row_selectable ? 1 : 0); - - return { - columns: this.props.columns, - filtering: this.props.filtering, - filtering_settings: this.props.filtering_settings, - filtering_type: this.props.filtering_type, - id: this.props.id, - offset, - setFilter: this.handleSetFilter - }; - }); + this.state = { + forcedResizeOnly: false + }; + this.stylesheet = new Stylesheet(`#${props.id}`); + this.tableFn = derivedTable(() => this.props); + this.updateStylesheet(); } getLexerResult = memoizeOne(lexer); @@ -66,6 +52,14 @@ export default class ControlledTable extends Component { return this.getLexerResult(filtering_settings); } + private updateStylesheet() { + const { table_style } = this.props; + + R.forEach(({ selector, rule }) => { + this.stylesheet.setRule(selector, rule); + }, table_style); + } + componentDidMount() { if ( this.props.selected_cell.length && @@ -74,24 +68,30 @@ export default class ControlledTable extends Component { this.props.setProps({ active_cell: this.props.selected_cell[0] }); } + this.applyStyle(); this.handleResize(); } componentWillMount() { // Fallback method for paste handling in Chrome // when no input element has focused inside the table - window.addEventListener('resize', this.handleResize); + window.addEventListener('resize', this.forceHandleResize); document.addEventListener('paste', this.handlePaste); document.addEventListener('mousedown', this.handleClickOutside); } componentWillUnmount() { - window.removeEventListener('resize', this.handleResize); + window.removeEventListener('resize', this.forceHandleResize); document.removeEventListener('mousedown', this.handleClickOutside); document.removeEventListener('paste', this.handlePaste); } + componentWillUpdate() { + this.updateStylesheet(); + } + componentDidUpdate() { + this.applyStyle(); this.handleResize(); this.handleDropdown(); } @@ -121,21 +121,27 @@ export default class ControlledTable extends Component { } } - handleResize = () => { - const { r0c0, r0c1, r1c0, r1c1 } = this.refs as { [key: string]: HTMLElement }; + forceHandleResize = () => this.handleResize(true); - const { n_fixed_columns, n_fixed_rows, table_style } = this.props; + handleResize = (force: boolean = false) => { + if (this.state.forcedResizeOnly && !force) { + return; + } - R.forEach(({ selector, rule }) => { - this.stylesheet.setRule(selector, rule); - }, table_style); + if (!force) { + this.setState({ forcedResizeOnly: true }); + } + + this.updateStylesheet(); + + const { r0c0, r0c1, r1c0, r1c1 } = this.refs as { [key: string]: HTMLElement }; // Adjust [fixed columns/fixed rows combo] to fixed rows height let trs = r0c1.querySelectorAll('tr'); r0c0.querySelectorAll('tr').forEach((tr, index) => { const tr2 = trs[index]; - tr.style.height = getComputedStyle(tr2).height; + tr.style.height = `${tr2.clientHeight}px`; }); // Adjust fixed columns headers to header's height @@ -152,29 +158,7 @@ export default class ControlledTable extends Component { if (contentTd) { const contentTr = contentTd.parentElement as HTMLElement; - this.stylesheet.setRule('.cell-1-0 tr', `height: ${getComputedStyle(contentTr).height}`); - } - - // Adjust the width of the fixed row header - if (n_fixed_rows) { - r1c1.querySelectorAll('tr:first-of-type td').forEach((td, index) => { - const width: any = getComputedStyle(td).width; - this.stylesheet.setRule( - `.dash-fixed-row:not(.dash-fixed-column) th:nth-of-type(${index + 1})`, - `width: ${width}; min-width: ${width}; max-width: ${width};` - ); - }); - } - - // Adjust the width of the fixed row / fixed columns header - if (n_fixed_columns && n_fixed_rows) { - r1c0.querySelectorAll('tr:first-of-type td').forEach((td, index) => { - const width: any = getComputedStyle(td).width; - this.stylesheet.setRule( - `.dash-fixed-column.dash-fixed-row th:nth-of-type(${index + 1})`, - `width: ${width}; min-width: ${width}; max-width: ${width};` - ); - }); + this.stylesheet.setRule('.dash-fixed-column tr', `height: ${getComputedStyle(contentTr).height};`); } } @@ -265,15 +249,11 @@ export default class ControlledTable extends Component { const { active_cell, columns, - row_deletable, - row_selectable, selected_cell, setProps, - virtualizer + viewport } = this.props; - const dataframe = virtualizer.dataframe; - // This is mostly to prevent TABing also triggering native HTML tab // navigation. If the preventDefault is too greedy here we must // continue to use it for at least the case we are navigating with @@ -330,18 +310,6 @@ export default class ControlledTable extends Component { const maxRow = selectedRows[selectedRows.length - 1]; const maxCol = selectedCols[selectedCols.length - 1]; - // visible col indices - const columnIndexOffset = - (row_deletable ? 1 : 0) + - (row_selectable ? 1 : 0); - - const vci: any[] = []; - columns.forEach((c, i) => { - if (!c.hidden) { - vci.push(i + columnIndexOffset); - } - }); - const selectingDown = e.keyCode === KEY_CODES.ARROW_DOWN || e.keyCode === KEY_CODES.ENTER; const selectingUp = e.keyCode === KEY_CODES.ARROW_UP; @@ -354,7 +322,7 @@ export default class ControlledTable extends Component { // the active cell. if (selectingDown && active_cell[0] > minRow) { removeCells = selectedCols.map(col => [minRow, col]); - } else if (selectingDown && maxRow !== dataframe.length - 1) { + } else if (selectingDown && maxRow !== viewport.dataframe.length - 1) { // Otherwise if we are selecting down select the next row if possible. targetCells = selectedCols.map(col => [maxRow + 1, col]); } else if (selectingUp && active_cell[0] < maxRow) { @@ -375,7 +343,7 @@ export default class ControlledTable extends Component { // If there are selections to the left of the active cell and // we are selecting right, move the left side closer to active_cell removeCells = selectedRows.map(row => [row, minCol]); - } else if (selectingRight && maxCol + 1 <= R.last(vci)) { + } else if (selectingRight && maxCol + 1 <= columns.length - 1) { // Otherwise move selection right if possible targetCells = selectedRows.map(row => [row, maxCol + 1]); } @@ -395,23 +363,17 @@ export default class ControlledTable extends Component { columns, dataframe, editable, - row_deletable, - row_selectable, selected_cell, setProps, - virtual_dataframe_indices + viewport } = this.props; event.preventDefault(); let newDataframe = dataframe; - const columnIndexOffset = - (row_deletable ? 1 : 0) + - (row_selectable ? 1 : 0); - const realCells: [number, number][] = R.map( - cell => [virtual_dataframe_indices[cell[0]], cell[1] - columnIndexOffset] as [number, number], + cell => [viewport.indices[cell[0]], cell[1]] as [number, number], selected_cell ); @@ -431,23 +393,9 @@ export default class ControlledTable extends Component { } getNextCell = (event: any, { restrictToSelection, currentCell }: any) => { - const { columns, row_deletable, row_selectable, selected_cell, virtualizer } = this.props; - const dataframe = virtualizer.dataframe; + const { columns, selected_cell, viewport } = this.props; const e = event; - const vci: any[] = []; - - const columnIndexOffset = - (row_deletable ? 1 : 0) + - (row_selectable ? 1 : 0); - - if (!restrictToSelection) { - columns.forEach((c, i) => { - if (!c.hidden) { - vci.push(i + columnIndexOffset); - } - }); - } switch (e.keyCode) { case KEY_CODES.ARROW_LEFT: @@ -458,10 +406,7 @@ export default class ControlledTable extends Component { ) : [ currentCell[0], - R.max( - vci[0], - vci[R.indexOf(currentCell[1], vci) - 1] - ) + R.max(0, currentCell[1] - 1) ]; case KEY_CODES.ARROW_RIGHT: @@ -473,10 +418,7 @@ export default class ControlledTable extends Component { ) : [ currentCell[0], - R.min( - R.last(vci), - vci[R.indexOf(currentCell[1], vci) + 1] - ) + R.min(columns.length - 1, currentCell[1] + 1) ]; case KEY_CODES.ARROW_UP: @@ -495,7 +437,7 @@ export default class ControlledTable extends Component { selected_cell ) : [ - R.min(dataframe.length - 1, currentCell[0] + 1), + R.min(viewport.dataframe.length - 1, currentCell[0] + 1), currentCell[1] ]; @@ -509,23 +451,11 @@ export default class ControlledTable extends Component { onCopy = (e: any) => { const { columns, - row_deletable, - row_selectable, selected_cell, - virtualizer + viewport } = this.props; - const dataframe = virtualizer.dataframe; - const columnIndexOffset = - (row_deletable ? 1 : 0) + - (row_selectable ? 1 : 0); - - const noOffsetSelectedCells: [number, number][] = R.map( - cell => [cell[0], cell[1] - columnIndexOffset] as [number, number], - selected_cell - ); - - TableClipboardHelper.toClipboard(e, noOffsetSelectedCells, columns, dataframe); + TableClipboardHelper.toClipboard(e, selected_cell, columns, viewport.dataframe); this.$el.focus(); } @@ -536,27 +466,19 @@ export default class ControlledTable extends Component { dataframe, editable, filtering_settings, - row_deletable, - row_selectable, setProps, sorting_settings, - virtual_dataframe_indices + viewport } = this.props; if (!editable) { return; } - const columnIndexOffset = - (row_deletable ? 1 : 0) + - (row_selectable ? 1 : 0); - - const noOffsetActiveCell: [number, number] = [active_cell[0], active_cell[1] - columnIndexOffset]; - const result = TableClipboardHelper.fromClipboard( e, - noOffsetActiveCell, - virtual_dataframe_indices, + active_cell, + viewport.indices, columns, dataframe, true, @@ -572,137 +494,110 @@ export default class ControlledTable extends Component { const { dataframe, navigation, - virtualization, - virtualization_settings + pagination_mode, + pagination_settings } = this.props; return navigation === 'page' && ( - (virtualization === 'fe' && virtualization_settings.page_size < dataframe.length) || - virtualization === 'be' + (pagination_mode === 'fe' && pagination_settings.page_size < dataframe.length) || + pagination_mode === 'be' ); } loadNext = () => { - const { virtualizer } = this.props; + const { paginator } = this.props; - virtualizer.loadNext(); + paginator.loadNext(); } loadPrevious = () => { - const { virtualizer } = this.props; + const { paginator } = this.props; - virtualizer.loadPrevious(); + paginator.loadPrevious(); } - onContainerScroll = (ev: any) => { - const { n_fixed_columns } = this.props; - if (!n_fixed_columns) { - return; - } - - const { spreadsheet } = this.refs; - if (ev.target !== spreadsheet) { - return; - } - - this.stylesheet.setRule(`.frozen-left`, `margin-top: ${-ev.target.scrollTop}px;`); - } - - applyStyle = (columns: Columns, deletable: boolean, selectable: RowSelection) => { - let typeIndex = 0; + applyStyle = () => { + const { + columns, + n_fixed_columns, + n_fixed_rows, + row_deletable, + row_selectable + } = this.props; - if (deletable) { + const { r1c0, r1c1 } = this.refs as { [key: string]: HTMLElement }; + if (row_deletable) { this.stylesheet.setRule( - `.dash-spreadsheet-inner td.column-${typeIndex}`, + `.dash-spreadsheet-inner td.dash-delete-cell`, `width: 30px; max-width: 30px; min-width: 30px;` ); - - ++typeIndex; - } - - if (selectable) { this.stylesheet.setRule( - `.dash-spreadsheet-inner td.column-${typeIndex}`, + `.dash-spreadsheet-inner th.dash-delete-header`, `width: 30px; max-width: 30px; min-width: 30px;` ); - - ++typeIndex; } - R.forEach(column => { - const width = Stylesheet.unit(column.width || DEFAULT_CELL_WIDTH, 'px'); - const maxWidth = Stylesheet.unit(column.maxWidth || column.width || DEFAULT_CELL_WIDTH, 'px'); - const minWidth = Stylesheet.unit(column.minWidth || column.width || DEFAULT_CELL_WIDTH, 'px'); - + if (row_selectable) { this.stylesheet.setRule( - `.dash-spreadsheet-inner td.column-${typeIndex}`, - `width: ${width}; max-width: ${maxWidth}; min-width: ${minWidth};` + `.dash-spreadsheet-inner td.dash-select-cell`, + `width: 30px; max-width: 30px; min-width: 30px;` ); - this.stylesheet.setRule( - `.dash-spreadsheet-inner th.column-${typeIndex}`, - `width: ${width}; max-width: ${maxWidth}; min-width: ${minWidth};` + `.dash-spreadsheet-inner th.dash-select-header`, + `width: 30px; max-width: 30px; min-width: 30px;` ); + } + + R.addIndex(R.forEach)((column, index) => { + const rules = []; + + if (column.width) { + rules.push(`width: ${Stylesheet.unit(column.width, 'px')};`); + } + + if (column.minWidth) { + rules.push(`min-width: ${Stylesheet.unit(column.minWidth, 'px')};`); + } - ++typeIndex; + if (column.maxWidth) { + rules.push(`max-width: ${Stylesheet.unit(column.maxWidth, 'px')};`); + } + + if (rules.length) { + const rule = rules.join(' '); + + this.stylesheet.setRule(`.dash-spreadsheet-inner td.column-${index}`, rule); + this.stylesheet.setRule(`.dash-spreadsheet-inner th.column-${index}`, rule); + } }, columns); - } - renderFragment = (cells: any[][] | null) => ( - cells ? - ( - - {cells.map( - (row, idx) => {row}) - } - -
) : - null - ) - - handleSetFilter = (filtering_settings: string) => this.props.setProps({ filtering_settings }); - - getCells = () => { - return [ - ...HeaderCellFactory.createHeaders(this.props), - ...this.filterFactory.createFilters(), - ...this.cellFactory.createCells() - ]; - } + // Adjust the width of the fixed row header + if (n_fixed_rows) { + r1c1.querySelectorAll('tr:first-of-type td, tr:first-of-type th').forEach((td, index) => { + const style = getComputedStyle(td); + const width = style.width; - getFragments = (cells: any, fixedColumns: number, fixedRows: number) => { - // slice out fixed columns - const fixedColumnCells = fixedColumns ? - R.map(row => - row.splice(0, R.reduceWhile( - acc => acc.count < fixedColumns, - (acc, cell) => { - acc.cells++; - acc.count += (cell.props.colSpan || 1); - - return acc; - }, - { cells: 0, count: 0 }, - row as any - ).cells), - cells) : - null; - - // slice out fixed rows - const fixedRowCells = fixedRows ? - cells.splice(0, fixedRows) : - null; - - const fixedRowAndColumnCells = fixedRows && fixedColumnCells ? - fixedColumnCells.splice(0, fixedRows) : - null; - - return [ - [this.renderFragment(fixedRowAndColumnCells), this.renderFragment(fixedRowCells)], - [this.renderFragment(fixedColumnCells), this.renderFragment(cells)] - ]; + this.stylesheet.setRule( + `.dash-fixed-row:not(.dash-fixed-column) th:nth-of-type(${index + 1})`, + `width: ${width}; min-width: ${width}; max-width: ${width};` + ); + }); + } + + // Adjust the width of the fixed row / fixed columns header + if (n_fixed_columns && n_fixed_rows) { + r1c0.querySelectorAll('tr:first-of-type td, tr:first-of-type th').forEach((td, index) => { + const style = getComputedStyle(td); + const width = style.width; + + this.stylesheet.setRule( + `.dash-fixed-column.dash-fixed-row th:nth-of-type(${index + 1})`, + `width: ${width}; min-width: ${width}; max-width: ${width};` + ); + }); + } } handleDropdown = () => { @@ -723,29 +618,24 @@ export default class ControlledTable extends Component { render() { const { id, - columns, content_style, n_fixed_columns, n_fixed_rows, - row_deletable, - row_selectable } = this.props; - this.applyStyle(columns, row_deletable, row_selectable); - const classes = [ 'dash-spreadsheet-inner', 'dash-spreadsheet', - ...(n_fixed_rows ? ['freeze-top'] : []), - ...(n_fixed_columns ? ['freeze-left'] : []), + ...(n_fixed_rows ? ['dash-freeze-top'] : []), + ...(n_fixed_columns ? ['dash-freeze-left'] : []), [`dash-${content_style}`] ]; const containerClasses = [ 'dash-spreadsheet', 'dash-spreadsheet-container', - ...(n_fixed_rows ? ['freeze-top'] : []), - ...(n_fixed_columns ? ['freeze-left'] : []), + ...(n_fixed_rows ? ['dash-freeze-top'] : []), + ...(n_fixed_columns ? ['dash-freeze-left'] : []), [`dash-${content_style}`] ]; @@ -760,8 +650,8 @@ export default class ControlledTable extends Component { ] ]; - const cells = this.getCells(); - const grid = this.getFragments(cells, n_fixed_columns, n_fixed_rows); + const rawTable = this.tableFn(); + const grid = derivedTableFragments(n_fixed_columns, n_fixed_rows, rawTable); return (
void; interface IColumnFilterProps { classes: string; + columnId: ColumnId; isValid: boolean; property: ColumnId; setFilter: SetFilter; @@ -48,11 +49,15 @@ export default class ColumnFilter extends PureComponent + return ( void; export interface IFilterOptions { - columns: Columns; + columns: VisibleColumns; + fillerColumns: number; filtering: Filtering; filtering_settings: string; filtering_type: FilteringType; id: string; - offset: number; setFilter: SetFilter; } export default class FilterFactory { private readonly handlers = new Map(); - private readonly ops = new Map(); + private readonly ops = new Map(); private get props() { return this.propsFn(); @@ -40,9 +40,9 @@ export default class FilterFactory { const value = ev.target.value.trim(); if (value && value.length) { - ops.set(columnId, value); + ops.set(columnId.toString(), value); } else { - ops.delete(columnId); + ops.delete(columnId.toString()); } setFilter(R.map( @@ -142,13 +142,13 @@ export default class FilterFactory { } private isFragmentValidOrNull(columnId: ColumnId) { - const op = this.ops.get(columnId); + const op = this.ops.get(columnId.toString()); return !op || !op.trim().length || this.isFragmentValid(columnId); } private isFragmentValid(columnId: ColumnId) { - const op = this.ops.get(columnId); + const op = this.ops.get(columnId.toString()); const lexerResult = lexer(`${columnId} ${op}`); const syntaxerResult = syntaxer(lexerResult); @@ -159,10 +159,10 @@ export default class FilterFactory { public createFilters() { const { columns, + fillerColumns, filtering, filtering_settings, filtering_type, - offset, setFilter } = this.props; @@ -172,24 +172,24 @@ export default class FilterFactory { this.updateOps(filtering_settings); - const visibleColumns = R.filter(column => !column.hidden, columns); - const offsetCells = R.range(0, offset).map(i => ()); + const offsetCells = R.range(0, fillerColumns).map(i => ()); const filterCells = filtering_type === FilteringType.Basic ? - R.addIndex(R.map)((column, index) => { + R.addIndex(R.map)((column, index) => { return (); - }, visibleColumns) : + }, columns) : [( undefined} />)]; diff --git a/src/dash-table/components/HeaderFactory.tsx b/src/dash-table/components/HeaderFactory.tsx index 58b541c42..a36506eec 100644 --- a/src/dash-table/components/HeaderFactory.tsx +++ b/src/dash-table/components/HeaderFactory.tsx @@ -1,306 +1,77 @@ -import React from 'react'; import * as R from 'ramda'; +import React from 'react'; -import { SortDirection, SortSettings } from 'core/sorting'; -import multiUpdateSettings from 'core/sorting/multi'; -import singleUpdateSettings from 'core/sorting/single'; - -import * as actions from 'dash-table/utils/actions'; -import { ColumnId, Columns, Dataframe, RowSelection, SetProps, SortingType } from 'dash-table/components/Table/props'; - -export const DEFAULT_CELL_WIDTH = 200; - -interface ICellOptions { - columns: Columns; - columnRowIndex: any; - dataframe: Dataframe; - labels: any[]; - mergeCells?: boolean; - n_fixed_columns: number; - offset: number; - rowSorting: string | boolean; - setProps: SetProps; - sorting_settings: SortSettings; - sorting_type: SortingType; - virtualization: any; -} - -interface IOptions { - columns: Columns; - dataframe: Dataframe; - mergeCells?: boolean; - merge_duplicate_headers: boolean; - n_fixed_columns: number; - n_fixed_rows: number; - row_deletable: boolean; - row_selectable: RowSelection; - setProps: SetProps; - sorting: string | boolean; - sorting_settings: SortSettings; - sorting_type: SortingType; - virtualization: any; -} - -const getColLength = (c: any) => (Array.isArray(c.name) ? c.name.length : 1); -const getColNameAt = (c: any, i: number) => (Array.isArray(c.name) ? c.name[i] : ''); - -function editColumnName(column: any, columnRowIndex: any, options: ICellOptions) { - return () => { - const { setProps } = options; - setProps(actions.editColumnName(column, columnRowIndex, options)); - }; -} +import { arrayMap } from 'core/math/arrayZipMap'; +import { matrixMap } from 'core/math/matrixZipMap'; -function deleteColumn(column: any, columnRowIndex: any, options: ICellOptions) { - return () => { - const { setProps } = options; - setProps(actions.deleteColumn(column, columnRowIndex, options)); - }; -} +import { ControlledTableProps } from 'dash-table/components/Table/props'; +import derivedHeaderContent from 'dash-table/derived/header/content'; +import getHeaderRows from 'dash-table/derived/header/headerRows'; +import getIndices from 'dash-table/derived/header/indices'; +import getLabels from 'dash-table/derived/header/labels'; +import derivedHeaderOperations from 'dash-table/derived/header/operations'; +import derivedHeaderWrappers from 'dash-table/derived/header/wrappers'; export default class HeaderFactory { - private static getSorting(columnId: ColumnId, settings: SortSettings): SortDirection { - const setting = R.find(s => s.columnId === columnId, settings); + private readonly headerContent = derivedHeaderContent(); + private readonly headerOperations = derivedHeaderOperations(); + private readonly headerWrappers = derivedHeaderWrappers(); - return setting ? setting.direction : SortDirection.None; + private get props() { + return this.propsFn(); } - private static doSort(columnId: ColumnId, options: ICellOptions) { - return () => { - const { sorting_settings, sorting_type } = options; - - let direction: SortDirection; - switch (HeaderFactory.getSorting(columnId, sorting_settings)) { - case SortDirection.Descending: - direction = SortDirection.Ascending; - break; - case SortDirection.Ascending: - direction = SortDirection.None; - break; - case SortDirection.None: - default: - direction = SortDirection.Descending; - break; - } + constructor(private readonly propsFn: () => ControlledTableProps) { - const sortingStrategy = sorting_type === 'single' ? - singleUpdateSettings : - multiUpdateSettings; - - options.setProps({ - sorting_settings: sortingStrategy( - sorting_settings, - { columnId, direction } - ) - }); - }; } - private static getSortingIcon(columnId: ColumnId, options: ICellOptions) { - const { sorting_settings } = options; - - switch (HeaderFactory.getSorting(columnId, sorting_settings)) { - case SortDirection.Descending: - return '↑'; - case SortDirection.Ascending: - return '↓'; - case SortDirection.None: - default: - return '↕'; - } - } + public createHeaders() { + const props = this.props; - private static createHeaderCells(options: ICellOptions) { - const { + let { columns, - columnRowIndex, - labels, - mergeCells, - offset, - rowSorting, - virtualization - } = options; - - let columnIndices: any[] = []; - - if (!mergeCells) { - columnIndices = R.range(0, columns.length); - } else { - columnIndices = [0]; - let compareIndex = 0; - labels.forEach((label, i) => { - // Skip over hidden columns for labels selection / filtering; - // otherwise they will be filtered out when generating the headers - if (columns[i].hidden || label === labels[compareIndex]) { - return; - } - columnIndices.push(i); - compareIndex = i; - }); - } - - return R.filter(column => !!column, columnIndices.map((columnId, spanId) => { - const c = columns[columnId]; - if (c.hidden) { - return null; - } - - let colSpan: number; - if (!mergeCells) { - colSpan = 1; - } else { - const nHiddenColumns = ( - R.slice(columnId, columnIndices[spanId + 1] || Infinity, columns) - .filter(R.propEq('hidden', true)) - .length); - if (columnId === R.last(columnIndices)) { - colSpan = labels.length - columnId - nHiddenColumns; - } else { - colSpan = columnIndices[spanId + 1] - columnId - nHiddenColumns; - } - } - - return ( - {rowSorting ? ( - - {HeaderFactory.getSortingIcon(c.id, options)} - ) : '' - } - - {((c.editable_name && R.type(c.editable_name) === 'Boolean') || - (R.type(c.editable_name) === 'Number' && - c.editable_name === columnRowIndex)) ? ( - - {`✎`} - - ) : ''} - - {((c.deletable && virtualization !== 'be' && R.type(c.deletable) === 'Boolean') || - (R.type(c.deletable) === 'Number' && - c.deletable === columnRowIndex)) ? ( - - {'×'} - - ) : ''} + merge_duplicate_headers, + pagination_mode, + row_deletable, + row_selectable, + setProps, + sorting, + sorting_settings, + sorting_type + } = props; - {labels[columnId]} - ); - })); - } + const headerRows = getHeaderRows(columns); - private static createDeletableHeader(options: IOptions) { - const { row_deletable } = options; + const labels = getLabels(columns, headerRows); + const indices = getIndices(columns, labels, merge_duplicate_headers); - return !row_deletable ? null : ( - + const operations = this.headerOperations( + headerRows, + row_selectable, + row_deletable ); - } - - private static createSelectableHeader(options: IOptions) { - const { row_selectable } = options; - return !row_selectable ? null : ( - + const wrappers = this.headerWrappers( + columns, + labelsAndIndices, + merge_duplicate_headers ); - } - static createHeaders(options: IOptions) { - let { + const content = this.headerContent( columns, - dataframe, + labelsAndIndices, sorting, - merge_duplicate_headers, - n_fixed_columns, - row_deletable, - row_selectable, - setProps, - sorting_settings, sorting_type, - virtualization - } = options; - - const offset = - (row_deletable ? 1 : 0) + - (row_selectable ? 1 : 0); - - const deletableCell = this.createDeletableHeader(options); - const selectableCell = this.createSelectableHeader(options); - - const headerDepth = Math.max.apply(Math, columns.map(getColLength)); + sorting_settings, + pagination_mode, + setProps, + props + ); - let headers: any[][]; - if (headerDepth === 1) { - headers = [[ - ...(deletableCell ? [deletableCell] : []), - ...(selectableCell ? [selectableCell] : []), - ...(HeaderFactory.createHeaderCells({ - columns, - columnRowIndex: 0, - dataframe, - labels: R.pluck('name', columns), - n_fixed_columns, - offset, - rowSorting: sorting, - setProps, - sorting_settings, - sorting_type, - virtualization - })) - ]]; - } else { - headers = R.range(0, headerDepth).map(i => ([ - ...(deletableCell ? [deletableCell] : []), - ...(selectableCell ? [selectableCell] : []), - ...(HeaderFactory.createHeaderCells({ - columns, - columnRowIndex: i, - dataframe, - labels: columns.map( - c => - R.isNil(c.name) && i === headerDepth - 1 - ? c.id - : getColNameAt(c, i) - ), - n_fixed_columns, - offset, - rowSorting: !!sorting && i + 1 === headerDepth, - mergeCells: - merge_duplicate_headers && - i + 1 !== headerDepth, - setProps, - sorting_settings, - sorting_type, - virtualization - })) - ])); - } + const headers = matrixMap(wrappers, content, (w, c) => React.cloneElement(w, { children: [c] })); - return headers; + return arrayMap(operations, headers, (o, h) => Array.prototype.concat(o, h)); } } \ No newline at end of file diff --git a/src/dash-table/components/Table/Table.less b/src/dash-table/components/Table/Table.less index 67a390a00..84515a8ce 100644 --- a/src/dash-table/components/Table/Table.less +++ b/src/dash-table/components/Table/Table.less @@ -59,12 +59,12 @@ } .dash-spreadsheet { - &.freeze-left { + &.dash-freeze-left { .fit-content-polyfill(); max-width: 500px; } - &.freeze-top { + &.dash-freeze-top { .fit-content-polyfill(); max-height: 500px; } @@ -116,8 +116,8 @@ } } - &.freeze-left, - &.freeze-top { + &.dash-freeze-left, + &.dash-freeze-top { overflow: hidden !important; .row-0 { @@ -161,13 +161,13 @@ } } - &:not(.freeze-top):not(.freeze-left) { + &:not(.dash-freeze-top):not(.dash-freeze-left) { .cell-1-1 { .top-left-cells(); } } - &:not(.freeze-top).freeze-left { + &:not(.dash-freeze-top).dash-freeze-left { .cell-1-0 { .top-left-cells(); } @@ -177,7 +177,7 @@ } } - &.freeze-top:not(.freeze-left) { + &.dash-freeze-top:not(.dash-freeze-left) { .cell-0-1 { .top-left-cells(); } @@ -187,7 +187,7 @@ } } - &.freeze-top.freeze-left { + &.dash-freeze-top.dash-freeze-left { .cell-0-0 { .top-left-cells(); } @@ -243,16 +243,60 @@ z-index: 200; } - .cell-value { + .dash-cell-value-container { + width: 100%; + height: 100%; + } + + .dash-input-cell-value-container { + position: relative; + } + + .dash-cell-value { height: 100%; width: 100%; } - div.cell-value { + input.dash-cell-value { + position: absolute; + left: 0; + top: 0; + } + + div.dash-cell-value { display: flex; flex-direction: column; justify-content: center; } + + .cell-value-shadow { + margin: auto 0; + opacity: 0; + } + + .input-cell-value-shadow { + display: inline-block; + height: initial; + width: initial; + } + + .dropdown-cell-value-shadow { + display: block; + height: 0px; + padding: 0 42px 0 10px; + } + } + + th.dash-filter { + position: relative; + + & input { + position: absolute; + left: 0; + top: 0; + height: 100%; + width: 100%; + } } // cell content styling @@ -369,7 +413,6 @@ th:hover .sort { padding: 0px; margin: 0px; height: calc(100% - 1px); - width: calc(100% - 1px); line-height: 30px; border: none; font-family: inherit; @@ -428,7 +471,8 @@ th:hover .sort { /* inset 0px 1px 0px 0px var(--border); */ } -.dash-spreadsheet-inner .delete-cell { +.dash-spreadsheet-inner .dash-delete-cell, +.dash-spreadsheet-inner .dash-delete-header { .not-selectable(); font-size: 1.3rem; @@ -436,7 +480,8 @@ th:hover .sort { cursor: pointer; color: var(--muted); } -.dash-spreadsheet-inner .delete-cell:hover { +.dash-spreadsheet-inner .dash-delete-cell:hover, +.dash-spreadsheet-inner .dash-delete-header:hover { color: var(--accent); } @@ -464,4 +509,4 @@ th:hover .sort { .dash-spreadsheet-inner th:hover .column-header--delete { color: var(--accent); opacity: 1; -} \ No newline at end of file +} diff --git a/src/dash-table/components/Table/VirtualizationAdapter.ts b/src/dash-table/components/Table/VirtualizationAdapter.ts deleted file mode 100644 index 152be8f75..000000000 --- a/src/dash-table/components/Table/VirtualizationAdapter.ts +++ /dev/null @@ -1,111 +0,0 @@ -import * as R from 'ramda'; - -import { ITarget, IViewport } from 'dash-table/virtualization/AbstractStrategy'; -import { memoizeOne } from 'core/memoizer'; -import sort, { defaultIsNully, SortSettings } from 'core/sorting'; -import SyntaxTree from 'core/syntax-tree'; -import Table from 'dash-table/components/Table'; -import { Dataframe, IVirtualizationSettings, Virtualization, Datum, Indices } from 'dash-table/components/Table/props'; - -export default class VirtualizationAdapter implements ITarget { - constructor(private readonly target: Table) { - - } - - private getDataframe = memoizeOne(( - dataframe: Dataframe, - filtering: string | boolean, - filtering_settings: string, - sorting: string | boolean, - sorting_settings: SortSettings = [], - sorting_treat_empty_string_as_none: boolean - ): { dataframe: Dataframe, indices: Indices } => { - const map = new Map(); - R.addIndex(R.forEach)((datum, index) => { - map.set(datum, index); - }, dataframe); - - if (filtering === 'fe' || filtering === true) { - const tree = new SyntaxTree(filtering_settings); - - dataframe = tree.isValid ? - tree.filter(dataframe) : - dataframe; - } - - const isNully = sorting_treat_empty_string_as_none ? - (value: any) => value === '' || defaultIsNully(value) : - undefined; - - if (sorting === 'fe' || sorting === true) { - dataframe = sort(dataframe, sorting_settings, isNully); - } - - // virtual_indices - const indices = R.map(datum => map.get(datum) as number, dataframe); - - return { dataframe, indices }; - }); - - private get dataframeAndIndices() { - const { - dataframe, - filtering, - filtering_settings, - sorting, - sorting_settings, - sorting_treat_empty_string_as_none - } = this.target.props; - - return this.getDataframe( - dataframe, - filtering, - filtering_settings, - sorting, - sorting_settings, - sorting_treat_empty_string_as_none - ); - } - - get dataframe(): Dataframe { - return this.dataframeAndIndices.dataframe; - } - - get indices(): Indices { - return this.dataframeAndIndices.indices; - } - - get settings(): IVirtualizationSettings { - return this.target.props.virtualization_settings; - } - - get virtualization(): Virtualization { - return this.target.props.virtualization; - } - - get viewportDataframe(): Dataframe { - return this.target.props.virtual_dataframe; - } - - get viewportIndices(): number[] { - return this.target.props.virtual_dataframe_indices; - } - - update(viewport: Partial) { - const setProps = this.target.setProps; - - const { - settings, - viewportDataframe, - viewportIndices - } = viewport; - - let props = R.mergeAll([ - settings ? { virtualization_settings: settings } : {}, - viewportDataframe ? { virtual_dataframe: viewportDataframe } : {}, - viewportIndices ? { virtual_dataframe_indices: viewportIndices } : {} - ]); - - setTimeout(() => { setProps(props); }, 0); - } -} \ No newline at end of file diff --git a/src/dash-table/components/Table/index.tsx b/src/dash-table/components/Table/index.tsx index c6bb52302..b471acd60 100644 --- a/src/dash-table/components/Table/index.tsx +++ b/src/dash-table/components/Table/index.tsx @@ -1,59 +1,153 @@ import React, { Component } from 'react'; import * as R from 'ramda'; -import { memoizeOne } from 'core/memoizer'; - -import VirtualizationFactory from 'dash-table/virtualization/Factory'; +import { memoizeOne, memoizeOneWithFlag } from 'core/memoizer'; import ControlledTable from 'dash-table/components/ControlledTable'; -import { PropsWithDefaults, SetProps } from './props'; -import VirtualizationAdapter from './VirtualizationAdapter'; + +import derivedPaginator from 'dash-table/derived/paginator'; +import derivedViewportDataframe from 'dash-table/derived/dataframe/viewport'; +import derivedVirtualDataframe from 'dash-table/derived/dataframe/virtual'; +import derivedVisibleColumns from 'dash-table/derived/column/visible'; + +import { + ControlledTableProps, + PropsWithDefaultsAndDerived, + SetProps +} from './props'; import 'react-select/dist/react-select.css'; import './Table.less'; import './Dropdown.css'; -export default class Table extends Component { - constructor(props: any) { +const DERIVED_REGEX = /^derived_/; + +export default class Table extends Component { + private controlled: ControlledTableProps; + + constructor(props: PropsWithDefaultsAndDerived) { super(props); - } - public get setProps() { - return this.__setProps(this.props.setProps); + this.controlled = this.getControlledProps(this.props); + this.updateDerivedProps(); } - render() { - const { setProps, virtualizer } = this; + componentWillReceiveProps(nextProps: PropsWithDefaultsAndDerived) { + this.controlled = this.getControlledProps(nextProps); + this.updateDerivedProps(); + } - virtualizer.refresh(); + shouldComponentUpdate(nextProps: any) { + const props: any = this.props; - return (); + return R.any(key => + !DERIVED_REGEX.test(key) && props[key] !== nextProps[key], + R.keysIn(props) + ); } - private get adapter() { - return this.__adapter(); + render() { + return (); } - private get virtualizer() { - const { virtualization, virtualization_settings } = this.props; + private getControlledProps(props: PropsWithDefaultsAndDerived): ControlledTableProps { + const { setProps } = this; + + const { + columns, + dataframe, + filtering, + filtering_settings, + pagination_mode, + pagination_settings, + sorting, + sorting_settings, + sorting_treat_empty_string_as_none + } = props; + + const virtual = this.virtual( + dataframe, + filtering, + filtering_settings, + sorting, + sorting_settings, + sorting_treat_empty_string_as_none + ); + + const viewport = this.viewport( + pagination_mode, + pagination_settings, + virtual.dataframe, + virtual.indices + ); - return this.__virtualizer( - virtualization, - virtualization_settings + const paginator = this.paginator( + pagination_mode, + pagination_settings, + setProps, + virtual.dataframe ); + + const visibleColumns = this.visibleColumns(columns); + + return R.mergeAll([ + props, + { + columns: visibleColumns, + paginator, + setProps, + viewport, + virtual + } + ]); + } + + private updateDerivedProps() { + const { filtering, filtering_settings, pagination_mode, pagination_settings, sorting, sorting_settings, viewport, virtual } = this.controlled; + + const viewportCached = this.viewportCache(viewport).cached; + const virtualCached = this.virtualCache(virtual).cached; + + const invalidatedFilter = this.filterCache(filtering_settings); + const invalidatedPagination = this.paginationCache(pagination_settings); + const invalidatedSort = this.sortCache(sorting_settings); + + const invalidateSelection = + (!invalidatedFilter.cached && !invalidatedFilter.first && filtering === 'be') || + (!invalidatedPagination.cached && !invalidatedPagination.first && pagination_mode === 'be') || + (!invalidatedSort.cached && !invalidatedSort.first && sorting === 'be'); + + if (virtualCached && viewportCached && !invalidateSelection) { + return; + } + + const { setProps } = this; + let newProps: Partial = {}; + + if (!virtualCached) { + newProps.derived_virtual_dataframe = virtual.dataframe; + newProps.derived_virtual_indices = virtual.indices; + } + + if (!viewportCached) { + newProps.derived_viewport_dataframe = viewport.dataframe; + newProps.derived_viewport_indices = viewport.indices; + } + + if (invalidateSelection) { + newProps.active_cell = undefined; + newProps.selected_cell = undefined; + newProps.selected_rows = undefined; + } + + setTimeout(() => setProps(newProps), 0); } - private __adapter = memoizeOne( - () => new VirtualizationAdapter(this) - ); + private get setProps() { + return this.__setProps(this.props.setProps); + } - private __setProps = memoizeOne((setProps?: SetProps) => { + private readonly __setProps = memoizeOne((setProps?: SetProps) => { return setProps ? (newProps: any) => { if (R.has('dataframe', newProps)) { const { dataframe } = this.props; @@ -63,10 +157,17 @@ export default class Table extends Component { } setProps(newProps); - } : (newProps: Partial) => this.setState(newProps); + } : (newProps: Partial) => this.setState(newProps); }); - private __virtualizer = memoizeOne((_virtualization, _settings) => { - return VirtualizationFactory.getVirtualizer(this.adapter); - }); + private readonly paginator = derivedPaginator(); + private readonly viewport = derivedViewportDataframe(); + private readonly virtual = derivedVirtualDataframe(); + private readonly visibleColumns = derivedVisibleColumns(); + + private readonly filterCache = memoizeOneWithFlag(filter => filter); + private readonly paginationCache = memoizeOneWithFlag(pagination => pagination); + private readonly sortCache = memoizeOneWithFlag(sort => sort); + private readonly viewportCache = memoizeOneWithFlag(viewport => viewport); + private readonly virtualCache = memoizeOneWithFlag(virtual => virtual); } \ No newline at end of file diff --git a/src/dash-table/components/Table/props.ts b/src/dash-table/components/Table/props.ts index 0df04f8f6..a819f26dd 100644 --- a/src/dash-table/components/Table/props.ts +++ b/src/dash-table/components/Table/props.ts @@ -1,11 +1,22 @@ import { SortSettings } from 'core/sorting'; -import AbstractVirtualizationStrategy from 'dash-table/virtualization/AbstractStrategy'; +import { IPaginator } from 'dash-table/derived/paginator'; + +export enum ColumnType { + Dropdown = 'dropdown', + Numeric = 'numeric', + Text = 'text' +} export enum FilteringType { Advanced = 'advanced', Basic = 'basic' } +export interface IDerivedDataframe { + dataframe: Dataframe; + indices: Indices; +} + export enum ContentStyle { Fit = 'fit', Grow = 'grow' @@ -20,22 +31,30 @@ export type Datum = IDatumObject | any; export type Filtering = 'fe' | 'be' | boolean; export type Indices = number[]; export type Navigation = 'page'; +export type PaginationMode = 'fe' | 'be' | boolean; export type RowSelection = 'single' | 'multi' | false; export type SelectedCells = CellCoordinates[]; export type SetProps = (...args: any[]) => void; export type Sorting = 'fe' | 'be' | boolean; export type SortingType = 'multi' | 'single'; -export type Virtualization = 'fe' | 'be' | boolean; +export type VisibleColumns = IVisibleColumn[]; -export interface IColumn { - id: ColumnId; +export interface IColumn extends IVisibleColumn { + hidden?: boolean; +} + +export interface IVisibleColumn { + clearable?: boolean; + deletable?: boolean | number; editable?: boolean; + editable_name?: boolean | number; + id: ColumnId; name: string; options?: { label: string | number, value: any }[]; // legacy - width?: string | number; maxWidth?: string | number; minWidth?: string | number; - [key: string]: any; + type?: ColumnType; + width?: string | number; } interface IDatumObject { @@ -47,7 +66,7 @@ interface IStylesheetRule { rule: string; } -export interface IVirtualizationSettings { +export interface IPaginationSettings { displayed_pages: number; current_page: number; page_size: number; @@ -92,8 +111,8 @@ interface IProps { sorting_type?: SortingType; table_style?: IStylesheetRule[]; sorting_treat_empty_string_as_none?: boolean; - virtualization?: Virtualization; - virtualization_settings?: IVirtualizationSettings; + pagination_mode?: PaginationMode; + pagination_settings?: IPaginationSettings; } interface IDefaultProps { @@ -124,22 +143,32 @@ interface IDefaultProps { sorting_type: SortingType; table_style: IStylesheetRule[]; sorting_treat_empty_string_as_none: boolean; - virtual_dataframe: Dataframe; - virtual_dataframe_indices: Indices; - virtualization: Virtualization; - virtualization_settings: IVirtualizationSettings; + pagination_mode: PaginationMode; + pagination_settings: IPaginationSettings; +} + +interface IDerivedProps { + derived_viewport_dataframe: Dataframe; + derived_viewport_indices: Indices; + derived_virtual_dataframe: Dataframe; + derived_virtual_indices: Indices; } export type PropsWithDefaults = IProps & IDefaultProps; +export type PropsWithDefaultsAndDerived = PropsWithDefaults & IDerivedProps; export type ControlledTableProps = PropsWithDefaults & { setProps: SetProps; - virtualizer: AbstractVirtualizationStrategy + + columns: VisibleColumns; + paginator: IPaginator; + viewport: IDerivedDataframe; + virtual: IDerivedDataframe; }; export interface ICellFactoryOptions { active_cell: ActiveCell; - columns: Columns; + columns: VisibleColumns; column_conditional_dropdowns: any[]; column_conditional_styles: any[]; column_static_dropdown: any; @@ -151,12 +180,11 @@ export interface ICellFactoryOptions { is_focused?: boolean; n_fixed_columns: number; n_fixed_rows: number; + paginator: IPaginator; row_deletable: boolean; row_selectable: RowSelection; selected_cell: SelectedCells; selected_rows: number[]; setProps: SetProps; - virtual_dataframe: Dataframe; - virtual_dataframe_indices: Indices; - virtualizer: AbstractVirtualizationStrategy; + viewport: IDerivedDataframe; } \ No newline at end of file diff --git a/src/dash-table/derived/cell/dropdowns.ts b/src/dash-table/derived/cell/dropdowns.ts new file mode 100644 index 000000000..2efeaa162 --- /dev/null +++ b/src/dash-table/derived/cell/dropdowns.ts @@ -0,0 +1,101 @@ +import * as R from 'ramda'; + +import { memoizeOneFactory } from 'core/memoizer'; + +import { + Dataframe, + Datum, + VisibleColumns, + ColumnId, + Indices +} from 'dash-table/components/Table/props'; +import SyntaxTree from 'core/syntax-tree'; +import memoizerCache from 'core/memoizerCache'; + +interface IDropdownOption { + label: string; + value: string; +} + +type IDropdownOptions = IDropdownOption[]; + +interface IConditionalDropdown { + condition: string; + dropdown: IDropdownOptions; +} + +const mapDataframe = R.addIndex(R.map); + +const getDropdown = ( + astCache: (key: [ColumnId, number], query: string) => SyntaxTree, + conditionalDropdowns: any, + datum: Datum, + property: ColumnId, + staticDropdown: any +) => { + const dropdowns = [ + ...(staticDropdown ? [staticDropdown] : []), + ...R.map( + ([cd]) => cd.dropdown, + R.filter( + ([cd, i]) => astCache([property, i], cd.condition).evaluate(datum), + R.addIndex(R.map)( + (cd, i) => [cd, i], + conditionalDropdowns + )) + ) + ]; + + return dropdowns.length ? dropdowns.slice(-1)[0] : undefined; +}; + +const getter = ( + astCache: (key: [ColumnId, number], query: string) => SyntaxTree, + columns: VisibleColumns, + dataframe: Dataframe, + indices: Indices, + columnConditionalDropdown: any, + columnStaticDropdown: any, + dropdown_properties: any +): any[][] => mapDataframe((datum, rowIndex) => R.map(column => { + const realIndex = indices[rowIndex]; + + let legacyDropdown: any = ( + ( + dropdown_properties && + dropdown_properties[column.id] && + ( + dropdown_properties[column.id].length > realIndex ? + dropdown_properties[column.id][realIndex] : + null + ) + ) || column || {} + ).options; + + let conditionalDropdowns = columnConditionalDropdown.find((cs: any) => cs.id === column.id); + let staticDropdown = columnStaticDropdown.find((ss: any) => ss.id === column.id); + + conditionalDropdowns = (conditionalDropdowns && conditionalDropdowns.dropdowns) || []; + staticDropdown = legacyDropdown || (staticDropdown && staticDropdown.dropdown); + + return getDropdown(astCache, conditionalDropdowns, datum, column.id, staticDropdown); +}, columns), dataframe); + +const getterFactory = memoizeOneFactory(getter); + +const decoratedGetter = (_id: string): (( + columns: VisibleColumns, + dataframe: Dataframe, + indices: Indices, + columnConditionalDropdown: any, + columnStaticDropdown: any, + dropdown_properties: any +) => any[][]) => { + const astCache = memoizerCache<[ColumnId, number], [string], SyntaxTree>( + (query: string) => new SyntaxTree(query) + ); + + return getterFactory().bind(undefined, astCache); +}; + +export default memoizeOneFactory(decoratedGetter); diff --git a/src/dash-table/derived/cell/eventHandler.ts b/src/dash-table/derived/cell/eventHandler.ts new file mode 100644 index 000000000..2532a7453 --- /dev/null +++ b/src/dash-table/derived/cell/eventHandler.ts @@ -0,0 +1,49 @@ + +import { memoizeOneFactory } from 'core/memoizer'; +import memoizerCache from 'core/memoizerCache'; +import { ICellFactoryOptions } from 'dash-table/components/Table/props'; +import { handleChange, handleClick, handleDoubleClick, handlePaste } from 'dash-table/handlers/cellEvents'; + +type CacheArgs = [Handler, number, number]; +type GetterArgs = [HandlerFn, number, number]; + +export enum Handler { + Change = 'change', + Click = 'click', + DoubleClick = 'doubleclick', + Paste = 'paste' +} + +export type CacheFn = (...args: CacheArgs) => Function; +export type HandlerFn = (...args: any[]) => any; + +const getter = (propsFn: () => ICellFactoryOptions): CacheFn => { + const cache = memoizerCache((...args: GetterArgs) => { + let [ + handler, + rowIndex, + columnIndex + ] = args; + + return handler && handler.bind(undefined, rowIndex, columnIndex); + }); + + const handlers = new Map([ + [Handler.Change, handleChange.bind(undefined, propsFn)], + [Handler.Click, handleClick.bind(undefined, propsFn)], + [Handler.DoubleClick, handleDoubleClick.bind(undefined, propsFn)], + [Handler.Paste, handlePaste.bind(undefined, propsFn)] + ]); + + return (...args: CacheArgs) => { + let [ + handler, + rowIndex, + columnIndex + ] = args; + + return cache(args, handlers.get(handler) as HandlerFn, rowIndex, columnIndex); + }; +}; + +export default memoizeOneFactory(getter); \ No newline at end of file diff --git a/src/dash-table/derived/cell/eventHandlerProps.ts b/src/dash-table/derived/cell/eventHandlerProps.ts new file mode 100644 index 000000000..34b4b0d6b --- /dev/null +++ b/src/dash-table/derived/cell/eventHandlerProps.ts @@ -0,0 +1,30 @@ + +import { memoizeOneFactory } from 'core/memoizer'; +import { ICellFactoryOptions } from 'dash-table/components/Table/props'; +import cellEventHandler, { Handler } from 'dash-table/derived/cell/eventHandler'; +import { ICellHandlerProps } from 'dash-table/components/CellInput/props'; + +type CacheArgs = [number, number]; + +export type CacheFn = (...args: CacheArgs) => ICellHandlerProps; +export type HandlerFn = (...args: any[]) => any; + +const getter = (propsFn: () => ICellFactoryOptions): CacheFn => { + const derivedHandlers = cellEventHandler()(propsFn); + + return (...args: CacheArgs) => { + const [ + rowIndex, + columnIndex + ] = args; + + return { + onChange: derivedHandlers(Handler.Change, rowIndex, columnIndex), + onClick: derivedHandlers(Handler.Click, rowIndex, columnIndex), + onDoubleClick: derivedHandlers(Handler.DoubleClick, rowIndex, columnIndex), + onPaste: derivedHandlers(Handler.Paste, rowIndex, columnIndex) + } as ICellHandlerProps; + }; +}; + +export default memoizeOneFactory(getter); \ No newline at end of file diff --git a/src/dash-table/derived/cell/inputs.tsx b/src/dash-table/derived/cell/inputs.tsx new file mode 100644 index 000000000..19c657afe --- /dev/null +++ b/src/dash-table/derived/cell/inputs.tsx @@ -0,0 +1,60 @@ +import * as R from 'ramda'; +import React from 'react'; + +import { memoizeOneFactory } from 'core/memoizer'; + +import { + ActiveCell, + Dataframe, + Datum, + IVisibleColumn, + VisibleColumns, + ICellFactoryOptions +} from 'dash-table/components/Table/props'; +import CellInput from 'dash-table/components/CellInput'; +import derivedCellEventHandlerProps from 'dash-table/derived/cell/eventHandlerProps'; +import isActiveCell from 'dash-table/derived/cell/isActive'; + +const mapDataframe = R.addIndex(R.map); +const mapRow = R.addIndex(R.map); + +const cellEventHandlerProps = derivedCellEventHandlerProps(); + +const getter = ( + activeCell: ActiveCell, + columns: VisibleColumns, + dataframe: Dataframe, + editable: boolean, + isFocused: boolean, + tableId: string, + dropdowns: any[][], + propsFn: () => ICellFactoryOptions +): JSX.Element[][] => mapDataframe( + (datum, rowIndex) => mapRow( + (column, columnIndex) => { + const active = isActiveCell(activeCell, rowIndex, columnIndex); + + const dropdown = dropdowns[rowIndex][columnIndex]; + const handlers = cellEventHandlerProps(propsFn)(rowIndex, columnIndex); + + return (); + }, + columns + ), + dataframe +); + +export default memoizeOneFactory(getter); diff --git a/src/dash-table/derived/cell/isActive.ts b/src/dash-table/derived/cell/isActive.ts new file mode 100644 index 000000000..78b705788 --- /dev/null +++ b/src/dash-table/derived/cell/isActive.ts @@ -0,0 +1,7 @@ +import { ActiveCell } from 'dash-table/components/Table/props'; + +export default ( + activeCell: ActiveCell, + row: number, + column: number +) => activeCell[0] === row && activeCell[1] === column; \ No newline at end of file diff --git a/src/dash-table/derived/cell/isSelected.ts b/src/dash-table/derived/cell/isSelected.ts new file mode 100644 index 000000000..8e701b864 --- /dev/null +++ b/src/dash-table/derived/cell/isSelected.ts @@ -0,0 +1,9 @@ +import * as R from 'ramda'; + +import { SelectedCells } from 'dash-table/components/Table/props'; + +export default ( + selectedCells: SelectedCells, + row: number, + column: number +) => R.contains([row, column], selectedCells); \ No newline at end of file diff --git a/src/dash-table/derived/cell/operations.tsx b/src/dash-table/derived/cell/operations.tsx new file mode 100644 index 000000000..531f806c5 --- /dev/null +++ b/src/dash-table/derived/cell/operations.tsx @@ -0,0 +1,81 @@ +import * as R from 'ramda'; +import React from 'react'; + +import { memoizeOneFactory } from 'core/memoizer'; + +import { + Dataframe, + Datum, + SetProps, + RowSelection, + ActiveCell, + Indices +} from 'dash-table/components/Table/props'; + +function deleteRow(idx: number, activeCell: ActiveCell, dataframe: Dataframe, selectedRows: number[]) { + const newProps: any = { + dataframe: R.remove(idx, 1, dataframe) + }; + if (R.is(Array, activeCell) && activeCell[0] === idx) { + newProps.active_cell = []; + } + + if (R.is(Array, selectedRows) && R.contains(idx, selectedRows)) { + newProps.selected_rows = R.without([idx], selectedRows); + } + return newProps; +} + +function rowSelectCell(idx: number, rowSelectable: RowSelection, selectedRows: number[], setProps: SetProps) { + return ( + setProps({ + selected_rows: + rowSelectable === 'single' ? + [idx] : + R.ifElse( + R.contains(idx), + R.without([idx]), + R.append(idx) + )(selectedRows) + })} + /> + ); +} + +function rowDeleteCell(setProps: SetProps, deleteFn: () => any) { + return ( setProps(deleteFn())} + style={{ width: `30px`, maxWidth: `30px`, minWidth: `30px` }} + > + {'×'} + ); +} + +const getter = ( + activeCell: ActiveCell, + dataframe: Dataframe, + viewportDataframe: Dataframe, + viewportIndices: Indices, + rowSelectable: RowSelection, + rowDeletable: boolean, + selectedRows: number[], + setProps: SetProps +): JSX.Element[][] => R.addIndex(R.map)( + (_, rowIndex) => [ + ...(rowDeletable ? [rowDeleteCell(setProps, deleteRow.bind(undefined, viewportIndices[rowIndex], activeCell, dataframe, selectedRows))] : []), + ...(rowSelectable ? [rowSelectCell(viewportIndices[rowIndex], rowSelectable, selectedRows, setProps)] : []) + ], + viewportDataframe +); + +export default memoizeOneFactory(getter); diff --git a/src/dash-table/derived/cell/wrapperStyles.ts b/src/dash-table/derived/cell/wrapperStyles.ts new file mode 100644 index 000000000..e4b9a841c --- /dev/null +++ b/src/dash-table/derived/cell/wrapperStyles.ts @@ -0,0 +1,117 @@ +import * as R from 'ramda'; +import { CSSProperties } from 'react'; + +import { memoizeAll, memoizeOne } from 'core/memoizer'; +import { ColumnId, Dataframe, Datum, VisibleColumns } from 'dash-table/components/Table/props'; +import SyntaxTree from 'core/syntax-tree'; +import memoizerCache from 'core/memoizerCache'; + +interface IStyle { + target?: undefined; + style: CSSProperties; +} + +interface IConditionalStyle extends IStyle { + condition: string; +} + +type Style = CSSProperties | undefined; + +type Key = [ColumnId, number]; +type AstCacheFn = (key: Key, query: string) => SyntaxTree; +type StyleCacheFn = ( + key: Key, + astCache: AstCacheFn, + conditionalStyles: IConditionalStyle[], + datum: Datum, + property: ColumnId, + staticStyle: IStyle +) => Style; + +const NULL_CONDITIONAL_STYLES: IConditionalStyle[] = []; + +function getStyle( + astCache: AstCacheFn, + conditionalStyles: IConditionalStyle[], + datum: Datum, + property: ColumnId, + staticStyle: IStyle +) { + const styles = R.map( + ([cs]) => cs.style, + R.filter( + ([cs, i]) => astCache([property, i], cs.condition).evaluate(datum), + R.addIndex(R.map)( + (cs, i) => [cs, i], + conditionalStyles + ) + ) + ); + + if (staticStyle) { + styles.push(staticStyle.style); + } + + if (!styles.length) { + return undefined; + } + + return R.mergeAll(styles); +} + +function getter( + astCache: AstCacheFn, + styleCache: StyleCacheFn, + columns: VisibleColumns, + columnConditionalStyle: any, + columnStaticStyle: any, + dataframe: Dataframe +): Style[][] { + return R.addIndex(R.map)( + (datum, rowIndex) => R.addIndex(R.map)( + (column, columnIndex) => { + let conditionalStyles = columnConditionalStyle.find((cs: any) => cs.id === column.id); + let staticStyle = columnStaticStyle.find((ss: any) => ss.id === column.id); + + conditionalStyles = (conditionalStyles && conditionalStyles.styles) || NULL_CONDITIONAL_STYLES; + staticStyle = staticStyle && staticStyle.style; + + return styleCache( + [rowIndex, columnIndex], + astCache, + conditionalStyles, + datum[column.id], + column.id, + staticStyle + ); + }, + columns), + dataframe); +} + +function decorator(_id: string): (( + columns: VisibleColumns, + columnConditionalStyle: any, + columnStaticStyle: any, + dataframe: Dataframe +) => Style[][]) { + const astCache = memoizerCache( + (query: string) => new SyntaxTree(query) + ); + + const styleCache = memoizerCache< + Key, + [ + (key: Key, query: string) => SyntaxTree, + IConditionalStyle[], + Datum, + ColumnId, + IStyle + ], + Style + >(getStyle); + + return memoizeOne(getter).bind(undefined, astCache, styleCache); +} + +export default memoizeAll(decorator); diff --git a/src/dash-table/derived/cell/wrappers.tsx b/src/dash-table/derived/cell/wrappers.tsx new file mode 100644 index 000000000..fe865abd4 --- /dev/null +++ b/src/dash-table/derived/cell/wrappers.tsx @@ -0,0 +1,69 @@ +import * as R from 'ramda'; +import React from 'react'; + +import { memoizeAll, memoizeOne } from 'core/memoizer'; +import { Dataframe, IVisibleColumn, VisibleColumns, ColumnType, ActiveCell, SelectedCells, Datum, ColumnId } from 'dash-table/components/Table/props'; +import Cell from 'dash-table/components/Cell'; +import isActiveCell from 'dash-table/derived/cell/isActive'; +import isSelectedCell from 'dash-table/derived/cell/isSelected'; +import memoizerCache from 'core/memoizerCache'; + +type Key = [number, number]; +type ElementCacheFn = ( + key: Key, + active: boolean, + classes: string, + columnIndex: number, + columnId: ColumnId +) => JSX.Element; + +function getter( + elementCache: ElementCacheFn, + activeCell: ActiveCell, + columns: VisibleColumns, + dataframe: Dataframe, + editable: boolean, + selectedCells: SelectedCells +): JSX.Element[][] { + return R.addIndex(R.map)( + (_, rowIndex) => R.addIndex(R.map)( + (column, columnIndex) => { + const active = isActiveCell(activeCell, rowIndex, columnIndex); + const selected = isSelectedCell(selectedCells, rowIndex, columnIndex); + + const classes = + 'dash-cell' + + ` column-${columnIndex}` + + (active ? ' focused' : '') + + (!editable ? ' cell--uneditable' : '') + + (selected ? ' cell--selected' : '') + + (column.type === ColumnType.Dropdown ? ' dropdown' : ''); + + return elementCache([rowIndex, columnIndex], active, classes, columnIndex, column.id); + }, + columns + ), + dataframe + ) +} + +function decorator(_id: string): (( + activeCell: ActiveCell, + columns: VisibleColumns, + columnConditionalStyle: any, + columnStaticStyle: any, + dataframe: Dataframe +) => JSX.Element[][]) { + const elementCache = memoizerCache( + (active: boolean, classes: string, columnIndex: number, columnId: ColumnId) => () + ); + + return memoizeOne(getter).bind(undefined, elementCache); +} + +export default memoizeAll(decorator); diff --git a/src/dash-table/derived/column/visible.ts b/src/dash-table/derived/column/visible.ts new file mode 100644 index 000000000..9d5d38d18 --- /dev/null +++ b/src/dash-table/derived/column/visible.ts @@ -0,0 +1,8 @@ +import * as R from 'ramda'; + +import { memoizeOneFactory } from 'core/memoizer'; +import { Columns, VisibleColumns } from 'dash-table/components/Table/props'; + +const getter = (columns: Columns): VisibleColumns => R.filter(column => !column.hidden, columns); + +export default memoizeOneFactory(getter); diff --git a/src/dash-table/derived/dataframe/viewport.ts b/src/dash-table/derived/dataframe/viewport.ts new file mode 100644 index 000000000..f3b17ded7 --- /dev/null +++ b/src/dash-table/derived/dataframe/viewport.ts @@ -0,0 +1,56 @@ +import { memoizeOneFactory } from 'core/memoizer'; + +import { + Dataframe, + Indices, + IPaginationSettings, + PaginationMode, + IDerivedDataframe +} from 'dash-table/components/Table/props'; + +function getNoPagination(dataframe: Dataframe, indices: Indices): IDerivedDataframe { + return { dataframe, indices }; +} + +function getFrontEndPagination(settings: IPaginationSettings, dataframe: Dataframe, indices: Indices): IDerivedDataframe { + let currentPage = Math.min( + settings.current_page, + Math.floor(dataframe.length / settings.page_size) + ); + + const firstIndex = settings.page_size * currentPage; + const lastIndex = Math.min( + firstIndex + settings.displayed_pages * settings.page_size, + dataframe.length + ); + + return { + dataframe: dataframe.slice(firstIndex, lastIndex), + indices: indices.slice(firstIndex, lastIndex) + }; +} + +function getBackEndPagination(dataframe: Dataframe, indices: Indices): IDerivedDataframe { + return { dataframe, indices }; +} + +const getter = ( + pagination_mode: PaginationMode, + pagination_settings: IPaginationSettings, + dataframe: Dataframe, + indices: Indices +): IDerivedDataframe => { + switch (pagination_mode) { + case false: + return getNoPagination(dataframe, indices); + case true: + case 'fe': + return getFrontEndPagination(pagination_settings, dataframe, indices); + case 'be': + return getBackEndPagination(dataframe, indices); + default: + throw new Error(`Unknown pagination mode: '${pagination_mode}'`); + } +}; + +export default memoizeOneFactory(getter); diff --git a/src/dash-table/derived/dataframe/virtual.ts b/src/dash-table/derived/dataframe/virtual.ts new file mode 100644 index 000000000..18d8521ca --- /dev/null +++ b/src/dash-table/derived/dataframe/virtual.ts @@ -0,0 +1,49 @@ +import * as R from 'ramda'; + +import { memoizeOneFactory } from 'core/memoizer'; +import sort, { defaultIsNully, SortSettings } from 'core/sorting'; +import SyntaxTree from 'core/syntax-tree'; +import { + Dataframe, + Datum, + Filtering, + IDerivedDataframe, + Sorting +} from 'dash-table/components/Table/props'; + +const getter = ( + dataframe: Dataframe, + filtering: Filtering, + filtering_settings: string, + sorting: Sorting, + sorting_settings: SortSettings = [], + sorting_treat_empty_string_as_none: boolean +): IDerivedDataframe => { + const map = new Map(); + R.addIndex(R.forEach)((datum, index) => { + map.set(datum, index); + }, dataframe); + + if (filtering === 'fe' || filtering === true) { + const tree = new SyntaxTree(filtering_settings); + + dataframe = tree.isValid ? + tree.filter(dataframe) : + dataframe; + } + + const isNully = sorting_treat_empty_string_as_none ? + (value: any) => value === '' || defaultIsNully(value) : + undefined; + + if (sorting === 'fe' || sorting === true) { + dataframe = sort(dataframe, sorting_settings, isNully); + } + + // virtual_indices + const indices = R.map(datum => map.get(datum) as number, dataframe); + + return { dataframe, indices }; +}; + +export default memoizeOneFactory(getter); diff --git a/src/dash-table/derived/header/content.tsx b/src/dash-table/derived/header/content.tsx new file mode 100644 index 000000000..3fbef7ba9 --- /dev/null +++ b/src/dash-table/derived/header/content.tsx @@ -0,0 +1,148 @@ +import * as R from 'ramda'; +import React from 'react'; + +import { memoizeOneFactory } from 'core/memoizer'; +import { SortDirection, SortSettings } from 'core/sorting'; +import multiUpdateSettings from 'core/sorting/multi'; +import singleUpdateSettings from 'core/sorting/single'; + +import { + ColumnId, + PaginationMode, + SortingType, + VisibleColumns, + IVisibleColumn, + SetProps, + ControlledTableProps, + Sorting +} from 'dash-table/components/Table/props'; +import * as actions from 'dash-table/utils/actions'; + +function deleteColumn(column: IVisibleColumn, columns: VisibleColumns, columnRowIndex: any, setProps: SetProps, options: ControlledTableProps) { + return () => { + setProps(actions.deleteColumn(column, columns, columnRowIndex, options)); + }; +} + +function doSort(columnId: ColumnId, sortSettings: SortSettings, sortType: SortingType, setProps: SetProps) { + return () => { + let direction: SortDirection; + switch (getSorting(columnId, sortSettings)) { + case SortDirection.Descending: + direction = SortDirection.Ascending; + break; + case SortDirection.Ascending: + direction = SortDirection.None; + break; + case SortDirection.None: + default: + direction = SortDirection.Descending; + break; + } + + const sortingStrategy = sortType === 'single' ? + singleUpdateSettings : + multiUpdateSettings; + + setProps({ + sorting_settings: sortingStrategy( + sortSettings, + { columnId, direction } + ) + }); + }; +} + +function editColumnName(column: IVisibleColumn, columns: VisibleColumns, columnRowIndex: any, setProps: SetProps, options: ControlledTableProps) { + return () => { + setProps(actions.editColumnName(column, columns, columnRowIndex, options)); + }; +} + +function getSorting(columnId: ColumnId, settings: SortSettings): SortDirection { + const setting = R.find(s => s.columnId === columnId, settings); + + return setting ? setting.direction : SortDirection.None; +} + +function getSortingIcon(columnId: ColumnId, sortSettings: SortSettings) { + switch (getSorting(columnId, sortSettings)) { + case SortDirection.Descending: + return '↑'; + case SortDirection.Ascending: + return '↓'; + case SortDirection.None: + default: + return '↕'; + } +} + +function getter( + columns: VisibleColumns, + labelsAndIndices: R.KeyValuePair[], + sorting: Sorting, + sortType: SortingType, + sortSettings: SortSettings, + paginationMode: PaginationMode, + setProps: SetProps, + options: ControlledTableProps +): JSX.Element[][] { + return R.addIndex, JSX.Element[]>(R.map)( + ([labels, indices], headerRowIndex) => { + const isLastRow = headerRowIndex === labelsAndIndices.length - 1; + + return R.addIndex(R.map)( + columnIndex => { + const column = columns[columnIndex]; + + const editable = (column.editable_name && R.type(column.editable_name) === 'Boolean') || + (R.type(column.editable_name) === 'Number' && column.editable_name === headerRowIndex); + + const deletable = paginationMode !== 'be' && + ( + (column.deletable && R.type(column.deletable) === 'Boolean') || + (R.type(column.deletable) === 'Number' && column.deletable === headerRowIndex) + ); + + return (
+ {sorting && isLastRow ? + ( + {getSortingIcon(column.id, sortSettings)} + ) : + '' + } + + {editable ? + ( + {`✎`} + ) : + '' + } + + {deletable ? + ( + {'×'} + ) : + '' + } + + {labels[columnIndex]} +
); + }, + indices + ); + }, + labelsAndIndices + ); +} + +export default memoizeOneFactory(getter); diff --git a/src/dash-table/derived/header/fixedHeaders.ts b/src/dash-table/derived/header/fixedHeaders.ts new file mode 100644 index 000000000..4c6ca9396 --- /dev/null +++ b/src/dash-table/derived/header/fixedHeaders.ts @@ -0,0 +1,13 @@ +import { RowSelection } from 'dash-table/components/Table/props'; + +export default ( + fixedColumns: number, + rowDeletable: boolean, + rowSelectable: RowSelection +): number => { + const offset = + (rowDeletable ? 1 : 0) + + (rowSelectable ? 1 : 0); + + return Math.max(0, fixedColumns - offset); +}; \ No newline at end of file diff --git a/src/dash-table/derived/header/headerRows.ts b/src/dash-table/derived/header/headerRows.ts new file mode 100644 index 000000000..50c7e36c1 --- /dev/null +++ b/src/dash-table/derived/header/headerRows.ts @@ -0,0 +1,7 @@ +import { VisibleColumns } from 'dash-table/components/Table/props'; + +const getColLength = (c: any) => (Array.isArray(c.name) ? c.name.length : 1); + +export default ( + columns: VisibleColumns +): number => Math.max(...columns.map(getColLength)); \ No newline at end of file diff --git a/src/dash-table/derived/header/indices.ts b/src/dash-table/derived/header/indices.ts new file mode 100644 index 000000000..93ac7493c --- /dev/null +++ b/src/dash-table/derived/header/indices.ts @@ -0,0 +1,27 @@ +import * as R from 'ramda'; + +import { VisibleColumns } from 'dash-table/components/Table/props'; + +export default ( + columns: VisibleColumns, + labels: any[][], + mergeHeaders: boolean +): number[][] => { + return R.map(rowLabels => { + if (!mergeHeaders) { + return R.range(0, columns.length); + } else { + let columnIndices = [0]; + let compareIndex = 0; + rowLabels.forEach((label, i) => { + if (label === rowLabels[compareIndex]) { + return; + } + columnIndices.push(i); + compareIndex = i; + }); + + return columnIndices; + } + }, labels); +}; \ No newline at end of file diff --git a/src/dash-table/derived/header/labels.ts b/src/dash-table/derived/header/labels.ts new file mode 100644 index 000000000..5ca394d95 --- /dev/null +++ b/src/dash-table/derived/header/labels.ts @@ -0,0 +1,19 @@ +import * as R from 'ramda'; + +import { VisibleColumns } from 'dash-table/components/Table/props'; + +const getColNameAt = (c: any, i: number) => (Array.isArray(c.name) ? c.name[i] : c.name); + +export default ( + columns: VisibleColumns, + headerRows: number +): any[][] => { + return R.map( + headerRowIndex => columns.map(c => + R.isNil(c.name) && headerRowIndex === headerRows - 1 + ? c.id + : getColNameAt(c, headerRowIndex) + ), + R.range(0, headerRows) + ); +}; \ No newline at end of file diff --git a/src/dash-table/derived/header/operations.tsx b/src/dash-table/derived/header/operations.tsx new file mode 100644 index 000000000..e84114140 --- /dev/null +++ b/src/dash-table/derived/header/operations.tsx @@ -0,0 +1,40 @@ +import * as R from 'ramda'; +import React from 'react'; + +import { memoizeOneFactory } from 'core/memoizer'; + +import { + Datum, + RowSelection +} from 'dash-table/components/Table/props'; + +function rowSelectCell() { + return (); +} + +function rowDeleteHeader() { + return (); +} + +const getter = ( + headerRows: number, + rowSelectable: RowSelection, + rowDeletable: boolean +): JSX.Element[][] => R.addIndex(R.map)( + () => [ + ...(rowDeletable ? [rowDeleteHeader()] : []), + ...(rowSelectable ? [rowSelectCell()] : []) + ], + R.range(0, headerRows) +); + +export default memoizeOneFactory(getter); diff --git a/src/dash-table/derived/header/wrappers.tsx b/src/dash-table/derived/header/wrappers.tsx new file mode 100644 index 000000000..c18c34a5e --- /dev/null +++ b/src/dash-table/derived/header/wrappers.tsx @@ -0,0 +1,47 @@ +import * as R from 'ramda'; +import React from 'react'; + +import { memoizeOneFactory } from 'core/memoizer'; + +import { VisibleColumns } from 'dash-table/components/Table/props'; + +function getter( + columns: VisibleColumns, + labelsAndIndices: R.KeyValuePair[], + mergeHeaders: boolean +): JSX.Element[][] { + return R.map(([labels, indices]) => { + return R.addIndex(R.map)( + (columnIndex, index) => { + const column = columns[columnIndex]; + + let colSpan: number; + if (!mergeHeaders) { + colSpan = 1; + } else { + if (columnIndex === R.last(indices)) { + colSpan = labels.length - columnIndex; + } else { + colSpan = indices[index + 1] - columnIndex; + } + } + + return (); + }, + indices + ); + }, + labelsAndIndices + ); +} + +export default memoizeOneFactory(getter); diff --git a/src/dash-table/derived/paginator.ts b/src/dash-table/derived/paginator.ts new file mode 100644 index 000000000..cc32e5fc5 --- /dev/null +++ b/src/dash-table/derived/paginator.ts @@ -0,0 +1,96 @@ +import * as R from 'ramda'; + +import { memoizeOneFactory } from 'core/memoizer'; + +import { + Dataframe, + PaginationMode, + SetProps, + IPaginationSettings +} from 'dash-table/components/Table/props'; + +export interface IPaginator { + loadNext(): void; + loadPrevious(): void; +} + +function getBackEndPagination( + pagination_settings: IPaginationSettings, + setProps: SetProps +): IPaginator { + return { + loadNext: () => { + pagination_settings.current_page++; + setProps({ pagination_settings }); + }, + loadPrevious: () => { + if (pagination_settings.current_page <= 0) { + return; + } + + pagination_settings.current_page--; + setProps({ pagination_settings }); + } + }; +} + +function getFrontEndPagination( + pagination_settings: IPaginationSettings, + setProps: SetProps, + dataframe: Dataframe +) { + return { + loadNext: () => { + let maxPageIndex = Math.floor(dataframe.length / pagination_settings.page_size); + + if (pagination_settings.current_page >= maxPageIndex) { + return; + } + + pagination_settings = R.merge(pagination_settings, { + current_page: pagination_settings.current_page + 1 + }); + + setProps({ pagination_settings }); + }, + loadPrevious: () => { + if (pagination_settings.current_page <= 0) { + return; + } + + pagination_settings = R.merge(pagination_settings, { + current_page: pagination_settings.current_page - 1 + }); + + setProps({ pagination_settings }); + } + }; +} + +function getNoPagination() { + return { + loadNext: () => { }, + loadPrevious: () => { } + }; +} + +const getter = ( + pagination_mode: PaginationMode, + pagination_settings: IPaginationSettings, + setProps: SetProps, + dataframe: Dataframe +): IPaginator => { + switch (pagination_mode) { + case false: + return getNoPagination(); + case true: + case 'fe': + return getFrontEndPagination(pagination_settings, setProps, dataframe); + case 'be': + return getBackEndPagination(pagination_settings, setProps); + default: + throw new Error(`Unknown pagination mode: '${pagination_mode}'`); + } +}; + +export default memoizeOneFactory(getter); \ No newline at end of file diff --git a/src/dash-table/derived/table/fragments.tsx b/src/dash-table/derived/table/fragments.tsx new file mode 100644 index 000000000..14aca4746 --- /dev/null +++ b/src/dash-table/derived/table/fragments.tsx @@ -0,0 +1,56 @@ +import * as R from 'ramda'; +import React from 'react'; + +interface IAccumulator { + cells: number; + count: number; +} + +function renderFragment(cells: any[][] | null) { + return cells ? + ( + + {cells.map( + (row, idx) => {row}) + } + +
) : + null; +} + +export default ( + fixedColumns: number, + fixedRows: number, + cells: JSX.Element[][] +): (JSX.Element | null)[][] => { + // slice out fixed columns + const fixedColumnCells = fixedColumns ? + R.map(row => + row.splice(0, R.reduceWhile( + acc => acc.count < fixedColumns, + (acc, cell) => { + acc.cells++; + acc.count += (cell.props.colSpan || 1); + + return acc; + }, + { cells: 0, count: 0 }, + row as any + ).cells), + cells) : + null; + + // slice out fixed rows + const fixedRowCells = fixedRows ? + cells.splice(0, fixedRows) : + null; + + const fixedRowAndColumnCells = fixedRows && fixedColumnCells ? + fixedColumnCells.splice(0, fixedRows) : + null; + + return [ + [renderFragment(fixedRowAndColumnCells), renderFragment(fixedRowCells)], + [renderFragment(fixedColumnCells), renderFragment(cells)] + ]; +}; \ No newline at end of file diff --git a/src/dash-table/derived/table/index.tsx b/src/dash-table/derived/table/index.tsx new file mode 100644 index 000000000..5fa95d0ae --- /dev/null +++ b/src/dash-table/derived/table/index.tsx @@ -0,0 +1,55 @@ +import CellFactory from 'dash-table/components/CellFactory'; +import FilterFactory from 'dash-table/components/FilterFactory'; +import HeaderFactory from 'dash-table/components/HeaderFactory'; +import { ControlledTableProps, SetProps } from 'dash-table/components/Table/props'; + +const handleSetFilter = (setProps: SetProps, filtering_settings: string) => setProps({ filtering_settings }); + +function filterPropsFn(propsFn: () => ControlledTableProps) { + const { + columns, + filtering, + filtering_settings, + filtering_type, + id, + row_deletable, + row_selectable, + setProps + } = propsFn(); + + const fillerColumns = + (row_deletable ? 1 : 0) + + (row_selectable ? 1 : 0); + + return { + columns: columns, + fillerColumns, + filtering: filtering, + filtering_settings: filtering_settings, + filtering_type: filtering_type, + id: id, + setFilter: handleSetFilter.bind(undefined, setProps) + }; +} + +function getter( + cellFactory: CellFactory, + filterFactory: FilterFactory, + headerFactory: HeaderFactory +): JSX.Element[][] { + const rows: JSX.Element[][] = []; + + rows.push(...headerFactory.createHeaders()); + rows.push(...filterFactory.createFilters()); + rows.push(...cellFactory.createCells()); + + return rows; +} + +export default (propsFn: () => ControlledTableProps): (() => JSX.Element[][]) => { + const cellFactory = new CellFactory(propsFn); + const filterFactory = new FilterFactory(() => filterPropsFn(propsFn)); + const headerFactory = new HeaderFactory(propsFn); + + return getter.bind(undefined, cellFactory, filterFactory, headerFactory); +}; \ No newline at end of file diff --git a/src/dash-table/handlers/cellEvents.ts b/src/dash-table/handlers/cellEvents.ts new file mode 100644 index 000000000..6b7325221 --- /dev/null +++ b/src/dash-table/handlers/cellEvents.ts @@ -0,0 +1,112 @@ +import * as R from 'ramda'; +import { SelectedCells, ICellFactoryOptions } from 'dash-table/components/Table/props'; + +function isCellSelected(selectedCells: SelectedCells, idx: number, i: number) { + return selectedCells && R.contains([idx, i], selectedCells); +} + +export const handleClick = (propsFn: () => ICellFactoryOptions, idx: number, i: number, e: any) => { + const { + editable, + is_focused, + selected_cell, + setProps + } = propsFn(); + + const selected = isCellSelected(selected_cell, idx, i); + + if (!editable) { + return; + } + if (!is_focused) { + e.preventDefault(); + } + + // don't update if already selected + if (selected) { + return; + } + + e.preventDefault(); + const cellLocation: [number, number] = [idx, i]; + const newProps: Partial = { + is_focused: false, + active_cell: cellLocation + }; + + const selectedRows = R.uniq(R.pluck(0, selected_cell)).sort((a, b) => a - b); + const selectedCols = R.uniq(R.pluck(1, selected_cell)).sort((a, b) => a - b); + const minRow = selectedRows[0]; + const minCol = selectedCols[0]; + + if (e.shiftKey) { + newProps.selected_cell = R.xprod( + R.range( + R.min(minRow, cellLocation[0]), + R.max(minRow, cellLocation[0]) + 1 + ), + R.range( + R.min(minCol, cellLocation[1]), + R.max(minCol, cellLocation[1]) + 1 + ) + ) as any; + } else { + newProps.selected_cell = [cellLocation]; + } + + setProps(newProps); +}; + +export const handleDoubleClick = (propsFn: () => ICellFactoryOptions, idx: number, i: number, e: any) => { + const { + editable, + is_focused, + setProps + } = propsFn(); + + if (!editable) { + return; + } + + const cellLocation: [number, number] = [idx, i]; + + if (!is_focused) { + e.preventDefault(); + const newProps = { + selected_cell: [cellLocation], + active_cell: cellLocation, + is_focused: true + }; + setProps(newProps); + } +}; + +export const handleChange = (propsFn: () => ICellFactoryOptions, idx: number, i: number, value: any) => { + const { + columns, + dataframe, + editable, + setProps, + viewport + } = propsFn(); + + const c = columns[i]; + const realIdx = viewport.indices[idx]; + + if (!editable) { + return; + } + + const newDataframe = R.set( + R.lensPath([realIdx, c.id]), + value, + dataframe + ); + setProps({ + dataframe: newDataframe + }); +}; + +export const handlePaste = (_propsFn: () => ICellFactoryOptions, _idx: number, _i: number, e: ClipboardEvent) => { + e.preventDefault(); +}; \ No newline at end of file diff --git a/src/dash-table/utils/TableClipboardHelper.ts b/src/dash-table/utils/TableClipboardHelper.ts index 2fe6d4d3e..ac91032b0 100644 --- a/src/dash-table/utils/TableClipboardHelper.ts +++ b/src/dash-table/utils/TableClipboardHelper.ts @@ -5,7 +5,7 @@ import Clipboard from 'core/Clipboard'; import Logger from 'core/Logger'; import { colIsEditable } from 'dash-table/components/derivedState'; -import { ActiveCell, Columns, Dataframe, SelectedCells } from 'dash-table/components/Table/props'; +import { ActiveCell, Columns, Dataframe, SelectedCells, ColumnType } from 'dash-table/components/Table/props'; export default class TableClipboardHelper { public static toClipboard(e: any, selectedCells: SelectedCells, columns: Columns, dataframe: Dataframe) { @@ -30,7 +30,7 @@ export default class TableClipboardHelper { public static fromClipboard( ev: ClipboardEvent, activeCell: ActiveCell, - virtual_dataframe_indices: number[], + derived_viewport_indices: number[], columns: Columns, dataframe: Dataframe, overflowColumns: boolean = true, @@ -43,6 +43,14 @@ export default class TableClipboardHelper { return; } + if (!overflowRows) { + Logger.debug(`Clipboard -- Sorting or filtering active, do not create new rows`); + } + + if (!overflowColumns) { + Logger.debug(`Clipboard -- Do not create new columns`); + } + const values = SheetClip.prototype.parse(text); let newDataframe = dataframe; @@ -57,17 +65,13 @@ export default class TableClipboardHelper { newColumns.push({ id: `Column ${i + 1}`, name: `Column ${i + 1}`, - type: 'numeric' + type: ColumnType.Text }); newDataframe.forEach(row => (row[`Column ${i}`] = '')); } } - if (overflowRows) { - Logger.debug(`Clipboard -- Sorting or filtering active, do not create new rows`); - } - - const realActiveRow = virtual_dataframe_indices[activeCell[0]]; + const realActiveRow = derived_viewport_indices[activeCell[0]]; if (overflowRows && values.length + realActiveRow >= dataframe.length) { const emptyRow: any = {}; columns.forEach(c => (emptyRow[c.id] = '')); @@ -83,13 +87,12 @@ export default class TableClipboardHelper { values.forEach((row: string[], i: number) => row.forEach((cell: string, j: number) => { const iOffset = activeCell[0] + i; - if (virtual_dataframe_indices.length <= activeCell[0] + i) { + if (derived_viewport_indices.length <= activeCell[0] + i) { return; } - const iRealCell = virtual_dataframe_indices[iOffset]; + const iRealCell = derived_viewport_indices[iOffset]; const jOffset = activeCell[1] + j; - // let newDataframe = dataframe; const col = newColumns[jOffset]; if (col && colIsEditable(true, col)) { newDataframe = R.set( diff --git a/src/dash-table/utils/actions.js b/src/dash-table/utils/actions.js index 6d91ce239..84657001a 100644 --- a/src/dash-table/utils/actions.js +++ b/src/dash-table/utils/actions.js @@ -1,75 +1,31 @@ import * as R from 'ramda'; +function getGroupedColumnIndices(column, columns, headerRowIndex) { + const columnIndex = columns.indexOf(column); -export function deleteRow(rowIndex, props) { - const { - active_cell, - dataframe, - end_cell, - selected_cell, - selected_rows, - start_cell - } = props; - - const newProps = { - dataframe: R.remove(rowIndex, 1, dataframe), - }; - if (R.is(Array, active_cell) && active_cell[0] === rowIndex) { - newProps.active_cell = []; - } - if (R.is(Array, end_cell) && end_cell[0] === rowIndex) { - newProps.end_cell = []; - } - if (R.is(Array, selected_cell) && selected_cell[0] === rowIndex) { - newProps.selected_cell = []; + if (!column.name || (Array.isArray(column.name) && column.name.length < headerRowIndex)) { + return { groupIndexFirst: columnIndex, groupIndexLast: columnIndex }; } - if (R.is(Array, start_cell) && start_cell[0] === rowIndex) { - newProps.start_cell = [0, 0]; - } - if (R.is(Array, selected_rows) && R.contains(rowIndex, selected_rows)) { - newProps.selected_rows = R.without([rowIndex], selected_rows); - } - return newProps; -} + let lastColumnIndex = columnIndex; -function getGroupedColumnIndices(column, headerRowIndex, props) { - // Find the set of column indices that share the same name and are adjacent - // as the given column ("group") - const {columns} = props; + for (let i = columnIndex; i < columns.length; ++i) { + const c = columns[i]; - // if the columns are merged, then deleting will delete all of the - // merged columns - let columnName; - let names; - if (R.type(headerRowIndex) !== 'Null') { - columnName = column.name[headerRowIndex]; - names = R.pluck( - headerRowIndex, - R.pluck('name', columns) - ); - } else { - columnName = column.name; - names = R.pluck('name', columns); - } - const columnIndex = R.findIndex(R.propEq('id', column.id), columns); - let groupIndexFirst = columnIndex; - let groupIndexLast = columnIndex; - while(names[groupIndexFirst - 1] === columnName) { - groupIndexFirst--; - } - - while(names[groupIndexLast + 1] === columnName) { - groupIndexLast++; + if (c.name && Array.isArray(c.name) && c.name.length > headerRowIndex && c.name[headerRowIndex] === column.name[headerRowIndex]) { + lastColumnIndex = i; + } else { + break; + } } - return {groupIndexFirst, groupIndexLast}; + return { groupIndexFirst: columnIndex, groupIndexLast: lastColumnIndex }; } -export function deleteColumn(column, headerRowIndex, props) { - const {columns, dataframe} = props; +export function deleteColumn(column, columns, headerRowIndex, props) { + const { dataframe} = props; const {groupIndexFirst, groupIndexLast} = getGroupedColumnIndices( - column, headerRowIndex, props + column, columns, headerRowIndex ); const rejectedColumnIds = R.slice( groupIndexFirst, @@ -94,10 +50,9 @@ export function deleteColumn(column, headerRowIndex, props) { } } -export function editColumnName(column, headerRowIndex, props) { - const {columns} = props; - const {groupIndexFirst, groupIndexLast} = getGroupedColumnIndices( - column, headerRowIndex, props +export function editColumnName(column, columns, headerRowIndex, props) { + const { groupIndexFirst, groupIndexLast } = getGroupedColumnIndices( + column, columns, headerRowIndex, props ); /* eslint no-alert: 0 */ const newColumnName = window.prompt('Enter a new column name'); diff --git a/src/dash-table/virtualization/AbstractStrategy.ts b/src/dash-table/virtualization/AbstractStrategy.ts deleted file mode 100644 index cb17d38c3..000000000 --- a/src/dash-table/virtualization/AbstractStrategy.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Dataframe, IVirtualizationSettings, Virtualization, Indices } from 'dash-table/components/Table/props'; - -export interface IViewport { - readonly dataframe: Dataframe; - readonly indices: Indices; - readonly settings: IVirtualizationSettings; - readonly virtualization: Virtualization; - - readonly viewportDataframe: Dataframe; - readonly viewportIndices: number[]; -} - -export interface ITarget extends IViewport { - update: (viewport: Partial) => void; -} - -export default abstract class AbstractVirtualizationStrategy -{ - protected __dataframe: Dataframe; - protected __indices: Indices; - - constructor(protected readonly target: ITarget) { - - } - - public get dataframe(): Dataframe { - return this.__dataframe; - } - - public get indices(): Indices { - return this.__indices; - } - - public refresh() { - let { dataframe = [], indices = [] } = this.target.dataframe && this.getDataframe(); - - let isEqual = - !!this.__dataframe && - dataframe.length === this.dataframe.length && - !!dataframe.every((datum, index) => datum === this.dataframe[index]); - - if (isEqual) { - return; - } - - this.__dataframe = dataframe; - this.__indices = indices; - - this.target.update({ - viewportDataframe: dataframe, - viewportIndices: indices - }); - } - - // Abstract - public abstract get offset(): number; - - public abstract loadNext(): void; - public abstract loadPrevious(): void; - - protected abstract getDataframe(): { dataframe: Dataframe, indices: number[] }; -} \ No newline at end of file diff --git a/src/dash-table/virtualization/BackEndVirtualization.ts b/src/dash-table/virtualization/BackEndVirtualization.ts deleted file mode 100644 index 7fd28d57b..000000000 --- a/src/dash-table/virtualization/BackEndVirtualization.ts +++ /dev/null @@ -1,35 +0,0 @@ -import AbstractStrategy, { ITarget } from 'dash-table/virtualization/AbstractStrategy'; - -export default class BackEndPageStrategy extends AbstractStrategy { - constructor(target: ITarget) { - super(target); - } - - protected getDataframe() { - let { dataframe, indices } = this.target; - - return { dataframe, indices }; - } - - public get offset() { - return 0; - } - - public loadNext() { - let { settings } = this.target; - - settings.current_page++; - this.target.update({ settings }); - } - - public loadPrevious() { - let { settings } = this.target; - - if (settings.current_page <= 0) { - return; - } - - settings.current_page--; - this.target.update({ settings }); - } -} \ No newline at end of file diff --git a/src/dash-table/virtualization/Factory.ts b/src/dash-table/virtualization/Factory.ts deleted file mode 100644 index c21b5c638..000000000 --- a/src/dash-table/virtualization/Factory.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ITarget } from 'dash-table/virtualization/AbstractStrategy'; - -import BackEndVirtualization from 'dash-table/virtualization/BackEndVirtualization'; -import FrontEndVirtualization from 'dash-table/virtualization/FrontEndVirtualization'; -import NoVirtualization from 'dash-table/virtualization/NoVirtualization'; - -export default class VirtualizationFactory { - public static getVirtualizer(target: ITarget) { - switch (target.virtualization) { - case false: - return new NoVirtualization(target); - case true: - case 'fe': - return new FrontEndVirtualization(target); - case 'be': - return new BackEndVirtualization(target); - default: - throw new Error(`Unknown virtualization type: '${target.virtualization}'`); - } - } -} \ No newline at end of file diff --git a/src/dash-table/virtualization/FrontEndVirtualization.ts b/src/dash-table/virtualization/FrontEndVirtualization.ts deleted file mode 100644 index 8a717da72..000000000 --- a/src/dash-table/virtualization/FrontEndVirtualization.ts +++ /dev/null @@ -1,65 +0,0 @@ -import AbstractStrategy, { ITarget } from 'dash-table/virtualization/AbstractStrategy'; - -export default class FrontEndPageStrategy extends AbstractStrategy { - private firstIndex: number; - private lastIndex: number; - - constructor(target: ITarget) { - super(target); - } - - protected getDataframe() { - let { settings, dataframe, indices } = this.target; - - let currentPage = Math.min( - settings.current_page, - Math.floor(dataframe.length / settings.page_size) - ); - - this.firstIndex = settings.page_size * currentPage; - - this.lastIndex = Math.min( - this.firstIndex + settings.displayed_pages * settings.page_size, - dataframe.length - ); - - return { - dataframe: dataframe.slice( - this.firstIndex, - this.lastIndex - ), - indices: indices.slice( - this.firstIndex, - this.lastIndex - ) - }; - } - - public get offset() { - return this.firstIndex; - } - - public loadNext() { - let { settings, dataframe } = this.target; - - let maxPageIndex = Math.floor(dataframe.length / settings.page_size); - - if (settings.current_page >= maxPageIndex) { - return; - } - - settings.current_page++; - this.target.update({ settings }); - } - - public loadPrevious() { - let { settings } = this.target; - - if (settings.current_page <= 0) { - return; - } - - settings.current_page--; - this.target.update({ settings }); - } -} \ No newline at end of file diff --git a/src/dash-table/virtualization/NoVirtualization.ts b/src/dash-table/virtualization/NoVirtualization.ts deleted file mode 100644 index 78580cdb5..000000000 --- a/src/dash-table/virtualization/NoVirtualization.ts +++ /dev/null @@ -1,29 +0,0 @@ -import * as R from 'ramda'; - -import AbstractStrategy, { ITarget } from 'dash-table/virtualization/AbstractStrategy'; - -export default class NoStrategy extends AbstractStrategy { - constructor(target: ITarget) { - super(target); - - this.refresh(); - } - - protected getDataframe() { - let { dataframe } = this.target; - - return { dataframe, indices: R.range(0, dataframe.length) }; - } - - public get offset() { - return 0; - } - - public loadNext() { - - } - - public loadPrevious() { - - } -} \ No newline at end of file diff --git a/tests/e2e/cypress/@Types/modules.d.ts b/tests/cypress/@Types/modules.d.ts similarity index 100% rename from tests/e2e/cypress/@Types/modules.d.ts rename to tests/cypress/@Types/modules.d.ts diff --git a/tests/e2e/dash/v_be_page.py b/tests/cypress/dash/v_be_page.py similarity index 74% rename from tests/e2e/dash/v_be_page.py rename to tests/cypress/dash/v_be_page.py index e6fc623e6..85cf5453a 100644 --- a/tests/e2e/dash/v_be_page.py +++ b/tests/cypress/dash/v_be_page.py @@ -17,7 +17,6 @@ url = "https://github.com/plotly/datasets/raw/master/" "26k-consumer-complaints.csv" df = pd.read_csv(url) -df = df.values app = dash.Dash() app.css.config.serve_locally = True @@ -29,8 +28,8 @@ dash_table.Table( id="table", dataframe=[], - virtualization="be", - virtualization_settings={ + pagination_mode="be", + pagination_settings={ "displayed_pages": 1, "current_page": 0, "page_size": 250, @@ -56,26 +55,39 @@ n_fixed_rows=1, row_selectable=True, row_deletable=True, - sorting=True, + sorting="be", + filtering=False, editable=True, ), ] ) -@app.callback(Output("table", "dataframe"), [Input("table", "virtualization_settings")]) -def updateDataframe(virtualization_settings): - print(virtualization_settings) +@app.callback(Output("table", "dataframe"), [ + Input("table", "pagination_settings"), + Input("table", "sorting_settings") +]) +def updateDataframe(pagination_settings, sorting_settings): + print(pagination_settings) - current_page = virtualization_settings["current_page"] - displayed_pages = virtualization_settings["displayed_pages"] - page_size = virtualization_settings["page_size"] + current_page = pagination_settings["current_page"] + displayed_pages = pagination_settings["displayed_pages"] + page_size = pagination_settings["page_size"] start_index = current_page * page_size end_index = start_index + displayed_pages * page_size print(str(start_index) + "," + str(end_index)) + print(sorting_settings) - return df[start_index:end_index] + if (sorting_settings is None or len(sorting_settings) == 0): + sorted_df = df.values + else: + sorted_df = df.sort_index( + axis=sorting_settings[0]['columnId'], + ascending=(sorting_settings[0]['direction'] == 'asc') + ).values + + return sorted_df[start_index:end_index] @app.callback( @@ -99,4 +111,4 @@ def findModifiedValue(dataframe, previous): if __name__ == "__main__": - app.run_server(port=8081, debug=False) + app.run_server(port=8081, debug=False) \ No newline at end of file diff --git a/tests/e2e/dash/v_copy_paste.py b/tests/cypress/dash/v_copy_paste.py similarity index 100% rename from tests/e2e/dash/v_copy_paste.py rename to tests/cypress/dash/v_copy_paste.py diff --git a/tests/e2e/cypress/plugins/index.js b/tests/cypress/plugins/index.js similarity index 68% rename from tests/e2e/cypress/plugins/index.js rename to tests/cypress/plugins/index.js index b582bcdfd..a4df28734 100644 --- a/tests/e2e/cypress/plugins/index.js +++ b/tests/cypress/plugins/index.js @@ -2,7 +2,7 @@ const wp = require('@cypress/webpack-preprocessor') module.exports = (on) => { const options = { - webpackOptions: require('../../../../webpack.test.config.js'), + webpackOptions: require('../../../webpack.test.config.js'), } on('file:preprocessor', wp(options)) diff --git a/tests/e2e/cypress/src/DOM.ts b/tests/cypress/src/DOM.ts similarity index 100% rename from tests/e2e/cypress/src/DOM.ts rename to tests/cypress/src/DOM.ts diff --git a/tests/e2e/cypress/src/DashTable.ts b/tests/cypress/src/DashTable.ts similarity index 70% rename from tests/e2e/cypress/src/DashTable.ts rename to tests/cypress/src/DashTable.ts index 965c46921..b903f4243 100644 --- a/tests/e2e/cypress/src/DashTable.ts +++ b/tests/cypress/src/DashTable.ts @@ -4,11 +4,11 @@ export default class DashTable { } static getDelete(row: number) { - return cy.get(`#table tbody tr td.delete-cell`).eq(row); + return cy.get(`#table tbody tr td.dash-delete-cell`).eq(row); } static getSelect(row: number) { - return cy.get(`#table tbody tr td.select-cell`).eq(row); + return cy.get(`#table tbody tr td.dash-select-cell`).eq(row); } static getSelectedCells() { diff --git a/tests/e2e/cypress/src/Key.ts b/tests/cypress/src/Key.ts similarity index 100% rename from tests/e2e/cypress/src/Key.ts rename to tests/cypress/src/Key.ts diff --git a/tests/e2e/cypress/support/commands.js b/tests/cypress/support/commands.js similarity index 100% rename from tests/e2e/cypress/support/commands.js rename to tests/cypress/support/commands.js diff --git a/tests/e2e/cypress/support/index.js b/tests/cypress/support/index.js similarity index 100% rename from tests/e2e/cypress/support/index.js rename to tests/cypress/support/index.js diff --git a/tests/e2e/cypress/integration/copy_paste_test.ts b/tests/cypress/tests/server/copy_paste_test.ts similarity index 72% rename from tests/e2e/cypress/integration/copy_paste_test.ts rename to tests/cypress/tests/server/copy_paste_test.ts index 5ecba1d1e..b06dfff3c 100644 --- a/tests/e2e/cypress/integration/copy_paste_test.ts +++ b/tests/cypress/tests/server/copy_paste_test.ts @@ -18,7 +18,7 @@ describe('copy paste', () => { DashTable.getCell(0, 0).click(); for (let row = 0; row <= 2; ++row) { - DashTable.getCell(row + 3, 0).within(() => cy.get('.cell-value').should('have.html', `${row}`)); + DashTable.getCell(row + 3, 0).within(() => cy.get('.dash-cell-value').should('have.html', `${row}`)); } }); @@ -31,8 +31,8 @@ describe('copy paste', () => { DOM.focused.type(`${Key.Meta}v`); DashTable.getCell(0, 0).click(); - DashTable.getCell(1, 0).within(() => cy.get('.cell-value').should('have.html', '9')); - DashTable.getCell(2, 0).within(() => cy.get('.cell-value').should('have.html', '10')); + DashTable.getCell(1, 0).within(() => cy.get('.dash-cell-value').should('have.html', '9')); + DashTable.getCell(2, 0).within(() => cy.get('.dash-cell-value').should('have.html', '10')); }); @@ -50,8 +50,8 @@ describe('copy paste', () => { for (let column = 1; column <= 2; ++column) { let initialValue: string; - DashTable.getCell(row, column).within(() => cy.get('.cell-value').then($cells => initialValue = $cells[0].innerHTML)); - DashTable.getCell(row + 3, column).within(() => cy.get('.cell-value').should('have.html', initialValue)); + DashTable.getCell(row, column).within(() => cy.get('.dash-cell-value').then($cells => initialValue = $cells[0].innerHTML)); + DashTable.getCell(row + 3, column).within(() => cy.get('.dash-cell-value').should('have.html', initialValue)); } } }); @@ -65,10 +65,10 @@ describe('copy paste', () => { DashTable .getCell(0, 0) - .within(() => cy.get('.cell-value').should('have.html', '10')) + .within(() => cy.get('.dash-cell-value').should('have.html', '10')) .then(() => { DashTable.getCell(0, 1) - .within(() => cy.get('.cell-value').should('have.html', 'MODIFIED')); + .within(() => cy.get('.dash-cell-value').should('have.html', 'MODIFIED')); }); }); @@ -81,10 +81,10 @@ describe('copy paste', () => { DashTable .getCell(1, 1) - .within(() => cy.get('.cell-value').should('have.html', 'MODIFIED')); + .within(() => cy.get('.dash-cell-value').should('have.html', 'MODIFIED')); DashTable .getCell(1, 0) - .within(() => cy.get('.cell-value').should('have.value', '0')); + .within(() => cy.get('.dash-cell-value').should('have.value', '0')); DashTable.getCell(1, 1).click(); DOM.focused.type(`${Key.Meta}c`); @@ -94,14 +94,14 @@ describe('copy paste', () => { DashTable .getCell(2, 1) - .within(() => cy.get('.cell-value').should('have.value', 'MODIFIED')); + .within(() => cy.get('.dash-cell-value').should('have.value', 'MODIFIED')); }); it('BE rountrip with sorted, unfiltered data', () => { - cy.get('tr th.column-0 .sort').click(); + cy.get('tr th.column-0 .sort').last().click(); DashTable.getCell(0, 0).click(); - DashTable.getCell(0, 0).within(() => cy.get('.cell-value').should('have.value', '249')); + DashTable.getCell(0, 0).within(() => cy.get('.dash-cell-value').should('have.value', '249')); DOM.focused.type(`${Key.Meta}c`); @@ -110,10 +110,10 @@ describe('copy paste', () => { DashTable .getCell(1, 1) - .within(() => cy.get('.cell-value').should('have.html', 'MODIFIED')); + .within(() => cy.get('.dash-cell-value').should('have.html', 'MODIFIED')); DashTable .getCell(1, 0) - .within(() => cy.get('.cell-value').should('have.value', '249')); + .within(() => cy.get('.dash-cell-value').should('have.value', '249')); DashTable.getCell(1, 1).click(); DOM.focused.type(`${Key.Meta}c`); @@ -123,7 +123,7 @@ describe('copy paste', () => { DashTable .getCell(2, 1) - .within(() => cy.get('.cell-value').should('have.value', 'MODIFIED')); + .within(() => cy.get('.dash-cell-value').should('have.value', 'MODIFIED')); }); }); }); diff --git a/tests/e2e/cypress/integration/dash_test.ts b/tests/cypress/tests/server/dash_test.ts similarity index 75% rename from tests/e2e/cypress/integration/dash_test.ts rename to tests/cypress/tests/server/dash_test.ts index 13046df13..d9282c68b 100644 --- a/tests/e2e/cypress/integration/dash_test.ts +++ b/tests/cypress/tests/server/dash_test.ts @@ -8,16 +8,16 @@ describe('dash basic', () => { }); it('can get cell', () => { - DashTable.getCell(0, 2).click(); - DashTable.getCell(0, 2).within(() => cy.get('input').should('have.value', '0')); + DashTable.getCell(0, 0).click(); + DashTable.getCell(0, 0).within(() => cy.get('input').should('have.value', '0')); cy.get('button.next-page').click(); - DashTable.getCell(0, 2).within(() => cy.get('input').should('have.value', '250')); + DashTable.getCell(0, 0).within(() => cy.get('input').should('have.value', '250')); }); it('cell click selects all text', () => { - DashTable.getCell(0, 3).click(); - DashTable.getCell(0, 3).within(() => + DashTable.getCell(0, 1).click(); + DashTable.getCell(0, 1).within(() => cy.get('input').then($inputs => { const $input = $inputs[0]; @@ -29,7 +29,7 @@ describe('dash basic', () => { // https://github.com/plotly/dash-table/issues/50 it('can edit last and update dataframe on "enter"', () => { - DashTable.getCell(249, 2).click(); + DashTable.getCell(249, 0).click(); DOM.focused.then($input => { const initialValue = $input.val(); @@ -42,8 +42,8 @@ describe('dash basic', () => { }); // https://github.com/plotly/dash-table/issues/107 - it.only('can edit last and update dataframe on "tab"', () => { - DashTable.getCell(249, 2).click(); + it('can edit last and update dataframe on "tab"', () => { + DashTable.getCell(249, 0).click(); DOM.focused.then($input => { const initialValue = $input.val(); @@ -58,12 +58,12 @@ describe('dash basic', () => { }); it('can edit last and update dataframe when clicking outside of cell', () => { - DashTable.getCell(249, 2).click(); + DashTable.getCell(249, 0).click(); DOM.focused.then($input => { const initialValue = $input.val(); DOM.focused.type(`abc`); - DashTable.getCell(248, 2).click(); + DashTable.getCell(248, 0).click(); cy.get('#container').should($container => { expect($container.first()[0].innerText).to.equal(`[249][0] = ${initialValue} -> abc`); @@ -72,7 +72,7 @@ describe('dash basic', () => { }); it('can get cell with double click', () => { - DashTable.getCell(3, 3).within(() => cy.get('div').dblclick()); - DashTable.getCell(3, 3).should('have.class', 'focused'); + DashTable.getCell(3, 1).within(() => cy.get('div').dblclick()); + DashTable.getCell(3, 1).should('have.class', 'focused'); }); }); \ No newline at end of file diff --git a/tests/e2e/cypress/integration/delete_cells_test.ts b/tests/cypress/tests/server/delete_cells_test.ts similarity index 74% rename from tests/e2e/cypress/integration/delete_cells_test.ts rename to tests/cypress/tests/server/delete_cells_test.ts index 20399fa2e..1e680288e 100644 --- a/tests/e2e/cypress/integration/delete_cells_test.ts +++ b/tests/cypress/tests/server/delete_cells_test.ts @@ -10,9 +10,9 @@ describe('delete cells', () => { describe('unsorted dataframe', () => { it('can delete single cell', () => { DashTable.getCell(0, 1).click(); - DashTable.getCell(0, 1).within(() => cy.get('.cell-value').should('not.have.value', '')); + DashTable.getCell(0, 1).within(() => cy.get('.dash-cell-value').should('not.have.value', '')); DOM.focused.type(`${Key.Backspace}${Key.ArrowDown}`); - DashTable.getCell(0, 1).within(() => cy.get('.cell-value').should('have.html', '')); + DashTable.getCell(0, 1).within(() => cy.get('.dash-cell-value').should('have.html', '')); }); it('can delete multiple cells', () => { @@ -23,7 +23,7 @@ describe('delete cells', () => { for (let row = 0; row <= 1; ++row) { for (let column = 1; column <= 2; ++column) { - DashTable.getCell(row, column).within(() => cy.get('.cell-value').should('have.html', '')); + DashTable.getCell(row, column).within(() => cy.get('.dash-cell-value').should('have.html', '')); } } }); @@ -31,14 +31,14 @@ describe('delete cells', () => { describe('sorted dataframe', () => { beforeEach(() => { - cy.get('tr th.column-0 .sort').click(); + cy.get('tr th.column-0 .sort').last().click(); }); it('can delete single cell', () => { DashTable.getCell(0, 1).click(); - DashTable.getCell(0, 1).within(() => cy.get('.cell-value').should('not.have.value', '')); + DashTable.getCell(0, 1).within(() => cy.get('.dash-cell-value').should('not.have.value', '')); DOM.focused.type(`${Key.Backspace}${Key.ArrowDown}`); - DashTable.getCell(0, 1).within(() => cy.get('.cell-value').should('have.html', '')); + DashTable.getCell(0, 1).within(() => cy.get('.dash-cell-value').should('have.html', '')); }); it('can delete multiple cells', () => { @@ -49,7 +49,7 @@ describe('delete cells', () => { for (let row = 0; row <= 1; ++row) { for (let column = 1; column <= 2; ++column) { - DashTable.getCell(row, column).within(() => cy.get('.cell-value').should('have.html', '')); + DashTable.getCell(row, column).within(() => cy.get('.dash-cell-value').should('have.html', '')); } } }); diff --git a/tests/cypress/tests/server/delete_row_test.ts b/tests/cypress/tests/server/delete_row_test.ts new file mode 100644 index 000000000..d29af34bf --- /dev/null +++ b/tests/cypress/tests/server/delete_row_test.ts @@ -0,0 +1,18 @@ +import DashTable from 'cypress/DashTable'; + +describe('delete', () => { + beforeEach(() => cy.visit('http://localhost:8081')); + + it('can delete row', () => { + DashTable.getCell(0, 0).within(() => cy.get('.dash-cell-value').should('have.html', '0')); + DashTable.getDelete(0).click(); + DashTable.getCell(0, 0).within(() => cy.get('.dash-cell-value').should('have.html', '1')); + }); + + it('can delete row when sorted', () => { + cy.get('tr th.column-0 .sort').last().click({ force: true }); + DashTable.getCell(0, 0).within(() => cy.get('.dash-cell-value').should('have.html', '28155')); + DashTable.getDelete(0).click(); + DashTable.getCell(0, 0).within(() => cy.get('.dash-cell-value').should('have.html', '28154')); + }); +}); \ No newline at end of file diff --git a/tests/cypress/tests/server/select_row_test.ts b/tests/cypress/tests/server/select_row_test.ts new file mode 100644 index 000000000..ce960a22d --- /dev/null +++ b/tests/cypress/tests/server/select_row_test.ts @@ -0,0 +1,25 @@ +import DashTable from 'cypress/DashTable'; + +describe('select row', () => { + describe('be pagination & sort', () => { + beforeEach(() => cy.visit('http://localhost:8081')); + + it('can select row', () => { + DashTable.getSelect(0).within(() => cy.get('input').click()); + DashTable.getSelect(0).within(() => cy.get('input').should('be.checked')); + }); + + it('can select row when sorted', () => { + cy.get('tr th.column-0 .sort').last().click({ force: true }); + DashTable.getSelect(0).within(() => cy.get('input').click()); + DashTable.getSelect(0).within(() => cy.get('input').should('be.checked')); + }); + + it('select, sort, new row is not selected', () => { + DashTable.getSelect(0).within(() => cy.get('input').click()); + DashTable.getSelect(0).within(() => cy.get('input').should('be.checked')); + cy.get('tr th.column-0 .sort').last().click({ force: true }); + DashTable.getSelect(0).within(() => cy.get('input').should('not.be.checked')); + }); + }); +}); \ No newline at end of file diff --git a/tests/cypress/tests/standalone/delete_row_test.ts b/tests/cypress/tests/standalone/delete_row_test.ts new file mode 100644 index 000000000..c586f0286 --- /dev/null +++ b/tests/cypress/tests/standalone/delete_row_test.ts @@ -0,0 +1,18 @@ +import DashTable from 'cypress/DashTable'; + +describe('delete', () => { + beforeEach(() => cy.visit('http://localhost:8080')); + + it('can delete row', () => { + DashTable.getCell(0, 0).within(() => cy.get('.dash-cell-value').should('have.html', '1')); + DashTable.getDelete(0).click(); + DashTable.getCell(0, 0).within(() => cy.get('.dash-cell-value').should('have.html', '2')); + }); + + it('can delete row when sorted', () => { + cy.get('tr th.column-0 .sort').last().click({ force: true }); + DashTable.getCell(0, 0).within(() => cy.get('.dash-cell-value').should('have.html', '4999')); + DashTable.getDelete(0).click(); + DashTable.getCell(0, 0).within(() => cy.get('.dash-cell-value').should('have.html', '4998')); + }); +}); \ No newline at end of file diff --git a/tests/cypress/tests/standalone/edit_cell_test.ts b/tests/cypress/tests/standalone/edit_cell_test.ts new file mode 100644 index 000000000..02e8437f1 --- /dev/null +++ b/tests/cypress/tests/standalone/edit_cell_test.ts @@ -0,0 +1,102 @@ +import DashTable from 'cypress/DashTable'; +import DOM from 'cypress/DOM'; +import Key from 'cypress/Key'; + +describe('edit cell', () => { + beforeEach(() => { + cy.visit('http://localhost:8080'); + }); + + it('can delete dropdown', () => { + DashTable.getCell(0, 6).trigger('mouseover'); + DashTable.getCell(0, 6).within(() => cy.get('.Select-clear').click()); + DashTable.getCell(0, 6).within(() => cy.get('.Select-placeholder').should('exist')); + }); + + it('can delete dropdown and set value', () => { + DashTable.getCell(0, 6).trigger('mouseover'); + DashTable.getCell(0, 6).within(() => cy.get('.Select-clear').click()); + DashTable.getCell(0, 6).within(() => cy.get('.Select-placeholder').should('exist')); + + DashTable.getCell(0, 6).within(() => cy.get('.Select-arrow').click()).then(() => { + DashTable.getCell(0, 6).within(() => { + cy.get('.Select-option').then($options => { + const target = $options[0]; + if (target) { + cy.wrap(target).click({ force: true }); + } + }); + }); + }); + + DashTable.getCell(0, 6).within(() => cy.get('.Select-placeholder').should('not.exist')); + }); + + it('can edit dropdown', () => { + let initialValue: string; + let expectedValue: string; + + DashTable.getCell(0, 6).within(() => { + cy.get('.Select-value-label').then($valueLabel => { + initialValue = $valueLabel[0].innerHTML; + cy.log('initial value', initialValue); + }); + }); + + DashTable.getCell(0, 6).within(() => cy.get('.Select-arrow').click()); + + DashTable.getCell(0, 6).within(() => { + cy.get('.Select-option').then($options => { + const target = Array.from($options).find($option => $option.innerHTML !== initialValue); + if (target) { + cy.wrap(target).click({ force: true }); + + expectedValue = target.innerHTML; + cy.log('expected value', expectedValue); + } + }); + }); + + DashTable.getCell(0, 6).within(() => { + cy.get('.Select-value-label').should('have.html', expectedValue); + }); + }); + + it('can edit on 2nd page', () => { + DashTable.getCell(0, 0).click(); + DashTable.getCell(0, 0).within(() => cy.get('input').should('have.value', '1')); + cy.get('button.next-page').click(); + DashTable.getCell(0, 0).within(() => cy.get('input').should('have.value', '251')); + + DOM.focused.type(`abc${Key.Enter}`); + DashTable.getCell(0, 0).click(); + DashTable.getCell(0, 0).within(() => cy.get('input').should('have.value', 'abc')); + }); + + it('can delete then edit on 2nd page', () => { + DashTable.getCell(0, 0).click(); + DashTable.getCell(0, 0).within(() => cy.get('input').should('have.value', '1')); + cy.get('button.next-page').click(); + DashTable.getCell(0, 0).within(() => cy.get('input').should('have.value', '251')); + DashTable.getDelete(0).click(); + DashTable.getCell(0, 0).within(() => cy.get('input').should('have.value', '252')); + + DOM.focused.type(`abc${Key.Enter}`); + DashTable.getCell(0, 0).click(); + DashTable.getCell(0, 0).within(() => cy.get('input').should('have.value', 'abc')); + }); + + // https://github.com/plotly/dash-table/issues/50 + it('can edit on "enter"', () => { + DashTable.getCell(0, 1).click(); + DOM.focused.type(`abc${Key.Enter}`); + DashTable.getCell(0, 1).within(() => cy.get('.dash-cell-value').should('have.html', `abc`)); + }); + + it('can edit when clicking outside of cell', () => { + DashTable.getCell(0, 1).click(); + DOM.focused.type(`abc`); + DashTable.getCell(0, 0).click(); + DashTable.getCell(0, 1).within(() => cy.get('.dash-cell-value').should('have.html', `abc`)); + }); +}); \ No newline at end of file diff --git a/tests/e2e/cypress/integration/navigation_test.ts b/tests/cypress/tests/standalone/navigation_test.ts similarity index 53% rename from tests/e2e/cypress/integration/navigation_test.ts rename to tests/cypress/tests/standalone/navigation_test.ts index 9944c11a2..65598cfae 100644 --- a/tests/e2e/cypress/integration/navigation_test.ts +++ b/tests/cypress/tests/standalone/navigation_test.ts @@ -8,10 +8,10 @@ describe('navigate', () => { }); it('does not change column width', () => { - DashTable.getCell(3, 3).then(startCell => { + DashTable.getCell(3, 1).then(startCell => { const startWidth = startCell.outerWidth(); - DashTable.getCell(3, 3).then(endCell => { + DashTable.getCell(3, 1).then(endCell => { const endWidth = endCell.outerWidth(); expect(endWidth).to.equal(startWidth); @@ -21,121 +21,121 @@ describe('navigate', () => { describe('with keyboard', () => { beforeEach(() => { - DashTable.getCell(3, 3).click(); + DashTable.getCell(3, 1).click(); }); describe('from a focused cell input', () => { beforeEach(() => { DOM.focused.type(Key.Enter); - DashTable.getCell(3, 3).within(() => cy.get('.cell-value').should('have.class', 'focused')); + DashTable.getCell(3, 1).within(() => cy.get('.dash-cell-value').should('have.class', 'focused')); }); it('does not focus on next cell input on "enter"', () => { DOM.focused.type(Key.Enter); - DashTable.getCell(3, 3).within(() => cy.get('.cell-value').should('not.have.class', 'focused')); + DashTable.getCell(3, 1).within(() => cy.get('.dash-cell-value').should('not.have.class', 'focused')); - DashTable.getCell(4, 3).should('have.class', 'focused'); - DashTable.getCell(4, 3).within(() => cy.get('.cell-value').should('not.have.class', 'focused')); + DashTable.getCell(4, 1).should('have.class', 'focused'); + DashTable.getCell(4, 1).within(() => cy.get('.dash-cell-value').should('not.have.class', 'focused')); }); it('does not focus on next cell input on "tab"', () => { cy.tab(); - DashTable.getCell(3, 3).should('not.have.class', 'focused'); + DashTable.getCell(3, 1).should('not.have.class', 'focused'); - DashTable.getCell(3, 4).should('have.class', 'focused'); - DashTable.getCell(3, 4).within(() => cy.get('.cell-value').should('not.have.class', 'focused')); + DashTable.getCell(3, 2).should('have.class', 'focused'); + DashTable.getCell(3, 2).within(() => cy.get('.dash-cell-value').should('not.have.class', 'focused')); }); }); describe('into a dropdown cell', () => { beforeEach(() => { - DashTable.getCell(3, 7).click(); + DashTable.getCell(3, 5).click(); }); it('can move', () => { DOM.focused.type(Key.ArrowRight); - DashTable.getCell(3, 8).should('have.class', 'focused'); - DashTable.getCell(3, 8).get('.Select').should('exist'); + DashTable.getCell(3, 6).should('have.class', 'focused'); + DashTable.getCell(3, 6).get('.Select').should('exist'); DOM.focused.type(Key.ArrowLeft, { force: true }); - DashTable.getCell(3, 8).should('not.have.class', 'focused'); - DashTable.getCell(3, 7).should('have.class', 'focused'); + DashTable.getCell(3, 6).should('not.have.class', 'focused'); + DashTable.getCell(3, 5).should('have.class', 'focused'); }); }); it('can navigate 9-10 selected cells', () => { - DashTable.getCell(9, 3).click(); + DashTable.getCell(9, 1).click(); DOM.focused.type(Key.Shift, { release: false }); - DashTable.getCell(10, 3).click(); + DashTable.getCell(10, 1).click(); DOM.focused.type(Key.Shift, { release: false }); - DashTable.getCell(10, 4).click(); + DashTable.getCell(10, 2).click(); for (let row = 9; row <= 10; ++row) { - for (let column = 3; column <= 4; ++column) { + for (let column = 1; column <= 2; ++column) { DashTable.getCell(row, column).should('have.class', 'cell--selected'); } } - DashTable.getCell(10, 4).should('have.class', 'cell--selected'); + DashTable.getCell(10, 2).should('have.class', 'cell--selected'); DOM.focused.type(`${Key.Enter}${Key.Enter}`); - DashTable.getCell(9, 3).should('have.class', 'cell--selected'); + DashTable.getCell(9, 1).should('have.class', 'cell--selected'); DOM.focused.type(`${Key.Enter}${Key.Enter}`); - DashTable.getCell(9, 4).should('have.class', 'cell--selected'); + DashTable.getCell(9, 2).should('have.class', 'cell--selected'); DOM.focused.type(`${Key.Enter}${Key.Enter}`); - DashTable.getCell(10, 3).should('have.class', 'cell--selected'); + DashTable.getCell(10, 1).should('have.class', 'cell--selected'); DOM.focused.type(`${Key.Enter}${Key.Enter}`); - DashTable.getCell(10, 4).should('have.class', 'cell--selected'); + DashTable.getCell(10, 2).should('have.class', 'cell--selected'); }); // Issue: https://github.com/plotly/dash-table/issues/49 it('can move after ctrl+c', () => { DOM.focused.type(`${Key.Meta}c`); DOM.focused.type(Key.ArrowDown); - DashTable.getCell(4, 3).should('have.class', 'focused'); - DashTable.getCell(3, 3).should('not.have.class', 'focused'); + DashTable.getCell(4, 1).should('have.class', 'focused'); + DashTable.getCell(3, 1).should('not.have.class', 'focused'); }); it('can move down', () => { DOM.focused.type(Key.ArrowDown); - DashTable.getCell(4, 3).should('have.class', 'focused'); - DashTable.getCell(3, 3).should('not.have.class', 'focused'); + DashTable.getCell(4, 1).should('have.class', 'focused'); + DashTable.getCell(3, 1).should('not.have.class', 'focused'); }); it('can move left', () => { DOM.focused.type(Key.ArrowLeft); - DashTable.getCell(3, 2).should('have.class', 'focused'); - DashTable.getCell(3, 3).should('not.have.class', 'focused'); + DashTable.getCell(3, 0).should('have.class', 'focused'); + DashTable.getCell(3, 1).should('not.have.class', 'focused'); }); it('can moved right', () => { DOM.focused.type(Key.ArrowRight); - DashTable.getCell(3, 4).should('have.class', 'focused'); - DashTable.getCell(3, 3).should('not.have.class', 'focused'); + DashTable.getCell(3, 2).should('have.class', 'focused'); + DashTable.getCell(3, 1).should('not.have.class', 'focused'); }); it('can move up', () => { DOM.focused.type(Key.ArrowUp); - DashTable.getCell(2, 3).should('have.class', 'focused'); - DashTable.getCell(3, 3).should('not.have.class', 'focused'); + DashTable.getCell(2, 1).should('have.class', 'focused'); + DashTable.getCell(3, 1).should('not.have.class', 'focused'); }); }); describe('with mouse', () => { beforeEach(() => { - DashTable.getCell(3, 3).click(); + DashTable.getCell(3, 1).click(); }); it('can select self', () => { DOM.focused.click(); - DashTable.getCell(3, 3).should('have.class', 'focused'); + DashTable.getCell(3, 1).should('have.class', 'focused'); }); it('can select other', () => { - DashTable.getCell(4, 4).click(); - DashTable.getCell(4, 4).should('have.class', 'focused'); - DashTable.getCell(3, 3).should('not.have.class', 'focused'); + DashTable.getCell(4, 2).click(); + DashTable.getCell(4, 2).should('have.class', 'focused'); + DashTable.getCell(3, 1).should('not.have.class', 'focused'); }); }); }); diff --git a/tests/cypress/tests/standalone/select_row_test.ts b/tests/cypress/tests/standalone/select_row_test.ts new file mode 100644 index 000000000..37539d891 --- /dev/null +++ b/tests/cypress/tests/standalone/select_row_test.ts @@ -0,0 +1,25 @@ +import DashTable from 'cypress/DashTable'; + +describe('select row', () => { + describe('fe pagination & sort', () => { + beforeEach(() => cy.visit('http://localhost:8080')); + + it('can select row', () => { + DashTable.getSelect(0).within(() => cy.get('input').click()); + DashTable.getSelect(0).within(() => cy.get('input').should('be.checked')); + }); + + it('can select row when sorted', () => { + cy.get('tr th.column-0 .sort').last().click({ force: true }); + DashTable.getSelect(0).within(() => cy.get('input').click()); + DashTable.getSelect(0).within(() => cy.get('input').should('be.checked')); + }); + + it('select, sort, new row is not selected', () => { + DashTable.getSelect(0).within(() => cy.get('input').click()); + DashTable.getSelect(0).within(() => cy.get('input').should('be.checked')); + cy.get('tr th.column-0 .sort').last().click({ force: true }); + DashTable.getSelect(0).within(() => cy.get('input').should('not.be.checked')); + }); + }); +}); \ No newline at end of file diff --git a/tests/e2e/cypress/integration/selection_test.ts b/tests/cypress/tests/standalone/selection_test.ts similarity index 67% rename from tests/e2e/cypress/integration/selection_test.ts rename to tests/cypress/tests/standalone/selection_test.ts index 94e04ae4a..18349dfe8 100644 --- a/tests/e2e/cypress/integration/selection_test.ts +++ b/tests/cypress/tests/standalone/selection_test.ts @@ -9,87 +9,87 @@ describe('select', () => { describe('with keyboard', () => { beforeEach(() => { - DashTable.getCell(3, 3).click(); + DashTable.getCell(3, 1).click(); }); it('can select down', () => { DOM.focused.type(`${Key.Shift}${Key.ArrowDown}`); DashTable.getSelectedCells().should('have.length', 2); - DashTable.getCell(3, 3).should('have.class', 'cell--selected'); - DashTable.getCell(4, 3).should('have.class', 'cell--selected'); + DashTable.getCell(3, 1).should('have.class', 'cell--selected'); + DashTable.getCell(4, 1).should('have.class', 'cell--selected'); }); it('can select left', () => { DOM.focused.type(`${Key.Shift}${Key.ArrowLeft}`); DashTable.getSelectedCells().should('have.length', 2); - DashTable.getCell(3, 3).should('have.class', 'cell--selected'); - DashTable.getCell(3, 2).should('have.class', 'cell--selected'); + DashTable.getCell(3, 1).should('have.class', 'cell--selected'); + DashTable.getCell(3, 0).should('have.class', 'cell--selected'); }); it('can select right', () => { DOM.focused.type(`${Key.Shift}${Key.ArrowRight}`); DashTable.getSelectedCells().should('have.length', 2); - DashTable.getCell(3, 3).should('have.class', 'cell--selected'); - DashTable.getCell(3, 4).should('have.class', 'cell--selected'); + DashTable.getCell(3, 1).should('have.class', 'cell--selected'); + DashTable.getCell(3, 2).should('have.class', 'cell--selected'); }); it('can select up', () => { DOM.focused.type(`${Key.Shift}${Key.ArrowUp}`); DashTable.getSelectedCells().should('have.length', 2); - DashTable.getCell(3, 3).should('have.class', 'cell--selected'); - DashTable.getCell(2, 3).should('have.class', 'cell--selected'); + DashTable.getCell(3, 1).should('have.class', 'cell--selected'); + DashTable.getCell(2, 1).should('have.class', 'cell--selected'); }); it('can select down twice', () => { DOM.focused.type(`${Key.Shift}${Key.ArrowDown}`); DOM.focused.type(`${Key.Shift}${Key.ArrowDown}`); DashTable.getSelectedCells().should('have.length', 3); - DashTable.getCell(3, 3).should('have.class', 'cell--selected'); - DashTable.getCell(4, 3).should('have.class', 'cell--selected'); - DashTable.getCell(5, 3).should('have.class', 'cell--selected'); + DashTable.getCell(3, 1).should('have.class', 'cell--selected'); + DashTable.getCell(4, 1).should('have.class', 'cell--selected'); + DashTable.getCell(5, 1).should('have.class', 'cell--selected'); }); it('can select down then up', () => { DOM.focused.type(`${Key.Shift}${Key.ArrowDown}`); DOM.focused.type(`${Key.Shift}${Key.ArrowUp}`); DashTable.getSelectedCells().should('have.length', 1); - DashTable.getCell(3, 3).should('have.class', 'cell--selected'); + DashTable.getCell(3, 1).should('have.class', 'cell--selected'); }); it('can select down then right', () => { DOM.focused.type(`${Key.Shift}${Key.ArrowDown}`); DOM.focused.type(`${Key.Shift}${Key.ArrowRight}`); DashTable.getSelectedCells().should('have.length', 4); - DashTable.getCell(3, 3).should('have.class', 'cell--selected'); - DashTable.getCell(4, 3).should('have.class', 'cell--selected'); - DashTable.getCell(3, 4).should('have.class', 'cell--selected'); - DashTable.getCell(4, 4).should('have.class', 'cell--selected'); + DashTable.getCell(3, 1).should('have.class', 'cell--selected'); + DashTable.getCell(4, 1).should('have.class', 'cell--selected'); + DashTable.getCell(3, 2).should('have.class', 'cell--selected'); + DashTable.getCell(4, 2).should('have.class', 'cell--selected'); }); }); describe('with mouse', () => { it('can select (5, 5)', () => { - DashTable.getCell(3, 3).click(); + DashTable.getCell(3, 1).click(); DOM.focused.type(Key.Shift, { release: false }); - DashTable.getCell(5, 5).click(); + DashTable.getCell(5, 3).click(); DashTable.getSelectedCells().should('have.length', 9); for (let row = 3; row <= 5; ++row) { - for (let column = 3; column <= 5; ++column) { + for (let column = 1; column <= 3; ++column) { DashTable.getCell(row, column).should('have.class', 'cell--selected'); } } }); it('can select 9-10 correctly', () => { - DashTable.getCell(9, 3).click(); + DashTable.getCell(9, 1).click(); DOM.focused.type(Key.Shift, { release: false }); - DashTable.getCell(10, 3).click(); + DashTable.getCell(10, 1).click(); DOM.focused.type(Key.Shift, { release: false }); - DashTable.getCell(10, 4).click(); + DashTable.getCell(10, 2).click(); for (let row = 9; row <= 10; ++row) { - for (let column = 3; column <= 4; ++column) { + for (let column = 1; column <= 2; ++column) { DashTable.getCell(row, column).should('have.class', 'cell--selected'); } } diff --git a/tests/cypress/tests/standalone/sorting_test.ts b/tests/cypress/tests/standalone/sorting_test.ts new file mode 100644 index 000000000..3f254c65c --- /dev/null +++ b/tests/cypress/tests/standalone/sorting_test.ts @@ -0,0 +1,19 @@ +import DashTable from 'cypress/DashTable'; + +describe('sort', () => { + beforeEach(() => { + cy.visit('http://localhost:8080'); + }); + + it('can sort', () => { + DashTable.getCell(0, 6).within(() => cy.get('.Select-value-label').should('have.html', 'Wet')); + DashTable.getCell(1, 6).within(() => cy.get('.Select-value-label').should('have.html', 'Snowy')); + DashTable.getCell(2, 6).within(() => cy.get('.Select-value-label').should('have.html', 'Tropical Beaches')); + DashTable.getCell(3, 6).within(() => cy.get('.Select-value-label').should('have.html', 'Humid')); + cy.get('tr th.column-6 .sort').last().click(); + DashTable.getCell(0, 6).within(() => cy.get('.Select-value-label').should('have.html', 'Wet')); + DashTable.getCell(1, 6).within(() => cy.get('.Select-value-label').should('have.html', 'Wet')); + DashTable.getCell(2, 6).within(() => cy.get('.Select-value-label').should('have.html', 'Wet')); + DashTable.getCell(3, 6).within(() => cy.get('.Select-value-label').should('have.html', 'Wet')); + }); +}); diff --git a/tests/cypress/tests/unit/derivedViewport_test.ts b/tests/cypress/tests/unit/derivedViewport_test.ts new file mode 100644 index 000000000..26e941257 --- /dev/null +++ b/tests/cypress/tests/unit/derivedViewport_test.ts @@ -0,0 +1,71 @@ +import * as R from 'ramda'; + +import derivedViewportDataframe from 'dash-table/derived/dataframe/viewport'; + +describe('derived viewport', () => { + const viewportDataframe = derivedViewportDataframe(); + + describe('virtual dataframe <= page size', () => { + describe('with no pagination', () => { + it('returns entire dataframe', () => { + const result = viewportDataframe( + false, + { displayed_pages: 1, current_page: 0, page_size: 250 }, + R.map(() => { }, R.range(0, 5)), + R.range(0, 5) + ); + + expect(result.dataframe.length).to.equal(5); + expect(result.indices.length).to.equal(5); + }); + }); + + describe('with fe pagination', () => { + it('returns entire dataframe', () => { + const result = viewportDataframe( + 'fe', + { displayed_pages: 1, current_page: 0, page_size: 250 }, + R.map(() => { }, R.range(0, 5)), + R.range(0, 5) + ); + + expect(result.dataframe.length).to.equal(5); + expect(result.indices.length).to.equal(5); + }); + }); + + describe('with be pagination', () => { + it('returns entire dataframe', () => { + const result = viewportDataframe( + 'be', + { displayed_pages: 1, current_page: 0, page_size: 250 }, + R.map(() => { }, R.range(0, 5)), + R.range(0, 5) + ); + + expect(result.dataframe.length).to.equal(5); + expect(result.indices.length).to.equal(5); + }); + }); + }); + + describe('virtual dataframe > page size', () => { + describe('with fe pagination', () => { + it('returns slice of dataframe', () => { + const result = viewportDataframe( + 'fe', + { displayed_pages: 1, current_page: 0, page_size: 250 }, + R.map(idx => ({ idx }), R.range(0, 500)), + R.range(0, 500) + ); + + expect(result.dataframe.length).to.equal(250); + expect(result.indices.length).to.equal(250); + expect(result.dataframe[0].idx).to.equal(0); + expect(result.dataframe[249].idx).to.equal(249); + expect(result.indices[0]).to.equal(0); + expect(result.indices[249]).to.equal(249); + }); + }); + }); +}); \ No newline at end of file diff --git a/tests/e2e/cypress/integration/unit/sorting_test.ts b/tests/cypress/tests/unit/sorting_test.ts similarity index 100% rename from tests/e2e/cypress/integration/unit/sorting_test.ts rename to tests/cypress/tests/unit/sorting_test.ts diff --git a/tests/e2e/cypress/integration/unit/syntactic_tree_test.ts b/tests/cypress/tests/unit/syntactic_tree_test.ts similarity index 100% rename from tests/e2e/cypress/integration/unit/syntactic_tree_test.ts rename to tests/cypress/tests/unit/syntactic_tree_test.ts diff --git a/tests/e2e/cypress/tsconfig.json b/tests/cypress/tsconfig.json similarity index 86% rename from tests/e2e/cypress/tsconfig.json rename to tests/cypress/tsconfig.json index c9c03265f..af6c03762 100644 --- a/tests/e2e/cypress/tsconfig.json +++ b/tests/cypress/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "allowJs": true, "allowSyntheticDefaultImports": true, - "baseUrl": "./..", + "baseUrl": ".", "emitDecoratorMetadata": false, "experimentalDecorators": true, "lib": ["esnext", "dom"], @@ -12,7 +12,7 @@ "noUnusedLocals": true, "noUnusedParameters": true, "paths": { - "cypress/*": ["cypress/src/*"], + "cypress/*": ["./src/*"], "core/*": ["./../../src/core/*"], "dash-table/*": ["./../../src/dash-table/*"] @@ -21,7 +21,7 @@ "strict": true, "strictPropertyInitialization": false, "target": "esnext", - "traceResolution": true, + "traceResolution": false, "types": [ "cypress" ] diff --git a/tests/dash/app_dataframe_backend_paging.py b/tests/dash/app_dataframe_backend_paging.py new file mode 100644 index 000000000..49bab9e98 --- /dev/null +++ b/tests/dash/app_dataframe_backend_paging.py @@ -0,0 +1,407 @@ +from dash.dependencies import Input, Output +import dash_core_components as dcc +import dash_html_components as html +import pandas as pd +from textwrap import dedent + +import dash_table +from index import app +from .utils import section_title + + +ID_PREFIX = "app_dataframe_updating_graph_be" +IDS = { + "table": ID_PREFIX, + "container": "{}-container".format(ID_PREFIX), + "table-sorting": "{}-sorting".format(ID_PREFIX), + "table-multi-sorting": "{}-multi-sorting".format(ID_PREFIX), + "table-filtering": "{}-filtering".format(ID_PREFIX), + "table-sorting-filtering": "{}-sorting-filtering".format(ID_PREFIX), + "table-paging-selection": "{}-paging-selection".format(ID_PREFIX), + "table-paging-with-graph": "{}-table-paging-with-graph".format(ID_PREFIX), + "table-paging-with-graph-container": "{}-table-paging-with-graph-container".format(ID_PREFIX), +} +df = pd.read_csv("./datasets/gapminder.csv") +df = df[df["year"] == 2007] +df[' index'] = range(1, len(df) + 1) + + +PAGE_SIZE = 5 + + +def layout(): + return html.Div( + [ + + section_title('Backend Paging'), + + dash_table.Table( + id=IDS["table"], + columns=[ + {"name": i, "id": i, "deletable": True} for i in sorted(df.columns) + ], + pagination_settings={ + 'displayed_pages': 1, + 'current_page': 0, + 'page_size': PAGE_SIZE + }, + pagination_mode='be' + ), + + html.Hr(), + + dcc.Markdown(dedent(''' + With backend paging, we can have front-end sorting and filtering + but it will only filter and sort the data that exists on the page. + + This should be avoided. Your users will expect + that sorting and filtering is happening on the entire dataset and, + with large pages, might not be aware that this is only occuring + on the current page. + + Instead, we recommend implmenting sorting and filtering on the + backend as well. That is, on the entire underlying dataset. + ''')), + + section_title('Backend Paging with Sorting'), + + dash_table.Table( + id=IDS["table-sorting"], + columns=[ + {"name": i, "id": i, "deletable": True} for i in sorted(df.columns) + ], + pagination_settings={ + 'displayed_pages': 1, + 'current_page': 0, + 'page_size': PAGE_SIZE + }, + pagination_mode='be', + + sorting='be', + sorting_type='single', + sorting_settings=[] + ), + + section_title('Backend Paging with Multi Column Sorting'), + + dcc.Markdown(dedent(''' + Multi-column sort allows you to sort by multiple columns. + This is useful when you have categorical columns with repeated + values and you're interested in seeing the sorted values for + each category. + + In this example, try sorting by continent and then any other column. + ''')), + + dash_table.Table( + id=IDS["table-multi-sorting"], + columns=[ + {"name": i, "id": i, "deletable": True} for i in sorted(df.columns) + ], + pagination_settings={ + 'displayed_pages': 1, + 'current_page': 0, + 'page_size': PAGE_SIZE + }, + pagination_mode='be', + + sorting='be', + sorting_type='multi', + sorting_settings=[] + ), + + section_title('Backend Paging with Filtering'), + + dcc.Markdown(dedent(''' + Dash Table's front-end filtering has its own filtering expression + language. + + Currently, backend filtering must parse the same filtering language. + If you write an expression that is not "valid" under the filtering + language, then it will not be passed to the backend. + + This limitation will be removed in the future to allow you to + write your own expression query language. + + In this example, we've written a Pandas backend for the filtering + language. It supports `eq`, `<`, and `>`. For example, try: + + - Enter `eq Asia` in the "continent" column + - Enter `> 5000` in the "gdpPercap" column + - Enter `< 80` in the `lifeExp` column + + ''')), + + dash_table.Table( + id=IDS["table-filtering"], + columns=[ + {"name": i, "id": i, "deletable": True} for i in sorted(df.columns) + ], + pagination_settings={ + 'displayed_pages': 1, + 'current_page': 0, + 'page_size': PAGE_SIZE + }, + pagination_mode='be', + + filtering='be', + filtering_settings='' + ), + + section_title('Backend Paging with Filtering and Multi-Column Sorting'), + + dash_table.Table( + id=IDS["table-sorting-filtering"], + columns=[ + {"name": i, "id": i, "deletable": True} for i in sorted(df.columns) + ], + pagination_settings={ + 'displayed_pages': 1, + 'current_page': 0, + 'page_size': PAGE_SIZE + }, + pagination_mode='be', + + filtering='be', + filtering_settings='', + + sorting='be', + sorting_type='multi', + sorting_settings=[] + ), + + section_title('Connecting Backend Paging with a Graph'), + + dcc.Markdown(dedent(''' + This final example ties it all together: the graph component + displays the current page of the `dataframe`. + ''')), + + html.Div( + className="row", + children=[ + html.Div( + dash_table.Table( + id=IDS["table-paging-with-graph"], + columns=[ + {"name": i, "id": i, "deletable": True} for i in sorted(df.columns) + ], + pagination_settings={ + 'displayed_pages': 1, + 'current_page': 0, + 'page_size': 20 + }, + pagination_mode='be', + + filtering='be', + filtering_settings='', + + sorting='be', + sorting_type='multi', + sorting_settings=[] + ), + style={'height': 750, 'overflowY': 'scroll'}, + className='six columns' + ), + html.Div( + id=IDS["table-paging-with-graph-container"], + className="six columns" + ) + ] + ) + + ] + ) + + +@app.callback( + Output(IDS["table"], "dataframe"), + [Input(IDS["table"], "pagination_settings")]) +def update_graph(pagination_settings): + return df.iloc[ + pagination_settings['current_page']*pagination_settings['page_size']: + (pagination_settings['current_page'] + 1)*pagination_settings['page_size'] + ].to_dict('rows') + + +@app.callback( + Output(IDS["table-sorting"], "dataframe"), + [Input(IDS["table-sorting"], "pagination_settings"), + Input(IDS["table-sorting"], "sorting_settings")]) +def update_graph(pagination_settings, sorting_settings): + print(sorting_settings) + if len(sorting_settings): + dff = df.sort_values( + sorting_settings[0]['columnId'], + ascending=sorting_settings[0]['direction'] == 'asc', + inplace=False + ) + else: + # No sort is applied + dff = df + + return dff.iloc[ + pagination_settings['current_page']*pagination_settings['page_size']: + (pagination_settings['current_page'] + 1)*pagination_settings['page_size'] + ].to_dict('rows') + + + +@app.callback( + Output(IDS["table-multi-sorting"], "dataframe"), + [Input(IDS["table-multi-sorting"], "pagination_settings"), + Input(IDS["table-multi-sorting"], "sorting_settings")]) +def update_graph(pagination_settings, sorting_settings): + print(sorting_settings) + if len(sorting_settings): + dff = df.sort_values( + [col['columnId'] for col in sorting_settings], + ascending=[ + col['direction'] == 'asc' + for col in sorting_settings + ], + inplace=False + ) + else: + # No sort is applied + dff = df + + return dff.iloc[ + pagination_settings['current_page']*pagination_settings['page_size']: + (pagination_settings['current_page'] + 1)*pagination_settings['page_size'] + ].to_dict('rows') + + +@app.callback( + Output(IDS["table-filtering"], "dataframe"), + [Input(IDS["table-filtering"], "pagination_settings"), + Input(IDS["table-filtering"], "filtering_settings")]) +def update_graph(pagination_settings, filtering_settings): + print(filtering_settings) + filtering_expressions = filtering_settings.split(' && ') + dff = df + for filter in filtering_expressions: + if ' eq ' in filter: + col_name = filter.split(' eq ')[0] + filter_value = filter.split(' eq ')[1] + dff = dff.loc[dff[col_name] == filter_value] + if ' > ' in filter: + col_name = filter.split(' > ')[0] + filter_value = float(filter.split(' > ')[1]) + dff = dff.loc[dff[col_name] > filter_value] + if ' < ' in filter: + col_name = filter.split(' < ')[0] + filter_value = float(filter.split(' < ')[1]) + dff = dff.loc[dff[col_name] < filter_value] + + return dff.iloc[ + pagination_settings['current_page']*pagination_settings['page_size']: + (pagination_settings['current_page'] + 1)*pagination_settings['page_size'] + ].to_dict('rows') + + +@app.callback( + Output(IDS["table-sorting-filtering"], "dataframe"), + [Input(IDS["table-sorting-filtering"], "pagination_settings"), + Input(IDS["table-sorting-filtering"], "sorting_settings"), + Input(IDS["table-sorting-filtering"], "filtering_settings")]) +def update_graph(pagination_settings, sorting_settings, filtering_settings): + filtering_expressions = filtering_settings.split(' && ') + dff = df + for filter in filtering_expressions: + if ' eq ' in filter: + col_name = filter.split(' eq ')[0] + filter_value = filter.split(' eq ')[1] + dff = dff.loc[dff[col_name] == filter_value] + if ' > ' in filter: + col_name = filter.split(' > ')[0] + filter_value = float(filter.split(' > ')[1]) + dff = dff.loc[dff[col_name] > filter_value] + if ' < ' in filter: + col_name = filter.split(' < ')[0] + filter_value = float(filter.split(' < ')[1]) + dff = dff.loc[dff[col_name] < filter_value] + + if len(sorting_settings): + dff = dff.sort_values( + [col['columnId'] for col in sorting_settings], + ascending=[ + col['direction'] == 'asc' + for col in sorting_settings + ], + inplace=False + ) + + return dff.iloc[ + pagination_settings['current_page']*pagination_settings['page_size']: + (pagination_settings['current_page'] + 1)*pagination_settings['page_size'] + ].to_dict('rows') + + +@app.callback( + Output(IDS["table-paging-with-graph"], "dataframe"), + [Input(IDS["table-paging-with-graph"], "pagination_settings"), + Input(IDS["table-paging-with-graph"], "sorting_settings"), + Input(IDS["table-paging-with-graph"], "filtering_settings")]) +def update_table(pagination_settings, sorting_settings, filtering_settings): + filtering_expressions = filtering_settings.split(' && ') + dff = df + for filter in filtering_expressions: + if ' eq ' in filter: + col_name = filter.split(' eq ')[0] + filter_value = filter.split(' eq ')[1] + dff = dff.loc[dff[col_name] == filter_value] + if ' > ' in filter: + col_name = filter.split(' > ')[0] + filter_value = float(filter.split(' > ')[1]) + dff = dff.loc[dff[col_name] > filter_value] + if ' < ' in filter: + col_name = filter.split(' < ')[0] + filter_value = float(filter.split(' < ')[1]) + dff = dff.loc[dff[col_name] < filter_value] + + if len(sorting_settings): + dff = dff.sort_values( + [col['columnId'] for col in sorting_settings], + ascending=[ + col['direction'] == 'asc' + for col in sorting_settings + ], + inplace=False + ) + + return dff.iloc[ + pagination_settings['current_page']*pagination_settings['page_size']: + (pagination_settings['current_page'] + 1)*pagination_settings['page_size'] + ].to_dict('rows') + + +@app.callback( + Output(IDS["table-paging-with-graph-container"], "children"), + [Input(IDS["table-paging-with-graph"], "dataframe")]) +def update_graph(rows): + dff = pd.DataFrame(rows) + return html.Div( + [ + dcc.Graph( + id=column, + figure={ + "data": [ + { + "x": dff["country"], + "y": dff[column] if column in dff else [], + "type": "bar", + "marker": {"color": "#0074D9"}, + } + ], + "layout": { + "xaxis": {"automargin": True}, + "yaxis": {"automargin": True}, + "height": 250, + "margin": {"t": 10, "l": 10, "r": 10}, + }, + }, + ) + for column in ["pop", "lifeExp", "gdpPercap"] + ] + ) diff --git a/tests/dash/app_dataframe_updating_graph_fe.py b/tests/dash/app_dataframe_updating_graph_fe.py new file mode 100644 index 000000000..bb7b2809e --- /dev/null +++ b/tests/dash/app_dataframe_updating_graph_fe.py @@ -0,0 +1,136 @@ +from dash.dependencies import Input, Output +import dash_core_components as dcc +import dash_html_components as html +import pandas as pd +from textwrap import dedent + +import dash_table +from index import app + +ID_PREFIX = "app_dataframe_updating_graph" +IDS = {"table": ID_PREFIX, "container": "{}-container".format(ID_PREFIX)} +df = pd.read_csv("./datasets/gapminder.csv") +df = df[df["year"] == 2007] + + +def layout(): + return html.Div( + [ + html.Div( + dash_table.Table( + id=IDS["table"], + columns=[ + {"name": i, "id": i, "deletable": True} for i in df.columns + ], + dataframe=df.to_dict("rows"), + editable=True, + filtering=True, + sorting=True, + sorting_type="multi", + row_selectable="multi", + row_deletable=True, + selected_rows=[], + n_fixed_rows=1, + ), + style={"height": 300, "overflowY": "scroll"}, + ), + html.Div(id=IDS["container"]), + dcc.Markdown( + dedent( + """ + *** + + `Table` includes several features for modifying and transforming the + view of the data. These include: + + - Sorting by column (`sorting=True`) + - Filtering by column (`filtering=True`) + - Editing the cells (`editable=True`) + - Deleting rows (`row_deletable=True`) + - Deleting columns (`columns[i].deletable=True`) + - Selecting rows (`row_selectable='single' | 'multi'`) + + > A quick note on filtering. We have defined our own + > syntax for performing filtering operations. Here are some + > examples for this particular dataset: + > - `lt num(50)` in the `lifeExp` column + > - `eq "Canada"` in the `country` column + + By default, these transformations are done clientside. + Your Dash callbacks can respond to these modifications + by listening to the `dataframe` property as an `Input`. + + Note that if `dataframe` is an `Input` then the entire + `dataframe` will be passed over the network: if your dataframe is + large, then this will become slow. For large dataframes, you have + two options: + - Use `dataframe_indicies` instead + - Perform the sorting or filtering in Python instead + + Issues with this example: + - Row selection callbacks don't work yet: `derived_viewport_indices` + isn't getting updated on row selection and `selected_rows` doesn't + track the underlying data (e.g. it will always be [1, 3] even after sorting or filtering) + """ + ) + ), + ] + ) + + +@app.callback( + Output(IDS["container"], "children"), + [ + Input(IDS["table"], "derived_virtual_dataframe"), + Input(IDS["table"], "selected_rows"), + ], +) +def update_graph(rows, selected_rows): + # When the table is first rendered, `derived_virtual_dataframe` + # will be `None`. This is due to an idiosyncracy in Dash + # (unsupplied properties are always None and Dash calls the dependent + # callbacks when the component is first rendered). + # So, if `selected_rows` is `None`, then the component was just rendered + # and its value will be the same as the component's dataframe. + # Instead of setting `None` in here, you could also set + # `derived_virtual_dataframe=df.to_rows('dict')` when you initialize + # the component. + if rows is None: + dff = df + else: + dff = pd.DataFrame(rows) + + colors = [] + for i in range(len(dff)): + if i in selected_rows: + colors.append("#7FDBFF") + else: + colors.append("#0074D9") + + return html.Div( + [ + dcc.Graph( + id=column, + figure={ + "data": [ + { + "x": dff["country"], + # check if column exists - user may have deleted it + # If `column.deletable=False`, then you don't + # need to do this check. + "y": dff[column] if column in dff else [], + "type": "bar", + "marker": {"color": colors}, + } + ], + "layout": { + "xaxis": {"automargin": True}, + "yaxis": {"automargin": True}, + "height": 250, + "margin": {"t": 10, "l": 10, "r": 10}, + }, + }, + ) + for column in ["pop", "lifeExp", "gdpPercap"] + ] + ) diff --git a/tests/dash/app_dropdown.py b/tests/dash/app_dropdown.py new file mode 100644 index 000000000..6f9bfeb91 --- /dev/null +++ b/tests/dash/app_dropdown.py @@ -0,0 +1,189 @@ +from collections import OrderedDict +from dash.dependencies import Input, Output +import dash_core_components as dcc +import dash_html_components as html +import pandas as pd +from textwrap import dedent + +import dash_table +from index import app +from .utils import section_title + + +ID_PREFIX = "app_dropdown" +IDS = { + "dropdown": ID_PREFIX, + "dropdown-by-cell": '{}-row-by-cell'.format(ID_PREFIX) +} + + +df = pd.DataFrame(OrderedDict([ + ('climate', + ['Sunny', 'Snowy', 'Sunny', 'Rainy']), + ('temperature', + [13, 43, 50, 30]), + ('city', + ['NYC', 'Montreal', 'Miami', 'NYC']) +])) + +df_per_row_dropdown = pd.DataFrame(OrderedDict([ + ('City', + ['NYC', 'Montreal', 'Los Angeles']), + ('Neighborhood', + ['Brooklyn', 'Mile End', 'Venice']), + ('Temperature (F)', + [70, 60, 90]), +])) + + +def layout(): + return html.Div([ + + dcc.Markdown(dedent(''' + The Dash table includes support for per-column and + per-cell dropdowns. In future releases, this will + be tightly integrated with a more formal typing system. + + For now, use the dropdown renderer as a way to limit the + options available when editing the values with an editable table. + + ''')), + + section_title('Dash Table with Per-Column Dropdowns'), + + dash_table.Table( + id=IDS['dropdown'], + dataframe=df.to_dict('rows'), + columns=[ + {'id': 'climate', 'name': 'climate'}, + {'id': 'temperature', 'name': 'temperature'}, + {'id': 'city', 'name': 'city'}, + ], + + editable=True, + column_static_dropdown=[ + { + 'id': 'climate', + 'dropdown': [ + {'label': i, 'value': i} + for i in df['climate'].unique() + ] + }, + { + 'id': 'city', + 'dropdown': [ + {'label': i, 'value': i} + for i in df['city'].unique() + ] + }, + ] + ), + + section_title('Dash Table with Per-Cell Dropdowns via Filtering UI'), + + dash_table.Table( + id=IDS['dropdown-by-cell'], + dataframe=df_per_row_dropdown.to_dict('rows'), + columns=[ + {'id': c, 'name': c} + for c in df_per_row_dropdown.columns + ], + + editable=True, + column_conditional_dropdowns=[ + { + 'id': 'Neighborhood', + 'dropdowns': [ + + { + 'condition': 'City eq "NYC"', + 'dropdown': [ + {'label': i, 'value': i} + for i in [ + 'Brooklyn', + 'Queens', + 'Staten Island' + ] + ] + }, + + { + 'condition': 'City eq "Montreal"', + 'dropdown': [ + {'label': i, 'value': i} + for i in [ + 'Mile End', + 'Plateau', + 'Hochelaga' + ] + ] + }, + + { + 'condition': 'City eq "Los Angeles"', + 'dropdown': [ + {'label': i, 'value': i} + for i in [ + 'Venice', + 'Hollywood', + 'Los Feliz' + ] + ] + } + + ] + } + ] + ), + + section_title('Dash Table with Per-Cell Dropdowns'), + + html.Div('This example uses a deprecated API, `dropdown_properties`.'), + + dash_table.Table( + id=IDS['dropdown-by-cell'], + dataframe=df_per_row_dropdown.to_dict('rows'), + columns=[ + {'id': c, 'name': c} + for c in df_per_row_dropdown.columns + ], + + editable=True, + dropdown_properties=[ + { + 'options': [ + {'label': i, 'value': i} + for i in [ + 'Brooklyn', + 'Queens', + 'Staten Island' + ] + ] + }, + + { + 'options': [ + {'label': i, 'value': i} + for i in [ + 'Mile End', + 'Plateau', + 'Hochelaga' + ] + ] + }, + + { + 'options': [ + {'label': i, 'value': i} + for i in [ + 'Venice', + 'Hollywood', + 'Los Feliz' + ] + ] + }, + ] + + ), + + ]) diff --git a/tests/dash/app_editor_with_configurable_options.py b/tests/dash/app_editor_with_configurable_options.py index 744e76c38..c25dc1170 100644 --- a/tests/dash/app_editor_with_configurable_options.py +++ b/tests/dash/app_editor_with_configurable_options.py @@ -50,9 +50,9 @@ options=[{"label": str(i), "value": i} for i in ["single", "multi", False]], value="single", ), - html.Label("Virtualization"), + html.Label("Pagination Mode"), dcc.RadioItems( - id="virtualization", + id="pagination_mode", options=[{"label": str(i), "value": i} for i in ["fe", True, False]], value="fe", ), @@ -99,7 +99,7 @@ def layout(): "sorting_type", # 2 "sorting_treat_empty_string_as_none", # 3 "row_selectable", # 4 - "virtualization", # 5 + "pagination_mode", # 5 "n_fixed_rows", # 6 "n_fixed_columns", # 7 "dataset", @@ -120,7 +120,7 @@ def update_table(*args): sorting_type=args[2], sorting_treat_empty_string_as_none=args[3], row_selectable=args[4], - virtualization=args[5], + pagination_mode=args[5], n_fixed_rows=args[6], n_fixed_columns=args[7], ) diff --git a/tests/dash/app_sizing.py b/tests/dash/app_sizing.py new file mode 100644 index 000000000..662a1b8dc --- /dev/null +++ b/tests/dash/app_sizing.py @@ -0,0 +1,432 @@ +from collections import OrderedDict +from dash.dependencies import Input, Output +import dash_core_components as dcc +import dash_html_components as html +import pandas as pd +from textwrap import dedent + +import dash_table +from index import app +from .utils import section_title, html_table + + +def layout(): + data = OrderedDict( + [ + ( + "Date", + [ + "July 12th, 2013 - July 25th, 2013", + "July 12th, 2013 - August 25th, 2013", + "July 12th, 2014 - August 25th, 2014", + ], + ), + ( + "Election Polling Organization", + ["The New York Times", "Pew Research", "The Washington Post"], + ), + ("Rep", [1, -20, 3.512]), + ("Dem", [10, 20, 30]), + ("Ind", [2, 10924, 3912]), + ( + "Region", + [ + "Northern New York State to the Southern Appalachian Mountains", + "Canada", + "Southern Vermont", + ], + ), + ] + ) + + df = pd.DataFrame(data) + df_long = pd.DataFrame( + OrderedDict([(name, col_data * 10) for (name, col_data) in data.items()]) + ) + + return [ + html.H1("Sizing Guide"), + html.Div( + style={ + "marginLeft": "auto", + "marginRight": "auto", + "width": "80%", + "borderLeft": "thin hotpink solid", + "borderRight": "thin hotpink solid", + }, + children=[ + html.H1("Background - HTML Tables"), + section_title("HTML Table - Default Styles"), + html.Div("By default, HTML tables expand to their contents"), + html_table(df, table_style={}, base_column_style={}), + section_title("HTML Table - Padding"), + html.Div( + """ + Since the table content is packed so tightly, + it's usually a good idea to place some left + on the columns. + """ + ), + html_table(df, table_style={}, cell_style={"paddingLeft": 10}), + section_title("HTML Table - Responsive Table"), + html.Div( + """ + With 100% width, the tables will expand to their + container. When the table gets small, the text will break into + multiple lines. + """ + ), + html_table(df, table_style={"width": "100%"}, base_column_style={}), + section_title("HTML Table - All Column Widths defined by Percent"), + html.Div( + """ + The column widths can be definied by percents rather than pixels. + """ + ), + html_table( + df, + table_style={"width": "100%"}, + column_style={ + "Date": {"width": "30%"}, + "Election Polling Organization": {"width": "25%"}, + "Dem": {"width": "5%"}, + "Rep": {"width": "5%"}, + "Ind": {"width": "5%"}, + "Region": {"width": "30%"}, + }, + ), + section_title("HTML Table - Single Column Width Defined by Percent"), + html.Div( + """ + The width of one column (Region=50%) can be definied by percent. + """ + ), + html_table( + df, + table_style={"width": "100%"}, + column_style={"Region": {"width": "50%"}}, + ), + section_title("HTML Table - Columns with min-width"), + html.Div( + "Here, the min-width for the first column is 130px, or about the width of this line: " + ), + html.Div( + style={"width": 130, "height": 10, "backgroundColor": "hotpink"} + ), + html_table( + df, + table_style={"width": "100%"}, + column_style={"Date": {"minWidth": "130"}}, + ), + section_title("HTML Table - Underspecified Widths"), + html.Div( + """ + The widths can be under-specified. Here, we're only setting the width for the three + columns in the middle, the rest of the columns are automatically sized to fit the rest of the container. + The columns have a width of 50px, or the width of this line: + """ + ), + html.Div( + style={"width": 50, "height": 10, "backgroundColor": "hotpink"} + ), + html_table( + df, + table_style={"width": "100%"}, + column_style={ + "Dem": {"width": 50}, + "Rep": {"width": 50}, + "Ind": {"width": 50}, + }, + ), + section_title("HTML Table - Widths that are smaller than the content"), + html.Div( + """ + In this case, we're setting the width to 20px, which is smaller + than the "10924" number in the "Ind" column. + The table does not allow it. + """ + ), + html.Div( + style={"width": 20, "height": 10, "backgroundColor": "hotpink"} + ), + html_table( + df, + table_style={"width": "100%"}, + column_style={ + "Dem": {"width": 20}, + "Rep": {"width": 20}, + "Ind": {"width": 20}, + }, + ), + section_title("HTML Table - Content with Ellipses"), + html.Div( + """ + With `max-width`, the content can collapse into + ellipses once the content doesn't fit. + + Here, `max-width` is set to 0. It could be any number, the only + important thing is that it is supplied. The behaviour will be + the same whether it is 0 or 50. + """ + ), + html_table( + df, + table_style={"width": "100%"}, + cell_style={ + "whiteSpace": "nowrap", + "overflow": "hidden", + "textOverflow": "ellipsis", + "maxWidth": 0, + }, + ), + section_title("HTML Table - Vertical Scrolling"), + html.Div( + """ + By supplying a max-height of the Table container and supplying + `overflow-y: scroll`, the table will become scrollable if the + table's contents are larger than the container. + """ + ), + html.Div( + style={"maxHeight": 300, "overflowY": "scroll"}, + children=html_table(df_long, table_style={"width": "100%"}), + ), + section_title("HTML Table - Vertical Scrolling with Max Height"), + html.Div( + """ + With `max-height`, if the table's contents are shorter than the + `max-height`, then the container will be shorter. + If you want a container with a constant height no matter the + contents, then use `height`. + + Here, we're setting max-height to 300, or the height of this line: + """ + ), + html.Div( + style={"width": 5, "height": 300, "backgroundColor": "hotpink"} + ), + html.Div( + style={"maxHeight": 300, "overflowY": "scroll"}, + children=html_table(df, table_style={"width": "100%"}), + ), + section_title("HTML Table - Vertical Scrolling with Height"), + html.Div("and here is `height` with the same content"), + html.Div( + style={"height": 300, "overflowY": "scroll"}, + children=html_table(df, table_style={"width": "100%"}), + ), + section_title("HTML Table - Horizontal Scrolling"), + html.Div( + """ + With HTML tables, we can set `min-width` to be 100%. + If the content is small, then the columns will have some extra + space. + But if the content of any of the cells is really large, then the + cells will expand beyond the container and a scrollbar will appear. + + In this way, `min-width` and `overflow-x: scroll` is an alternative + to `text-overflow: ellipses`. With scroll, the content that can't + fit in the container will get pushed out into a scrollable zone. + With text-overflow: ellipses, the content will get truncated by + ellipses. Both strategies work with or without line breaks on the + white spaces (`white-space: normal` or `white-space: nowrap`). + + These next two examples have the same styles applied: + - `min-width: 100%` + - `white-space: nowrap` (to keep the content on a single line) + - A parent with `overflow-x: scroll` + + """ + ), + section_title("HTML Table - Two Columns, 100% Min-Width"), + html.Div( + html_table( + pd.DataFrame({"Column 1": [1, 2], "Column 2": [3, 3]}), + table_style={"minWidth": "100%"}, + cell_style={"whiteSpace": "nowrap"}, + ), + style={"overflowX": "scroll"}, + ), + section_title("HTML Table - Long Columns, 100% Min-Width"), + html.Div( + """ + Here is a table with several columns with long titles, + 100% min-width, and `'white-space': 'nowrap'` + (to keep the text on a single line) + """ + ), + html.Div( + html_table( + pd.DataFrame( + { + "This is Column {} Data".format(i): [1, 2] + for i in range(10) + } + ), + table_style={"minWidth": "100%", "overflowX": "scroll"}, + cell_style={"whiteSpace": "nowrap"}, + ), + style={"overflowX": "scroll"}, + ), + html.Hr(), + html.H3("Dash Interactive Table"), + html.Div("These same styles can be applied to the dash table"), + section_title("Dash Table - Default Styles"), + dash_table.Table( + id="sizing-1", + dataframe=df.to_dict("rows"), + columns=[{"name": i, "id": i} for i in df.columns], + ), + section_title("Dash Table - Padding"), + # ... + section_title("Dash Table - All Column Widths by Percent"), + html.Div( + """ + Here is a table with all columns having width equal to 16.67%, + the Region column additionally wraps text. The table will try and respect + the width of each column while allowing for the content to be displayed. + + Changing the browser's viewport width will help understand how the table + allocates space. + """ + ), + dash_table.Table( + id="sizing-2", + dataframe=df.to_dict("rows"), + content_style="grow", + columns=[ + {"name": i, "id": i, "width": "16.67%"} for i in df.columns + ], + table_style=[ + {"selector": ".dash-spreadsheet", "rule": "width: 100%"}, + { + "selector": ".dash-cell[data-dash-column=Region]", + "rule": "white-space: normal", + }, + ], + ), + section_title("Dash Table - Single Column Width by Percent"), + html.Div( + """ + Here is a table with all columns having default (auto) width excepts for the + the Region column that has 50% width and wraps text. The table will try and respect + the width of each column while allowing for the content to be displayed. + + Changing the browser's viewport width will help understand how the table + allocates space. + """ + ), + dash_table.Table( + id="sizing-3", + dataframe=df.to_dict("rows"), + content_style="grow", + columns=[ + {"name": i, "id": i, "width": "50%" if i == "Region" else None} + for i in df.columns + ], + table_style=[ + {"selector": ".dash-spreadsheet", "rule": "width: 100%"}, + { + "selector": ".dash-cell[data-dash-column=Region]", + "rule": "white-space: normal", + }, + ], + ), + section_title("Dash Table - Underspecified Widths"), + html.Div( + """ + The widths can be under-specified. Here, we're only setting the width for the three + columns in the middle, the rest of the columns are automatically sized to fit the rest of the container. + The columns have a width/minWidth/maxWidth of 100px. + """ + ), + dash_table.Table( + id="sizing-4", + dataframe=df.to_dict("rows"), + columns=[ + { + "name": i, + "id": i, + "width": "100px" + if i == "Dem" or i == "Rep" or i == "Ind" + else None, + "minWidth": "100px" + if i == "Dem" or i == "Rep" or i == "Ind" + else None, + "maxWidth": "100px" + if i == "Dem" or i == "Rep" or i == "Ind" + else None, + } + for i in df.columns + ], + ), + section_title("Dash Table - Widths that are smaller than the content"), + html.Div( + """ + Width for all columns is set to 100px. Columns whose content is smaller than the defined size will respect it. + Columns whose content is bigger than defined will grow to accomodate content. Region column wraps to show behavior + in that case + """ + ), + dash_table.Table( + id="sizing-5", + dataframe=df.to_dict("rows"), + columns=[ + {"name": i, "id": i, "width": "100px"} for i in df.columns + ], + table_style=[ + { + "selector": ".dash-cell[data-dash-column=Region]", + "rule": "white-space: normal", + } + ], + ), + section_title( + "Dash Table - Widths that are smaller than the content (forced)" + ), + html.Div( + """ + Width/minWidth/maxWidth for all columns is set to 100px. Columns whose content is smaller than the defined size will respect it. + Columns whose content is bigger than defined will respect it too. Region column wraps to show behavior + in that case + """ + ), + dash_table.Table( + id="sizing-6", + dataframe=df.to_dict("rows"), + columns=[ + { + "name": i, + "id": i, + "width": "100px", + "minWidth": "100px", + "maxWidth": "100px", + } + for i in df.columns + ], + table_style=[ + { + "selector": ".dash-cell[data-dash-column=Region]", + "rule": "white-space: normal", + } + ], + ), + section_title("Dash Table - Content with Ellipses"), + # ... + section_title("Dash Table - Vertical Scrolling"), + # ... + section_title("Dash Table - Vertical Scrolling with Max Height"), + # ... + section_title("Dash Table - Vertical Scrolling with Height"), + # ... + section_title("Dash Table - Horizontal Scrolling"), + # ... + section_title("Dash Table - Two Columns, 100% Min-Width"), + # ... + section_title("Dash Table - Long Columns, 100% Min-Width"), + # ... + section_title("Dash Table - Alignment"), + # ... + ], + ), + ] diff --git a/tests/dash/app_styling.py b/tests/dash/app_styling.py new file mode 100644 index 000000000..ad5e8d40b --- /dev/null +++ b/tests/dash/app_styling.py @@ -0,0 +1,382 @@ +from collections import OrderedDict +from dash.dependencies import Input, Output +import dash_core_components as dcc +import dash_html_components as html +import pandas as pd +from textwrap import dedent + +import dash_table +from index import app +from .utils import html_table, section_title + + +def layout(): + data = OrderedDict( + [ + ("Date", ["2015-01-01", "2015-10-24", "2016-05-10"] * 2), + ("Region", ["Montreal", "Vermont", "New York City"] * 2), + ("Temperature", [1, -20, 3.512] * 2), + ("Humidity", [10, 20, 30] * 2), + ("Pressure", [2, 10924, 3912] * 2), + ] + ) + + df = pd.DataFrame(data) + + return html.Div( + style={"marginLeft": "auto", "marginRight": "auto", "width": "80%"}, + children=[ + html.H1("[WIP] - Styling the Table"), + + section_title("HTML Table - Gridded"), + + html.Div(""" + By default, the Dash table has grey headers and borders + around each cell. It resembles a spreadsheet with clearly defined + headers + """), + + html_table( + df, + cell_style={'border': 'thin lightgrey solid'}, + table_style={'width': '100%'}, + column_style={'width': '20%', 'paddingLeft': 20}, + header_style={'backgroundColor': 'rgb(235, 235, 235)'} + ), + + html.Hr(), + + section_title("HTML Table - Column Alignment and Column Fonts"), + dcc.Markdown(dedent( + """ + When displaying numerical data, it's a good practice to use + monospaced fonts, to right-align the data, and to provide the same + number of decimals throughout the column. + + Note that it's not possible to modify the number of decimal places + in css. `dash-table` will provide formatting options in the future, + until then you'll have to modify your data before displaying it. + + For textual data, left-aligning the data is usually easier to read. + + In both cases, the column headers should have the same alignment + as the cell content. + """ + )), + html_table( + df, + table_style={'width': '100%'}, + column_style={'width': '20%', 'paddingLeft': 20}, + cell_style={"paddingLeft": 5, "paddingRight": 5, 'border': 'thin lightgrey solid'}, + header_style_by_column={ + "Temperature": {"textAlign": "right", "fontFamily": "monospaced"}, + "Humidity": {"textAlign": "right", "fontFamily": "monospaced"}, + "Pressure": {"textAlign": "right", "fontFamily": "monospaced"}, + }, + cell_style_by_column={ + "Temperature": {"textAlign": "right", "fontFamily": "monospaced"}, + "Humidity": {"textAlign": "right", "fontFamily": "monospaced"}, + "Pressure": {"textAlign": "right", "fontFamily": "monospaced"}, + }, + header_style={'backgroundColor': 'rgb(235, 235, 235)'} + ), + + html.Hr(), + + section_title('HTML Table - Styling the Table as a List'), + + dcc.Markdown(dedent(''' + The gridded view is a good default view for an editable table, like a spreadsheet. + If your table isn't editable, then in many cases it can look cleaner without the + horizontal or vertical grid lines. + ''')), + + html_table( + df, + table_style={'width': '100%'}, + column_style={'width': '20%', 'paddingLeft': 20}, + cell_style={"paddingLeft": 5, "paddingRight": 5}, + header_style={'backgroundColor': 'rgb(235, 235, 235)', 'borderTop': 'thin lightgrey solid', 'borderBottom': 'thin lightgrey solid'}, + header_style_by_column={ + "Temperature": {"textAlign": "right", "fontFamily": "monospaced"}, + "Humidity": {"textAlign": "right", "fontFamily": "monospaced"}, + "Pressure": {"textAlign": "right", "fontFamily": "monospaced"}, + }, + cell_style_by_column={ + "Temperature": {"textAlign": "right", "fontFamily": "monospaced"}, + "Humidity": {"textAlign": "right", "fontFamily": "monospaced"}, + "Pressure": {"textAlign": "right", "fontFamily": "monospaced"}, + }, + ), + + html.Hr(), + + section_title('HTML Table - Row Padding'), + + dcc.Markdown(dedent(''' + By default, the gridded view is pretty tight. You can add some top and bottom row padding to + the rows to give your data a little bit more room to breathe. + ''')), + + html_table( + df, + table_style={'width': '100%'}, + column_style={'width': '20%', 'paddingLeft': 20}, + cell_style={"paddingLeft": 5, "paddingRight": 5}, + header_style={'backgroundColor': 'rgb(235, 235, 235)', 'borderTop': 'thin lightgrey solid', 'borderBottom': 'thin lightgrey solid'}, + header_style_by_column={ + "Temperature": {"textAlign": "right", "fontFamily": "monospaced"}, + "Humidity": {"textAlign": "right", "fontFamily": "monospaced"}, + "Pressure": {"textAlign": "right", "fontFamily": "monospaced"}, + }, + cell_style_by_column={ + "Temperature": {"textAlign": "right", "fontFamily": "monospaced"}, + "Humidity": {"textAlign": "right", "fontFamily": "monospaced"}, + "Pressure": {"textAlign": "right", "fontFamily": "monospaced"}, + }, + row_style={'paddingTop': 10, 'paddingBottom': 10} + ), + + html.Hr(), + + section_title('HTML Table - List Style with Minimal Headers'), + + dcc.Markdown(dedent(''' + In some contexts, the grey background can look a little heavy. + You can lighten this up by giving it a white background and + a thicker bottom border. + ''')), + + html_table( + df, + table_style={'width': '100%'}, + column_style={'width': '20%', 'paddingLeft': 20}, + cell_style={"paddingLeft": 5, "paddingRight": 5}, + header_style={'borderBottom': '2px lightgrey solid'}, + header_style_by_column={ + "Temperature": {"textAlign": "right", "fontFamily": "monospaced"}, + "Humidity": {"textAlign": "right", "fontFamily": "monospaced"}, + "Pressure": {"textAlign": "right", "fontFamily": "monospaced"}, + }, + cell_style_by_column={ + "Temperature": {"textAlign": "right", "fontFamily": "monospaced"}, + "Humidity": {"textAlign": "right", "fontFamily": "monospaced"}, + "Pressure": {"textAlign": "right", "fontFamily": "monospaced"}, + }, + row_style={'paddingTop': 10, 'paddingBottom': 10} + ), + + html.Hr(), + + section_title('HTML Table - List Style with Understated Headers'), + + dcc.Markdown(dedent(''' + When the data is obvious, sometimes you can de-emphasize the headers + as well, by giving them a lighter color than the cell text. + ''')), + + html_table( + df, + table_style={'width': '100%'}, + column_style={'width': '20%', 'paddingLeft': 20}, + cell_style={"paddingLeft": 5, "paddingRight": 5}, + header_style={'color': 'rgb(100, 100, 100)'}, + header_style_by_column={ + "Temperature": {"textAlign": "right", "fontFamily": "monospaced"}, + "Humidity": {"textAlign": "right", "fontFamily": "monospaced"}, + "Pressure": {"textAlign": "right", "fontFamily": "monospaced"}, + }, + cell_style_by_column={ + "Temperature": {"textAlign": "right", "fontFamily": "monospaced"}, + "Humidity": {"textAlign": "right", "fontFamily": "monospaced"}, + "Pressure": {"textAlign": "right", "fontFamily": "monospaced"}, + }, + row_style={'paddingTop': 10, 'paddingBottom': 10} + ), + + html.Hr(), + + section_title('HTML Table - Striped Rows'), + + dcc.Markdown(dedent(''' + When you're viewing datasets where you need to compare values within individual rows, it + can sometimes be helpful to give the rows alternating background colors. + We recommend using colors that are faded so as to not attract too much attention to the stripes. + ''')), + + html_table( + df, + table_style={'width': '100%'}, + column_style={'width': '20%', 'paddingLeft': 20}, + cell_style={"paddingLeft": 5, "paddingRight": 5}, + header_style={'backgroundColor': 'rgb(235, 235, 235)', 'borderTop': 'thin lightgrey solid', 'borderBottom': 'thin lightgrey solid'}, + header_style_by_column={ + "Temperature": {"textAlign": "right", "fontFamily": "monospaced"}, + "Humidity": {"textAlign": "right", "fontFamily": "monospaced"}, + "Pressure": {"textAlign": "right", "fontFamily": "monospaced"}, + }, + cell_style_by_column={ + "Temperature": {"textAlign": "right", "fontFamily": "monospaced"}, + "Humidity": {"textAlign": "right", "fontFamily": "monospaced"}, + "Pressure": {"textAlign": "right", "fontFamily": "monospaced"}, + }, + row_style={'paddingTop': 10, 'paddingBottom': 10}, + odd_row_style={'backgroundColor': 'rgb(248, 248, 248)'} + ), + + section_title('HTML Table - Dark Theme with Cells'), + + dcc.Markdown(dedent( + """ + You have full control over all of the elements in the table. + If you are viewing your table in an app with a dark background, + you can provide inverted background and font colors. + """ + )), + + html_table( + df, + table_style={ + 'backgroundColor': 'rgb(50, 50, 50)', + 'color': 'white', + 'width': '100%' + }, + cell_style={'border': 'thin white solid'}, + header_style={'backgroundColor': 'rgb(30, 30, 30)'}, + row_style={'padding': 10}, + header_style_by_column={ + "Temperature": {"textAlign": "right", "fontFamily": "monospaced"}, + "Humidity": {"textAlign": "right", "fontFamily": "monospaced"}, + "Pressure": {"textAlign": "right", "fontFamily": "monospaced"}, + }, + cell_style_by_column={ + "Temperature": {"textAlign": "right", "fontFamily": "monospaced"}, + "Humidity": {"textAlign": "right", "fontFamily": "monospaced"}, + "Pressure": {"textAlign": "right", "fontFamily": "monospaced"}, + }, + ), + + section_title('HTML Table - Dark Theme with Rows'), + + html_table( + df, + table_style={ + 'backgroundColor': 'rgb(50, 50, 50)', + 'color': 'white', + 'width': '100%' + }, + row_style={ + 'borderTop': 'thin white solid', + 'borderBottom': 'thin white solid', + 'padding': 10 + }, + header_style={'backgroundColor': 'rgb(30, 30, 30)'}, + header_style_by_column={ + "Temperature": {"textAlign": "right", "fontFamily": "monospaced"}, + "Humidity": {"textAlign": "right", "fontFamily": "monospaced"}, + "Pressure": {"textAlign": "right", "fontFamily": "monospaced"}, + }, + cell_style_by_column={ + "Temperature": {"textAlign": "right", "fontFamily": "monospaced"}, + "Humidity": {"textAlign": "right", "fontFamily": "monospaced"}, + "Pressure": {"textAlign": "right", "fontFamily": "monospaced"}, + }, + ), + + section_title('HTML Table - Highlighting Certain Rows'), + + dcc.Markdown(dedent(''' + You can draw attention to certain rows by providing a unique + background color, bold text, or colored text. + ''')), + + html_table( + df, + cell_style={'border': 'thin lightgrey solid', 'color': 'rgb(60, 60, 60)'}, + table_style={'width': '100%'}, + column_style={'width': '20%', 'paddingLeft': 20}, + header_style={'backgroundColor': 'rgb(235, 235, 235)'}, + row_style_by_index={ + 4: { + 'backgroundColor': 'yellow', + } + } + ), + + section_title('HTML Table - Highlighting Certain Columns'), + + dcc.Markdown(dedent(''' + Similarly, certain columns can be highlighted. + ''')), + + html_table( + df, + cell_style={'border': 'thin lightgrey solid', 'color': 'rgb(60, 60, 60)'}, + table_style={'width': '100%'}, + column_style={'width': '20%', 'paddingLeft': 20}, + header_style={'backgroundColor': 'rgb(235, 235, 235)'}, + cell_style_by_column={ + "Temperature": { + "backgroundColor": "yellow" + }, + } + ), + + section_title('HTML Table - Highlighting Certain Cells'), + + dcc.Markdown(dedent(''' + You can also highlight certain cells. For example, you may want to + highlight certain cells that exceed a threshold or that match + a filter elsewhere in the app. + ''')), + + html_table( + df, + cell_style={'border': 'thin lightgrey solid', 'color': 'rgb(60, 60, 60)'}, + table_style={'width': '100%'}, + column_style={'width': '20%', 'paddingLeft': 20}, + header_style={'backgroundColor': 'rgb(235, 235, 235)'}, + conditional_cell_style=lambda cell, column: ( + {'backgroundColor': 'yellow'} + if ( + (column == 'Region' and cell == 'Montreal') + or + (cell == 20) + ) else {} + ) + ), + + html.Hr(), + + section_title('Dash Table - Styling the Table as a List'), + # ... + + section_title('Dash Table - Row Padding'), + # ... + + section_title('Dash Table - List Style with Minimal Headers'), + # ... + + section_title('Dash Table - List Style with Understated Headers'), + # ... + + section_title('Dash Table - Striped Rows'), + # ... + + section_title('Dash Table - Dark Theme with Cells'), + # ... + + section_title('Dash Table - Dark Theme with Rows'), + # ... + + section_title('Dash Table - Highlighting Certain Rows'), + # ... + + section_title('Dash Table - Highlighting Certain Columns'), + # ... + + section_title('Dash Table - Highlighting Certain Cells'), + # ... + + ], + ) diff --git a/tests/dash/utils.py b/tests/dash/utils.py new file mode 100644 index 000000000..539ed6186 --- /dev/null +++ b/tests/dash/utils.py @@ -0,0 +1,68 @@ +import dash_html_components as html + + +def merge(*args): + merged = {} + for arg in args: + for key in arg: + merged[key] = arg[key] + return merged + + +def section_title(title): + return html.H4(title, style={"marginTop": "20px"}) + + +def html_table( + df, + base_column_style={}, + table_style={}, + column_style={}, + cell_style={}, + cell_style_by_column={}, + header_style={}, + header_style_by_column={}, + row_style={}, + row_style_by_index={}, + odd_row_style={}, + conditional_cell_style=(lambda cell, column: {}) +): + header = [] + for column in df.columns: + header.append( + html.Th( + column, + style=merge( + row_style, + base_column_style, + cell_style, + column_style.get(column, {}), + header_style, + header_style_by_column.get(column, {}), + ), + ) + ) + + rows = [] + for i in range(len(df)): + row = [] + for column in df.columns: + row.append( + html.Td( + df.iloc[i][column], + style=merge( + row_style, + row_style_by_index.get(i, {}), + odd_row_style if i % 2 == 1 else {}, + cell_style, + cell_style_by_column.get(column, {}), + conditional_cell_style(df.iloc[i][column], column) + ), + ) + ) + rows.append(html.Tr(row)) + + return html.Table( + [html.Thead(header), html.Tbody(rows)], + style=merge(table_style, {"marginTop": "20px", "marginBottom": "20px"}), + ) diff --git a/tests/e2e/cypress/integration/delete_row_test.ts b/tests/e2e/cypress/integration/delete_row_test.ts deleted file mode 100644 index 2bc291f4a..000000000 --- a/tests/e2e/cypress/integration/delete_row_test.ts +++ /dev/null @@ -1,37 +0,0 @@ -import DashTable from 'cypress/DashTable'; - -describe('delete', () => { - describe('be', () => { - beforeEach(() => cy.visit('http://localhost:8081')); - - it('can delete row', () => { - DashTable.getCell(0, 2).within(() => cy.get('.cell-value').should('have.html', '0')); - DashTable.getDelete(0).click(); - DashTable.getCell(0, 2).within(() => cy.get('.cell-value').should('have.html', '1')); - }); - - it('can delete row when sorted', () => { - cy.get('tr th.column-2 .sort').click({ force: true }); - DashTable.getCell(0, 2).within(() => cy.get('.cell-value').should('have.html', '249')); - DashTable.getDelete(0).click(); - DashTable.getCell(0, 2).within(() => cy.get('.cell-value').should('have.html', '248')); - }); - }); - - describe('fe', () => { - beforeEach(() => cy.visit('http://localhost:8080')); - - it('can delete row', () => { - DashTable.getCell(0, 2).within(() => cy.get('.cell-value').should('have.html', '1')); - DashTable.getDelete(0).click(); - DashTable.getCell(0, 2).within(() => cy.get('.cell-value').should('have.html', '2')); - }); - - it('can delete row when sorted', () => { - cy.get('tr th.column-2 .sort').click({ force: true }); - DashTable.getCell(0, 2).within(() => cy.get('.cell-value').should('have.html', '4999')); - DashTable.getDelete(0).click(); - DashTable.getCell(0, 2).within(() => cy.get('.cell-value').should('have.html', '4998')); - }); - }); -}); \ No newline at end of file diff --git a/tests/e2e/cypress/integration/edit_cell_test.ts b/tests/e2e/cypress/integration/edit_cell_test.ts deleted file mode 100644 index faa6e9bc5..000000000 --- a/tests/e2e/cypress/integration/edit_cell_test.ts +++ /dev/null @@ -1,78 +0,0 @@ -import DashTable from 'cypress/DashTable'; -import DOM from 'cypress/DOM'; -import Key from 'cypress/Key'; - -describe('edit cell', () => { - beforeEach(() => { - cy.visit('http://localhost:8080'); - }); - - it('can delete dropdown', () => { - DashTable.getCell(0, 8).trigger('mouseover'); - DashTable.getCell(0, 8).within(() => cy.get('.Select-clear').click()); - DashTable.getCell(0, 8).within(() => cy.get('.Select-placeholder').should('exist')); - }); - - it('can delete dropdown and set value', () => { - DashTable.getCell(0, 8).trigger('mouseover'); - DashTable.getCell(0, 8).within(() => cy.get('.Select-clear').click()); - DashTable.getCell(0, 8).within(() => cy.get('.Select-placeholder').should('exist')); - - DashTable.getCell(0, 8).within(() => cy.get('div.Select').click()).then(() => { - DashTable.getCell(0, 8).within(() => { - cy.get('.Select-option').then($options => { - const target = $options[0]; - if (target) { - cy.wrap(target).click({ force: true }); - } - }); - }); - }); - - DashTable.getCell(0, 8).within(() => cy.get('.Select-placeholder').should('not.exist')); - }); - - it('can edit dropdown', () => { - let initialValue: string; - let expectedValue: string; - - DashTable.getCell(0, 8).within(() => { - cy.get('.Select-value-label').then($valueLabel => { - initialValue = $valueLabel[0].innerHTML; - cy.log('initial value', initialValue); - }); - }); - - DashTable.getCell(0, 8).within(() => cy.get('div.Select').click()).then(() => { - DashTable.getCell(0, 8).within(() => { - cy.get('.Select-option').then($options => { - const target = Array.from($options).find($option => $option.innerHTML !== initialValue); - if (target) { - cy.wrap(target).click({ force: true }); - - expectedValue = target.innerHTML; - cy.log('expected value', expectedValue); - } - }); - }); - }); - - DashTable.getCell(0, 8).within(() => { - cy.get('.Select-value-label').should('have.html', expectedValue); - }); - }); - - // https://github.com/plotly/dash-table/issues/50 - it('can edit on "enter"', () => { - DashTable.getCell(0, 3).click(); - DOM.focused.type(`abc${Key.Enter}`); - DashTable.getCell(0, 3).within(() => cy.get('.cell-value').should('have.html', `abc`)); - }); - - it('can edit when clicking outside of cell', () => { - DashTable.getCell(0, 3).click(); - DOM.focused.type(`abc`); - DashTable.getCell(0, 2).click(); - DashTable.getCell(0, 3).within(() => cy.get('.cell-value').should('have.html', `abc`)); - }); -}); \ No newline at end of file diff --git a/tests/e2e/cypress/integration/select_row_test.ts b/tests/e2e/cypress/integration/select_row_test.ts deleted file mode 100644 index f3b1fe8dc..000000000 --- a/tests/e2e/cypress/integration/select_row_test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import DashTable from 'cypress/DashTable'; - -describe('delete', () => { - describe('be', () => { - beforeEach(() => cy.visit('http://localhost:8081')); - - it('can select row', () => { - DashTable.getSelect(0).within(() => cy.get('input').click()); - DashTable.getSelect(0).within(() => cy.get('input').should('be.checked')); - }); - - it('can select row when sorted', () => { - cy.get('tr th.column-2 .sort').click({ force: true }); - DashTable.getSelect(0).within(() => cy.get('input').click()); - DashTable.getSelect(0).within(() => cy.get('input').should('be.checked')); - }); - - it('select, sort, new row is not selected', () => { - DashTable.getSelect(0).within(() => cy.get('input').click()); - DashTable.getSelect(0).within(() => cy.get('input').should('be.checked')); - cy.get('tr th.column-2 .sort').click({ force: true }); - DashTable.getSelect(0).within(() => cy.get('input').should('not.be.checked')); - }); - }); - - describe('fe', () => { - beforeEach(() => cy.visit('http://localhost:8080')); - - it('can select row', () => { - DashTable.getSelect(0).within(() => cy.get('input').click()); - DashTable.getSelect(0).within(() => cy.get('input').should('be.checked')); - }); - - it('can select row when sorted', () => { - cy.get('tr th.column-2 .sort').click({ force: true }); - DashTable.getSelect(0).within(() => cy.get('input').click()); - DashTable.getSelect(0).within(() => cy.get('input').should('be.checked')); - }); - - it('select, sort, new row is not selected', () => { - DashTable.getSelect(0).within(() => cy.get('input').click()); - DashTable.getSelect(0).within(() => cy.get('input').should('be.checked')); - cy.get('tr th.column-2 .sort').click({ force: true }); - DashTable.getSelect(0).within(() => cy.get('input').should('not.be.checked')); - }); - }); -}); \ No newline at end of file diff --git a/tests/e2e/cypress/integration/sorting_test.ts b/tests/e2e/cypress/integration/sorting_test.ts deleted file mode 100644 index 00c805b2c..000000000 --- a/tests/e2e/cypress/integration/sorting_test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import DashTable from 'cypress/DashTable'; - -describe('sort', () => { - beforeEach(() => { - cy.visit('http://localhost:8080'); - }); - - it('can sort', () => { - DashTable.getCell(0, 8).within(() => cy.get('.Select-value-label').should('have.html', 'Wet')); - DashTable.getCell(1, 8).within(() => cy.get('.Select-value-label').should('have.html', 'Snowy')); - DashTable.getCell(2, 8).within(() => cy.get('.Select-value-label').should('have.html', 'Tropical Beaches')); - DashTable.getCell(3, 8).within(() => cy.get('.Select-value-label').should('have.html', 'Humid')); - cy.get('tr th.column-8 .sort').click(); - DashTable.getCell(0, 8).within(() => cy.get('.Select-value-label').should('have.html', 'Wet')); - DashTable.getCell(1, 8).within(() => cy.get('.Select-value-label').should('have.html', 'Wet')); - DashTable.getCell(2, 8).within(() => cy.get('.Select-value-label').should('have.html', 'Wet')); - DashTable.getCell(3, 8).within(() => cy.get('.Select-value-label').should('have.html', 'Wet')); - }); -}); diff --git a/tests/visual/percy-storybook/DashTable.percy.tsx b/tests/visual/percy-storybook/DashTable.percy.tsx index 3edb9785e..f21d51cda 100644 --- a/tests/visual/percy-storybook/DashTable.percy.tsx +++ b/tests/visual/percy-storybook/DashTable.percy.tsx @@ -137,6 +137,37 @@ const sparseDataframe = (() => { )); })(); +const hiddenColumns = R.addIndex(R.map)((column, index) => + R.mergeAll([ + {}, + column, + { hidden: index % 2 === 0 } + ]), + columns +); + +storiesOf('DashTable/Hidden Columns', module) + .add('hides', () => ()) + .add('active cell', () => ()) + .add('selected cells', () => ()); + storiesOf('DashTable/Sorting', module) .add('"a" ascending', () => ( { }; + +let stories = storiesOf('DashTable/Props Validation', module); + +filteringValues.forEach(filter => { + sortingValues.forEach(sort => { + paginationValues.forEach(page => { + stories = stories.add(`filter=${filter}, sorting=${sort}, pagination=${page}`, () => ()); + }); + }); +}); \ No newline at end of file diff --git a/tests/visual/percy-storybook/Width.percy.tsx b/tests/visual/percy-storybook/Width.all.percy.tsx similarity index 69% rename from tests/visual/percy-storybook/Width.percy.tsx rename to tests/visual/percy-storybook/Width.all.percy.tsx index 7f27afb3c..9290256f5 100644 --- a/tests/visual/percy-storybook/Width.percy.tsx +++ b/tests/visual/percy-storybook/Width.all.percy.tsx @@ -6,8 +6,7 @@ import DashTable from 'dash-table/Table'; const setProps = () => { }; -const columns = ['a', 'b', 'c'] - .map(id => ({ id: id, name: id.toUpperCase(), width: '33%' })); +const columns = ['a', 'b', 'c']; const dataframe = (() => { const r = random(1); @@ -20,19 +19,17 @@ const dataframe = (() => { )); })(); -let props = { +const baseProps = { setProps, - content_style: 'grow', id: 'table', - dataframe, - columns, - table_style: [ - { selector: '.dash-spreadsheet', rule: 'width: 1000px; max-width: 1000px; height: 1000px;' }, - { selector: '.dash-fixed-column', rule: 'width: 33%;' } - ] + dataframe }; -storiesOf('DashTable/Width percentages', module) +const props = Object.assign({}, baseProps, { + columns: columns.map((id => ({ id: id, name: id.toUpperCase(), width: 20, minWidth: 20, maxWidth: 20 }))) +}); + +storiesOf('DashTable/Width width, minWidth, maxWidth', module) .add('without frozen columns or rows', () => ()) diff --git a/tests/visual/percy-storybook/Width.defaults.percy.tsx b/tests/visual/percy-storybook/Width.defaults.percy.tsx new file mode 100644 index 000000000..bb2faf395 --- /dev/null +++ b/tests/visual/percy-storybook/Width.defaults.percy.tsx @@ -0,0 +1,48 @@ +import * as R from 'ramda'; +import React from 'react'; +import { storiesOf } from '@storybook/react'; +import random from 'core/math/random'; +import DashTable from 'dash-table/Table'; + +const setProps = () => { }; + +const columns = ['a', 'b', 'c']; + +const dataframe = (() => { + const r = random(1); + + return R.range(0, 5).map(() => ( + ['a', 'b', 'c'].reduce((obj: any, key) => { + obj[key] = Math.floor(r() * 1000); + return obj; + }, {}) + )); +})(); + +const baseProps = { + setProps, + id: 'table', + dataframe +}; + +const props = Object.assign({}, baseProps, { + columns: columns.map((id => ({ id: id, name: id.toUpperCase() }))) +}); + +storiesOf('DashTable/Width defaults', module) + .add('without frozen columns or rows', () => ()) + .add('with frozen rows', () => ()) + .add('with frozen columns', () => ()) + .add('with frozen rows and frozen columns', () => ()); \ No newline at end of file diff --git a/tests/visual/percy-storybook/Width.max.percy.tsx b/tests/visual/percy-storybook/Width.max.percy.tsx new file mode 100644 index 000000000..5758dd5bd --- /dev/null +++ b/tests/visual/percy-storybook/Width.max.percy.tsx @@ -0,0 +1,48 @@ +import * as R from 'ramda'; +import React from 'react'; +import { storiesOf } from '@storybook/react'; +import random from 'core/math/random'; +import DashTable from 'dash-table/Table'; + +const setProps = () => { }; + +const columns = ['a', 'b', 'c']; + +const dataframe = (() => { + const r = random(1); + + return R.range(0, 5).map(() => ( + ['a', 'b', 'c'].reduce((obj: any, key) => { + obj[key] = Math.floor(r() * 1000); + return obj; + }, {}) + )); +})(); + +const baseProps = { + setProps, + id: 'table', + dataframe +}; + +const props = Object.assign({}, baseProps, { + columns: columns.map((id => ({ id: id, name: id.toUpperCase(), maxWidth: 10 }))) +}); + +storiesOf('DashTable/Width maxWidth only', module) + .add('without frozen columns or rows', () => ()) + .add('with frozen rows', () => ()) + .add('with frozen columns', () => ()) + .add('with frozen rows and frozen columns', () => ()); \ No newline at end of file diff --git a/tests/visual/percy-storybook/Width.min.percy.tsx b/tests/visual/percy-storybook/Width.min.percy.tsx new file mode 100644 index 000000000..68d0aa3c7 --- /dev/null +++ b/tests/visual/percy-storybook/Width.min.percy.tsx @@ -0,0 +1,48 @@ +import * as R from 'ramda'; +import React from 'react'; +import { storiesOf } from '@storybook/react'; +import random from 'core/math/random'; +import DashTable from 'dash-table/Table'; + +const setProps = () => { }; + +const columns = ['a', 'b', 'c']; + +const dataframe = (() => { + const r = random(1); + + return R.range(0, 5).map(() => ( + ['a', 'b', 'c'].reduce((obj: any, key) => { + obj[key] = Math.floor(r() * 1000); + return obj; + }, {}) + )); +})(); + +const baseProps = { + setProps, + id: 'table', + dataframe +}; + +const props = Object.assign({}, baseProps, { + columns: columns.map((id => ({ id: id, name: id.toUpperCase(), minWidth: 100 }))) +}); + +storiesOf('DashTable/Width minWidth only', module) + .add('without frozen columns or rows', () => ()) + .add('with frozen rows', () => ()) + .add('with frozen columns', () => ()) + .add('with frozen rows and frozen columns', () => ()); \ No newline at end of file diff --git a/tests/visual/percy-storybook/Width.percentages.percy.tsx b/tests/visual/percy-storybook/Width.percentages.percy.tsx new file mode 100644 index 000000000..940f438eb --- /dev/null +++ b/tests/visual/percy-storybook/Width.percentages.percy.tsx @@ -0,0 +1,55 @@ +import * as R from 'ramda'; +import React from 'react'; +import { storiesOf } from '@storybook/react'; +import random from 'core/math/random'; +import DashTable from 'dash-table/Table'; +const setProps = () => { }; + +const columns = ['a', 'b', 'c']; + +const dataframe = (() => { + const r = random(1); + + return R.range(0, 5).map(() => ( + ['a', 'b', 'c'].reduce((obj: any, key) => { + obj[key] = Math.floor(r() * 1000); + return obj; + }, {}) + )); +})(); + +const baseProps = { + setProps, + id: 'table', + dataframe +}; + +const props = Object.assign({}, baseProps, { + content_style: 'grow', + columns: columns.map((id => ({ id: id, name: id.toUpperCase(), width: '33%' }))), + table_style: [{ + selector: '.dash-spreadsheet', + rule: 'width: 1000px; max-width: 1000px; height: 1000px;' + }, { + selector: '.dash-fixed-column', + rule: 'width: 33%;' + }] +}); + +storiesOf('DashTable/Width percentages', module) + .add('without frozen columns or rows', () => ()) + .add('with frozen rows', () => ()) + .add('with frozen columns', () => ()) + .add('with frozen rows and frozen columns', () => ()); \ No newline at end of file diff --git a/tests/visual/percy-storybook/Width.width.percy.tsx b/tests/visual/percy-storybook/Width.width.percy.tsx new file mode 100644 index 000000000..44bb5ea42 --- /dev/null +++ b/tests/visual/percy-storybook/Width.width.percy.tsx @@ -0,0 +1,48 @@ +import * as R from 'ramda'; +import React from 'react'; +import { storiesOf } from '@storybook/react'; +import random from 'core/math/random'; +import DashTable from 'dash-table/Table'; + +const setProps = () => { }; + +const columns = ['a', 'b', 'c']; + +const dataframe = (() => { + const r = random(1); + + return R.range(0, 5).map(() => ( + ['a', 'b', 'c'].reduce((obj: any, key) => { + obj[key] = Math.floor(r() * 1000); + return obj; + }, {}) + )); +})(); + +const baseProps = { + setProps, + id: 'table', + dataframe +}; + +const props = Object.assign({}, baseProps, { + columns: columns.map((id => ({ id: id, name: id.toUpperCase(), width: 20 }))) +}); + +storiesOf('DashTable/Width width only', module) + .add('without frozen columns or rows', () => ()) + .add('with frozen rows', () => ()) + .add('with frozen columns', () => ()) + .add('with frozen rows and frozen columns', () => ()); \ No newline at end of file diff --git a/tests/visual/percy-storybook/fixtures.ts b/tests/visual/percy-storybook/fixtures.ts index e7d96eb18..294fde135 100644 --- a/tests/visual/percy-storybook/fixtures.ts +++ b/tests/visual/percy-storybook/fixtures.ts @@ -28,7 +28,7 @@ export default [ ], n_fixed_rows: 1, table_style: [{ - selector: '.dash-spreadsheet.freeze-top', + selector: '.dash-spreadsheet.dash-freeze-top', rule: 'height: 100px;' }] } @@ -357,6 +357,7 @@ export default [ props: { id: 'table', editable: true, + active_cell: [2, 1], selected_cell: [[2, 1], [2, 2], [1, 1], [1, 2]], columns: [ { diff --git a/tests/visual/percy-storybook/tsconfig.json b/tests/visual/percy-storybook/tsconfig.json index 2dbe79bb3..17ea601d7 100644 --- a/tests/visual/percy-storybook/tsconfig.json +++ b/tests/visual/percy-storybook/tsconfig.json @@ -20,6 +20,6 @@ "strict": true, "strictPropertyInitialization": false, "target": "esnext", - "traceResolution": true + "traceResolution": false } } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 2e2fd4ecf..c552cdb9f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,7 +21,7 @@ "strict": true, "strictPropertyInitialization": false, "target": "esnext", - "traceResolution": true + "traceResolution": false }, "exclude": [ "tests/*" diff --git a/usage.py b/usage.py deleted file mode 100644 index d9e921b9d..000000000 --- a/usage.py +++ /dev/null @@ -1,77 +0,0 @@ -import dash -from dash.dependencies import Input, Output -import dash_table -import dash_html_components as html - -app = dash.Dash() - -app.css.config.serve_locally = True -app.scripts.config.serve_locally = True - -dataframe = [ - {'ind': 0, 'temp': 80, 'climate': 'Tropical'}, - {'ind': 1, 'temp': 30, 'climate': 'Snowy'}, - {'ind': 2, 'temp': 20, 'climate': 'Rain Forests'}, -] - -dataframe2 = [ - {'ind': 0, 'temp': 80, 'climate': 'Tropical'}, - {'ind': 1, 'temp': 30, 'climate': 'Snowy'}, - {'ind': 2, 'temp': 20, 'climate': 'Rain Forests'}, - {'ind': 2, 'temp': 20, 'climate': 'Rain Forests'}, - {'ind': 2, 'temp': 20, 'climate': 'Rain Forests'}, - {'ind': 2, 'temp': 20, 'climate': 'Rain Forests'}, -] - -app.layout = html.Div([ - dash_table.Table( - id='table', - dataframe=dataframe, - virtualization='be', - virtualization_settings={ - 'displayed_pages': 1, - 'current_page': 0, - 'page_size': 100 - }, - navigation='page', - columns=[ - { - 'id': 'ind', - 'name': '' - }, - { - 'id': 'temp', - 'name': 'Temperature' - }, - { - 'id': 'climate', - 'name': 'Climate' - }, - ], - editable=True - ), - html.Div(id='container') -]) - - -@app.callback( - Output('table', 'dataframe'), - [Input('table', 'virtualization')] -) -def updateDataframe(): - return dataframe2 - - -@app.callback( - Output('container', 'children'), - [ - Input('table', 'virtual_dataframe'), - Input('table', 'virtual_dataframe_indices') - ] -) -def updateContainer(): - return html.Pre('
Hello
') - - -if __name__ == '__main__': - app.run_server(debug=True) diff --git a/usage_table_changes.py b/usage_table_changes.py deleted file mode 100644 index 3907f9fa9..000000000 --- a/usage_table_changes.py +++ /dev/null @@ -1,59 +0,0 @@ -import dash -from dash.dependencies import Input, Output, State -import dash_table -import dash_html_components as html -import json - -app = dash.Dash() - -app.css.config.serve_locally = True -app.scripts.config.serve_locally = True - -app.layout = html.Div([ - dash_table.Table( - id='table', - dataframe=[ - {'ind': 0, 'temp': 80, 'climate': 'Tropical'}, - {'ind': 1, 'temp': 30, 'climate': 'Snowy'}, - {'ind': 2, 'temp': 20, 'climate': 'Rain Forests'}, - ], - columns=[ - { - 'id': 'ind', - 'name': '' - }, - { - 'id': 'temp', - 'name': 'Temperature' - }, - { - 'id': 'climate', - 'name': 'Climate' - }, - ], - editable=True - ), - html.Div(id='container') -]) - - -@app.callback( - Output('container', 'children'), - [Input('table', 'dataframe_timestamp')], - [State('table', 'dataframe'), - State('table', 'dataframe_previous')]) -def display_data(timestamp, dataframe, dataframe_previous): - changes = [] - for (i, row) in enumerate(dataframe): - row_prev = dataframe_previous[i] - for col in row: - if row[col] != row_prev[col]: - changes.append(u'rows[{}][{}] = {} ➡ {}'.format( - i, col, row_prev[col], row[col] - )) - - return html.Pre('\n'.join(changes), style={'fontSize': 20}) - - -if __name__ == '__main__': - app.run_server(debug=True) diff --git a/v_be_page_usage.py b/v_be_page_usage.py deleted file mode 100644 index f18964e82..000000000 --- a/v_be_page_usage.py +++ /dev/null @@ -1,81 +0,0 @@ -import dash -from dash.dependencies import Input, Output, State - -import dash_html_components as html -import dash_table - -import pandas as pd -df = pd.read_csv('https://github.com/plotly/datasets/raw/master/26k-consumer-complaints.csv') -df = df.values - -app = dash.Dash() -app.css.config.serve_locally = True -app.scripts.config.serve_locally = True - -app.layout = html.Div([ - html.Div( - id='container', - children='Hello World' - ), - dash_table.Table( - id='table', - dataframe=[], - virtualization='be', - virtualization_settings={ - 'displayed_pages': 1, - 'current_page': 0, - 'page_size': 5 - }, - navigation='page', - columns=[ - {'id': 0, 'name': 'Complaint ID'}, - {'id': 1, 'name': 'Product'}, - {'id': 2, 'name': 'Sub-product'}, - {'id': 3, 'name': 'Issue'}, - {'id': 4, 'name': 'Sub-issue'}, - {'id': 5, 'name': 'State'}, - {'id': 6, 'name': 'ZIP'}, - {'id': 7, 'name': 'code'}, - {'id': 8, 'name': 'Date received'}, - {'id': 9, 'name': 'Date sent to company'}, - {'id': 10, 'name': 'Company'}, - {'id': 11, 'name': 'Company response'}, - {'id': 12, 'name': 'Timely response?'}, - {'id': 13, 'name': 'Consumer disputed?'} - ], - editable=True - ) -]) - -@app.callback( - Output('table', 'dataframe'), - [Input('table', 'virtualization_settings')] -) -def updateDataframe(virtualization_settings): - print(virtualization_settings) - - current_page = virtualization_settings['current_page'] - displayed_pages = virtualization_settings['displayed_pages'] - page_size = virtualization_settings['page_size'] - - start_index = current_page * page_size - end_index = start_index + displayed_pages * page_size - print(str(start_index) + ',' + str(end_index)) - - return df[start_index:end_index] - -hidden = False -@app.callback( - Output('container', 'hidden'), - [Input('table', 'virtual_dataframe'), Input('table', 'virtual_dataframe_indices')] -) -def updateVirtualDataframe(virtual_dataframe, virtual_dataframe_indices): - print(virtual_dataframe) - - global hidden - - hidden = not hidden - return hidden - -if __name__ == '__main__': - app.run_server(debug=True) diff --git a/v_fe_page_usage.py b/v_fe_page_usage.py deleted file mode 100644 index a7652c149..000000000 --- a/v_fe_page_usage.py +++ /dev/null @@ -1,46 +0,0 @@ -import dash -from dash.dependencies import Input, Output, State - -import dash_html_components as html -import dash_table - -import pandas as pd -df = pd.read_csv('https://github.com/plotly/datasets/raw/master/26k-consumer-complaints.csv') -df = df.values - -app = dash.Dash() -app.css.config.serve_locally = True -app.scripts.config.serve_locally = True - -app.layout = html.Div([ - dash_table.Table( - id='table', - dataframe=df, - virtualization='fe', - virtualization_settings={ - 'current_page': 0, - 'displayed_pages': 1, - 'page_size': 500 - }, - columns=[ - {'id': 0, 'name': 'Complaint ID'}, - {'id': 1, 'name': 'Product'}, - {'id': 2, 'name': 'Sub-product'}, - {'id': 3, 'name': 'Issue'}, - {'id': 4, 'name': 'Sub-issue'}, - {'id': 5, 'name': 'State'}, - {'id': 6, 'name': 'ZIP'}, - {'id': 7, 'name': 'code'}, - {'id': 8, 'name': 'Date received'}, - {'id': 9, 'name': 'Date sent to company'}, - {'id': 10, 'name': 'Company'}, - {'id': 11, 'name': 'Company response'}, - {'id': 12, 'name': 'Timely response?'}, - {'id': 13, 'name': 'Consumer disputed?'} - ], - editable=True - ) -]) - -if __name__ == '__main__': - app.run_server(debug=True)