From 59d0ba8921c2e0886b0c34705ac5a74f35ab4e43 Mon Sep 17 00:00:00 2001 From: Ghislain B Date: Thu, 9 Jul 2020 08:12:57 -0400 Subject: [PATCH] feat(footer): add Custom Footer component (#5) * feat(footer): add Custom Footer component as vanilla JS/TS with Unit & E2E tests --- README.md | 26 +- docs/app.a5da56b69f47a82084ee.bundle.css | 2 +- docs/app.b0549aeeb865e0f3c1b2.bundle.js | 299 ------------ docs/app.b0549aeeb865e0f3c1b2.bundle.map | 1 - docs/app.fe29ab69d904d58efc09.bundle.js | 297 ++++++++++++ docs/app.fe29ab69d904d58efc09.bundle.map | 1 + docs/index.html | 2 +- package.json | 14 +- packages/common/README.md | 6 +- packages/common/package.json | 10 +- packages/common/src/global-grid-options.ts | 2 +- packages/common/src/styles/_variables.scss | 1 + .../common/src/styles/material-svg-icons.scss | 35 ++ packages/common/src/styles/slick-footer.scss | 1 + packages/excel-export/README.md | 2 +- packages/excel-export/package.json | 2 +- packages/file-export/package.json | 2 +- packages/graphql/README.md | 2 +- packages/graphql/package.json | 3 + packages/odata/README.md | 2 +- packages/vanilla-bundle/README.md | 9 +- packages/vanilla-bundle/package.json | 4 +- .../components/__tests__/slick-footer.spec.ts | 207 ++++++++ .../__tests__/slick-pagination.spec.ts | 10 +- .../src/components/slick-footer.ts | 187 +++++++ .../src/components/slick-pagination.ts | 2 +- .../services/__tests__/binding.helper.spec.ts | 21 + .../src/services/binding.helper.ts | 18 +- .../src/services/footer.service.ts | 95 ---- packages/vanilla-bundle/src/services/index.ts | 1 - .../vanilla-bundle/src/vanilla-grid-bundle.ts | 24 +- packages/web-demo-vanilla-bundle/README.md | 8 +- packages/web-demo-vanilla-bundle/package.json | 13 +- .../src/examples/example01.ts | 12 +- .../src/examples/example02.ts | 3 +- .../src/examples/example03.ts | 2 +- .../src/examples/example04.html | 9 + .../src/examples/example04.ts | 16 +- .../src/examples/example05.ts | 2 +- .../src/examples/example06.html | 5 +- .../src/examples/example06.ts | 2 +- .../src/examples/example07.ts | 2 +- .../src/examples/example08.html | 17 +- .../src/examples/example08.ts | 15 +- .../src/examples/example09.ts | 4 +- .../src/examples/example10.ts | 4 +- .../src/examples/example50.ts | 2 +- .../src/examples/example51.ts | 2 +- test/cypress/integration/example01.spec.js | 459 ++++++++++++++++++ test/cypress/integration/example02.spec.js | 88 ++++ test/cypress/integration/example04.spec.js | 99 ++++ test/cypress/integration/example06.spec.js | 175 +++++++ test/cypress/integration/example07.spec.js | 90 ++++ test/cypress/integration/example08.spec.js | 121 +++++ test/cypress/integration/example09.spec.js | 48 +- test/cypress/integration/example10.spec.js | 30 +- test/translateServiceStub.ts | 1 + yarn.lock | 234 ++++----- 58 files changed, 2103 insertions(+), 648 deletions(-) delete mode 100644 docs/app.b0549aeeb865e0f3c1b2.bundle.js delete mode 100644 docs/app.b0549aeeb865e0f3c1b2.bundle.map create mode 100644 docs/app.fe29ab69d904d58efc09.bundle.js create mode 100644 docs/app.fe29ab69d904d58efc09.bundle.map create mode 100644 packages/vanilla-bundle/src/components/__tests__/slick-footer.spec.ts create mode 100644 packages/vanilla-bundle/src/components/slick-footer.ts delete mode 100644 packages/vanilla-bundle/src/services/footer.service.ts create mode 100644 test/cypress/integration/example01.spec.js create mode 100644 test/cypress/integration/example02.spec.js create mode 100644 test/cypress/integration/example04.spec.js create mode 100644 test/cypress/integration/example06.spec.js create mode 100644 test/cypress/integration/example07.spec.js create mode 100644 test/cypress/integration/example08.spec.js diff --git a/README.md b/README.md index 868c00063..57ef5c207 100644 --- a/README.md +++ b/README.md @@ -35,17 +35,19 @@ and [Aurelia-Slickgrid](https://github.com/ghiscoding/aurelia-slickgrid) to use Note however that this project also has a Vanilla Implementation (not associated to any framework) and it is also used to test with the UI portion. The Vanilla bundle is also used in our SalesForce (with Lightning Web Component) hence the creation of this monorepo. -#### The main packages structure is the following -- `@slickgrid-universal/common`: commonly used Formatters/Editors/Filters/Services/... - - this can then be used by any Framework (Angular, Aurelia, VanillaJS, ...) -- `@slickgrid-universal/excel-export`: export to Excel (xls/xlsx) -- `@slickgrid-universal/file-export`: export to text file (csv/txt) -- `@slickgrid-universal/graphql`: GraphQL querying (support Filter/Sort/Pagination with a GraphQL backend Server) -- `@slickgrid-universal/odata`: OData querying (support Filter/Sort/Pagination with an OData backend Server) -- `@slickgrid-universal/vanilla-bundle`: a vanilla TypeScript/JavaScript implementation (framework-less) - -   -- **Standalone Package** - - `slickgrid-universal/web-demo-vanilla-bundle` standalone package for demo purposes and UI testing (not a public package) +### Available Packages + +| Package Name | Description | Publish | +| --------| ----------- | ------------- | +| [@slickgrid-universal/common](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/common) | commonly used Formatters/Editors/Filters/Services/... | public | +| [@slickgrid-universal/excel-export](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/excel-export) | export to Excel (xls/xlsx) | public | +| [@slickgrid-universal/file-export](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/file-export) | export to text file (csv/txt) | public | +| [@slickgrid-universal/graphql](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/graphql) | GraphQL querying (support Filter/Sort/Pagination with a GraphQL backend Server) | public | +| [@slickgrid-universal/odata](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/odata) | OData querying (support Filter/Sort/Pagination with an OData backend Server) | public | +| [@slickgrid-universal/vanilla-bundle](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/vanilla-bundle) | a vanilla TypeScript/JavaScript implementation | public | +| | | | +| [slickgrid-universal/web-demo-vanilla-bundle](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/web-demo-vanilla-bundle) | standalone package for demo purposes and UI testing (therefore not a public package) | private | + ### Installation To get going with this monorepo, you will need to clone the repo and then follow the steps below @@ -125,10 +127,10 @@ npm run test:watch - [x] Sort - [ ] Others / Vanilla Implementation - [x] Custom Footer - - [ ] add unit tests (possibly rewrite component in vanilla JS) - [x] Backend Services + Pagination - [x] Local Pagination - [x] Grid Presets + - [ ] Preset Row Selections - [ ] Dynamically Add Columns - [ ] Translations Support - [ ] Tree Data diff --git a/docs/app.a5da56b69f47a82084ee.bundle.css b/docs/app.a5da56b69f47a82084ee.bundle.css index f36f246ef..d51d78b85 100644 --- a/docs/app.a5da56b69f47a82084ee.bundle.css +++ b/docs/app.a5da56b69f47a82084ee.bundle.css @@ -204,4 +204,4 @@ /*rtl:end:ignore*/ .flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9;}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px;}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto;}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%;}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,0.15);-webkit-box-sizing:border-box;box-sizing:border-box;}.numInputWrapper span:hover{background:rgba(0,0,0,0.1)}.numInputWrapper span:active{background:rgba(0,0,0,0.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0;}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,0.6);top:26%}.numInputWrapper span.arrowDown{top:50%;}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,0.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto;}.numInputWrapper span svg path{fill:rgba(0,0,0,0.5)}.numInputWrapper:hover{background:rgba(0,0,0,0.05);}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0;}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\0;display:inline-block;}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:rgba(0,0,0,0.9)}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:rgba(0,0,0,0.9)}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield;}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:rgba(0,0,0,0.5);background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto;}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px;}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:rgba(0,0,0,0.54);line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px;}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1;}.dayContainer + .dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center;}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9;}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:rgba(57,57,57,0.3);background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:rgba(57,57,57,0.1)}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left;}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:rgba(57,57,57,0.3);background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left;}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield;}.flatpickr-time input.flatpickr-hour{font-weight:bold}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:bold;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}} -/*# sourceMappingURL=app.b0549aeeb865e0f3c1b2.bundle.map*/ \ No newline at end of file +/*# sourceMappingURL=app.fe29ab69d904d58efc09.bundle.map*/ \ No newline at end of file diff --git a/docs/app.b0549aeeb865e0f3c1b2.bundle.js b/docs/app.b0549aeeb865e0f3c1b2.bundle.js deleted file mode 100644 index fb4db9c2f..000000000 --- a/docs/app.b0549aeeb865e0f3c1b2.bundle.js +++ /dev/null @@ -1,299 +0,0 @@ -!function(e){var t={};function i(r){if(t[r])return t[r].exports;var _=t[r]={i:r,l:!1,exports:{}};return e[r].call(_.exports,_,_.exports,i),_.l=!0,_.exports}i.m=e,i.c=t,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var _ in e)i.d(r,_,function(t){return e[t]}.bind(null,_));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=272)}([function(e,t,i){"use strict";i.r(t);var r=i(60);i.d(t,"CaseType",(function(){return r.a}));var _=i(61);i.d(t,"DelimiterType",(function(){return _.a}));var n=i(40);i.d(t,"EmitterType",(function(){return n.a}));var o=i(62);i.d(t,"EventNamingStyle",(function(){return o.a}));var c=i(9);i.d(t,"ExtensionName",(function(){return c.a}));var a=i(7);i.d(t,"FieldType",(function(){return a.a}));var l=i(63);i.d(t,"FileType",(function(){return l.a}));var s=i(64);i.d(t,"FilterMultiplePassType",(function(){return s.a}));var d=i(65);for(var u in d)["CaseType","DelimiterType","EmitterType","EventNamingStyle","ExtensionName","FieldType","FileType","FilterMultiplePassType","default"].indexOf(u)<0&&function(e){i.d(t,e,(function(){return d[e]}))}(u);var m=i(66);i.d(t,"GridAutosizeColsMode",(function(){return m.a}));var p=i(67);i.d(t,"GridStateType",(function(){return p.a}));var f=i(13);i.d(t,"KeyCode",(function(){return f.a}));var h=i(68);for(var u in h)["CaseType","DelimiterType","EmitterType","EventNamingStyle","ExtensionName","FieldType","FileType","FilterMultiplePassType","GridAutosizeColsMode","GridStateType","KeyCode","default"].indexOf(u)<0&&function(e){i.d(t,e,(function(){return h[e]}))}(u);var g=i(29);i.d(t,"OperatorType",(function(){return g.a}));var P=i(69);for(var u in P)["CaseType","DelimiterType","EmitterType","EventNamingStyle","ExtensionName","FieldType","FileType","FilterMultiplePassType","GridAutosizeColsMode","GridStateType","KeyCode","OperatorType","default"].indexOf(u)<0&&function(e){i.d(t,e,(function(){return P[e]}))}(u);var E=i(70);for(var u in E)["CaseType","DelimiterType","EmitterType","EventNamingStyle","ExtensionName","FieldType","FileType","FilterMultiplePassType","GridAutosizeColsMode","GridStateType","KeyCode","OperatorType","default"].indexOf(u)<0&&function(e){i.d(t,e,(function(){return E[e]}))}(u);var b=i(71);i.d(t,"SortDirection",(function(){return b.a}));var S=i(28);i.d(t,"SortDirectionNumber",(function(){return S.a}));var x=i(72);for(var u in x)["CaseType","DelimiterType","EmitterType","EventNamingStyle","ExtensionName","FieldType","FileType","FilterMultiplePassType","GridAutosizeColsMode","GridStateType","KeyCode","OperatorType","SortDirection","SortDirectionNumber","default"].indexOf(u)<0&&function(e){i.d(t,e,(function(){return x[e]}))}(u);var A=i(73);for(var u in A)["CaseType","DelimiterType","EmitterType","EventNamingStyle","ExtensionName","FieldType","FileType","FilterMultiplePassType","GridAutosizeColsMode","GridStateType","KeyCode","OperatorType","SortDirection","SortDirectionNumber","default"].indexOf(u)<0&&function(e){i.d(t,e,(function(){return A[e]}))}(u)},function(e,t,i){"use strict";i.d(t,"Utilities",(function(){return b}));i(284);var r=i(6);i.d(t,"Constants",(function(){return r.a}));var _=i(39);i.d(t,"GlobalGridOptions",(function(){return _.a}));var n=i(0);i.o(n,"Aggregators")&&i.d(t,"Aggregators",(function(){return n.Aggregators})),i.o(n,"AutoTooltipExtension")&&i.d(t,"AutoTooltipExtension",(function(){return n.AutoTooltipExtension})),i.o(n,"CaseType")&&i.d(t,"CaseType",(function(){return n.CaseType})),i.o(n,"CellExternalCopyManagerExtension")&&i.d(t,"CellExternalCopyManagerExtension",(function(){return n.CellExternalCopyManagerExtension})),i.o(n,"CellMenuExtension")&&i.d(t,"CellMenuExtension",(function(){return n.CellMenuExtension})),i.o(n,"CheckboxSelectorExtension")&&i.d(t,"CheckboxSelectorExtension",(function(){return n.CheckboxSelectorExtension})),i.o(n,"CollectionService")&&i.d(t,"CollectionService",(function(){return n.CollectionService})),i.o(n,"ColumnPickerExtension")&&i.d(t,"ColumnPickerExtension",(function(){return n.ColumnPickerExtension})),i.o(n,"ContextMenuExtension")&&i.d(t,"ContextMenuExtension",(function(){return n.ContextMenuExtension})),i.o(n,"DraggableGroupingExtension")&&i.d(t,"DraggableGroupingExtension",(function(){return n.DraggableGroupingExtension})),i.o(n,"Editors")&&i.d(t,"Editors",(function(){return n.Editors})),i.o(n,"EventNamingStyle")&&i.d(t,"EventNamingStyle",(function(){return n.EventNamingStyle})),i.o(n,"ExtensionName")&&i.d(t,"ExtensionName",(function(){return n.ExtensionName})),i.o(n,"ExtensionService")&&i.d(t,"ExtensionService",(function(){return n.ExtensionService})),i.o(n,"ExtensionUtility")&&i.d(t,"ExtensionUtility",(function(){return n.ExtensionUtility})),i.o(n,"FieldType")&&i.d(t,"FieldType",(function(){return n.FieldType})),i.o(n,"FileType")&&i.d(t,"FileType",(function(){return n.FileType})),i.o(n,"FilterFactory")&&i.d(t,"FilterFactory",(function(){return n.FilterFactory})),i.o(n,"FilterService")&&i.d(t,"FilterService",(function(){return n.FilterService})),i.o(n,"Filters")&&i.d(t,"Filters",(function(){return n.Filters})),i.o(n,"Formatters")&&i.d(t,"Formatters",(function(){return n.Formatters})),i.o(n,"GridEventService")&&i.d(t,"GridEventService",(function(){return n.GridEventService})),i.o(n,"GridMenuExtension")&&i.d(t,"GridMenuExtension",(function(){return n.GridMenuExtension})),i.o(n,"GridService")&&i.d(t,"GridService",(function(){return n.GridService})),i.o(n,"GridStateService")&&i.d(t,"GridStateService",(function(){return n.GridStateService})),i.o(n,"GridStateType")&&i.d(t,"GridStateType",(function(){return n.GridStateType})),i.o(n,"GroupItemMetaProviderExtension")&&i.d(t,"GroupItemMetaProviderExtension",(function(){return n.GroupItemMetaProviderExtension})),i.o(n,"GroupTotalFormatters")&&i.d(t,"GroupTotalFormatters",(function(){return n.GroupTotalFormatters})),i.o(n,"GroupingAndColspanService")&&i.d(t,"GroupingAndColspanService",(function(){return n.GroupingAndColspanService})),i.o(n,"HeaderButtonExtension")&&i.d(t,"HeaderButtonExtension",(function(){return n.HeaderButtonExtension})),i.o(n,"HeaderMenuExtension")&&i.d(t,"HeaderMenuExtension",(function(){return n.HeaderMenuExtension})),i.o(n,"OperatorType")&&i.d(t,"OperatorType",(function(){return n.OperatorType})),i.o(n,"PaginationService")&&i.d(t,"PaginationService",(function(){return n.PaginationService})),i.o(n,"RowMoveManagerExtension")&&i.d(t,"RowMoveManagerExtension",(function(){return n.RowMoveManagerExtension})),i.o(n,"RowSelectionExtension")&&i.d(t,"RowSelectionExtension",(function(){return n.RowSelectionExtension})),i.o(n,"SharedService")&&i.d(t,"SharedService",(function(){return n.SharedService})),i.o(n,"SortComparers")&&i.d(t,"SortComparers",(function(){return n.SortComparers})),i.o(n,"SortDirection")&&i.d(t,"SortDirection",(function(){return n.SortDirection})),i.o(n,"SortDirectionNumber")&&i.d(t,"SortDirectionNumber",(function(){return n.SortDirectionNumber})),i.o(n,"SortService")&&i.d(t,"SortService",(function(){return n.SortService})),i.o(n,"TreeDataService")&&i.d(t,"TreeDataService",(function(){return n.TreeDataService})),i.o(n,"addWhiteSpaces")&&i.d(t,"addWhiteSpaces",(function(){return n.addWhiteSpaces})),i.o(n,"convertParentChildArrayToHierarchicalView")&&i.d(t,"convertParentChildArrayToHierarchicalView",(function(){return n.convertParentChildArrayToHierarchicalView})),i.o(n,"deepCopy")&&i.d(t,"deepCopy",(function(){return n.deepCopy})),i.o(n,"executeBackendProcessesCallback")&&i.d(t,"executeBackendProcessesCallback",(function(){return n.executeBackendProcessesCallback})),i.o(n,"exportWithFormatterWhenDefined")&&i.d(t,"exportWithFormatterWhenDefined",(function(){return n.exportWithFormatterWhenDefined})),i.o(n,"findItemInHierarchicalStructure")&&i.d(t,"findItemInHierarchicalStructure",(function(){return n.findItemInHierarchicalStructure})),i.o(n,"getHtmlElementOffset")&&i.d(t,"getHtmlElementOffset",(function(){return n.getHtmlElementOffset})),i.o(n,"getTranslationPrefix")&&i.d(t,"getTranslationPrefix",(function(){return n.getTranslationPrefix})),i.o(n,"htmlEntityDecode")&&i.d(t,"htmlEntityDecode",(function(){return n.htmlEntityDecode})),i.o(n,"mapMomentDateFormatWithFieldType")&&i.d(t,"mapMomentDateFormatWithFieldType",(function(){return n.mapMomentDateFormatWithFieldType})),i.o(n,"mapOperatorByFieldType")&&i.d(t,"mapOperatorByFieldType",(function(){return n.mapOperatorByFieldType})),i.o(n,"mapOperatorType")&&i.d(t,"mapOperatorType",(function(){return n.mapOperatorType})),i.o(n,"onBackendError")&&i.d(t,"onBackendError",(function(){return n.onBackendError})),i.o(n,"parseUtcDate")&&i.d(t,"parseUtcDate",(function(){return n.parseUtcDate})),i.o(n,"refreshBackendDataset")&&i.d(t,"refreshBackendDataset",(function(){return n.refreshBackendDataset})),i.o(n,"sanitizeHtmlToText")&&i.d(t,"sanitizeHtmlToText",(function(){return n.sanitizeHtmlToText})),i.o(n,"titleCase")&&i.d(t,"titleCase",(function(){return n.titleCase})),i.o(n,"toKebabCase")&&i.d(t,"toKebabCase",(function(){return n.toKebabCase}));var o=i(75);i.o(o,"Aggregators")&&i.d(t,"Aggregators",(function(){return o.Aggregators})),i.o(o,"AutoTooltipExtension")&&i.d(t,"AutoTooltipExtension",(function(){return o.AutoTooltipExtension})),i.o(o,"CaseType")&&i.d(t,"CaseType",(function(){return o.CaseType})),i.o(o,"CellExternalCopyManagerExtension")&&i.d(t,"CellExternalCopyManagerExtension",(function(){return o.CellExternalCopyManagerExtension})),i.o(o,"CellMenuExtension")&&i.d(t,"CellMenuExtension",(function(){return o.CellMenuExtension})),i.o(o,"CheckboxSelectorExtension")&&i.d(t,"CheckboxSelectorExtension",(function(){return o.CheckboxSelectorExtension})),i.o(o,"CollectionService")&&i.d(t,"CollectionService",(function(){return o.CollectionService})),i.o(o,"ColumnPickerExtension")&&i.d(t,"ColumnPickerExtension",(function(){return o.ColumnPickerExtension})),i.o(o,"ContextMenuExtension")&&i.d(t,"ContextMenuExtension",(function(){return o.ContextMenuExtension})),i.o(o,"DraggableGroupingExtension")&&i.d(t,"DraggableGroupingExtension",(function(){return o.DraggableGroupingExtension})),i.o(o,"Editors")&&i.d(t,"Editors",(function(){return o.Editors})),i.o(o,"EventNamingStyle")&&i.d(t,"EventNamingStyle",(function(){return o.EventNamingStyle})),i.o(o,"ExtensionName")&&i.d(t,"ExtensionName",(function(){return o.ExtensionName})),i.o(o,"ExtensionService")&&i.d(t,"ExtensionService",(function(){return o.ExtensionService})),i.o(o,"ExtensionUtility")&&i.d(t,"ExtensionUtility",(function(){return o.ExtensionUtility})),i.o(o,"FieldType")&&i.d(t,"FieldType",(function(){return o.FieldType})),i.o(o,"FileType")&&i.d(t,"FileType",(function(){return o.FileType})),i.o(o,"FilterFactory")&&i.d(t,"FilterFactory",(function(){return o.FilterFactory})),i.o(o,"FilterService")&&i.d(t,"FilterService",(function(){return o.FilterService})),i.o(o,"Filters")&&i.d(t,"Filters",(function(){return o.Filters})),i.o(o,"Formatters")&&i.d(t,"Formatters",(function(){return o.Formatters})),i.o(o,"GridEventService")&&i.d(t,"GridEventService",(function(){return o.GridEventService})),i.o(o,"GridMenuExtension")&&i.d(t,"GridMenuExtension",(function(){return o.GridMenuExtension})),i.o(o,"GridService")&&i.d(t,"GridService",(function(){return o.GridService})),i.o(o,"GridStateService")&&i.d(t,"GridStateService",(function(){return o.GridStateService})),i.o(o,"GridStateType")&&i.d(t,"GridStateType",(function(){return o.GridStateType})),i.o(o,"GroupItemMetaProviderExtension")&&i.d(t,"GroupItemMetaProviderExtension",(function(){return o.GroupItemMetaProviderExtension})),i.o(o,"GroupTotalFormatters")&&i.d(t,"GroupTotalFormatters",(function(){return o.GroupTotalFormatters})),i.o(o,"GroupingAndColspanService")&&i.d(t,"GroupingAndColspanService",(function(){return o.GroupingAndColspanService})),i.o(o,"HeaderButtonExtension")&&i.d(t,"HeaderButtonExtension",(function(){return o.HeaderButtonExtension})),i.o(o,"HeaderMenuExtension")&&i.d(t,"HeaderMenuExtension",(function(){return o.HeaderMenuExtension})),i.o(o,"OperatorType")&&i.d(t,"OperatorType",(function(){return o.OperatorType})),i.o(o,"PaginationService")&&i.d(t,"PaginationService",(function(){return o.PaginationService})),i.o(o,"RowMoveManagerExtension")&&i.d(t,"RowMoveManagerExtension",(function(){return o.RowMoveManagerExtension})),i.o(o,"RowSelectionExtension")&&i.d(t,"RowSelectionExtension",(function(){return o.RowSelectionExtension})),i.o(o,"SharedService")&&i.d(t,"SharedService",(function(){return o.SharedService})),i.o(o,"SortComparers")&&i.d(t,"SortComparers",(function(){return o.SortComparers})),i.o(o,"SortDirection")&&i.d(t,"SortDirection",(function(){return o.SortDirection})),i.o(o,"SortDirectionNumber")&&i.d(t,"SortDirectionNumber",(function(){return o.SortDirectionNumber})),i.o(o,"SortService")&&i.d(t,"SortService",(function(){return o.SortService})),i.o(o,"TreeDataService")&&i.d(t,"TreeDataService",(function(){return o.TreeDataService})),i.o(o,"addWhiteSpaces")&&i.d(t,"addWhiteSpaces",(function(){return o.addWhiteSpaces})),i.o(o,"convertParentChildArrayToHierarchicalView")&&i.d(t,"convertParentChildArrayToHierarchicalView",(function(){return o.convertParentChildArrayToHierarchicalView})),i.o(o,"deepCopy")&&i.d(t,"deepCopy",(function(){return o.deepCopy})),i.o(o,"executeBackendProcessesCallback")&&i.d(t,"executeBackendProcessesCallback",(function(){return o.executeBackendProcessesCallback})),i.o(o,"exportWithFormatterWhenDefined")&&i.d(t,"exportWithFormatterWhenDefined",(function(){return o.exportWithFormatterWhenDefined})),i.o(o,"findItemInHierarchicalStructure")&&i.d(t,"findItemInHierarchicalStructure",(function(){return o.findItemInHierarchicalStructure})),i.o(o,"getHtmlElementOffset")&&i.d(t,"getHtmlElementOffset",(function(){return o.getHtmlElementOffset})),i.o(o,"getTranslationPrefix")&&i.d(t,"getTranslationPrefix",(function(){return o.getTranslationPrefix})),i.o(o,"htmlEntityDecode")&&i.d(t,"htmlEntityDecode",(function(){return o.htmlEntityDecode})),i.o(o,"mapMomentDateFormatWithFieldType")&&i.d(t,"mapMomentDateFormatWithFieldType",(function(){return o.mapMomentDateFormatWithFieldType})),i.o(o,"mapOperatorByFieldType")&&i.d(t,"mapOperatorByFieldType",(function(){return o.mapOperatorByFieldType})),i.o(o,"mapOperatorType")&&i.d(t,"mapOperatorType",(function(){return o.mapOperatorType})),i.o(o,"onBackendError")&&i.d(t,"onBackendError",(function(){return o.onBackendError})),i.o(o,"parseUtcDate")&&i.d(t,"parseUtcDate",(function(){return o.parseUtcDate})),i.o(o,"refreshBackendDataset")&&i.d(t,"refreshBackendDataset",(function(){return o.refreshBackendDataset})),i.o(o,"sanitizeHtmlToText")&&i.d(t,"sanitizeHtmlToText",(function(){return o.sanitizeHtmlToText})),i.o(o,"titleCase")&&i.d(t,"titleCase",(function(){return o.titleCase})),i.o(o,"toKebabCase")&&i.d(t,"toKebabCase",(function(){return o.toKebabCase}));var c=i(17);i.d(t,"CollectionService",(function(){return c.a})),i.d(t,"ExtensionService",(function(){return c.b})),i.d(t,"FilterService",(function(){return c.c})),i.d(t,"GridEventService",(function(){return c.d})),i.d(t,"GridService",(function(){return c.e})),i.d(t,"GridStateService",(function(){return c.f})),i.d(t,"GroupingAndColspanService",(function(){return c.g})),i.d(t,"PaginationService",(function(){return c.h})),i.d(t,"SharedService",(function(){return c.i})),i.d(t,"SortService",(function(){return c.j})),i.d(t,"TreeDataService",(function(){return c.k})),i.d(t,"addWhiteSpaces",(function(){return c.l})),i.d(t,"convertParentChildArrayToHierarchicalView",(function(){return c.m})),i.d(t,"deepCopy",(function(){return c.n})),i.d(t,"executeBackendProcessesCallback",(function(){return c.o})),i.d(t,"exportWithFormatterWhenDefined",(function(){return c.p})),i.d(t,"findItemInHierarchicalStructure",(function(){return c.q})),i.d(t,"getHtmlElementOffset",(function(){return c.s})),i.d(t,"getTranslationPrefix",(function(){return c.t})),i.d(t,"htmlEntityDecode",(function(){return c.u})),i.d(t,"mapMomentDateFormatWithFieldType",(function(){return c.v})),i.d(t,"mapOperatorByFieldType",(function(){return c.w})),i.d(t,"mapOperatorType",(function(){return c.x})),i.d(t,"onBackendError",(function(){return c.y})),i.d(t,"parseUtcDate",(function(){return c.z})),i.d(t,"refreshBackendDataset",(function(){return c.A})),i.d(t,"sanitizeHtmlToText",(function(){return c.B})),i.d(t,"titleCase",(function(){return c.C})),i.d(t,"toKebabCase",(function(){return c.D}));var a=i(254);i.d(t,"Aggregators",(function(){return a.a}));var l=i(253);i.d(t,"Editors",(function(){return l.a}));var s=i(251);i.d(t,"AutoTooltipExtension",(function(){return s.a})),i.d(t,"CellExternalCopyManagerExtension",(function(){return s.b})),i.d(t,"CellMenuExtension",(function(){return s.c})),i.d(t,"CheckboxSelectorExtension",(function(){return s.d})),i.d(t,"ColumnPickerExtension",(function(){return s.e})),i.d(t,"ContextMenuExtension",(function(){return s.f})),i.d(t,"DraggableGroupingExtension",(function(){return s.g})),i.d(t,"ExtensionUtility",(function(){return s.h})),i.d(t,"GridMenuExtension",(function(){return s.i})),i.d(t,"GroupItemMetaProviderExtension",(function(){return s.j})),i.d(t,"HeaderButtonExtension",(function(){return s.k})),i.d(t,"HeaderMenuExtension",(function(){return s.l})),i.d(t,"RowMoveManagerExtension",(function(){return s.m})),i.d(t,"RowSelectionExtension",(function(){return s.n}));i(37);var d=i(50);i.d(t,"Filters",(function(){return d.a}));var u=i(217);i.d(t,"FilterFactory",(function(){return u.a}));var m=i(250);i.d(t,"Formatters",(function(){return m.a}));var p=i(252);i.d(t,"GroupTotalFormatters",(function(){return p.a}));var f=i(32);i.d(t,"SortComparers",(function(){return f.a})),i.d(t,"Enums",(function(){return n}));var h=i(2),g=i(18),P=i(218);i.d(t,"SlickgridConfig",(function(){return P.a}));var E=function(){return(E=Object.assign||function(e){for(var t,i=1,r=arguments.length;i":">",'"':""","'":"'"};return(e||"").toString().replace(/[&<>"']/g,(function(e){return t[e]}))}function p(e){return e.replace(/&#(\d+);/g,(function(e,t){return String.fromCharCode(t)}))}function f(e,t,i,r,_){if(void 0===r&&(r="."),void 0===_&&(_=""),isNaN(+e))return e;var n=void 0===t?2:t,o=void 0===i?2:i,c=String(Math.round(+e*Math.pow(10,o))/Math.pow(10,o));for(c.indexOf(".")<0&&n>0&&(c+=".");c.length-c.indexOf(".")<=n;)c+="0";var a,l,s=c.split(".");a=_?s.length>=1?T(s[0],_):void 0:s.length>=1?s[0]:c,s.length>1&&(l=s[1]);var d="";return void 0!==a&&void 0!==l?d=""+a+r+l:null!=a&&(d=a),d}function h(e,t,i,r,_,n,o,c){if(void 0===_&&(_=""),void 0===n&&(n=""),void 0===o&&(o="."),void 0===c&&(c=""),isNaN(+e))return e;var a=Math.round(1e6*parseFloat(e))/1e6;if(a<0){var l=Math.abs(a);return r?isNaN(t)&&isNaN(i)?"("+_+T(""+l,c)+n+")":"("+_+f(l,t,i,o,c)+n+")":isNaN(t)&&isNaN(i)?"-"+_+T(""+l,c)+n:"-"+_+f(l,t,i,o,c)+n}return isNaN(t)&&isNaN(i)?""+_+T(""+e,c)+n:""+_+f(e,t,i,o,c)+n}function g(e,t){return e&&t?t.split(".").reduce((function(e,t){return e&&e[t]}),e):e}function P(e){return e&&e.translationNamespace?e.translationNamespace+(e.translationNamespaceSeparator||""):""}function E(e){var t;switch(e){case _.FieldType.dateTime:case _.FieldType.dateTimeIso:t="YYYY-MM-DD HH:mm:ss";break;case _.FieldType.dateTimeIsoAmPm:t="YYYY-MM-DD hh:mm:ss a";break;case _.FieldType.dateTimeIsoAM_PM:t="YYYY-MM-DD hh:mm:ss A";break;case _.FieldType.dateTimeShortIso:t="YYYY-MM-DD HH:mm";break;case _.FieldType.dateEuro:t="DD/MM/YYYY";break;case _.FieldType.dateEuroShort:t="D/M/YY";break;case _.FieldType.dateTimeEuro:t="DD/MM/YYYY HH:mm:ss";break;case _.FieldType.dateTimeShortEuro:t="DD/MM/YYYY HH:mm";break;case _.FieldType.dateTimeEuroAmPm:t="DD/MM/YYYY hh:mm:ss a";break;case _.FieldType.dateTimeEuroAM_PM:t="DD/MM/YYYY hh:mm:ss A";break;case _.FieldType.dateTimeEuroShort:t="D/M/YY H:m:s";break;case _.FieldType.dateTimeEuroShortAmPm:t="D/M/YY h:m:s a";break;case _.FieldType.dateUs:t="MM/DD/YYYY";break;case _.FieldType.dateUsShort:t="M/D/YY";break;case _.FieldType.dateTimeUs:t="MM/DD/YYYY HH:mm:ss";break;case _.FieldType.dateTimeUsAmPm:t="MM/DD/YYYY hh:mm:ss a";break;case _.FieldType.dateTimeUsAM_PM:t="MM/DD/YYYY hh:mm:ss A";break;case _.FieldType.dateTimeUsShort:t="M/D/YY H:m:s";break;case _.FieldType.dateTimeUsShortAmPm:t="M/D/YY h:m:s a";break;case _.FieldType.dateTimeShortUs:t="MM/DD/YYYY HH:mm";break;case _.FieldType.dateUtc:t="YYYY-MM-DDTHH:mm:ss.SSSZ";break;case _.FieldType.date:case _.FieldType.dateIso:default:t="YYYY-MM-DD"}return t}function b(e){var t;switch(e){case _.FieldType.dateTime:case _.FieldType.dateTimeIso:t="Y-m-d H:i:S";break;case _.FieldType.dateTimeShortIso:t="Y-m-d H:i";break;case _.FieldType.dateTimeIsoAmPm:case _.FieldType.dateTimeIsoAM_PM:t="Y-m-d h:i:S K";break;case _.FieldType.dateEuro:t="d/m/Y";break;case _.FieldType.dateEuroShort:t="d/m/y";break;case _.FieldType.dateTimeEuro:t="d/m/Y H:i:S";break;case _.FieldType.dateTimeShortEuro:t="d/m/y H:i";break;case _.FieldType.dateTimeEuroAmPm:t="d/m/Y h:i:S K";break;case _.FieldType.dateTimeEuroAM_PM:t="d/m/Y h:i:s K";break;case _.FieldType.dateTimeEuroShort:t="d/m/y H:i:s";break;case _.FieldType.dateTimeEuroShortAmPm:t="d/m/y h:i:s K";break;case _.FieldType.dateUs:t="m/d/Y";break;case _.FieldType.dateUsShort:t="m/d/y";break;case _.FieldType.dateTimeUs:t="m/d/Y H:i:S";break;case _.FieldType.dateTimeShortUs:t="m/d/y H:i";break;case _.FieldType.dateTimeUsAmPm:t="m/d/Y h:i:S K";break;case _.FieldType.dateTimeUsAM_PM:t="m/d/Y h:i:s K";break;case _.FieldType.dateTimeUsShort:t="m/d/y H:i:s";break;case _.FieldType.dateTimeUsShortAmPm:t="m/d/y h:i:s K";break;case _.FieldType.dateUtc:t="Z";break;case _.FieldType.date:case _.FieldType.dateIso:default:t="Y-m-d"}return t}function S(e){var t;switch(e){case"<":case"LT":t=_.OperatorType.lessThan;break;case"<=":case"LE":t=_.OperatorType.lessThanOrEqual;break;case">":case"GT":t=_.OperatorType.greaterThan;break;case">=":case"GE":t=_.OperatorType.greaterThanOrEqual;break;case"<>":case"!=":case"NE":t=_.OperatorType.notEqual;break;case"*":case"a*":case"StartsWith":t=_.OperatorType.startsWith;break;case"*z":case"EndsWith":t=_.OperatorType.endsWith;break;case"=":case"==":case"EQ":t=_.OperatorType.equal;break;case"IN":t=_.OperatorType.in;break;case"NIN":case"NOT_IN":t=_.OperatorType.notIn;break;case"Not_Contains":case"NOT_CONTAINS":t=_.OperatorType.notContains;break;case"Contains":case"CONTAINS":default:t=_.OperatorType.contains}return t}function x(e){var t="";switch(e){case _.OperatorType.greaterThan:case">":t=">";break;case _.OperatorType.greaterThanOrEqual:case">=":t=">=";break;case _.OperatorType.lessThan:case"<":t="<";break;case _.OperatorType.lessThanOrEqual:case"<=":t="<=";break;case _.OperatorType.notEqual:case"<>":t="<>";break;case _.OperatorType.equal:case"=":case"==":case"EQ":t="=";break;case _.OperatorType.startsWith:case"a*":case"*":t="a*";break;case _.OperatorType.endsWith:case"*z":t="*z";break;default:t=e}return t}function A(e){var t;switch(e){case _.FieldType.string:case _.FieldType.unknown:t=_.OperatorType.contains;break;case _.FieldType.float:case _.FieldType.number:case _.FieldType.date:case _.FieldType.dateIso:case _.FieldType.dateUtc:case _.FieldType.dateTime:case _.FieldType.dateTimeIso:case _.FieldType.dateTimeIsoAmPm:case _.FieldType.dateTimeIsoAM_PM:case _.FieldType.dateEuro:case _.FieldType.dateEuroShort:case _.FieldType.dateTimeEuro:case _.FieldType.dateTimeEuroAmPm:case _.FieldType.dateTimeEuroAM_PM:case _.FieldType.dateTimeEuroShort:case _.FieldType.dateTimeEuroShortAmPm:case _.FieldType.dateTimeEuroShortAM_PM:case _.FieldType.dateUs:case _.FieldType.dateUsShort:case _.FieldType.dateTimeUs:case _.FieldType.dateTimeUsAmPm:case _.FieldType.dateTimeUsAM_PM:case _.FieldType.dateTimeUsShort:case _.FieldType.dateTimeUsShortAmPm:case _.FieldType.dateTimeUsShortAM_PM:default:t=_.OperatorType.equal}return t}function N(e){return/(true|1)/i.test(e+"")}function y(e,t){var i="";if("string"==typeof e&&/^[0-9\-\/]*$/.test(e)){var r=decodeURIComponent(e),_=n(new Date(r));_.isValid()&&4===_.year().toString().length&&(i=t?_.utc().format():_.format())}return i}function v(e){var t=document.createElement("div");return t.innerHTML=e,t.textContent||t.innerText||""}function C(e,t,i){if("string"==typeof t&&(t=t.split(".")),t.length>1){var r=t.shift();e&&void 0!==r&&C(e[r]="[object Object]"===Object.prototype.toString.call(e[r])?e[r]:{},t,i)}else e&&t[0]&&(e[t[0]]=i)}function T(e,t){if(void 0===t&&(t=","),null!=e){var i=""+e,r=i.split(".");return 2===r.length?r[0].replace(/\B(?=(\d{3})+(?!\d))/g,t)+"."+r[1]:i.replace(/\B(?=(\d{3})+(?!\d))/g,t)}return e}function M(e,t){return void 0===t&&(t=!1),"string"==typeof e?t?e.replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})):e.charAt(0).toUpperCase()+e.slice(1):e}function B(e){return"string"==typeof e?e.replace(/(?:^\w|[A-Z]|\b\w|[\s+\-_\/])/g,(function(e,t){return/[\s+\-_\/]/.test(e)?"":0===t?e.toLowerCase():e.toUpperCase()})):e}function I(e){return"string"==typeof e?B(e).replace(/([A-Z])/g,"-$1").toLowerCase():e}function R(e,t,i){if(void 0===i&&(i=!1),!(e&&t&&Array.isArray(e)&&Array.isArray(e)))return!1;if(e.length!==t.length)return!1;!i&&e.sort&&t.sort&&(e.sort(),t.sort());for(var r=0;r0?e.filter((function(t,i){return e.indexOf(t)>=i})):e}function L(e,t){if(void 0===t&&(t="id"),Array.isArray(e)&&e.length>0){for(var i=[],r=new Map,_=0,n=e;_0&&t-1 in e)}A.fn=A.prototype={jquery:"3.4.1",constructor:A,length:0,toArray:function(){return a.call(this)},get:function(e){return null==e?a.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=A.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return A.each(this,e)},map:function(e){return this.pushStack(A.map(this,(function(t,i){return e.call(t,i,t)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,i=+e+(e<0?t:0);return this.pushStack(i>=0&&i+~]|"+L+")"+L+"*"),W=new RegExp(L+"|>"),V=new RegExp(U),K=new RegExp("^"+Q+"$"),J={ID:new RegExp("^#("+Q+")"),CLASS:new RegExp("^\\.("+Q+")"),TAG:new RegExp("^("+Q+"|[*])"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+U),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+k+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,j=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ie=function(e,t,i){var r="0x"+t-65536;return r!=r||i?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,_e=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},ne=function(){u()},oe=be((function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{F.apply(B=D.call(S.childNodes),S.childNodes),B[S.childNodes.length].nodeType}catch(e){F={apply:B.length?function(e,t){R.apply(e,D.call(t))}:function(e,t){for(var i=e.length,r=0;e[i++]=t[r++];);e.length=i-1}}}function ce(e,t,r,_){var n,c,l,s,d,p,g,P=t&&t.ownerDocument,x=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==x&&9!==x&&11!==x)return r;if(!_&&((t?t.ownerDocument||t:S)!==m&&u(t),t=t||m,f)){if(11!==x&&(d=Z.exec(e)))if(n=d[1]){if(9===x){if(!(l=t.getElementById(n)))return r;if(l.id===n)return r.push(l),r}else if(P&&(l=P.getElementById(n))&&E(t,l)&&l.id===n)return r.push(l),r}else{if(d[2])return F.apply(r,t.getElementsByTagName(e)),r;if((n=d[3])&&i.getElementsByClassName&&t.getElementsByClassName)return F.apply(r,t.getElementsByClassName(n)),r}if(i.qsa&&!C[e+" "]&&(!h||!h.test(e))&&(1!==x||"object"!==t.nodeName.toLowerCase())){if(g=e,P=t,1===x&&W.test(e)){for((s=t.getAttribute("id"))?s=s.replace(re,_e):t.setAttribute("id",s=b),c=(p=o(e)).length;c--;)p[c]="#"+s+" "+Ee(p[c]);g=p.join(","),P=ee.test(e)&&ge(t.parentNode)||t}try{return F.apply(r,P.querySelectorAll(g)),r}catch(t){C(e,!0)}finally{s===b&&t.removeAttribute("id")}}}return a(e.replace(q,"$1"),t,r,_)}function ae(){var e=[];return function t(i,_){return e.push(i+" ")>r.cacheLength&&delete t[e.shift()],t[i+" "]=_}}function le(e){return e[b]=!0,e}function se(e){var t=m.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function de(e,t){for(var i=e.split("|"),_=i.length;_--;)r.attrHandle[i[_]]=t}function ue(e,t){var i=t&&e,r=i&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(i)for(;i=i.nextSibling;)if(i===t)return-1;return e?1:-1}function me(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var i=t.nodeName.toLowerCase();return("input"===i||"button"===i)&&t.type===e}}function fe(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&oe(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return le((function(t){return t=+t,le((function(i,r){for(var _,n=e([],i.length,t),o=n.length;o--;)i[_=n[o]]&&(i[_]=!(r[_]=i[_]))}))}))}function ge(e){return e&&void 0!==e.getElementsByTagName&&e}for(t in i=ce.support={},n=ce.isXML=function(e){var t=e.namespaceURI,i=(e.ownerDocument||e).documentElement;return!Y.test(t||i&&i.nodeName||"HTML")},u=ce.setDocument=function(e){var t,_,o=e?e.ownerDocument||e:S;return o!==m&&9===o.nodeType&&o.documentElement?(p=(m=o).documentElement,f=!n(m),S!==m&&(_=m.defaultView)&&_.top!==_&&(_.addEventListener?_.addEventListener("unload",ne,!1):_.attachEvent&&_.attachEvent("onunload",ne)),i.attributes=se((function(e){return e.className="i",!e.getAttribute("className")})),i.getElementsByTagName=se((function(e){return e.appendChild(m.createComment("")),!e.getElementsByTagName("*").length})),i.getElementsByClassName=$.test(m.getElementsByClassName),i.getById=se((function(e){return p.appendChild(e).id=b,!m.getElementsByName||!m.getElementsByName(b).length})),i.getById?(r.filter.ID=function(e){var t=e.replace(te,ie);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&f){var i=t.getElementById(e);return i?[i]:[]}}):(r.filter.ID=function(e){var t=e.replace(te,ie);return function(e){var i=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return i&&i.value===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&f){var i,r,_,n=t.getElementById(e);if(n){if((i=n.getAttributeNode("id"))&&i.value===e)return[n];for(_=t.getElementsByName(e),r=0;n=_[r++];)if((i=n.getAttributeNode("id"))&&i.value===e)return[n]}return[]}}),r.find.TAG=i.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):i.qsa?t.querySelectorAll(e):void 0}:function(e,t){var i,r=[],_=0,n=t.getElementsByTagName(e);if("*"===e){for(;i=n[_++];)1===i.nodeType&&r.push(i);return r}return n},r.find.CLASS=i.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&f)return t.getElementsByClassName(e)},g=[],h=[],(i.qsa=$.test(m.querySelectorAll))&&(se((function(e){p.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&h.push("[*^$]="+L+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||h.push("\\["+L+"*(?:value|"+k+")"),e.querySelectorAll("[id~="+b+"-]").length||h.push("~="),e.querySelectorAll(":checked").length||h.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||h.push(".#.+[+~]")})),se((function(e){e.innerHTML="";var t=m.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&h.push("name"+L+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&h.push(":enabled",":disabled"),p.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")}))),(i.matchesSelector=$.test(P=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&se((function(e){i.disconnectedMatch=P.call(e,"*"),P.call(e,"[s!='']:x"),g.push("!=",U)})),h=h.length&&new RegExp(h.join("|")),g=g.length&&new RegExp(g.join("|")),t=$.test(p.compareDocumentPosition),E=t||$.test(p.contains)?function(e,t){var i=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(i.contains?i.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},T=t?function(e,t){if(e===t)return d=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!i.sortDetached&&t.compareDocumentPosition(e)===r?e===m||e.ownerDocument===S&&E(S,e)?-1:t===m||t.ownerDocument===S&&E(S,t)?1:s?w(s,e)-w(s,t):0:4&r?-1:1)}:function(e,t){if(e===t)return d=!0,0;var i,r=0,_=e.parentNode,n=t.parentNode,o=[e],c=[t];if(!_||!n)return e===m?-1:t===m?1:_?-1:n?1:s?w(s,e)-w(s,t):0;if(_===n)return ue(e,t);for(i=e;i=i.parentNode;)o.unshift(i);for(i=t;i=i.parentNode;)c.unshift(i);for(;o[r]===c[r];)r++;return r?ue(o[r],c[r]):o[r]===S?-1:c[r]===S?1:0},m):m},ce.matches=function(e,t){return ce(e,null,null,t)},ce.matchesSelector=function(e,t){if((e.ownerDocument||e)!==m&&u(e),i.matchesSelector&&f&&!C[t+" "]&&(!g||!g.test(t))&&(!h||!h.test(t)))try{var r=P.call(e,t);if(r||i.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){C(t,!0)}return ce(t,m,null,[e]).length>0},ce.contains=function(e,t){return(e.ownerDocument||e)!==m&&u(e),E(e,t)},ce.attr=function(e,t){(e.ownerDocument||e)!==m&&u(e);var _=r.attrHandle[t.toLowerCase()],n=_&&M.call(r.attrHandle,t.toLowerCase())?_(e,t,!f):void 0;return void 0!==n?n:i.attributes||!f?e.getAttribute(t):(n=e.getAttributeNode(t))&&n.specified?n.value:null},ce.escape=function(e){return(e+"").replace(re,_e)},ce.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},ce.uniqueSort=function(e){var t,r=[],_=0,n=0;if(d=!i.detectDuplicates,s=!i.sortStable&&e.slice(0),e.sort(T),d){for(;t=e[n++];)t===e[n]&&(_=r.push(n));for(;_--;)e.splice(r[_],1)}return s=null,e},_=ce.getText=function(e){var t,i="",r=0,n=e.nodeType;if(n){if(1===n||9===n||11===n){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)i+=_(e)}else if(3===n||4===n)return e.nodeValue}else for(;t=e[r++];)i+=_(t);return i},(r=ce.selectors={cacheLength:50,createPseudo:le,match:J,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ie),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ie),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ce.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ce.error(e[0]),e},PSEUDO:function(e){var t,i=!e[6]&&e[2];return J.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":i&&V.test(i)&&(t=o(i,!0))&&(t=i.indexOf(")",i.length-t)-i.length)&&(e[0]=e[0].slice(0,t),e[2]=i.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ie).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=new RegExp("(^|"+L+")"+e+"("+L+"|$)"))&&N(e,(function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")}))},ATTR:function(e,t,i){return function(r){var _=ce.attr(r,e);return null==_?"!="===t:!t||(_+="","="===t?_===i:"!="===t?_!==i:"^="===t?i&&0===_.indexOf(i):"*="===t?i&&_.indexOf(i)>-1:"$="===t?i&&_.slice(-i.length)===i:"~="===t?(" "+_.replace(H," ")+" ").indexOf(i)>-1:"|="===t&&(_===i||_.slice(0,i.length+1)===i+"-"))}},CHILD:function(e,t,i,r,_){var n="nth"!==e.slice(0,3),o="last"!==e.slice(-4),c="of-type"===t;return 1===r&&0===_?function(e){return!!e.parentNode}:function(t,i,a){var l,s,d,u,m,p,f=n!==o?"nextSibling":"previousSibling",h=t.parentNode,g=c&&t.nodeName.toLowerCase(),P=!a&&!c,E=!1;if(h){if(n){for(;f;){for(u=t;u=u[f];)if(c?u.nodeName.toLowerCase()===g:1===u.nodeType)return!1;p=f="only"===e&&!p&&"nextSibling"}return!0}if(p=[o?h.firstChild:h.lastChild],o&&P){for(E=(m=(l=(s=(d=(u=h)[b]||(u[b]={}))[u.uniqueID]||(d[u.uniqueID]={}))[e]||[])[0]===x&&l[1])&&l[2],u=m&&h.childNodes[m];u=++m&&u&&u[f]||(E=m=0)||p.pop();)if(1===u.nodeType&&++E&&u===t){s[e]=[x,m,E];break}}else if(P&&(E=m=(l=(s=(d=(u=t)[b]||(u[b]={}))[u.uniqueID]||(d[u.uniqueID]={}))[e]||[])[0]===x&&l[1]),!1===E)for(;(u=++m&&u&&u[f]||(E=m=0)||p.pop())&&((c?u.nodeName.toLowerCase()!==g:1!==u.nodeType)||!++E||(P&&((s=(d=u[b]||(u[b]={}))[u.uniqueID]||(d[u.uniqueID]={}))[e]=[x,E]),u!==t)););return(E-=_)===r||E%r==0&&E/r>=0}}},PSEUDO:function(e,t){var i,_=r.pseudos[e]||r.setFilters[e.toLowerCase()]||ce.error("unsupported pseudo: "+e);return _[b]?_(t):_.length>1?(i=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?le((function(e,i){for(var r,n=_(e,t),o=n.length;o--;)e[r=w(e,n[o])]=!(i[r]=n[o])})):function(e){return _(e,0,i)}):_}},pseudos:{not:le((function(e){var t=[],i=[],r=c(e.replace(q,"$1"));return r[b]?le((function(e,t,i,_){for(var n,o=r(e,null,_,[]),c=e.length;c--;)(n=o[c])&&(e[c]=!(t[c]=n))})):function(e,_,n){return t[0]=e,r(t,null,n,i),t[0]=null,!i.pop()}})),has:le((function(e){return function(t){return ce(e,t).length>0}})),contains:le((function(e){return e=e.replace(te,ie),function(t){return(t.textContent||_(t)).indexOf(e)>-1}})),lang:le((function(e){return K.test(e||"")||ce.error("unsupported lang: "+e),e=e.replace(te,ie).toLowerCase(),function(t){var i;do{if(i=f?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(i=i.toLowerCase())===e||0===i.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}})),target:function(t){var i=e.location&&e.location.hash;return i&&i.slice(1)===t.id},root:function(e){return e===p},focus:function(e){return e===m.activeElement&&(!m.hasFocus||m.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:fe(!1),disabled:fe(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return X.test(e.nodeName)},input:function(e){return j.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he((function(){return[0]})),last:he((function(e,t){return[t-1]})),eq:he((function(e,t,i){return[i<0?i+t:i]})),even:he((function(e,t){for(var i=0;it?t:i;--r>=0;)e.push(r);return e})),gt:he((function(e,t,i){for(var r=i<0?i+t:i;++r1?function(t,i,r){for(var _=e.length;_--;)if(!e[_](t,i,r))return!1;return!0}:e[0]}function xe(e,t,i,r,_){for(var n,o=[],c=0,a=e.length,l=null!=t;c-1&&(n[l]=!(o[l]=d))}}else g=xe(g===o?g.splice(p,g.length):g),_?_(null,o,g,a):F.apply(o,g)}))}function Ne(e){for(var t,i,_,n=e.length,o=r.relative[e[0].type],c=o||r.relative[" "],a=o?1:0,s=be((function(e){return e===t}),c,!0),d=be((function(e){return w(t,e)>-1}),c,!0),u=[function(e,i,r){var _=!o&&(r||i!==l)||((t=i).nodeType?s(e,i,r):d(e,i,r));return t=null,_}];a1&&Se(u),a>1&&Ee(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(q,"$1"),i,a<_&&Ne(e.slice(a,_)),_0,_=e.length>0,n=function(n,o,c,a,s){var d,p,h,g=0,P="0",E=n&&[],b=[],S=l,A=n||_&&r.find.TAG("*",s),N=x+=null==S?1:Math.random()||.1,y=A.length;for(s&&(l=o===m||o||s);P!==y&&null!=(d=A[P]);P++){if(_&&d){for(p=0,o||d.ownerDocument===m||(u(d),c=!f);h=e[p++];)if(h(d,o||m,c)){a.push(d);break}s&&(x=N)}i&&((d=!h&&d)&&g--,n&&E.push(d))}if(g+=P,i&&P!==g){for(p=0;h=t[p++];)h(E,b,o,c);if(n){if(g>0)for(;P--;)E[P]||b[P]||(b[P]=I.call(a));b=xe(b)}F.apply(a,b),s&&!n&&b.length>0&&g+t.length>1&&ce.uniqueSort(a)}return s&&(x=N,l=S),E};return i?le(n):n}(n,_))).selector=e}return c},a=ce.select=function(e,t,i,_){var n,a,l,s,d,u="function"==typeof e&&e,m=!_&&o(e=u.selector||e);if(i=i||[],1===m.length){if((a=m[0]=m[0].slice(0)).length>2&&"ID"===(l=a[0]).type&&9===t.nodeType&&f&&r.relative[a[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(te,ie),t)||[])[0]))return i;u&&(t=t.parentNode),e=e.slice(a.shift().value.length)}for(n=J.needsContext.test(e)?0:a.length;n--&&(l=a[n],!r.relative[s=l.type]);)if((d=r.find[s])&&(_=d(l.matches[0].replace(te,ie),ee.test(a[0].type)&&ge(t.parentNode)||t))){if(a.splice(n,1),!(e=_.length&&Ee(a)))return F.apply(i,_),i;break}}return(u||c(e,m))(_,t,!f,i,!t||ee.test(e)&&ge(t.parentNode)||t),i},i.sortStable=b.split("").sort(T).join("")===b,i.detectDuplicates=!!d,u(),i.sortDetached=se((function(e){return 1&e.compareDocumentPosition(m.createElement("fieldset"))})),se((function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")}))||de("type|href|height|width",(function(e,t,i){if(!i)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)})),i.attributes&&se((function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}))||de("value",(function(e,t,i){if(!i&&"input"===e.nodeName.toLowerCase())return e.defaultValue})),se((function(e){return null==e.getAttribute("disabled")}))||de(k,(function(e,t,i){var r;if(!i)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null})),ce}(i);A.find=v,A.expr=v.selectors,A.expr[":"]=A.expr.pseudos,A.uniqueSort=A.unique=v.uniqueSort,A.text=v.getText,A.isXMLDoc=v.isXML,A.contains=v.contains,A.escapeSelector=v.escape;var C=function(e,t,i){for(var r=[],_=void 0!==i;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(_&&A(e).is(i))break;r.push(e)}return r},T=function(e,t){for(var i=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&i.push(e);return i},M=A.expr.match.needsContext;function B(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function R(e,t,i){return P(t)?A.grep(e,(function(e,r){return!!t.call(e,r,e)!==i})):t.nodeType?A.grep(e,(function(e){return e===t!==i})):"string"!=typeof t?A.grep(e,(function(e){return d.call(t,e)>-1!==i})):A.filter(t,e,i)}A.filter=function(e,t,i){var r=t[0];return i&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?A.find.matchesSelector(r,e)?[r]:[]:A.find.matches(e,A.grep(t,(function(e){return 1===e.nodeType})))},A.fn.extend({find:function(e){var t,i,r=this.length,_=this;if("string"!=typeof e)return this.pushStack(A(e).filter((function(){for(t=0;t1?A.uniqueSort(i):i},filter:function(e){return this.pushStack(R(this,e||[],!1))},not:function(e){return this.pushStack(R(this,e||[],!0))},is:function(e){return!!R(this,"string"==typeof e&&M.test(e)?A(e):e||[],!1).length}});var F,D=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(A.fn.init=function(e,t,i){var r,_;if(!e)return this;if(i=i||F,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:D.exec(e))||!r[1]&&t)return!t||t.jquery?(t||i).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof A?t[0]:t,A.merge(this,A.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),I.test(r[1])&&A.isPlainObject(t))for(r in t)P(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(_=o.getElementById(r[2]))&&(this[0]=_,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):P(e)?void 0!==i.ready?i.ready(e):e(A):A.makeArray(e,this)}).prototype=A.fn,F=A(o);var w=/^(?:parents|prev(?:Until|All))/,k={children:!0,contents:!0,next:!0,prev:!0};function L(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}A.fn.extend({has:function(e){var t=A(e,this),i=t.length;return this.filter((function(){for(var e=0;e-1:1===i.nodeType&&A.find.matchesSelector(i,e))){n.push(i);break}return this.pushStack(n.length>1?A.uniqueSort(n):n)},index:function(e){return e?"string"==typeof e?d.call(A(e),this[0]):d.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(A.uniqueSort(A.merge(this.get(),A(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),A.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return C(e,"parentNode")},parentsUntil:function(e,t,i){return C(e,"parentNode",i)},next:function(e){return L(e,"nextSibling")},prev:function(e){return L(e,"previousSibling")},nextAll:function(e){return C(e,"nextSibling")},prevAll:function(e){return C(e,"previousSibling")},nextUntil:function(e,t,i){return C(e,"nextSibling",i)},prevUntil:function(e,t,i){return C(e,"previousSibling",i)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return void 0!==e.contentDocument?e.contentDocument:(B(e,"template")&&(e=e.content||e),A.merge([],e.childNodes))}},(function(e,t){A.fn[e]=function(i,r){var _=A.map(this,t,i);return"Until"!==e.slice(-5)&&(r=i),r&&"string"==typeof r&&(_=A.filter(r,_)),this.length>1&&(k[e]||A.uniqueSort(_),w.test(e)&&_.reverse()),this.pushStack(_)}}));var Q=/[^\x20\t\r\n\f]+/g;function O(e){return e}function U(e){throw e}function H(e,t,i,r){var _;try{e&&P(_=e.promise)?_.call(e).done(t).fail(i):e&&P(_=e.then)?_.call(e,t,i):t.apply(void 0,[e].slice(r))}catch(e){i.apply(void 0,[e])}}A.Callbacks=function(e){e="string"==typeof e?function(e){var t={};return A.each(e.match(Q)||[],(function(e,i){t[i]=!0})),t}(e):A.extend({},e);var t,i,r,_,n=[],o=[],c=-1,a=function(){for(_=_||e.once,r=t=!0;o.length;c=-1)for(i=o.shift();++c-1;)n.splice(i,1),i<=c&&c--})),this},has:function(e){return e?A.inArray(e,n)>-1:n.length>0},empty:function(){return n&&(n=[]),this},disable:function(){return _=o=[],n=i="",this},disabled:function(){return!n},lock:function(){return _=o=[],i||t||(n=i=""),this},locked:function(){return!!_},fireWith:function(e,i){return _||(i=[e,(i=i||[]).slice?i.slice():i],o.push(i),t||a()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},A.extend({Deferred:function(e){var t=[["notify","progress",A.Callbacks("memory"),A.Callbacks("memory"),2],["resolve","done",A.Callbacks("once memory"),A.Callbacks("once memory"),0,"resolved"],["reject","fail",A.Callbacks("once memory"),A.Callbacks("once memory"),1,"rejected"]],r="pending",_={state:function(){return r},always:function(){return n.done(arguments).fail(arguments),this},catch:function(e){return _.then(null,e)},pipe:function(){var e=arguments;return A.Deferred((function(i){A.each(t,(function(t,r){var _=P(e[r[4]])&&e[r[4]];n[r[1]]((function(){var e=_&&_.apply(this,arguments);e&&P(e.promise)?e.promise().progress(i.notify).done(i.resolve).fail(i.reject):i[r[0]+"With"](this,_?[e]:arguments)}))})),e=null})).promise()},then:function(e,r,_){var n=0;function o(e,t,r,_){return function(){var c=this,a=arguments,l=function(){var i,l;if(!(e=n&&(r!==U&&(c=void 0,a=[i]),t.rejectWith(c,a))}};e?s():(A.Deferred.getStackHook&&(s.stackTrace=A.Deferred.getStackHook()),i.setTimeout(s))}}return A.Deferred((function(i){t[0][3].add(o(0,i,P(_)?_:O,i.notifyWith)),t[1][3].add(o(0,i,P(e)?e:O)),t[2][3].add(o(0,i,P(r)?r:U))})).promise()},promise:function(e){return null!=e?A.extend(e,_):_}},n={};return A.each(t,(function(e,i){var o=i[2],c=i[5];_[i[1]]=o.add,c&&o.add((function(){r=c}),t[3-e][2].disable,t[3-e][3].disable,t[0][2].lock,t[0][3].lock),o.add(i[3].fire),n[i[0]]=function(){return n[i[0]+"With"](this===n?void 0:this,arguments),this},n[i[0]+"With"]=o.fireWith})),_.promise(n),e&&e.call(n,n),n},when:function(e){var t=arguments.length,i=t,r=Array(i),_=a.call(arguments),n=A.Deferred(),o=function(e){return function(i){r[e]=this,_[e]=arguments.length>1?a.call(arguments):i,--t||n.resolveWith(r,_)}};if(t<=1&&(H(e,n.done(o(i)).resolve,n.reject,!t),"pending"===n.state()||P(_[i]&&_[i].then)))return n.then();for(;i--;)H(_[i],o(i),n.reject);return n.promise()}});var q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;A.Deferred.exceptionHook=function(e,t){i.console&&i.console.warn&&e&&q.test(e.name)&&i.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},A.readyException=function(e){i.setTimeout((function(){throw e}))};var G=A.Deferred();function z(){o.removeEventListener("DOMContentLoaded",z),i.removeEventListener("load",z),A.ready()}A.fn.ready=function(e){return G.then(e).catch((function(e){A.readyException(e)})),this},A.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--A.readyWait:A.isReady)||(A.isReady=!0,!0!==e&&--A.readyWait>0||G.resolveWith(o,[A]))}}),A.ready.then=G.then,"complete"===o.readyState||"loading"!==o.readyState&&!o.documentElement.doScroll?i.setTimeout(A.ready):(o.addEventListener("DOMContentLoaded",z),i.addEventListener("load",z));var W=function(e,t,i,r,_,n,o){var c=0,a=e.length,l=null==i;if("object"===x(i))for(c in _=!0,i)W(e,t,c,i[c],!0,n,o);else if(void 0!==r&&(_=!0,P(r)||(o=!0),l&&(o?(t.call(e,r),t=null):(l=t,t=function(e,t,i){return l.call(A(e),i)})),t))for(;c1,null,!0)},removeData:function(e){return this.each((function(){Z.remove(this,e)}))}}),A.extend({queue:function(e,t,i){var r;if(e)return t=(t||"fx")+"queue",r=$.get(e,t),i&&(!r||Array.isArray(i)?r=$.access(e,t,A.makeArray(i)):r.push(i)),r||[]},dequeue:function(e,t){t=t||"fx";var i=A.queue(e,t),r=i.length,_=i.shift(),n=A._queueHooks(e,t);"inprogress"===_&&(_=i.shift(),r--),_&&("fx"===t&&i.unshift("inprogress"),delete n.stop,_.call(e,(function(){A.dequeue(e,t)}),n)),!r&&n&&n.empty.fire()},_queueHooks:function(e,t){var i=t+"queueHooks";return $.get(e,i)||$.access(e,i,{empty:A.Callbacks("once memory").add((function(){$.remove(e,[t+"queue",i])}))})}}),A.fn.extend({queue:function(e,t){var i=2;return"string"!=typeof e&&(t=e,e="fx",i--),arguments.length\x20\t\r\n\f]*)/i,ge=/^$|^module$|\/(?:java|ecma)script/i,Pe={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Ee(e,t){var i;return i=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&B(e,t)?A.merge([e],i):i}function be(e,t){for(var i=0,r=e.length;i-1)_&&_.push(n);else if(l=ce(n),o=Ee(d.appendChild(n),"script"),l&&be(o),i)for(s=0;n=o[s++];)ge.test(n.type||"")&&i.push(n);return d}Se=o.createDocumentFragment().appendChild(o.createElement("div")),(xe=o.createElement("input")).setAttribute("type","radio"),xe.setAttribute("checked","checked"),xe.setAttribute("name","t"),Se.appendChild(xe),g.checkClone=Se.cloneNode(!0).cloneNode(!0).lastChild.checked,Se.innerHTML="",g.noCloneChecked=!!Se.cloneNode(!0).lastChild.defaultValue;var ye=/^key/,ve=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Te(){return!0}function Me(){return!1}function Be(e,t){return e===function(){try{return o.activeElement}catch(e){}}()==("focus"===t)}function Ie(e,t,i,r,_,n){var o,c;if("object"==typeof t){for(c in"string"!=typeof i&&(r=r||i,i=void 0),t)Ie(e,c,i,r,t[c],n);return e}if(null==r&&null==_?(_=i,r=i=void 0):null==_&&("string"==typeof i?(_=r,r=void 0):(_=r,r=i,i=void 0)),!1===_)_=Me;else if(!_)return e;return 1===n&&(o=_,(_=function(e){return A().off(e),o.apply(this,arguments)}).guid=o.guid||(o.guid=A.guid++)),e.each((function(){A.event.add(this,t,_,r,i)}))}function Re(e,t,i){i?($.set(e,t,!1),A.event.add(e,t,{namespace:!1,handler:function(e){var r,_,n=$.get(this,t);if(1&e.isTrigger&&this[t]){if(n.length)(A.event.special[t]||{}).delegateType&&e.stopPropagation();else if(n=a.call(arguments),$.set(this,t,n),r=i(this,t),this[t](),n!==(_=$.get(this,t))||r?$.set(this,t,!1):_={},n!==_)return e.stopImmediatePropagation(),e.preventDefault(),_.value}else n.length&&($.set(this,t,{value:A.event.trigger(A.extend(n[0],A.Event.prototype),n.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===$.get(e,t)&&A.event.add(e,t,Te)}A.event={global:{},add:function(e,t,i,r,_){var n,o,c,a,l,s,d,u,m,p,f,h=$.get(e);if(h)for(i.handler&&(i=(n=i).handler,_=n.selector),_&&A.find.matchesSelector(oe,_),i.guid||(i.guid=A.guid++),(a=h.events)||(a=h.events={}),(o=h.handle)||(o=h.handle=function(t){return void 0!==A&&A.event.triggered!==t.type?A.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(Q)||[""]).length;l--;)m=f=(c=Ce.exec(t[l])||[])[1],p=(c[2]||"").split(".").sort(),m&&(d=A.event.special[m]||{},m=(_?d.delegateType:d.bindType)||m,d=A.event.special[m]||{},s=A.extend({type:m,origType:f,data:r,handler:i,guid:i.guid,selector:_,needsContext:_&&A.expr.match.needsContext.test(_),namespace:p.join(".")},n),(u=a[m])||((u=a[m]=[]).delegateCount=0,d.setup&&!1!==d.setup.call(e,r,p,o)||e.addEventListener&&e.addEventListener(m,o)),d.add&&(d.add.call(e,s),s.handler.guid||(s.handler.guid=i.guid)),_?u.splice(u.delegateCount++,0,s):u.push(s),A.event.global[m]=!0)},remove:function(e,t,i,r,_){var n,o,c,a,l,s,d,u,m,p,f,h=$.hasData(e)&&$.get(e);if(h&&(a=h.events)){for(l=(t=(t||"").match(Q)||[""]).length;l--;)if(m=f=(c=Ce.exec(t[l])||[])[1],p=(c[2]||"").split(".").sort(),m){for(d=A.event.special[m]||{},u=a[m=(r?d.delegateType:d.bindType)||m]||[],c=c[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),o=n=u.length;n--;)s=u[n],!_&&f!==s.origType||i&&i.guid!==s.guid||c&&!c.test(s.namespace)||r&&r!==s.selector&&("**"!==r||!s.selector)||(u.splice(n,1),s.selector&&u.delegateCount--,d.remove&&d.remove.call(e,s));o&&!u.length&&(d.teardown&&!1!==d.teardown.call(e,p,h.handle)||A.removeEvent(e,m,h.handle),delete a[m])}else for(m in a)A.event.remove(e,m+t[l],i,r,!0);A.isEmptyObject(a)&&$.remove(e,"handle events")}},dispatch:function(e){var t,i,r,_,n,o,c=A.event.fix(e),a=new Array(arguments.length),l=($.get(this,"events")||{})[c.type]||[],s=A.event.special[c.type]||{};for(a[0]=c,t=1;t=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(n=[],o={},i=0;i-1:A.find(_,this,null,[l]).length),o[_]&&n.push(r);n.length&&c.push({elem:l,handlers:n})}return l=this,a\x20\t\r\n\f]*)[^>]*)\/>/gi,De=/\s*$/g;function Le(e,t){return B(e,"table")&&B(11!==t.nodeType?t:t.firstChild,"tr")&&A(e).children("tbody")[0]||e}function Qe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Ue(e,t){var i,r,_,n,o,c,a,l;if(1===t.nodeType){if($.hasData(e)&&(n=$.access(e),o=$.set(t,n),l=n.events))for(_ in delete o.handle,o.events={},l)for(i=0,r=l[_].length;i1&&"string"==typeof p&&!g.checkClone&&we.test(p))return e.each((function(_){var n=e.eq(_);f&&(t[0]=p.call(this,_,n.html())),qe(n,t,i,r)}));if(u&&(n=(_=Ne(t,e[0].ownerDocument,!1,e,r)).firstChild,1===_.childNodes.length&&(_=n),n||r)){for(c=(o=A.map(Ee(_,"script"),Qe)).length;d")},clone:function(e,t,i){var r,_,n,o,c=e.cloneNode(!0),a=ce(e);if(!(g.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||A.isXMLDoc(e)))for(o=Ee(c),r=0,_=(n=Ee(e)).length;r<_;r++)He(n[r],o[r]);if(t)if(i)for(n=n||Ee(e),o=o||Ee(c),r=0,_=n.length;r<_;r++)Ue(n[r],o[r]);else Ue(e,c);return(o=Ee(c,"script")).length>0&&be(o,!a&&Ee(e,"script")),c},cleanData:function(e){for(var t,i,r,_=A.event.special,n=0;void 0!==(i=e[n]);n++)if(j(i)){if(t=i[$.expando]){if(t.events)for(r in t.events)_[r]?A.event.remove(i,r):A.removeEvent(i,r,t.handle);i[$.expando]=void 0}i[Z.expando]&&(i[Z.expando]=void 0)}}}),A.fn.extend({detach:function(e){return Ge(this,e,!0)},remove:function(e){return Ge(this,e)},text:function(e){return W(this,(function(e){return void 0===e?A.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)}))}),null,e,arguments.length)},append:function(){return qe(this,arguments,(function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)}))},prepend:function(){return qe(this,arguments,(function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}}))},before:function(){return qe(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this)}))},after:function(){return qe(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)}))},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(A.cleanData(Ee(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map((function(){return A.clone(this,e,t)}))},html:function(e){return W(this,(function(e){var t=this[0]||{},i=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!De.test(e)&&!Pe[(he.exec(e)||["",""])[1].toLowerCase()]){e=A.htmlPrefilter(e);try{for(;i=0&&(a+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-n-a-c-.5))||0),a}function nt(e,t,i){var r=We(e),_=(!g.boxSizingReliable()||i)&&"border-box"===A.css(e,"boxSizing",!1,r),n=_,o=Ke(e,t,r),c="offset"+t[0].toUpperCase()+t.slice(1);if(ze.test(o)){if(!i)return o;o="auto"}return(!g.boxSizingReliable()&&_||"auto"===o||!parseFloat(o)&&"inline"===A.css(e,"display",!1,r))&&e.getClientRects().length&&(_="border-box"===A.css(e,"boxSizing",!1,r),(n=c in e)&&(o=e[c])),(o=parseFloat(o)||0)+_t(e,t,i||(_?"border":"content"),n,r,o)+"px"}function ot(e,t,i,r,_){return new ot.prototype.init(e,t,i,r,_)}A.extend({cssHooks:{opacity:{get:function(e,t){if(t){var i=Ke(e,"opacity");return""===i?"1":i}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,i,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var _,n,o,c=Y(t),a=et.test(t),l=e.style;if(a||(t=$e(c)),o=A.cssHooks[t]||A.cssHooks[c],void 0===i)return o&&"get"in o&&void 0!==(_=o.get(e,!1,r))?_:l[t];"string"===(n=typeof i)&&(_=_e.exec(i))&&_[1]&&(i=de(e,t,_),n="number"),null!=i&&i==i&&("number"!==n||a||(i+=_&&_[3]||(A.cssNumber[c]?"":"px")),g.clearCloneStyle||""!==i||0!==t.indexOf("background")||(l[t]="inherit"),o&&"set"in o&&void 0===(i=o.set(e,i,r))||(a?l.setProperty(t,i):l[t]=i))}},css:function(e,t,i,r){var _,n,o,c=Y(t);return et.test(t)||(t=$e(c)),(o=A.cssHooks[t]||A.cssHooks[c])&&"get"in o&&(_=o.get(e,!0,i)),void 0===_&&(_=Ke(e,t,r)),"normal"===_&&t in it&&(_=it[t]),""===i||i?(n=parseFloat(_),!0===i||isFinite(n)?n||0:_):_}}),A.each(["height","width"],(function(e,t){A.cssHooks[t]={get:function(e,i,r){if(i)return!Ze.test(A.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?nt(e,t,r):se(e,tt,(function(){return nt(e,t,r)}))},set:function(e,i,r){var _,n=We(e),o=!g.scrollboxSize()&&"absolute"===n.position,c=(o||r)&&"border-box"===A.css(e,"boxSizing",!1,n),a=r?_t(e,t,r,c,n):0;return c&&o&&(a-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(n[t])-_t(e,t,"border",!1,n)-.5)),a&&(_=_e.exec(i))&&"px"!==(_[3]||"px")&&(e.style[t]=i,i=A.css(e,t)),rt(0,i,a)}}})),A.cssHooks.marginLeft=Je(g.reliableMarginLeft,(function(e,t){if(t)return(parseFloat(Ke(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},(function(){return e.getBoundingClientRect().left})))+"px"})),A.each({margin:"",padding:"",border:"Width"},(function(e,t){A.cssHooks[e+t]={expand:function(i){for(var r=0,_={},n="string"==typeof i?i.split(" "):[i];r<4;r++)_[e+ne[r]+t]=n[r]||n[r-2]||n[0];return _}},"margin"!==e&&(A.cssHooks[e+t].set=rt)})),A.fn.extend({css:function(e,t){return W(this,(function(e,t,i){var r,_,n={},o=0;if(Array.isArray(t)){for(r=We(e),_=t.length;o<_;o++)n[t[o]]=A.css(e,t[o],!1,r);return n}return void 0!==i?A.style(e,t,i):A.css(e,t)}),e,t,arguments.length>1)}}),A.Tween=ot,ot.prototype={constructor:ot,init:function(e,t,i,r,_,n){this.elem=e,this.prop=i,this.easing=_||A.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=n||(A.cssNumber[i]?"":"px")},cur:function(){var e=ot.propHooks[this.prop];return e&&e.get?e.get(this):ot.propHooks._default.get(this)},run:function(e){var t,i=ot.propHooks[this.prop];return this.options.duration?this.pos=t=A.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),i&&i.set?i.set(this):ot.propHooks._default.set(this),this}},ot.prototype.init.prototype=ot.prototype,ot.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=A.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){A.fx.step[e.prop]?A.fx.step[e.prop](e):1!==e.elem.nodeType||!A.cssHooks[e.prop]&&null==e.elem.style[$e(e.prop)]?e.elem[e.prop]=e.now:A.style(e.elem,e.prop,e.now+e.unit)}}},ot.propHooks.scrollTop=ot.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},A.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},A.fx=ot.prototype.init,A.fx.step={};var ct,at,lt=/^(?:toggle|show|hide)$/,st=/queueHooks$/;function dt(){at&&(!1===o.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(dt):i.setTimeout(dt,A.fx.interval),A.fx.tick())}function ut(){return i.setTimeout((function(){ct=void 0})),ct=Date.now()}function mt(e,t){var i,r=0,_={height:e};for(t=t?1:0;r<4;r+=2-t)_["margin"+(i=ne[r])]=_["padding"+i]=e;return t&&(_.opacity=_.width=e),_}function pt(e,t,i){for(var r,_=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),n=0,o=_.length;n1)},removeAttr:function(e){return this.each((function(){A.removeAttr(this,e)}))}}),A.extend({attr:function(e,t,i){var r,_,n=e.nodeType;if(3!==n&&8!==n&&2!==n)return void 0===e.getAttribute?A.prop(e,t,i):(1===n&&A.isXMLDoc(e)||(_=A.attrHooks[t.toLowerCase()]||(A.expr.match.bool.test(t)?ht:void 0)),void 0!==i?null===i?void A.removeAttr(e,t):_&&"set"in _&&void 0!==(r=_.set(e,i,t))?r:(e.setAttribute(t,i+""),i):_&&"get"in _&&null!==(r=_.get(e,t))?r:null==(r=A.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!g.radioValue&&"radio"===t&&B(e,"input")){var i=e.value;return e.setAttribute("type",t),i&&(e.value=i),t}}}},removeAttr:function(e,t){var i,r=0,_=t&&t.match(Q);if(_&&1===e.nodeType)for(;i=_[r++];)e.removeAttribute(i)}}),ht={set:function(e,t,i){return!1===t?A.removeAttr(e,i):e.setAttribute(i,i),i}},A.each(A.expr.match.bool.source.match(/\w+/g),(function(e,t){var i=gt[t]||A.find.attr;gt[t]=function(e,t,r){var _,n,o=t.toLowerCase();return r||(n=gt[o],gt[o]=_,_=null!=i(e,t,r)?o:null,gt[o]=n),_}}));var Pt=/^(?:input|select|textarea|button)$/i,Et=/^(?:a|area)$/i;function bt(e){return(e.match(Q)||[]).join(" ")}function St(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(Q)||[]}A.fn.extend({prop:function(e,t){return W(this,A.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each((function(){delete this[A.propFix[e]||e]}))}}),A.extend({prop:function(e,t,i){var r,_,n=e.nodeType;if(3!==n&&8!==n&&2!==n)return 1===n&&A.isXMLDoc(e)||(t=A.propFix[t]||t,_=A.propHooks[t]),void 0!==i?_&&"set"in _&&void 0!==(r=_.set(e,i,t))?r:e[t]=i:_&&"get"in _&&null!==(r=_.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=A.find.attr(e,"tabindex");return t?parseInt(t,10):Pt.test(e.nodeName)||Et.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),g.optSelected||(A.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),A.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){A.propFix[this.toLowerCase()]=this})),A.fn.extend({addClass:function(e){var t,i,r,_,n,o,c,a=0;if(P(e))return this.each((function(t){A(this).addClass(e.call(this,t,St(this)))}));if((t=xt(e)).length)for(;i=this[a++];)if(_=St(i),r=1===i.nodeType&&" "+bt(_)+" "){for(o=0;n=t[o++];)r.indexOf(" "+n+" ")<0&&(r+=n+" ");_!==(c=bt(r))&&i.setAttribute("class",c)}return this},removeClass:function(e){var t,i,r,_,n,o,c,a=0;if(P(e))return this.each((function(t){A(this).removeClass(e.call(this,t,St(this)))}));if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)for(;i=this[a++];)if(_=St(i),r=1===i.nodeType&&" "+bt(_)+" "){for(o=0;n=t[o++];)for(;r.indexOf(" "+n+" ")>-1;)r=r.replace(" "+n+" "," ");_!==(c=bt(r))&&i.setAttribute("class",c)}return this},toggleClass:function(e,t){var i=typeof e,r="string"===i||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):P(e)?this.each((function(i){A(this).toggleClass(e.call(this,i,St(this),t),t)})):this.each((function(){var t,_,n,o;if(r)for(_=0,n=A(this),o=xt(e);t=o[_++];)n.hasClass(t)?n.removeClass(t):n.addClass(t);else void 0!==e&&"boolean"!==i||((t=St(this))&&$.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":$.get(this,"__className__")||""))}))},hasClass:function(e){var t,i,r=0;for(t=" "+e+" ";i=this[r++];)if(1===i.nodeType&&(" "+bt(St(i))+" ").indexOf(t)>-1)return!0;return!1}});var At=/\r/g;A.fn.extend({val:function(e){var t,i,r,_=this[0];return arguments.length?(r=P(e),this.each((function(i){var _;1===this.nodeType&&(null==(_=r?e.call(this,i,A(this).val()):e)?_="":"number"==typeof _?_+="":Array.isArray(_)&&(_=A.map(_,(function(e){return null==e?"":e+""}))),(t=A.valHooks[this.type]||A.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,_,"value")||(this.value=_))}))):_?(t=A.valHooks[_.type]||A.valHooks[_.nodeName.toLowerCase()])&&"get"in t&&void 0!==(i=t.get(_,"value"))?i:"string"==typeof(i=_.value)?i.replace(At,""):null==i?"":i:void 0}}),A.extend({valHooks:{option:{get:function(e){var t=A.find.attr(e,"value");return null!=t?t:bt(A.text(e))}},select:{get:function(e){var t,i,r,_=e.options,n=e.selectedIndex,o="select-one"===e.type,c=o?null:[],a=o?n+1:_.length;for(r=n<0?a:o?n:0;r-1)&&(i=!0);return i||(e.selectedIndex=-1),n}}}}),A.each(["radio","checkbox"],(function(){A.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=A.inArray(A(e).val(),t)>-1}},g.checkOn||(A.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})})),g.focusin="onfocusin"in i;var Nt=/^(?:focusinfocus|focusoutblur)$/,yt=function(e){e.stopPropagation()};A.extend(A.event,{trigger:function(e,t,r,_){var n,c,a,l,s,d,u,m,f=[r||o],h=p.call(e,"type")?e.type:e,g=p.call(e,"namespace")?e.namespace.split("."):[];if(c=m=a=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!Nt.test(h+A.event.triggered)&&(h.indexOf(".")>-1&&(g=h.split("."),h=g.shift(),g.sort()),s=h.indexOf(":")<0&&"on"+h,(e=e[A.expando]?e:new A.Event(h,"object"==typeof e&&e)).isTrigger=_?2:3,e.namespace=g.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=r),t=null==t?[e]:A.makeArray(t,[e]),u=A.event.special[h]||{},_||!u.trigger||!1!==u.trigger.apply(r,t))){if(!_&&!u.noBubble&&!E(r)){for(l=u.delegateType||h,Nt.test(l+h)||(c=c.parentNode);c;c=c.parentNode)f.push(c),a=c;a===(r.ownerDocument||o)&&f.push(a.defaultView||a.parentWindow||i)}for(n=0;(c=f[n++])&&!e.isPropagationStopped();)m=c,e.type=n>1?l:u.bindType||h,(d=($.get(c,"events")||{})[e.type]&&$.get(c,"handle"))&&d.apply(c,t),(d=s&&c[s])&&d.apply&&j(c)&&(e.result=d.apply(c,t),!1===e.result&&e.preventDefault());return e.type=h,_||e.isDefaultPrevented()||u._default&&!1!==u._default.apply(f.pop(),t)||!j(r)||s&&P(r[h])&&!E(r)&&((a=r[s])&&(r[s]=null),A.event.triggered=h,e.isPropagationStopped()&&m.addEventListener(h,yt),r[h](),e.isPropagationStopped()&&m.removeEventListener(h,yt),A.event.triggered=void 0,a&&(r[s]=a)),e.result}},simulate:function(e,t,i){var r=A.extend(new A.Event,i,{type:e,isSimulated:!0});A.event.trigger(r,null,t)}}),A.fn.extend({trigger:function(e,t){return this.each((function(){A.event.trigger(e,t,this)}))},triggerHandler:function(e,t){var i=this[0];if(i)return A.event.trigger(e,t,i,!0)}}),g.focusin||A.each({focus:"focusin",blur:"focusout"},(function(e,t){var i=function(e){A.event.simulate(t,e.target,A.event.fix(e))};A.event.special[t]={setup:function(){var r=this.ownerDocument||this,_=$.access(r,t);_||r.addEventListener(e,i,!0),$.access(r,t,(_||0)+1)},teardown:function(){var r=this.ownerDocument||this,_=$.access(r,t)-1;_?$.access(r,t,_):(r.removeEventListener(e,i,!0),$.remove(r,t))}}}));var vt=i.location,Ct=Date.now(),Tt=/\?/;A.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new i.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||A.error("Invalid XML: "+e),t};var Mt=/\[\]$/,Bt=/\r?\n/g,It=/^(?:submit|button|image|reset|file)$/i,Rt=/^(?:input|select|textarea|keygen)/i;function Ft(e,t,i,r){var _;if(Array.isArray(t))A.each(t,(function(t,_){i||Mt.test(e)?r(e,_):Ft(e+"["+("object"==typeof _&&null!=_?t:"")+"]",_,i,r)}));else if(i||"object"!==x(t))r(e,t);else for(_ in t)Ft(e+"["+_+"]",t[_],i,r)}A.param=function(e,t){var i,r=[],_=function(e,t){var i=P(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==i?"":i)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!A.isPlainObject(e))A.each(e,(function(){_(this.name,this.value)}));else for(i in e)Ft(i,e[i],t,_);return r.join("&")},A.fn.extend({serialize:function(){return A.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var e=A.prop(this,"elements");return e?A.makeArray(e):this})).filter((function(){var e=this.type;return this.name&&!A(this).is(":disabled")&&Rt.test(this.nodeName)&&!It.test(e)&&(this.checked||!fe.test(e))})).map((function(e,t){var i=A(this).val();return null==i?null:Array.isArray(i)?A.map(i,(function(e){return{name:t.name,value:e.replace(Bt,"\r\n")}})):{name:t.name,value:i.replace(Bt,"\r\n")}})).get()}});var Dt=/%20/g,wt=/#.*$/,kt=/([?&])_=[^&]*/,Lt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Qt=/^(?:GET|HEAD)$/,Ot=/^\/\//,Ut={},Ht={},qt="*/".concat("*"),Gt=o.createElement("a");function zt(e){return function(t,i){"string"!=typeof t&&(i=t,t="*");var r,_=0,n=t.toLowerCase().match(Q)||[];if(P(i))for(;r=n[_++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(i)):(e[r]=e[r]||[]).push(i)}}function Wt(e,t,i,r){var _={},n=e===Ht;function o(c){var a;return _[c]=!0,A.each(e[c]||[],(function(e,c){var l=c(t,i,r);return"string"!=typeof l||n||_[l]?n?!(a=l):void 0:(t.dataTypes.unshift(l),o(l),!1)})),a}return o(t.dataTypes[0])||!_["*"]&&o("*")}function Vt(e,t){var i,r,_=A.ajaxSettings.flatOptions||{};for(i in t)void 0!==t[i]&&((_[i]?e:r||(r={}))[i]=t[i]);return r&&A.extend(!0,e,r),e}Gt.href=vt.href,A.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:vt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(vt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":A.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Vt(Vt(e,A.ajaxSettings),t):Vt(A.ajaxSettings,e)},ajaxPrefilter:zt(Ut),ajaxTransport:zt(Ht),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var r,_,n,c,a,l,s,d,u,m,p=A.ajaxSetup({},t),f=p.context||p,h=p.context&&(f.nodeType||f.jquery)?A(f):A.event,g=A.Deferred(),P=A.Callbacks("once memory"),E=p.statusCode||{},b={},S={},x="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(s){if(!c)for(c={};t=Lt.exec(n);)c[t[1].toLowerCase()+" "]=(c[t[1].toLowerCase()+" "]||[]).concat(t[2]);t=c[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return s?n:null},setRequestHeader:function(e,t){return null==s&&(e=S[e.toLowerCase()]=S[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==s&&(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(s)N.always(e[N.status]);else for(t in e)E[t]=[E[t],e[t]];return this},abort:function(e){var t=e||x;return r&&r.abort(t),y(0,t),this}};if(g.promise(N),p.url=((e||p.url||vt.href)+"").replace(Ot,vt.protocol+"//"),p.type=t.method||t.type||p.method||p.type,p.dataTypes=(p.dataType||"*").toLowerCase().match(Q)||[""],null==p.crossDomain){l=o.createElement("a");try{l.href=p.url,l.href=l.href,p.crossDomain=Gt.protocol+"//"+Gt.host!=l.protocol+"//"+l.host}catch(e){p.crossDomain=!0}}if(p.data&&p.processData&&"string"!=typeof p.data&&(p.data=A.param(p.data,p.traditional)),Wt(Ut,p,t,N),s)return N;for(u in(d=A.event&&p.global)&&0==A.active++&&A.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Qt.test(p.type),_=p.url.replace(wt,""),p.hasContent?p.data&&p.processData&&0===(p.contentType||"").indexOf("application/x-www-form-urlencoded")&&(p.data=p.data.replace(Dt,"+")):(m=p.url.slice(_.length),p.data&&(p.processData||"string"==typeof p.data)&&(_+=(Tt.test(_)?"&":"?")+p.data,delete p.data),!1===p.cache&&(_=_.replace(kt,"$1"),m=(Tt.test(_)?"&":"?")+"_="+Ct+++m),p.url=_+m),p.ifModified&&(A.lastModified[_]&&N.setRequestHeader("If-Modified-Since",A.lastModified[_]),A.etag[_]&&N.setRequestHeader("If-None-Match",A.etag[_])),(p.data&&p.hasContent&&!1!==p.contentType||t.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+qt+"; q=0.01":""):p.accepts["*"]),p.headers)N.setRequestHeader(u,p.headers[u]);if(p.beforeSend&&(!1===p.beforeSend.call(f,N,p)||s))return N.abort();if(x="abort",P.add(p.complete),N.done(p.success),N.fail(p.error),r=Wt(Ht,p,t,N)){if(N.readyState=1,d&&h.trigger("ajaxSend",[N,p]),s)return N;p.async&&p.timeout>0&&(a=i.setTimeout((function(){N.abort("timeout")}),p.timeout));try{s=!1,r.send(b,y)}catch(e){if(s)throw e;y(-1,e)}}else y(-1,"No Transport");function y(e,t,o,c){var l,u,m,b,S,x=t;s||(s=!0,a&&i.clearTimeout(a),r=void 0,n=c||"",N.readyState=e>0?4:0,l=e>=200&&e<300||304===e,o&&(b=function(e,t,i){for(var r,_,n,o,c=e.contents,a=e.dataTypes;"*"===a[0];)a.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(_ in c)if(c[_]&&c[_].test(r)){a.unshift(_);break}if(a[0]in i)n=a[0];else{for(_ in i){if(!a[0]||e.converters[_+" "+a[0]]){n=_;break}o||(o=_)}n=n||o}if(n)return n!==a[0]&&a.unshift(n),i[n]}(p,N,o)),b=function(e,t,i,r){var _,n,o,c,a,l={},s=e.dataTypes.slice();if(s[1])for(o in e.converters)l[o.toLowerCase()]=e.converters[o];for(n=s.shift();n;)if(e.responseFields[n]&&(i[e.responseFields[n]]=t),!a&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),a=n,n=s.shift())if("*"===n)n=a;else if("*"!==a&&a!==n){if(!(o=l[a+" "+n]||l["* "+n]))for(_ in l)if((c=_.split(" "))[1]===n&&(o=l[a+" "+c[0]]||l["* "+c[0]])){!0===o?o=l[_]:!0!==l[_]&&(n=c[0],s.unshift(c[1]));break}if(!0!==o)if(o&&e.throws)t=o(t);else try{t=o(t)}catch(e){return{state:"parsererror",error:o?e:"No conversion from "+a+" to "+n}}}return{state:"success",data:t}}(p,b,N,l),l?(p.ifModified&&((S=N.getResponseHeader("Last-Modified"))&&(A.lastModified[_]=S),(S=N.getResponseHeader("etag"))&&(A.etag[_]=S)),204===e||"HEAD"===p.type?x="nocontent":304===e?x="notmodified":(x=b.state,u=b.data,l=!(m=b.error))):(m=x,!e&&x||(x="error",e<0&&(e=0))),N.status=e,N.statusText=(t||x)+"",l?g.resolveWith(f,[u,x,N]):g.rejectWith(f,[N,x,m]),N.statusCode(E),E=void 0,d&&h.trigger(l?"ajaxSuccess":"ajaxError",[N,p,l?u:m]),P.fireWith(f,[N,x]),d&&(h.trigger("ajaxComplete",[N,p]),--A.active||A.event.trigger("ajaxStop")))}return N},getJSON:function(e,t,i){return A.get(e,t,i,"json")},getScript:function(e,t){return A.get(e,void 0,t,"script")}}),A.each(["get","post"],(function(e,t){A[t]=function(e,i,r,_){return P(i)&&(_=_||r,r=i,i=void 0),A.ajax(A.extend({url:e,type:t,dataType:_,data:i,success:r},A.isPlainObject(e)&&e))}})),A._evalUrl=function(e,t){return A.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){A.globalEval(e,t)}})},A.fn.extend({wrapAll:function(e){var t;return this[0]&&(P(e)&&(e=e.call(this[0])),t=A(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map((function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e})).append(this)),this},wrapInner:function(e){return P(e)?this.each((function(t){A(this).wrapInner(e.call(this,t))})):this.each((function(){var t=A(this),i=t.contents();i.length?i.wrapAll(e):t.append(e)}))},wrap:function(e){var t=P(e);return this.each((function(i){A(this).wrapAll(t?e.call(this,i):e)}))},unwrap:function(e){return this.parent(e).not("body").each((function(){A(this).replaceWith(this.childNodes)})),this}}),A.expr.pseudos.hidden=function(e){return!A.expr.pseudos.visible(e)},A.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},A.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(e){}};var Kt={0:200,1223:204},Jt=A.ajaxSettings.xhr();g.cors=!!Jt&&"withCredentials"in Jt,g.ajax=Jt=!!Jt,A.ajaxTransport((function(e){var t,r;if(g.cors||Jt&&!e.crossDomain)return{send:function(_,n){var o,c=e.xhr();if(c.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(o in e.xhrFields)c[o]=e.xhrFields[o];for(o in e.mimeType&&c.overrideMimeType&&c.overrideMimeType(e.mimeType),e.crossDomain||_["X-Requested-With"]||(_["X-Requested-With"]="XMLHttpRequest"),_)c.setRequestHeader(o,_[o]);t=function(e){return function(){t&&(t=r=c.onload=c.onerror=c.onabort=c.ontimeout=c.onreadystatechange=null,"abort"===e?c.abort():"error"===e?"number"!=typeof c.status?n(0,"error"):n(c.status,c.statusText):n(Kt[c.status]||c.status,c.statusText,"text"!==(c.responseType||"text")||"string"!=typeof c.responseText?{binary:c.response}:{text:c.responseText},c.getAllResponseHeaders()))}},c.onload=t(),r=c.onerror=c.ontimeout=t("error"),void 0!==c.onabort?c.onabort=r:c.onreadystatechange=function(){4===c.readyState&&i.setTimeout((function(){t&&r()}))},t=t("abort");try{c.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}})),A.ajaxPrefilter((function(e){e.crossDomain&&(e.contents.script=!1)})),A.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return A.globalEval(e),e}}}),A.ajaxPrefilter("script",(function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")})),A.ajaxTransport("script",(function(e){var t,i;if(e.crossDomain||e.scriptAttrs)return{send:function(r,_){t=A("
LOADING...
\ No newline at end of file +Slickgrid-Universal
LOADING...
\ No newline at end of file diff --git a/package.json b/package.json index fe3c84a98..8a0f6e2f4 100644 --- a/package.json +++ b/package.json @@ -34,12 +34,12 @@ ] }, "devDependencies": { - "@types/jest": "^26.0.3", - "@types/node": "^14.0.14", - "@typescript-eslint/eslint-plugin": "^3.5.0", - "@typescript-eslint/parser": "^3.5.0", - "cypress": "^4.9.0", - "eslint": "^7.3.1", + "@types/jest": "^26.0.4", + "@types/node": "^14.0.19", + "@typescript-eslint/eslint-plugin": "^3.6.0", + "@typescript-eslint/parser": "^3.6.0", + "cypress": "^4.10.0", + "eslint": "^7.4.0", "eslint-plugin-import": "^2.22.0", "eslint-plugin-prefer-arrow": "^1.2.1", "http-server": "^0.12.3", @@ -54,7 +54,7 @@ "mocha": "^8.0.1", "mochawesome": "^6.1.1", "ts-jest": "^26.1.1", - "typescript": "^3.9.5" + "typescript": "^3.9.6" }, "engines": { "node": ">=12.13.1", diff --git a/packages/common/README.md b/packages/common/README.md index d05447e2f..935645937 100644 --- a/packages/common/README.md +++ b/packages/common/README.md @@ -1,10 +1,10 @@ -## Vanilla Bundle +## Vanilla Bundle #### @slickgrid-universal/common -This package is regrouping the most common features or pieces that could be used by any other Framework (it is framework agnostic). It includes all Editors, Filters, Extensions and Services as can be seen below. +This package is regrouping the most common features or pieces that could be used by any other Framework (it is framework agnostic). It includes all Editors, Filters, Extensions and Services as can be seen below. ### Installation -Go to the root of the repo and follow the instruction provided in the main [README](https://github.com/ghiscoding/slickgrid-universal#installation) +Go to the root of the repo and follow the instructions provided in the main [README](https://github.com/ghiscoding/slickgrid-universal#installation) ### What is included? - **Aggregators** (min, max, avg, sum, ...) diff --git a/packages/common/package.json b/packages/common/package.json index b377f6d0e..34126915f 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -56,7 +56,7 @@ "not dead" ], "dependencies": { - "dompurify": "^2.0.11", + "dompurify": "^2.0.12", "flatpickr": "^4.6.3", "jquery": "^3.4.1", "jquery-ui-dist": "^1.12.1", @@ -67,9 +67,9 @@ }, "devDependencies": { "@types/dompurify": "^2.0.2", - "@types/jquery": "^3.3.38", + "@types/jquery": "^3.5.0", "@types/moment": "^2.13.0", - "autoprefixer": "^9.8.0", + "autoprefixer": "^9.8.4", "copyfiles": "^2.3.0", "cross-env": "^7.0.2", "mini-css-extract-plugin": "^0.9.0", @@ -78,10 +78,10 @@ "npm-run-all": "^4.1.5", "postcss-cli": "^7.1.1", "rimraf": "^3.0.2", - "typescript": "^3.9.5" + "typescript": "^3.9.6" }, "engines": { "node": ">=12.13.1", "npm": ">=6.12.1" } -} \ No newline at end of file +} diff --git a/packages/common/src/global-grid-options.ts b/packages/common/src/global-grid-options.ts index 2e5f93245..d2f54e11f 100644 --- a/packages/common/src/global-grid-options.ts +++ b/packages/common/src/global-grid-options.ts @@ -57,7 +57,7 @@ export const GlobalGridOptions: GridOption = { width: 200, }, customFooterOptions: { - dateFormat: 'YYYY-DD-MM h:mm:ss a', + dateFormat: 'YYYY-MM-DD, hh:mm a', hideTotalItemCount: false, hideLastUpdateTimestamp: true, footerHeight: 20, diff --git a/packages/common/src/styles/_variables.scss b/packages/common/src/styles/_variables.scss index e6ab6c150..51f8f2666 100644 --- a/packages/common/src/styles/_variables.scss +++ b/packages/common/src/styles/_variables.scss @@ -620,6 +620,7 @@ $viewport-border-left: 0 none !default; /* Custom Footer */ $footer-bg-color: transparent !default; +$footer-font-size: $font-size-base !default; $footer-font-style: italic !default; $footer-font-weight: normal !default; $footer-height: 30px !default; // if you modify this height, you also have to modify the footerHeight in the customFooterOptions diff --git a/packages/common/src/styles/material-svg-icons.scss b/packages/common/src/styles/material-svg-icons.scss index 87e29bd3f..c39ca95c0 100644 --- a/packages/common/src/styles/material-svg-icons.scss +++ b/packages/common/src/styles/material-svg-icons.scss @@ -1,6 +1,7 @@ /* icon color */ $icon-color-mdi-arrow-collapse: $icon-color !default; $icon-color-mdi-arrow-expand: $icon-color !default; +$icon-color-mdi-check: $icon-color !default; $icon-color-mdi-checkbox-blank-outline: $icon-color !default; $icon-color-mdi-check-box-outline: $icon-color !default; $icon-color-mdi-checkbox-marked: $icon-color !default; @@ -31,6 +32,7 @@ $icon-color-mdi-sync: $icon-color !default; /* icon width */ $icon-width-mdi-arrow-collapse: $icon-width !default; $icon-width-mdi-arrow-expand: $icon-width !default; +$icon-width-mdi-check: $icon-width !default; $icon-width-mdi-checkbox-blank-outline: $icon-width !default; $icon-width-mdi-check-box-outline: $icon-width !default; $icon-width-mdi-checkbox-marked: $icon-width !default; @@ -68,114 +70,147 @@ $icon-width-mdi-sync: $icon-width !default; &.mdi-arrow-collapse:before { width: $icon-width-mdi-arrow-collapse; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-arrow-expand:before { width: $icon-width-mdi-arrow-expand; + display: inline-block; content: url('data:image/svg+xml,'); } + &.mdi-check:before { + width: $icon-width-mdi-check; + display: inline-block; + content: url('data:image/svg+xml,'); + } &.mdi-checkbox-blank-outline:before { width: $icon-width-mdi-checkbox-blank-outline; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-check-box-outline:before { width: $icon-width-mdi-check-box-outline; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-checkbox-marked:before { width: $icon-width-mdi-checkbox-marked; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-close:before { width: $icon-width-mdi-close; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-close-thick:before { width: $icon-width-mdi-close-thick; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-content-copy:before { width: $icon-width-mdi-content-copy; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-download:before { width: $icon-width-mdi-download; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-file-document-outline:before { width: $icon-width-mdi-file-document-outline; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-file-excel-outline:before { width: $icon-width-mdi-file-excel-outline; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-file-music-outline:before { width: $icon-width-mdi-file-music-outline; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-file-pdf-outline:before { width: $icon-width-mdi-file-pdf-outline; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-filter-remove-outline:before { width: $icon-width-mdi-filter-remove-outline; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-flip-vertical:before { width: $icon-width-mdi-flip-vertical; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-folder:before { width: $icon-width-mdi-folder; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-folder-open:before { width: $icon-width-mdi-folder-open; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-help-circle:before { width: $icon-width-mdi-help-circle; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-help-circle-outline:before { width: $icon-width-mdi-help-circle-outline; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-menu:before { width: $icon-width-mdi-menu; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-microsoft-excel:before { width: $icon-width-mdi-microsoft-excel; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-pin-off-outline:before { width: $icon-width-mdi-pin-off-outline; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-pin-outline:before { width: $icon-width-mdi-pin-outline; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-plus:before { width: $icon-width-mdi-plus; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-sort-ascending:before { width: $icon-width-mdi-sort-ascending; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-sort-descending:before { width: $icon-width-mdi-sort-descending; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-swap-vertical:before { width: $icon-width-mdi-swap-vertical; + display: inline-block; content: url('data:image/svg+xml,'); } &.mdi-sync:before { width: $icon-width-mdi-sync; + display: inline-block; content: url('data:image/svg+xml,'); } } diff --git a/packages/common/src/styles/slick-footer.scss b/packages/common/src/styles/slick-footer.scss index bd1bbd033..1524dbab4 100644 --- a/packages/common/src/styles/slick-footer.scss +++ b/packages/common/src/styles/slick-footer.scss @@ -4,6 +4,7 @@ color: $footer-text-color; padding: $footer-padding; background-color: $footer-bg-color; + font-size: $footer-font-size; font-style: $footer-font-style; font-weight: $footer-font-weight; height: $footer-height; diff --git a/packages/excel-export/README.md b/packages/excel-export/README.md index 33a3bf0d0..6091b83fb 100644 --- a/packages/excel-export/README.md +++ b/packages/excel-export/README.md @@ -4,7 +4,7 @@ Simple Export to Excel Service that allows to exporting as ".xls" or ".xlsx". ### Dependencies -This package requires [excel-builder-webpacker](https://www.npmjs.com/package/excel-builder-webpacker) which itself requires [jszip](https://www.npmjs.com/package/jszip) and [lodash](https://www.npmjs.com/package/lodash), the later not being a small lib, so make sure you are fine the bundle size. For our use case, the extra bundle size is totally worth the feature. +This package requires [excel-builder-webpacker](https://www.npmjs.com/package/excel-builder-webpacker) which itself requires [jszip](https://www.npmjs.com/package/jszip) and [lodash](https://www.npmjs.com/package/lodash), the later not being a small lib, so make sure that you are fine with the bundle size. For our use case, the extra bundle size is totally worth the feature. ### Installation Follow the instruction provided in the main [README](https://github.com/ghiscoding/slickgrid-universal#installation), you can see a demo by looking at the [GitHub Demo](https://ghiscoding.github.io/slickgrid-universal) page and click on "Export to CSV" from the Grid Menu (aka hamburger menu). diff --git a/packages/excel-export/package.json b/packages/excel-export/package.json index 64f14cba5..607b9be92 100644 --- a/packages/excel-export/package.json +++ b/packages/excel-export/package.json @@ -46,6 +46,6 @@ "cross-env": "^7.0.2", "npm-run-all": "^4.1.5", "rimraf": "^3.0.2", - "typescript": "^3.9.5" + "typescript": "^3.9.6" } } diff --git a/packages/file-export/package.json b/packages/file-export/package.json index 93beb094c..7727820b4 100644 --- a/packages/file-export/package.json +++ b/packages/file-export/package.json @@ -46,6 +46,6 @@ "cross-env": "^7.0.2", "npm-run-all": "^4.1.5", "rimraf": "^3.0.2", - "typescript": "^3.9.5" + "typescript": "^3.9.6" } } diff --git a/packages/graphql/README.md b/packages/graphql/README.md index 0f2eb0d58..8847ab258 100644 --- a/packages/graphql/README.md +++ b/packages/graphql/README.md @@ -7,7 +7,7 @@ GraphQL Service to sync a grid with an GraphQL backend server, the service will No external dependency ### Installation -Follow the instruction provided in the main [README](https://github.com/ghiscoding/slickgrid-universal#installation), you can see a demo by looking at the [GitHub Demo](https://ghiscoding.github.io/slickgrid-universal) page. +Follow the instruction provided in the main [README](https://github.com/ghiscoding/slickgrid-universal#installation), you can see a demo by looking at the [GitHub Demo](https://ghiscoding.github.io/slickgrid-universal/#/example10) page. ### Usage Simply use pass the Service into the `backendServiceApi` Grid Option. diff --git a/packages/graphql/package.json b/packages/graphql/package.json index 2da74cf8a..c0c666ae3 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -6,6 +6,9 @@ "main": "dist/commonjs/index.js", "module": "dist/es2015/index.js", "typings": "dist/commonjs/index.d.ts", + "publishConfig": { + "access": "public" + }, "files": [ "src", "dist" diff --git a/packages/odata/README.md b/packages/odata/README.md index 67554803c..ce7556dfa 100644 --- a/packages/odata/README.md +++ b/packages/odata/README.md @@ -7,7 +7,7 @@ OData Service to sync a grid with an OData backend server, the service will cons No external dependency ### Installation -Follow the instruction provided in the main [README](https://github.com/ghiscoding/slickgrid-universal#installation), you can see a demo by looking at the [GitHub Demo](https://ghiscoding.github.io/slickgrid-universal) page. +Follow the instruction provided in the main [README](https://github.com/ghiscoding/slickgrid-universal#installation), you can see a demo by looking at the [GitHub Demo](https://ghiscoding.github.io/slickgrid-universal/#/example09) page. ### Usage In order to use the Service, you will need to register it in your grid options via the `registerExternalServices` as shown below. diff --git a/packages/vanilla-bundle/README.md b/packages/vanilla-bundle/README.md index d4f121656..caa1dad3d 100644 --- a/packages/vanilla-bundle/README.md +++ b/packages/vanilla-bundle/README.md @@ -1,8 +1,9 @@ -## Vanilla Bundle +## Vanilla Bundle #### @slickgrid-universal/vanilla-bundle -Vanilla Bundle implementation (no framework, plain TypeSript). This does what other framework would do, it makes all the features usable in 1 bundle to be used by other Apps/Projects, for example we use this bundle in our SalesForce (with Lighning Web Component) App and it requires plain ES6 JavaScript which this bundle also produce (for that there's a `dist-grid-bundle-zip` folder which zip the ES6 `dist` folder which we import in SalesForce). +Vanilla Bundle implementation (no framework, plain TypeSript implementation). This package does what other framework would do, that is to make all the features usable in 1 bundle so that it could then be used by other Apps/Projects, for example we use this bundle in our SalesForce (with Lighning Web Component) App and it requires plain ES6 JavaScript which this bundle also produce (for that there's a `dist-grid-bundle-zip` folder which will zip the ES6 `dist` folder which we then import in SalesForce). ### Installation -This Vanilla Bundle is used by the standalone `web-demo-vanilla-bundle`. -Go to the root of the repo and follow the instruction provided in the main [README](https://github.com/ghiscoding/slickgrid-universal#installation) +This Vanilla Bundle is used in our SalesForce implementation (since it requires plain ES6) and is also used by the standalone `web-demo-vanilla-bundle` which serves for demo purposes. + +Go to the root of the repo and follow the instructions provided in the main [README](https://github.com/ghiscoding/slickgrid-universal#installation) diff --git a/packages/vanilla-bundle/package.json b/packages/vanilla-bundle/package.json index f337ef461..60fba9a65 100644 --- a/packages/vanilla-bundle/package.json +++ b/packages/vanilla-bundle/package.json @@ -50,7 +50,7 @@ "dompurify": "^2.0.12" }, "devDependencies": { - "@types/webpack": "^4.41.18", + "@types/webpack": "^4.41.21", "archiver": "^4.0.1", "cross-env": "^7.0.2", "dts-bundle-webpack": "^1.0.2", @@ -58,7 +58,7 @@ "npm-run-all": "^4.1.5", "rimraf": "^3.0.2", "ts-loader": "^7.0.5", - "typescript": "^3.9.5", + "typescript": "^3.9.6", "webpack": "^4.43.0" } } diff --git a/packages/vanilla-bundle/src/components/__tests__/slick-footer.spec.ts b/packages/vanilla-bundle/src/components/__tests__/slick-footer.spec.ts new file mode 100644 index 000000000..e4adeb569 --- /dev/null +++ b/packages/vanilla-bundle/src/components/__tests__/slick-footer.spec.ts @@ -0,0 +1,207 @@ +import { GridOption, SlickGrid } from '@slickgrid-universal/common'; +import { SlickFooterComponent } from '../slick-footer'; +import { TranslateServiceStub } from '../../../../../test/translateServiceStub'; + +function removeExtraSpaces(textS: string) { + return `${textS}`.replace(/\s{2,}/g, ''); +} + +const mockGridOptions = { + enableTranslate: false, + showCustomFooter: true, +} as GridOption; + +const gridStub = { + getOptions: () => mockGridOptions, + getUID: () => 'slickgrid_123456', + registerPlugin: jest.fn(), +} as unknown as SlickGrid; + +describe('Slick-Footer Component', () => { + let component: SlickFooterComponent; + let div: HTMLDivElement; + let translateService: TranslateServiceStub; + let mockTimestamp: Date; + + beforeEach(() => { + div = document.createElement('div'); + document.body.appendChild(div); + translateService = new TranslateServiceStub(); + mockTimestamp = new Date('2019-05-03T00:00:01'); + + mockGridOptions.customFooterOptions = { + dateFormat: 'YYYY-MM-DD, h:mm:ssa', + metricSeparator: '|', + metricTexts: { + items: 'some items', + lastUpdate: 'some last update', + of: 'some of' + } + }; + }); + + describe('Integration Tests', () => { + afterEach(() => { + // clear all the spyOn mocks to not influence next test + jest.clearAllMocks(); + component.dispose(); + }); + + it('should make sure Slick-Footer is defined', () => { + component = new SlickFooterComponent(gridStub, mockGridOptions.customFooterOptions, translateService); + component.renderFooter(div); + + const footerContainerElm = document.querySelector('div.slick-custom-footer.slickgrid_123456'); + + expect(component).toBeTruthy(); + expect(component.constructor).toBeDefined(); + expect(footerContainerElm).toBeTruthy(); + }); + + it('should create a the Slick-Footer component in the DOM', () => { + component = new SlickFooterComponent(gridStub, mockGridOptions.customFooterOptions, translateService); + component.renderFooter(div); + + const footerContainerElm = document.querySelector('div.slick-custom-footer.slickgrid_123456'); + const leftFooterElm = document.querySelector('div.slick-custom-footer.slickgrid_123456 > div.left-footer'); + const rightFooterElm = document.querySelector('div.slick-custom-footer.slickgrid_123456 > div.metrics'); + + expect(translateService.getCurrentLocale()).toBe('en'); + expect(footerContainerElm).toBeTruthy(); + expect(leftFooterElm).toBeTruthy(); + expect(rightFooterElm).toBeTruthy(); + }); + + it('should create a the Slick-Footer component with only left side content when everything else is defined as hidden', () => { + mockGridOptions.customFooterOptions.hideLastUpdateTimestamp = true; + mockGridOptions.customFooterOptions.hideMetrics = true; + + component = new SlickFooterComponent(gridStub, mockGridOptions.customFooterOptions, translateService); + component.renderFooter(div); + component.metrics = { startTime: mockTimestamp, endTime: mockTimestamp, itemCount: 7, totalItemCount: 99 }; + + const footerContainerElm = document.querySelector('div.slick-custom-footer.slickgrid_123456'); + const leftFooterElm = document.querySelector('div.slick-custom-footer.slickgrid_123456 > div.left-footer'); + const rightFooterElm = document.querySelector('div.slick-custom-footer.slickgrid_123456 > div.metrics'); + + expect(footerContainerElm).toBeTruthy(); + expect(leftFooterElm).toBeTruthy(); + expect(rightFooterElm).toBeTruthy(); + expect(leftFooterElm.innerHTML).toBe(''); + expect(rightFooterElm.innerHTML).toBe(''); + }); + + it('should create a the Slick-Footer component in the DOM with only right side with last update timestamp & items count', () => { + component = new SlickFooterComponent(gridStub, mockGridOptions.customFooterOptions, translateService); + component.renderFooter(div); + component.metrics = { startTime: mockTimestamp, endTime: mockTimestamp, itemCount: 7, totalItemCount: 99 }; + + const footerContainerElm = document.querySelector('div.slick-custom-footer.slickgrid_123456'); + const leftFooterElm = document.querySelector('div.slick-custom-footer.slickgrid_123456 > div.left-footer'); + const rightFooterElm = document.querySelector('div.slick-custom-footer.slickgrid_123456 > div.metrics'); + + expect(footerContainerElm).toBeTruthy(); + expect(leftFooterElm).toBeTruthy(); + expect(rightFooterElm).toBeTruthy(); + expect(leftFooterElm.innerHTML).toBe(''); + expect(rightFooterElm.innerHTML).toBe(removeExtraSpaces( + ``)); + }); + + it('should create a the Slick-Footer component in the DOM with metrics but without timestamp when hidding it', () => { + mockGridOptions.customFooterOptions.hideMetrics = false; + mockGridOptions.customFooterOptions.hideLastUpdateTimestamp = true; + + component = new SlickFooterComponent(gridStub, mockGridOptions.customFooterOptions, translateService); + component.renderFooter(div); + component.metrics = { startTime: mockTimestamp, endTime: mockTimestamp, itemCount: 7, totalItemCount: 99 }; + + const footerContainerElm = document.querySelector('div.slick-custom-footer.slickgrid_123456'); + const leftFooterElm = document.querySelector('div.slick-custom-footer.slickgrid_123456 > div.left-footer'); + const rightFooterElm = document.querySelector('div.slick-custom-footer.slickgrid_123456 > div.metrics'); + + expect(footerContainerElm).toBeTruthy(); + expect(leftFooterElm).toBeTruthy(); + expect(rightFooterElm).toBeTruthy(); + expect(leftFooterElm.innerHTML).toBe(''); + expect(rightFooterElm.innerHTML).toBe(removeExtraSpaces( + ``)); + }); + + it('should create a the Slick-Footer component in the DOM with metrics but without timestamp neither totalCount when hidding it', () => { + mockGridOptions.customFooterOptions.hideMetrics = false; + mockGridOptions.customFooterOptions.hideLastUpdateTimestamp = true; + mockGridOptions.customFooterOptions.hideTotalItemCount = true; + + component = new SlickFooterComponent(gridStub, mockGridOptions.customFooterOptions, translateService); + component.renderFooter(div); + component.metrics = { startTime: mockTimestamp, endTime: mockTimestamp, itemCount: 7, totalItemCount: 99 }; + + const footerContainerElm = document.querySelector('div.slick-custom-footer.slickgrid_123456'); + const leftFooterElm = document.querySelector('div.slick-custom-footer.slickgrid_123456 > div.left-footer'); + const rightFooterElm = document.querySelector('div.slick-custom-footer.slickgrid_123456 > div.metrics'); + + expect(footerContainerElm).toBeTruthy(); + expect(leftFooterElm).toBeTruthy(); + expect(rightFooterElm).toBeTruthy(); + expect(leftFooterElm.innerHTML).toBe(''); + expect(rightFooterElm.innerHTML).toBe(removeExtraSpaces( + ``)); + }); + + it('should create a the Slick-Footer component in the DOM and expect to use default English locale when none of the metricsText are defined', () => { + mockGridOptions.customFooterOptions.metricTexts = { items: '', lastUpdate: '', of: '' }; + + component = new SlickFooterComponent(gridStub, mockGridOptions.customFooterOptions, translateService); + component.renderFooter(div); + component.metrics = { startTime: mockTimestamp, endTime: mockTimestamp, itemCount: 7, totalItemCount: 99 }; + + const footerContainerElm = document.querySelector('div.slick-custom-footer.slickgrid_123456'); + const leftFooterElm = document.querySelector('div.slick-custom-footer.slickgrid_123456 > div.left-footer'); + const rightFooterElm = document.querySelector('div.slick-custom-footer.slickgrid_123456 > div.metrics'); + + expect(footerContainerElm).toBeTruthy(); + expect(leftFooterElm).toBeTruthy(); + expect(rightFooterElm).toBeTruthy(); + expect(leftFooterElm.innerHTML).toBe(''); + expect(rightFooterElm.innerHTML).toBe(removeExtraSpaces( + ``)); + }); + + it('should create a the Slick-Footer component in the DOM and use different locale when enableTranslate is enabled', () => { + mockGridOptions.customFooterOptions.metricTexts = { itemsKey: 'ITEMS', lastUpdateKey: 'LAST_UPDATE', ofKey: 'OF' }; + mockGridOptions.enableTranslate = true; + translateService.setLocale('fr'); + + component = new SlickFooterComponent(gridStub, mockGridOptions.customFooterOptions, translateService); + component.renderFooter(div); + component.metrics = { startTime: mockTimestamp, endTime: mockTimestamp, itemCount: 7, totalItemCount: 99 }; + + const footerContainerElm = document.querySelector('div.slick-custom-footer.slickgrid_123456'); + const leftFooterElm = document.querySelector('div.slick-custom-footer.slickgrid_123456 > div.left-footer'); + const rightFooterElm = document.querySelector('div.slick-custom-footer.slickgrid_123456 > div.metrics'); + + expect(footerContainerElm).toBeTruthy(); + expect(leftFooterElm).toBeTruthy(); + expect(rightFooterElm).toBeTruthy(); + expect(leftFooterElm.innerHTML).toBe(''); + expect(rightFooterElm.innerHTML).toBe(removeExtraSpaces( + ``)); + }); + }); +}); diff --git a/packages/vanilla-bundle/src/components/__tests__/slick-pagination.spec.ts b/packages/vanilla-bundle/src/components/__tests__/slick-pagination.spec.ts index e31fb92d9..52240afac 100644 --- a/packages/vanilla-bundle/src/components/__tests__/slick-pagination.spec.ts +++ b/packages/vanilla-bundle/src/components/__tests__/slick-pagination.spec.ts @@ -81,9 +81,11 @@ describe('Slick-Pagination Component', () => { }); it('should make sure Slick-Pagination is defined', () => { + const paginationElm = document.querySelector('div.pager.slickgrid_123456'); + expect(component).toBeTruthy(); - // expect(paginationTemplate).toBeTruthy(); expect(component.constructor).toBeDefined(); + expect(paginationElm).toBeTruthy(); }); it('should create a the Slick-Pagination component in the DOM', () => { @@ -220,12 +222,12 @@ describe('Slick-Pagination Component', () => { }); describe('with different i18n locale', () => { - let component: any; + let component: SlickPaginationComponent; let div: HTMLDivElement; let eventPubSubService: EventPubSubService; let sharedService: SharedService; let translateService: TranslateServiceStub; - const mockFullPagination = { + const mockFullPagination2 = { pageCount: 19, pageNumber: 2, pageSize: 5, @@ -239,7 +241,7 @@ describe('with different i18n locale', () => { mockGridOptions.enableTranslate = true; jest.spyOn(SharedService.prototype, 'gridOptions', 'get').mockReturnValue(mockGridOptions); jest.spyOn(SharedService.prototype, 'grid', 'get').mockReturnValue(gridStub); - jest.spyOn(paginationServiceStub, 'getFullPagination').mockReturnValue(mockFullPagination); + jest.spyOn(paginationServiceStub, 'getFullPagination').mockReturnValue(mockFullPagination2); div = document.createElement('div'); document.body.appendChild(div); sharedService = new SharedService(); diff --git a/packages/vanilla-bundle/src/components/slick-footer.ts b/packages/vanilla-bundle/src/components/slick-footer.ts new file mode 100644 index 000000000..dbfa24bea --- /dev/null +++ b/packages/vanilla-bundle/src/components/slick-footer.ts @@ -0,0 +1,187 @@ +import * as DOMPurify from 'dompurify'; +import * as moment_ from 'moment-mini'; +const moment = moment_; // patch to fix rollup "moment has no default export" issue, document here https://github.com/rollup/rollup/issues/670 + +import { + Constants, + CustomFooterOption, + GridOption, + Locale, + Metrics, + SlickGrid, + TranslaterService, +} from '@slickgrid-universal/common'; +import { BindingHelper } from '../services/binding.helper'; + +export class SlickFooterComponent { + private _bindingHelper: BindingHelper; + private _domPurifyOptions: any = {}; + private _footerElement: HTMLDivElement; + + get gridUid(): string { + return this.grid?.getUID() ?? ''; + } + + /** Getter for the Grid Options pulled through the Grid Object */ + get gridOptions(): GridOption { + return (this.grid && this.grid.getOptions) ? this.grid.getOptions() : {}; + } + + get locales(): Locale { + // get locales provided by user in main file or else use default English locales via the Constants + return this.gridOptions.locales || Constants.locales; + } + + set metrics(metrics: Metrics) { + this.renderMetrics(metrics); + } + + constructor(private grid: SlickGrid, private customFooterOptions: CustomFooterOption, private translaterService?: TranslaterService) { + this._bindingHelper = new BindingHelper(); + this._bindingHelper.querySelectorPrefix = `.${this.gridUid} `; + } + + dispose() { + this._bindingHelper.dispose(); + this._footerElement?.remove(); + } + + /** + * We could optionally display a custom footer below the grid to show some metrics (last update, item count with/without filters) + * It's an opt-in, user has to enable "showCustomFooter" and it cannot be used when there's already a Pagination since they display the same kind of info + */ + renderFooter(gridParentContainerElm: HTMLElement) { + if (this.gridOptions.enableTranslate) { + this.translateCustomFooterTexts(); + } else { + this.customFooterOptions.metricTexts = this.customFooterOptions.metricTexts || {}; + this.customFooterOptions.metricTexts.lastUpdate = this.customFooterOptions.metricTexts.lastUpdate || this.locales?.TEXT_LAST_UPDATE || 'TEXT_LAST_UPDATE'; + this.customFooterOptions.metricTexts.items = this.customFooterOptions.metricTexts.items || this.locales?.TEXT_ITEMS || 'TEXT_ITEMS'; + this.customFooterOptions.metricTexts.of = this.customFooterOptions.metricTexts.of || this.locales?.TEXT_OF || 'TEXT_OF'; + } + + // we create and the custom footer in the DOM but only when there's no Pagination + this.createFooterContainer(gridParentContainerElm); + } + + /** Render element attribute values */ + renderMetrics(metrics: Metrics) { + // get translated text & last timestamp + const lastUpdateText = this.customFooterOptions?.metricTexts?.lastUpdate ?? ''; + const lastUpdateTimestamp = moment(metrics.endTime).format(this.customFooterOptions.dateFormat); + this._bindingHelper.setElementAttributeValue('span.last-update', 'textContent', `${lastUpdateText} ${lastUpdateTimestamp}`); + this._bindingHelper.setElementAttributeValue('span.item-count', 'textContent', metrics.itemCount); + this._bindingHelper.setElementAttributeValue('span.total-count', 'textContent', metrics.totalItemCount); + } + + // -- + // private functions + // -------------------- + + /** Create the Footer Container */ + private createFooterContainer(gridParentContainerElm: HTMLElement) { + const footerElm = document.createElement('div'); + footerElm.className = `slick-custom-footer row ${this.gridUid}`; + footerElm.style.width = '100%'; + footerElm.style.height = `${this.customFooterOptions.footerHeight || 20}px`; + + const leftFooterElm = document.createElement('div'); + leftFooterElm.className = `left-footer ${this.customFooterOptions.leftContainerClass}`; + leftFooterElm.innerHTML = DOMPurify.sanitize(this.customFooterOptions.leftFooterText || '', this._domPurifyOptions).toString(); + + const metricsElm = document.createElement('div'); + metricsElm.className = 'metrics'; + + if (!this.customFooterOptions.hideMetrics) { + const rightFooterElm = this.createFooterRightContainer(); + if (rightFooterElm) { + metricsElm.appendChild(rightFooterElm); + } + } + + footerElm.appendChild(leftFooterElm); + footerElm.appendChild(metricsElm); + this._footerElement = footerElm; + + if (gridParentContainerElm?.append && this._footerElement) { + gridParentContainerElm.append(this._footerElement); + } + } + + /** Create the Right Section Footer */ + private createFooterRightContainer(): HTMLDivElement { + const rightFooterElm = document.createElement('div'); + rightFooterElm.className = `right-footer metrics ${this.customFooterOptions.rightContainerClass || ''}`; + + const lastUpdateElm = document.createElement('span'); + lastUpdateElm.className = 'timestamp'; + + if (!this.customFooterOptions.hideLastUpdateTimestamp) { + const footerLastUpdateElm = this.createFooterLastUpdate(); + if (footerLastUpdateElm) { + lastUpdateElm.appendChild(footerLastUpdateElm); + } + } + + const itemCountElm = document.createElement('span'); + itemCountElm.className = 'item-count'; + itemCountElm.textContent = `${this.metrics?.itemCount ?? ''}`; + + // last update elements + rightFooterElm.appendChild(lastUpdateElm); + rightFooterElm.appendChild(itemCountElm); + + // total count element (unless hidden) + if (!this.customFooterOptions.hideTotalItemCount) { + const textOfElm = document.createElement('span'); + textOfElm.textContent = ` ${this.customFooterOptions.metricTexts?.of ?? ''} `; + rightFooterElm.appendChild(textOfElm); + + const totalCountElm = document.createElement('span'); + totalCountElm.className = 'total-count'; + totalCountElm.textContent = `${this.metrics?.totalItemCount ?? ''} items`; + + rightFooterElm.appendChild(totalCountElm); + } + + const textItemsElm = document.createElement('span'); + textItemsElm.textContent = ` ${this.customFooterOptions.metricTexts?.items ?? ''} `; + rightFooterElm.appendChild(textItemsElm); + + return rightFooterElm; + } + + /** Create the Right Section Last Update Timestamp */ + private createFooterLastUpdate(): HTMLSpanElement { + // get translated text & last timestamp + const lastUpdateText = this.customFooterOptions?.metricTexts?.lastUpdate ?? ''; + const lastUpdateTimestamp = moment(this.metrics?.endTime).format(this.customFooterOptions.dateFormat); + + const lastUpdateElm = document.createElement('span'); + lastUpdateElm.className = 'last-update'; + lastUpdateElm.textContent = `${lastUpdateText} ${lastUpdateTimestamp}`; + + const separatorElm = document.createElement('span'); + separatorElm.className = 'separator'; + separatorElm.textContent = ` ${this.customFooterOptions.metricSeparator || ''} `; + + const lastUpdateContainerElm = document.createElement('span'); + lastUpdateContainerElm.appendChild(lastUpdateElm); + lastUpdateContainerElm.appendChild(separatorElm); + + return lastUpdateContainerElm; + } + + /** Translate all Custom Footer Texts (footer with metrics) */ + private translateCustomFooterTexts() { + if (this.translaterService?.translate) { + this.customFooterOptions.metricTexts = this.customFooterOptions.metricTexts || {}; + for (const propName of Object.keys(this.customFooterOptions.metricTexts)) { + if (propName.lastIndexOf('Key') > 0) { + const propNameWithoutKey = propName.substring(0, propName.lastIndexOf('Key')); + this.customFooterOptions.metricTexts[propNameWithoutKey] = this.translaterService.translate(this.customFooterOptions.metricTexts[propName] || ' '); + } + } + } + } +} diff --git a/packages/vanilla-bundle/src/components/slick-pagination.ts b/packages/vanilla-bundle/src/components/slick-pagination.ts index 0ef317c0b..72a307bd1 100644 --- a/packages/vanilla-bundle/src/components/slick-pagination.ts +++ b/packages/vanilla-bundle/src/components/slick-pagination.ts @@ -231,7 +231,7 @@ export class SlickPaginationComponent { /** Translate all the texts shown in the UI, use ngx-translate service when available or custom locales when service is null */ private translatePaginationTexts(locales: Locale) { - if (this._enableTranslate && this.translaterService?.translate && this.translaterService.getCurrentLocale) { + if (this._enableTranslate && this.translaterService?.translate) { const translationPrefix = getTranslationPrefix(this.gridOptions); this.textItemsPerPage = this.translaterService.translate(`${translationPrefix}ITEMS_PER_PAGE`); this.textItems = this.translaterService.translate(`${translationPrefix}ITEMS`); diff --git a/packages/vanilla-bundle/src/services/__tests__/binding.helper.spec.ts b/packages/vanilla-bundle/src/services/__tests__/binding.helper.spec.ts index 4f00b3cab..01691e6e1 100644 --- a/packages/vanilla-bundle/src/services/__tests__/binding.helper.spec.ts +++ b/packages/vanilla-bundle/src/services/__tests__/binding.helper.spec.ts @@ -101,4 +101,25 @@ describe('Binding Helper', () => { expect(helper.querySelectorPrefix).toBe('.grid123'); expect(mockCallback).toHaveBeenCalled(); }); + + it('set an element attribute with new value defined', () => { + const elm = document.createElement('span'); + elm.className = 'something'; + div.appendChild(elm); + + helper.setElementAttributeValue('.something', 'textContent', 'Hello World'); + + expect(elm.textContent).toBe('Hello World'); + }); + + it('set an element attribute with new value defined with a prefix also defined', () => { + const elm = document.createElement('span'); + elm.className = 'prefixer something'; + div.appendChild(elm); + + helper.querySelectorPrefix = '.prefixer'; + helper.setElementAttributeValue('.something', 'textContent', 'Hello World'); + + expect(elm.textContent).toBe('Hello World'); + }); }); diff --git a/packages/vanilla-bundle/src/services/binding.helper.ts b/packages/vanilla-bundle/src/services/binding.helper.ts index d3f930653..a24c92521 100644 --- a/packages/vanilla-bundle/src/services/binding.helper.ts +++ b/packages/vanilla-bundle/src/services/binding.helper.ts @@ -44,13 +44,29 @@ export class BindingHelper { }); } + /** From a DOM element selector, which could be zero or multiple elements, add an event listener */ bindEventHandler(selector: string, eventName: string, callback: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions) { const elements = document.querySelectorAll(`${this.querySelectorPrefix}${selector}`); - elements.forEach((elm) => { + elements.forEach(elm => { if (elm?.addEventListener) { elm.addEventListener(eventName, callback, options); } }); } + + /** + * From a DOM element selector, which could be zero or multiple elements, set the value on a given attribute name + * For example ('div.hello', 'textContent', 'world') => would set the textContent equal to 'world' on a div element having the class 'hello' + */ + setElementAttributeValue(selector: string, attribute: string, value: any) { + const elements = document.querySelectorAll(`${this.querySelectorPrefix}${selector}`); + + elements.forEach(elm => { + elm.textContent = ''; + if (elm && attribute in elm) { + elm[attribute] = value; + } + }); + } } diff --git a/packages/vanilla-bundle/src/services/footer.service.ts b/packages/vanilla-bundle/src/services/footer.service.ts deleted file mode 100644 index f068f9177..000000000 --- a/packages/vanilla-bundle/src/services/footer.service.ts +++ /dev/null @@ -1,95 +0,0 @@ -import * as moment_ from 'moment-mini'; -const moment = moment_; // patch to fix rollup "moment has no default export" issue, document here https://github.com/rollup/rollup/issues/670 - -import { Constants, CustomFooterOption, GridOption, Locale, Metrics, SharedService, TranslaterService } from '@slickgrid-universal/common'; - -export class FooterService { - showCustomFooter = false; - customFooterOptions: CustomFooterOption; - metrics: Metrics; - - constructor(private sharedService: SharedService, private translaterService?: TranslaterService) { } - - get gridOptions(): GridOption { - return this.sharedService?.gridOptions || {}; - } - - get locales(): Locale { - // get locales provided by user in main file or else use default English locales via the Constants - return this.sharedService.gridOptions && this.sharedService.gridOptions.locales || Constants.locales; - } - - /** - * We could optionally display a custom footer below the grid to show some metrics (last update, item count with/without filters) - * It's an opt-in, user has to enable "showCustomFooter" and it cannot be used when there's already a Pagination since they display the same kind of info - */ - optionallyShowCustomFooterWithMetrics(metrics: Metrics): any | null { - if (this.gridOptions) { - this.metrics = metrics; - if (this.gridOptions.enableTranslate) { - this.translateCustomFooterTexts(); - } else if (this.gridOptions.customFooterOptions) { - const customFooterOptions = this.gridOptions.customFooterOptions; - customFooterOptions.metricTexts = customFooterOptions.metricTexts || {}; - customFooterOptions.metricTexts.lastUpdate = customFooterOptions.metricTexts.lastUpdate || this.locales && this.locales.TEXT_LAST_UPDATE || 'TEXT_LAST_UPDATE'; - customFooterOptions.metricTexts.items = customFooterOptions.metricTexts.items || this.locales && this.locales.TEXT_ITEMS || 'TEXT_ITEMS'; - customFooterOptions.metricTexts.of = customFooterOptions.metricTexts.of || this.locales && this.locales.TEXT_OF || 'TEXT_OF'; - } - - // we will display the custom footer only when there's no Pagination - if (!this.gridOptions.enablePagination) { - this.showCustomFooter = this.gridOptions.hasOwnProperty('showCustomFooter') ? (this.gridOptions.showCustomFooter as boolean) : false; - this.customFooterOptions = this.gridOptions.customFooterOptions || {}; - if (this.showCustomFooter) { - return $(this.renderFooter()); - } - } - } - return null; - } - - /** Translate all Custom Footer Texts (footer with metrics) */ - private translateCustomFooterTexts() { - if (this.translaterService && this.translaterService.translate && this.translaterService.getCurrentLocale && this.translaterService.getCurrentLocale()) { - const customFooterOptions = this.gridOptions?.customFooterOptions || {}; - customFooterOptions.metricTexts = customFooterOptions.metricTexts || {}; - for (const propName of Object.keys(customFooterOptions.metricTexts)) { - if (propName.lastIndexOf('Key') > 0) { - const propNameWithoutKey = propName.substring(0, propName.lastIndexOf('Key')); - customFooterOptions.metricTexts[propNameWithoutKey] = this.translaterService.translate(customFooterOptions.metricTexts[propName] || ' '); - } - } - } - } - - renderFooter() { - return ``.trim(); - } - - renderFooterRightContainer(): string { - return ``.trim(); - } - - renderFooterTotalCount(): string { - return `${this.customFooterOptions.metricTexts?.of || ''} ${this.metrics.totalItemCount}`; - } - - renderFooterLastUpdate(): string { - return `${this.customFooterOptions.metricTexts?.lastUpdate || ''} - ${moment(this.metrics.endTime).format(this.customFooterOptions.dateFormat)} - ${this.customFooterOptions.metricSeparator}`.trim(); - } -} diff --git a/packages/vanilla-bundle/src/services/index.ts b/packages/vanilla-bundle/src/services/index.ts index e59dc8a7f..25213cdf8 100644 --- a/packages/vanilla-bundle/src/services/index.ts +++ b/packages/vanilla-bundle/src/services/index.ts @@ -2,5 +2,4 @@ export * from './binding.service'; export * from './binding.helper'; export * from './eventPubSub.service'; export * from './fileExport.service'; -export * from './footer.service'; export * from './translate.service'; diff --git a/packages/vanilla-bundle/src/vanilla-grid-bundle.ts b/packages/vanilla-bundle/src/vanilla-grid-bundle.ts index 6344cbf51..24271c20b 100644 --- a/packages/vanilla-bundle/src/vanilla-grid-bundle.ts +++ b/packages/vanilla-bundle/src/vanilla-grid-bundle.ts @@ -69,7 +69,7 @@ import { import { FileExportService } from './services/fileExport.service'; import { TranslateService } from './services/translate.service'; import { EventPubSubService } from './services/eventPubSub.service'; -import { FooterService } from './services/footer.service'; +import { SlickFooterComponent } from './components/slick-footer'; import { SlickPaginationComponent } from './components/slick-pagination'; import { SalesforceGlobalGridOptions } from './salesforce-global-grid-options'; @@ -130,7 +130,6 @@ export class VanillaGridBundle { collectionService: CollectionService; extensionService: ExtensionService; filterService: FilterService; - footerService: FooterService; gridEventService: GridEventService; gridService: GridService; gridStateService: GridStateService; @@ -141,7 +140,8 @@ export class VanillaGridBundle { translateService: TranslateService; treeDataService: TreeDataService; - slickPagination: SlickPaginationComponent; + slickFooter: SlickFooterComponent | undefined; + slickPagination: SlickPaginationComponent | undefined; gridClass: string; gridClassName: string; @@ -241,7 +241,6 @@ export class VanillaGridBundle { this.sharedService = new SharedService(); this.translateService = new TranslateService(); this.collectionService = new CollectionService(this.translateService); - this.footerService = new FooterService(this.sharedService, this.translateService); const filterFactory = new FilterFactory(slickgridConfig, this.collectionService, this.translateService); this.filterService = new FilterService(filterFactory, this._eventPubSubService, this.sharedService); this.sortService = new SortService(this.sharedService, this._eventPubSubService); @@ -405,9 +404,9 @@ export class VanillaGridBundle { } // user could show a custom footer with the data metrics (dataset length and last updated timestamp) - const customFooterElm = this.footerService.optionallyShowCustomFooterWithMetrics(this.metrics); - if (customFooterElm) { - $(customFooterElm).appendTo(this._gridParentContainerElm); + if (!this.gridOptions.enablePagination && this.gridOptions.showCustomFooter && this.gridOptions.customFooterOptions) { + this.slickFooter = new SlickFooterComponent(this.grid, this.gridOptions.customFooterOptions, this.translateService); + this.slickFooter.renderFooter(this._gridParentContainerElm); } const fixedGridDimensions = (this._gridOptions?.gridHeight || this._gridOptions?.gridWidth) ? { height: this._gridOptions?.gridHeight, width: this._gridOptions?.gridWidth } : undefined; @@ -661,15 +660,8 @@ export class VanillaGridBundle { }; // if custom footer is enabled, then we'll update its metrics - if (this.footerService.showCustomFooter) { - const itemCountElm = document.querySelector('.item-count'); - const totalCountElm = document.querySelector('.total-count'); - if (itemCountElm) { - itemCountElm.textContent = `${this.metrics.itemCount}`; - } - if (totalCountElm) { - totalCountElm.textContent = `${this.metrics.totalItemCount}`; - } + if (this.slickFooter) { + this.slickFooter.metrics = this.metrics; } }); diff --git a/packages/web-demo-vanilla-bundle/README.md b/packages/web-demo-vanilla-bundle/README.md index 8e2052335..ee30ebccc 100644 --- a/packages/web-demo-vanilla-bundle/README.md +++ b/packages/web-demo-vanilla-bundle/README.md @@ -1,7 +1,9 @@ ## Vanilla Bundle Examples (demo) -Standalone package to simply demo the Vanilla Bundle implementation (no framework associated) and test the code by providing a few Examples of most features. +Standalone package to simply demo the Vanilla Bundle implementation (no framework associated) and build the [GitHub Demo](https://ghiscoding.github.io/slickgrid-universal) page. + +This is basically a simple UI implementation written in plain TypeScript to demo most features, we will also use it to run certain Cypress E2E tests. ### Installation -To get this demo starting, you need to run it from the monorepo at the root. -Go to the root of the repo and follow the instruction provided in the main [README](https://github.com/ghiscoding/slickgrid-universal#installation) +To get started with this demo, you need to run it from the root of monorepo structure. +Go to the root of the repo and follow the instructions provided in the main [README](https://github.com/ghiscoding/slickgrid-universal#installation) diff --git a/packages/web-demo-vanilla-bundle/package.json b/packages/web-demo-vanilla-bundle/package.json index af8abb9c4..42698f799 100644 --- a/packages/web-demo-vanilla-bundle/package.json +++ b/packages/web-demo-vanilla-bundle/package.json @@ -1,6 +1,7 @@ { "name": "web-demo-vanilla-bundle", "version": "0.0.2", + "private": true, "description": "SlickGrid-Universal demo", "directories": { "src": "src" @@ -34,23 +35,23 @@ "devDependencies": { "@types/jquery": "^3.5.0", "@types/moment": "^2.13.0", - "@types/node": "^14.0.14", - "@types/webpack": "^4.41.18", + "@types/node": "^14.0.19", + "@types/webpack": "^4.41.21", "clean-webpack-plugin": "^3.0.0", - "copy-webpack-plugin": "^6.0.2", + "copy-webpack-plugin": "^6.0.3", "css-loader": "^3.6.0", "file-loader": "^6.0.0", - "fork-ts-checker-webpack-plugin": "^5.0.5", + "fork-ts-checker-webpack-plugin": "^5.0.7", "html-loader": "^1.1.0", "html-webpack-plugin": "^4.3.0", "json-loader": "^0.5.7", "mini-css-extract-plugin": "^0.9.0", "node-sass": "4.14.1", - "sass-loader": "^8.0.2", + "sass-loader": "^9.0.2", "style-loader": "^1.2.1", "ts-loader": "^7.0.5", "ts-node": "^8.10.2", - "typescript": "^3.9.5", + "typescript": "^3.9.6", "url-loader": "^4.1.0", "webpack": "^4.43.0", "webpack-cli": "^3.3.12", diff --git a/packages/web-demo-vanilla-bundle/src/examples/example01.ts b/packages/web-demo-vanilla-bundle/src/examples/example01.ts index 72594ae3d..ef02d9808 100644 --- a/packages/web-demo-vanilla-bundle/src/examples/example01.ts +++ b/packages/web-demo-vanilla-bundle/src/examples/example01.ts @@ -32,8 +32,8 @@ export class Example1 { } dispose() { - this.slickgridLwc1.dispose(); - this.slickgridLwc2.dispose(); + this.slickgridLwc1?.dispose(); + this.slickgridLwc2?.dispose(); } /* Define grid Options and Columns */ @@ -59,6 +59,7 @@ export class Example1 { this.gridOptions2 = { ...this.gridOptions1, ...{ + gridHeight: 255, enablePagination: true, enableFiltering: true, pagination: { @@ -68,9 +69,12 @@ export class Example1 { presets: { pagination: { pageNumber: 2, - pageSize: 20 + pageSize: 5 }, - sorters: [{ columnId: '%', direction: 'DESC' }, { columnId: 'title', direction: 'ASC' }], + sorters: [ + // { columnId: '%', direction: 'DESC' }, + { columnId: 'title', direction: 'ASC' } + ], filters: [{ columnId: 'title', searchTerms: ['2'] }] } } diff --git a/packages/web-demo-vanilla-bundle/src/examples/example02.ts b/packages/web-demo-vanilla-bundle/src/examples/example02.ts index 175824e07..89c88639e 100644 --- a/packages/web-demo-vanilla-bundle/src/examples/example02.ts +++ b/packages/web-demo-vanilla-bundle/src/examples/example02.ts @@ -32,7 +32,7 @@ export class Example2 { } dispose() { - this.slickgridLwc.dispose(); + this.slickgridLwc?.dispose(); } initializeGrid() { @@ -145,6 +145,7 @@ export class Example2 { customFooterOptions: { // optionally display some text on the left footer container leftFooterText: 'Grid created with Slickgrid-Universal', + hideMetrics: false, hideTotalItemCount: false, hideLastUpdateTimestamp: false }, diff --git a/packages/web-demo-vanilla-bundle/src/examples/example03.ts b/packages/web-demo-vanilla-bundle/src/examples/example03.ts index 7df5b5592..445ebfad8 100644 --- a/packages/web-demo-vanilla-bundle/src/examples/example03.ts +++ b/packages/web-demo-vanilla-bundle/src/examples/example03.ts @@ -76,7 +76,7 @@ export class Example3 { } dispose() { - this.slickgridLwc.dispose(); + this.slickgridLwc?.dispose(); } initializeGrid() { diff --git a/packages/web-demo-vanilla-bundle/src/examples/example04.html b/packages/web-demo-vanilla-bundle/src/examples/example04.html index 4fc283972..6d9229477 100644 --- a/packages/web-demo-vanilla-bundle/src/examples/example04.html +++ b/packages/web-demo-vanilla-bundle/src/examples/example04.html @@ -16,6 +16,15 @@

Example 04 - Pinned (frozen) Columns/Rows

+ + + + +
diff --git a/packages/web-demo-vanilla-bundle/src/examples/example08.ts b/packages/web-demo-vanilla-bundle/src/examples/example08.ts index a2f7e7a8c..665b39f10 100644 --- a/packages/web-demo-vanilla-bundle/src/examples/example08.ts +++ b/packages/web-demo-vanilla-bundle/src/examples/example08.ts @@ -14,6 +14,7 @@ export class Example08 { columnDefinitions2: Column[]; gridOptions1: GridOption; gridOptions2: GridOption; + slickerGrid2Instance: any; dataset1 = []; dataset2 = []; slickgridLwc1; @@ -30,6 +31,7 @@ export class Example08 { this.dataset2 = this.loadData(500); const gridContainerElm1 = document.querySelector(`.grid1`); const gridContainerElm2 = document.querySelector(`.grid2`); + gridContainerElm2.addEventListener('onslickergridcreated', this.handleOnSlickerGrid2Created.bind(this)); this.slickgridLwc1 = new Slicker.GridBundle(gridContainerElm1, this.columnDefinitions1, { ...ExampleGridOptions, ...this.gridOptions1 }, this.dataset1); this.slickgridLwc2 = new Slicker.GridBundle(gridContainerElm2, this.columnDefinitions2, { ...ExampleGridOptions, ...this.gridOptions2 }, this.dataset2); } @@ -68,6 +70,7 @@ export class Example08 { definedGrid2() { this.columnDefinitions2 = [ + { id: 'sel', name: '#', field: 'num', behavior: 'select', cssClass: 'cell-selection', width: 40, resizable: false, selectable: false }, { id: 'title', name: 'Title', field: 'title', minWidth: 120, sortable: true, columnGroup: 'Common Factor' }, { id: 'duration', name: 'Duration', field: 'duration', minWidth: 120, columnGroup: 'Common Factor' }, { id: 'start', name: 'Start', field: 'start', minWidth: 145, columnGroup: 'Period' }, @@ -86,7 +89,7 @@ export class Example08 { showPreHeaderPanel: true, preHeaderPanelHeight: 35, explicitInitialization: true, - frozenColumn: 1, + frozenColumn: 2, rowHeight: 33, gridMenu: { hideClearFrozenColumnsCommand: false }, headerMenu: { hideFreezeColumnsCommand: false } @@ -111,6 +114,16 @@ export class Example08 { return mockDataset; } + handleOnSlickerGrid2Created(event) { + this.slickerGrid2Instance = event && event.detail; + // console.log('handleOnSlickerGridCreated', this.slickerGrid2Instance); + } + + setFrozenColumns2(frozenCols: number) { + this.slickerGrid2Instance.slickGrid.setOptions({ frozenColumn: frozenCols, alwaysShowVerticalScroll: false }); + this.gridOptions2 = this.slickerGrid2Instance.slickGrid.getOptions(); + } + /** * A callback to render different row column span * Your callback will always have the "item" argument which you can use to decide on the colspan diff --git a/packages/web-demo-vanilla-bundle/src/examples/example09.ts b/packages/web-demo-vanilla-bundle/src/examples/example09.ts index 7a86c55c1..a9d629a3b 100644 --- a/packages/web-demo-vanilla-bundle/src/examples/example09.ts +++ b/packages/web-demo-vanilla-bundle/src/examples/example09.ts @@ -33,7 +33,7 @@ export class Example09 { dispose() { if (this.slickgridLwc) { - this.slickgridLwc.dispose(); + this.slickgridLwc?.dispose(); } } @@ -113,7 +113,7 @@ export class Example09 { displaySpinner(isProcessing) { this.processing = isProcessing; - this.status = (isProcessing) ? 'loading...' : 'done!!!'; + this.status = (isProcessing) ? 'loading...' : 'finished!!'; this.statusClass = (isProcessing) ? 'notification is-light is-warning' : 'notification is-light is-success'; } diff --git a/packages/web-demo-vanilla-bundle/src/examples/example10.ts b/packages/web-demo-vanilla-bundle/src/examples/example10.ts index 11b20ae07..a7dc5f66b 100644 --- a/packages/web-demo-vanilla-bundle/src/examples/example10.ts +++ b/packages/web-demo-vanilla-bundle/src/examples/example10.ts @@ -37,7 +37,7 @@ export class Example10 { dispose() { if (this.slickgridLwc) { - this.slickgridLwc.dispose(); + this.slickgridLwc?.dispose(); } // this.saveCurrentGridState(); } @@ -186,7 +186,7 @@ export class Example10 { displaySpinner(isProcessing) { this.processing = isProcessing; - this.status = (isProcessing) ? 'loading...' : 'done!!!'; + this.status = (isProcessing) ? 'loading...' : 'finished!!'; this.statusClass = (isProcessing) ? 'notification is-light is-warning' : 'notification is-light is-success'; } diff --git a/packages/web-demo-vanilla-bundle/src/examples/example50.ts b/packages/web-demo-vanilla-bundle/src/examples/example50.ts index 7c163372c..f97b2c913 100644 --- a/packages/web-demo-vanilla-bundle/src/examples/example50.ts +++ b/packages/web-demo-vanilla-bundle/src/examples/example50.ts @@ -248,7 +248,7 @@ export class Example50 { } dispose() { - this.slickgridLwc.dispose(); + this.slickgridLwc?.dispose(); } searchItem(event: KeyboardEvent) { diff --git a/packages/web-demo-vanilla-bundle/src/examples/example51.ts b/packages/web-demo-vanilla-bundle/src/examples/example51.ts index 561a83936..9d95b8b8d 100644 --- a/packages/web-demo-vanilla-bundle/src/examples/example51.ts +++ b/packages/web-demo-vanilla-bundle/src/examples/example51.ts @@ -285,7 +285,7 @@ export class Example51 { } dispose() { - this.slickgridLwc.dispose(); + this.slickgridLwc?.dispose(); } searchItem(event: KeyboardEvent) { diff --git a/test/cypress/integration/example01.spec.js b/test/cypress/integration/example01.spec.js new file mode 100644 index 000000000..988459336 --- /dev/null +++ b/test/cypress/integration/example01.spec.js @@ -0,0 +1,459 @@ +/// + +describe('Example 01 - Basic Grids', () => { + const fullTitles = ['Title', 'Duration (days)', '% Complete', 'Start', 'Finish', 'Effort Driven']; + + it('should display Example title', () => { + cy.visit(`${Cypress.config('baseExampleUrl')}/example01`); + cy.get('h3').should('contain', 'Example 01 - Basic Grids'); + cy.get('h3 span.subtitle').should('contain', '(with Salesforce Theme)'); + }); + + it('should have 2 grids of size 800 by 225px', () => { + cy.get('.grid1') + .should('have.css', 'width', '800px'); + + cy.get('.grid1 > .slickgrid-container') + .should('have.css', 'height', '225px'); + + cy.get('.grid2') + .should('have.css', 'width', '800px'); + + cy.get('.grid2 > .slickgrid-container') + .should('have.css', 'height', '255px'); + }); + + it('should have exact column titles on 1st grid', () => { + cy.get('.grid1') + .find('.slick-header-columns') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullTitles[index])); + }); + + it('should hover over the Title column and click on "Sort Descending" command', () => { + cy.get('.grid1') + .find('.slick-header-column') + .first() + .trigger('mouseover') + .children('.slick-header-menubutton') + .click(); + + cy.get('.slick-header-menu') + .should('be.visible') + .children('.slick-header-menuitem:nth-child(2)') + .children('.slick-header-menucontent') + .should('contain', 'Sort Descending') + .click(); + + cy.get('.slick-row') + .first() + .children('.slick-cell') + .first() + .should('contain', 'Task 994'); + }); + + it('should hover over the "Title" column of 2nd grid and click on "Sort Ascending" command', () => { + cy.get('.grid2') + .find('.slick-header-column') + .first() + .trigger('mouseover') + .children('.slick-header-menubutton') + .invoke('show') + .click(); + + cy.get('.slick-header-menu') + .should('be.visible') + .children('.slick-header-menuitem:nth-child(1)') + .children('.slick-header-menucontent') + .should('contain', 'Sort Ascending') + .click(); + + cy.get('.grid2 [style="top:0px"] > .slick-cell:nth(0)').should('contain', 'Task 122'); + cy.get('.grid2 [style="top:33px"] > .slick-cell:nth(0)').should('contain', 'Task 123'); + cy.get('.grid2 [style="top:66px"] > .slick-cell:nth(0)').should('contain', 'Task 124'); + cy.get('.grid2 [style="top:99px"] > .slick-cell:nth(0)').should('contain', 'Task 125'); + cy.get('.grid2 [style="top:132px"] > .slick-cell:nth(0)').should('contain', 'Task 126'); + }); + + it('should hover over the "Duration" column of 2nd grid, Sort Ascending and have 2 sorts', () => { + cy.get('.grid2') + .find('.slick-header-column:nth-child(2)') + .trigger('mouseover') + .children('.slick-header-menubutton') + .invoke('show') + .click(); + + cy.get('.grid2') + .find('.slick-header-menu') + .should('be.visible') + .children('.slick-header-menuitem:nth-child(2)') + .click(); + + cy.get('.grid2') + .find('.slick-sort-indicator-asc') + .should('have.length', 1) + .siblings('.slick-sort-indicator-numbered') + .contains('1'); + + cy.get('.grid2') + .find('.slick-sort-indicator-desc') + .should('have.length', 1) + .siblings('.slick-sort-indicator-numbered') + .contains('2'); + }); + + it('should clear sorting of grid2 using the Grid Menu "Clear all Sorting" command', () => { + cy.get('.grid2') + .find('button.slick-gridmenu-button') + .trigger('click') + .click(); + }); + + it('should have no sorting in 2nd grid (back to default sorted by id)', () => { + let gridUid = ''; + + cy.get('.grid2 .slickgrid-container') + .should(($grid) => { + const classes = $grid.prop('className').split(' '); + gridUid = classes.find(className => /slickgrid_.*/.test(className)); + expect(gridUid).to.not.be.null; + }) + .then(() => { + cy.get(`.slick-gridmenu.${gridUid}`) + .find('.slick-gridmenu-item:nth(1)') + .find('span') + .contains('Clear all Sorting') + .click(); + + cy.get('.grid2') + .find('.slick-sort-indicator-asc') + .should('have.length', 0); + + cy.get('.grid2') + .find('.slick-sort-indicator-desc') + .should('have.length', 0); + + cy.get('.grid2 [style="top:0px"] > .slick-cell:nth(0)').should('contain', 'Task 23'); + cy.get('.grid2 [style="top:33px"] > .slick-cell:nth(0)').should('contain', 'Task 24'); + cy.get('.grid2 [style="top:66px"] > .slick-cell:nth(0)').should('contain', 'Task 25'); + cy.get('.grid2 [style="top:99px"] > .slick-cell:nth(0)').should('contain', 'Task 26'); + cy.get('.grid2 [style="top:132px"] > .slick-cell:nth(0)').should('contain', 'Task 27'); + }); + }); + + it('should retain sorting in 1st grid', () => { + cy.get('.grid1') + .find('.slick-sort-indicator-desc') + .should('have.length', 1); + }); + + it('should have Pagination displayed and set on Grid2', () => { + cy.get('[data-test=page-number-input]') + .invoke('val') + .then(pageNumber => expect(pageNumber).to.eq('2')); + + cy.get('[data-test=page-count]') + .contains('55'); + + cy.get('[data-test=item-from]') + .contains('6'); + + cy.get('[data-test=item-to]') + .contains('10'); + + cy.get('[data-test=total-items]') + .contains('271'); + }); + + it('should clear filters of grid2 using the Grid Menu "Clear all Filters" command', () => { + cy.get('.grid2') + .find('button.slick-gridmenu-button') + .trigger('click') + .click(); + + let gridUid = ''; + + cy.get('.grid2 .slickgrid-container') + .should(($grid) => { + const classes = $grid.prop('className').split(' '); + gridUid = classes.find(className => /slickgrid_.*/.test(className)); + expect(gridUid).to.not.be.null; + }) + .then(() => { + cy.get(`.slick-gridmenu.${gridUid}`) + .find('.slick-gridmenu-item:nth(0)') + .find('span') + .contains('Clear all Filters') + .click(); + }); + }); + + it('should change Page Number 52 and expect the Pagination to have correct values', () => { + cy.get('[data-test=page-number-input]') + .clear() + .type('52') + .type('{enter}'); + + cy.get('[data-test=page-count]') + .contains('199'); + + cy.get('[data-test=item-from]') + .contains('256'); + + cy.get('[data-test=item-to]') + .contains('260'); + + cy.get('[data-test=total-items]') + .contains('995'); + }); + + it('should open the Grid Menu on 1st Grid and expect all Columns to be checked', () => { + let gridUid = ''; + cy.get('.grid1') + .find('button.slick-gridmenu-button') + .click({ force: true }); + + cy.get('.grid1 .slickgrid-container') + .should(($grid) => { + const classes = $grid.prop('className').split(' '); + gridUid = classes.find(className => /slickgrid_.*/.test(className)); + expect(gridUid).to.not.be.null; + }) + .then(() => { + cy.get(`.slick-gridmenu.${gridUid}`) + .find('.slick-gridmenu-list') + .children('li') + .each(($child, index) => { + if (index <= 5) { + const $input = $child.children('input'); + const $label = $child.children('label'); + expect($input.attr('checked')).to.eq('checked'); + expect($label.text()).to.eq(fullTitles[index]); + } + }); + }); + }); + + it('should then hide "Title" column from same 1st Grid and expect the column to be removed from 1st Grid', () => { + const newColumnList = ['Duration (days)', '% Complete', 'Start', 'Finish', 'Effort Driven']; + cy.get('.grid1') + .get('.slick-gridmenu:visible') + .find('.slick-gridmenu-list') + .children('li:visible:nth(0)') + .children('label') + .should('contain', 'Title') + .click({ force: true }); + + cy.get('.grid1') + .get('.slick-gridmenu:visible') + .find('span.close') + .click({ force: true }); + + cy.get('.grid1') + .find('.slick-header-columns') + .children() + .each(($child, index) => expect($child.text()).to.eq(newColumnList[index])); + }); + + it('should open the Grid Menu off 2nd Grid and expect all Columns to still be all checked', () => { + let gridUid = ''; + cy.get('.grid2') + .find('button.slick-gridmenu-button') + .click({ force: true }); + + cy.get('.grid2 .slickgrid-container') + .should(($grid) => { + const classes = $grid.prop('className').split(' '); + gridUid = classes.find(className => /slickgrid_.*/.test(className)); + expect(gridUid).to.not.be.null; + }) + .then(() => { + cy.get(`.slick-gridmenu.${gridUid}`) + .find('.slick-gridmenu-list') + .children('li') + .each(($child, index) => { + if (index <= 5) { + const $input = $child.children('input'); + const $label = $child.children('label'); + expect($input.attr('checked')).to.eq('checked'); + expect($label.text()).to.eq(fullTitles[index]); + } + }); + }); + }); + + it('should then hide "% Complete" column from this same 2nd Grid and expect the column to be removed from 2nd Grid', () => { + const newColumnList = ['Title', 'Duration (days)', 'Start', 'Finish', 'Effort Driven']; + cy.get('.grid2') + .get('.slick-gridmenu:visible') + .find('.slick-gridmenu-list') + .children('li:visible:nth(2)') + .children('label') + .should('contain', '% Complete') + .click({ force: true }); + + cy.get('.grid2') + .get('.slick-gridmenu:visible') + .find('span.close') + .click({ force: true }); + + cy.get('.grid2') + .find('.slick-header-columns') + .children() + .each(($child, index) => expect($child.text()).to.eq(newColumnList[index])); + }); + + it('should go back to 1st Grid and open its Grid Menu and we expect this grid to stil have the "Title" column be hidden (unchecked)', () => { + cy.get('.grid1') + .find('button.slick-gridmenu-button') + .click({ force: true }); + + cy.get('.slick-gridmenu-list') + .children('li') + .each(($child, index) => { + if (index <= 5) { + const $input = $child.children('input'); + const $label = $child.children('label'); + if ($label.text() === 'Title') { + expect($input.attr('checked')).to.eq(undefined); + } else { + expect($input.attr('checked')).to.eq('checked'); + } + expect($label.text()).to.eq(fullTitles[index]); + } + }); + }); + + it('should hide "Start" column from 1st Grid and expect to have 2 hidden columns (Title, Start)', () => { + const newColumnList = ['Duration (days)', '% Complete', 'Finish', 'Effort Driven']; + cy.get('.grid1') + .get('.slick-gridmenu:visible') + .find('.slick-gridmenu-list') + .children('li:visible:nth(3)') + .children('label') + .should('contain', 'Start') + .click({ force: true }); + + cy.get('.grid1') + .get('.slick-gridmenu:visible') + .find('span.close') + .click({ force: true }); + + cy.get('.grid1') + .find('.slick-header-columns') + .children() + .each(($child, index) => expect($child.text()).to.eq(newColumnList[index])); + }); + + it('should open Column Picker of 2nd Grid and show the "% Complete" column back to visible', () => { + cy.get('.grid2') + .find('.slick-header-column') + .first() + .trigger('mouseover') + .trigger('contextmenu') + .invoke('show'); + + cy.get('.slick-columnpicker') + .find('.slick-columnpicker-list') + .children() + .each(($child, index) => { + if (index <= 5) { + expect($child.text()).to.eq(fullTitles[index]); + } + }); + + cy.get('.slick-columnpicker') + .find('.slick-columnpicker-list') + .children('li:nth-child(3)') + .children('label') + .should('contain', '% Complete') + .click(); + + cy.get('.grid2') + .find('.slick-header-columns') + .children() + .each(($child, index) => { + if (index <= 5) { + expect($child.text()).to.eq(fullTitles[index]); + } + }); + + cy.get('.grid2') + .get('.slick-columnpicker:visible') + .find('span.close') + .trigger('click') + .click(); + }); + + it('should open the Grid Menu on 2nd Grid and expect all Columns to be checked', () => { + let gridUid = ''; + cy.get('.grid2') + .find('button.slick-gridmenu-button') + .click({ force: true }); + + cy.get('.grid2 .slickgrid-container') + .should(($grid) => { + const classes = $grid.prop('className').split(' '); + gridUid = classes.find(className => /slickgrid_.*/.test(className)); + expect(gridUid).to.not.be.null; + }) + .then(() => { + cy.get(`.slick-gridmenu.${gridUid}`) + .find('.slick-gridmenu-list') + .children('li') + .each(($child, index) => { + if (index <= 5) { + const $input = $child.children('input'); + const $label = $child.children('label'); + expect($input.attr('checked')).to.eq('checked'); + expect($label.text()).to.eq(fullTitles[index]); + } + }); + }); + }); + + it('should still expect 1st Grid to be unchanged from previous state and still have only 4 columns shown', () => { + const newColumnList = ['Duration (days)', '% Complete', 'Finish', 'Effort Driven']; + + cy.get('.grid1') + .find('.slick-header-columns') + .children() + .each(($child, index) => expect($child.text()).to.eq(newColumnList[index])); + }); + + it('should open the Grid Menu on 1st Grid and also expect to only have 4 columns checked (visible)', () => { + let gridUid = ''; + cy.get('.grid1') + .find('button.slick-gridmenu-button') + .click({ force: true }); + + cy.get('.grid1 .slickgrid-container') + .should(($grid) => { + const classes = $grid.prop('className').split(' '); + gridUid = classes.find(className => /slickgrid_.*/.test(className)); + expect(gridUid).to.not.be.null; + }) + .then(() => { + cy.get(`.slick-gridmenu.${gridUid}`) + .find('.slick-gridmenu-list') + .children('li') + .each(($child, index) => { + if (index <= 5) { + const $input = $child.children('input'); + const $label = $child.children('label'); + if ($label.text() === 'Title' || $label.text() === 'Start') { + expect($input.attr('checked')).to.eq(undefined); + } else { + expect($input.attr('checked')).to.eq('checked'); + } + expect($label.text()).to.eq(fullTitles[index]); + } + }); + }); + + cy.get('.grid1') + .get('.slick-gridmenu:visible') + .find('span.close') + .click({ force: true }); + }); +}); diff --git a/test/cypress/integration/example02.spec.js b/test/cypress/integration/example02.spec.js new file mode 100644 index 000000000..92fb4deb6 --- /dev/null +++ b/test/cypress/integration/example02.spec.js @@ -0,0 +1,88 @@ +/// +import moment from 'moment-mini'; + +function removeExtraSpaces(textS) { + return `${textS}`.replace(/\s+/g, ' ').trim(); +} + +describe('Example 02 - Grid with Formatters', () => { + const fullTitles = ['#', 'Title', 'Duration', '% Complete', 'Start', 'Finish', 'Cost', 'Effort Driven']; + + it('should display Example title', () => { + cy.visit(`${Cypress.config('baseExampleUrl')}/example02`); + cy.get('h3').should('contain', 'Example 02 - Grouping & Aggregators'); + cy.get('h3 span.subtitle').should('contain', '(with Material Theme)'); + }); + + it('should have exact column titles on 1st grid', () => { + cy.get('.grid2') + .find('.slick-header-columns') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullTitles[index])); + }); + + it('should show a custom text in the grid footer left portion', () => { + cy.get('.grid2') + .find('.slick-custom-footer') + .find('.left-footer') + .contains('created with Slickgrid-Universal'); + }); + + it('should have some metrics shown in the grid right footer', () => { + cy.get('.grid2') + .find('.slick-custom-footer') + .find('.right-footer') + .should($span => { + const text = removeExtraSpaces($span.text()); // remove all white spaces + expect(text).to.eq(`Last Update ${moment().format('YYYY-MM-DD, hh:mm a')} | 500 of 500 items`); + }); + }); + + it('should type a filter in the Title and expect 176 items shown in the footer', () => { + cy.get('.search-filter.filter-title') + .clear() + .type('2'); + + cy.get('.grid2') + .find('.slick-custom-footer') + .find('.right-footer') + .should($span => { + const text = removeExtraSpaces($span.text()); // remove all white spaces + expect(text).to.eq(`Last Update ${moment().format('YYYY-MM-DD, hh:mm a')} | 176 of 500 items`); + }); + }); + + it('should add another filter "Effort-Driven" set to True and expect 28 items shown in the footer', () => { + cy.get('div.ms-filter.filter-effortDriven') + .trigger('click'); + + cy.get('.ms-drop') + .find('span:nth(1)') + .click(); + + cy.get('.grid2') + .find('.slick-custom-footer') + .find('.right-footer') + .should($span => { + const text = removeExtraSpaces($span.text()); // remove all white spaces + expect(text).to.eq(`Last Update ${moment().format('YYYY-MM-DD, hh:mm a')} | 28 of 500 items`); + }); + }); + + it('should change filter "Effort-Driven" to False and expect 148 items shown in the footer', () => { + cy.get('div.ms-filter.filter-effortDriven') + .trigger('click'); + + cy.get('.ms-drop') + .find('span:nth(2)') + .click(); + + cy.get('.grid2') + .find('.slick-custom-footer') + .find('.right-footer') + .should($span => { + const text = removeExtraSpaces($span.text()); // remove all white spaces + expect(text).to.eq(`Last Update ${moment().format('YYYY-MM-DD, hh:mm a')} | 148 of 500 items`); + }); + }); +}); diff --git a/test/cypress/integration/example04.spec.js b/test/cypress/integration/example04.spec.js new file mode 100644 index 000000000..fc5cbb30e --- /dev/null +++ b/test/cypress/integration/example04.spec.js @@ -0,0 +1,99 @@ +/// + +describe('Example 04 - Frozen Grid', () => { + // NOTE: everywhere there's a * 2 is because we have a top+bottom (frozen rows) containers even after clear frozen columns + + const fullTitles = ['', 'Title', '% Complete', 'Start', 'Finish', 'Completed', 'Cost | Duration', 'City of Origin', 'Action']; + + it('should display Example title', () => { + cy.visit(`${Cypress.config('baseExampleUrl')}/example04`); + cy.get('h3').should('contain', 'Example 04 - Pinned (frozen) Columns/Rows'); + }); + + it('should have exact column titles on 1st grid', () => { + cy.get('.grid4') + .find('.slick-header-columns') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullTitles[index])); + }); + + it('should have exact Column Header Titles in the grid', () => { + cy.get('.grid4') + .find('.slick-header-columns:nth(0)') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullTitles[index])); + }); + + it('should have a frozen grid with 4 containers on page load with 3 columns on the left and 6 columns on the right', () => { + cy.get('[style="top:0px"]').should('have.length', 2 * 2); + cy.get('.grid-canvas-left > [style="top:0px"]').children().should('have.length', 3 * 2); + cy.get('.grid-canvas-right > [style="top:0px"]').children().should('have.length', 6 * 2); + + cy.get('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(0)').should('contain', ''); + cy.get('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(1)').should('contain', 'Task 0'); + + cy.get('.grid-canvas-right > [style="top:0px"] > .slick-cell:nth(0)').should('contain', '2009-01-01'); + cy.get('.grid-canvas-right > [style="top:0px"] > .slick-cell:nth(1)').should('contain', '2009-05-05'); + }); + + it('should click on the "Remove Frozen Columns" button to switch to a regular grid without frozen columns and expect 7 columns on the left container', () => { + cy.get('[data-test=remove-frozen-column-button]') + .click({ force: true }); + + cy.get('[style="top:0px"]').should('have.length', 1 * 2); + cy.get('.grid-canvas-left > [style="top:0px"]').children().should('have.length', 9 * 2); + + cy.get('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(0)').should('contain', ''); + cy.get('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(1)').should('contain', 'Task 0'); + + cy.get('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(3)').should('contain', '2009-01-01'); + cy.get('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(4)').should('contain', '2009-05-05'); + }); + + it('should have exact Column Header Titles in the grid', () => { + cy.get('.grid4') + .find('.slick-header-columns:nth(0)') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullTitles[index])); + }); + + it('should click on the "Set 3 Frozen Columns" button to switch frozen columns grid and expect 3 frozen columns on the left and 4 columns on the right', () => { + cy.get('[data-test=set-3frozen-columns]') + .click({ force: true }); + + cy.get('[style="top:0px"]').should('have.length', 2 * 2); + cy.get('.grid-canvas-left > [style="top:0px"]').children().should('have.length', 3 * 2); + cy.get('.grid-canvas-right > [style="top:0px"]').children().should('have.length', 6 * 2); + + cy.get('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(0)').should('contain', ''); + cy.get('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(1)').should('contain', 'Task 0'); + + cy.get('.grid-canvas-right > [style="top:0px"] > .slick-cell:nth(0)').should('contain', '2009-01-01'); + cy.get('.grid-canvas-right > [style="top:0px"] > .slick-cell:nth(1)').should('contain', '2009-05-05'); + }); + + it('should have exact Column Header Titles in the grid', () => { + cy.get('.grid4') + .find('.slick-header-columns:nth(0)') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullTitles[index])); + }); + + it('should click on the Grid Menu command "Clear Frozen Columns" to switch to a regular grid without frozen columns and expect 7 columns on the left container', () => { + cy.get('.grid4') + .find('button.slick-gridmenu-button') + .click({ force: true }); + + cy.contains('Clear Frozen Columns') + .click({ force: true }); + + cy.get('[style="top:0px"]').should('have.length', 1 * 2); + cy.get('.grid-canvas-left > [style="top:0px"]').children().should('have.length', 9 * 2); + + cy.get('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(0)').should('contain', ''); + cy.get('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(1)').should('contain', 'Task 0'); + + cy.get('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(3)').should('contain', '2009-01-01'); + cy.get('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(4)').should('contain', '2009-05-05'); + }); +}); diff --git a/test/cypress/integration/example06.spec.js b/test/cypress/integration/example06.spec.js new file mode 100644 index 000000000..cb3af6c1a --- /dev/null +++ b/test/cypress/integration/example06.spec.js @@ -0,0 +1,175 @@ +/// + +describe('Example 06 - Tree Data (from a Hierarchical Dataset)', () => { + const titles = ['Files', 'Date Modified', 'Size']; + // const defaultSortAscList = ['bucket-list.txt', 'documents', 'misc', 'todo.txt', 'pdf', 'internet-bill.pdf', 'map.pdf', 'map2.pdf', 'phone-bill.pdf', 'txt', 'todo.txt', 'xls', 'compilation.xls', 'music', 'mp3', 'pop', 'song.mp3', 'theme.mp3', 'rock', 'soft.mp3', 'something.txt']; + // const defaultSortDescList = ['something.txt', 'music', 'mp3', 'rock', 'soft.mp3', 'pop', 'theme.mp3', 'song.mp3', 'documents', 'xls', 'compilation.xls', 'txt', 'todo.txt', 'pdf', 'phone-bill.pdf', 'map2.pdf', 'map.pdf', 'internet-bill.pdf', 'misc', 'todo.txt', 'bucket-list.txt']; + const defaultSortAscList = ['bucket-list.txt', 'documents', 'misc', 'todo.txt', 'pdf', 'internet-bill.pdf', 'map.pdf', 'map2.pdf', 'phone-bill.pdf']; + const defaultSortDescList = ['something.txt', 'music', 'mp3', 'rock', 'soft.mp3', 'pop', 'theme.mp3', 'song.mp3', 'documents', 'xls', 'compilation.xls', 'txt', 'todo.txt']; + + it('should display Example title', () => { + cy.visit(`${Cypress.config('baseExampleUrl')}/example06`); + cy.get('h3').should('contain', 'Example 06 - Tree Data'); + cy.get('h3 span.subtitle').should('contain', '(from a Hierarchical Dataset)'); + }); + + it('should have exact column titles on 1st grid', () => { + cy.get('.grid6') + .find('.slick-header-columns') + .children() + .each(($child, index) => expect($child.text()).to.eq(titles[index])); + }); + + it('should have default Files list', () => { + cy.get('.grid6') + .find('.slick-row') + .each(($row, index) => { + if (index > defaultSortAscList.length - 1) { + return; + } + cy.wrap($row).children('.slick-cell') + .first() + .should('contain', defaultSortAscList[index]); + }); + }); + + it('should filter the Files column with the word "map" and expect only 4 rows left', () => { + const filteredFiles = ['documents', 'pdf', 'map.pdf', 'map2.pdf']; + const filteredSizes = ['', '', '3.1', '2.9']; + + cy.get('.search-filter.filter-file') + .type('map'); + + cy.get('.grid6') + .find('.slick-row') + .each(($row, index) => { + cy.wrap($row).children('.slick-cell:nth(0)').should('contain', filteredFiles[index]); + cy.wrap($row).children('.slick-cell:nth(2)').should('contain', filteredSizes[index]); + }); + }); + + it('should add filter with Size <3 and expect 3 rows left', () => { + const filteredFiles = ['documents', 'pdf', 'map2.pdf']; + + cy.get('.search-filter.filter-size') + .find('input') + .type('3'); + + cy.get('.search-filter.filter-size') + .find('.input-group-addon.operator select') + .select('<'); + + cy.get('.grid6') + .find('.slick-row .slick-cell:nth(0)') + .each(($cell, index) => { + expect($cell.text().trim()).to.contain(filteredFiles[index]); + }); + }); + + it('should add filter with Size >3 and expect 3 rows left', () => { + const filteredFiles = ['documents', 'pdf', 'map.pdf']; + + cy.get('.search-filter.filter-size') + .find('.input-group-addon.operator select') + .select('>'); + + cy.get('.grid6') + .find('.slick-row .slick-cell:nth(0)') + .each(($cell, index) => { + expect($cell.text().trim()).to.contain(filteredFiles[index]); + }); + }); + + it('should add filter with Size <=3.1 and expect 3 rows left', () => { + const filteredFiles = ['documents', 'pdf', 'map.pdf', 'map2.pdf']; + + cy.get('.search-filter.filter-size') + .find('input') + .type('.1'); + + cy.get('.search-filter.filter-size') + .find('.input-group-addon.operator select') + .select('<='); + + cy.get('.grid6') + .find('.slick-row .slick-cell:nth(0)') + .each(($cell, index) => { + expect($cell.text().trim()).to.contain(filteredFiles[index]); + }); + }); + + it('should Clear all Filters and default list', () => { + cy.get('.grid6') + .find('button.slick-gridmenu-button') + .trigger('click') + .click(); + + cy.get(`.slick-gridmenu:visible`) + .find('.slick-gridmenu-item') + .first() + .find('span') + .contains('Clear all Filters') + .click(); + + cy.get('.grid6') + .find('.slick-row') + .each(($row, index) => { + if (index > defaultSortAscList.length - 1) { + return; + } + cy.wrap($row).children('.slick-cell') + .first() + .should('contain', defaultSortAscList[index]); + }); + }); + + it('should click on "Files" column to sort descending', () => { + cy.get('.slick-header-columns .slick-header-column:nth(0)') + .click(); + + cy.get('.grid6') + .find('.slick-row') + .each(($row, index) => { + if (index > defaultSortDescList.length - 1) { + return; + } + cy.wrap($row).children('.slick-cell') + .first() + .should('contain', defaultSortDescList[index]); + }); + }); + + it('should filter the Files by the input search string and expect 4 rows and 1st column to have ', () => { + const filteredFiles = ['documents', 'pdf', 'map2.pdf', 'map.pdf']; + + cy.get('[data-test=search-string]') + .type('map'); + + cy.get('.search-filter.filter-file') + .should(($input) => { + expect($input.val()).to.eq('map'); + }); + + cy.get('.grid6') + .find('.slick-row .slick-cell:nth(0)') + .each(($cell, index) => { + expect($cell.text().trim()).to.contain(filteredFiles[index]); + }); + }); + + it('should clear search string and expect default list', () => { + cy.get('[data-test=clear-search-string]') + .click(); + + cy.get('.grid6') + .find('.slick-row') + .each(($row, index) => { + if (index > defaultSortAscList.length - 1) { + return; + } + cy.wrap($row).children('.slick-cell') + .first() + .should('contain', defaultSortDescList[index]); + }); + }); +}); diff --git a/test/cypress/integration/example07.spec.js b/test/cypress/integration/example07.spec.js new file mode 100644 index 000000000..3ae2b47b6 --- /dev/null +++ b/test/cypress/integration/example07.spec.js @@ -0,0 +1,90 @@ +/// + +describe('Example 07 - Row Move & Checkbox Selector Selector Plugins', () => { + const fullTitles = ['', '', 'Title', 'Duration', '% Complete', 'Start', 'Finish', 'Completed']; + + beforeEach(() => { + // create a console.log spy for later use + cy.window().then((win) => { + cy.spy(win.console, 'log'); + }); + }); + + it('should display Example title', () => { + cy.visit(`${Cypress.config('baseExampleUrl')}/example07`); + cy.get('h3').should('contain', 'Example 07 - Row Move & Row Selections'); + }); + + + it('should have exact Column Titles in the grid', () => { + cy.get('.grid7') + .find('.slick-header-columns') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullTitles[index])); + }); + + it('should drag opened Row Detail to another position in the grid', () => { + cy.get('[style="top:45px"] > .slick-cell.cell-reorder').as('moveIconTask1'); + cy.get('[style="top:135px"] > .slick-cell.cell-reorder').as('moveIconTask3'); + + cy.get('@moveIconTask3').should('have.length', 1); + + cy.get('@moveIconTask3') + .trigger('mousedown', { button: 0, force: true }) + .trigger('mousemove', 'bottomRight'); + + cy.get('@moveIconTask1') + .trigger('mousemove', 'bottomRight') + .trigger('mouseup', 'bottomRight', { force: true }); + + cy.get('input[type="checkbox"]:checked') + .should('have.length', 0); + }); + + it('should expect row to be moved to another row index', () => { + cy.get('.slick-viewport-top.slick-viewport-left') + .scrollTo('top'); + + cy.get('[style="top:0px"] > .slick-cell:nth(2)').should('contain', 'Task 0'); + cy.get('[style="top:45px"] > .slick-cell:nth(2)').should('contain', 'Task 1'); + cy.get('[style="top:90px"] > .slick-cell:nth(2)').should('contain', 'Task 3'); + cy.get('[style="top:135px"] > .slick-cell:nth(2)').should('contain', 'Task 2'); + cy.get('[style="top:180px"] > .slick-cell:nth(2)').should('contain', 'Task 4'); + + cy.get('input[type="checkbox"]:checked') + .should('have.length', 0); + }); + + it('should select 2 rows (Task 3,4), then move row and expect the 2 rows to still be selected without any others', () => { + cy.get('[style="top:90px"] > .slick-cell:nth(1)').click(); + cy.get('[style="top:180px"] > .slick-cell:nth(1)').click(); + + cy.get('[style="top:90px"] > .slick-cell.cell-reorder').as('moveIconTask3'); + cy.get('[style="top:225px"] > .slick-cell.cell-reorder').as('moveIconTask5'); + + cy.get('@moveIconTask3').should('have.length', 1); + + cy.get('@moveIconTask3') + .trigger('mousedown', { button: 0, force: true }) + .trigger('mousemove', 'bottomRight'); + + cy.get('@moveIconTask5') + .trigger('mousemove', 'bottomRight') + .trigger('mouseup', 'bottomRight', { force: true }); + + cy.get('.slick-viewport-top.slick-viewport-left') + .scrollTo('top'); + + cy.get('[style="top:0px"] > .slick-cell:nth(2)').should('contain', 'Task 0'); + cy.get('[style="top:45px"] > .slick-cell:nth(2)').should('contain', 'Task 1'); + cy.get('[style="top:90px"] > .slick-cell:nth(2)').should('contain', 'Task 2'); + cy.get('[style="top:135px"] > .slick-cell:nth(2)').should('contain', 'Task 4'); + cy.get('[style="top:180px"] > .slick-cell:nth(2)').should('contain', 'Task 5'); + cy.get('[style="top:225px"] > .slick-cell:nth(2)').should('contain', 'Task 3'); + + // Task 4 and 3 should be selected + cy.get('input[type="checkbox"]:checked').should('have.length', 2); + cy.get('[style="top:135px"] > .slick-cell:nth(1) input[type="checkbox"]:checked').should('have.length', 1); + cy.get('[style="top:225px"] > .slick-cell:nth(1) input[type="checkbox"]:checked').should('have.length', 1); + }); +}); diff --git a/test/cypress/integration/example08.spec.js b/test/cypress/integration/example08.spec.js new file mode 100644 index 000000000..9fc62f1c5 --- /dev/null +++ b/test/cypress/integration/example08.spec.js @@ -0,0 +1,121 @@ +/// + +describe('Example 08 - Column Span & Header Grouping', () => { + // NOTE: everywhere there's a * 2 is because we have a top+bottom (frozen rows) containers even after clear frozen columns + const fullPreTitles = ['', 'Common Factor', 'Period', 'Analysis']; + const fullTitles = ['#', 'Title', 'Duration', 'Start', 'Finish', '% Complete', 'Effort Driven']; + + it('should display Example title', () => { + cy.visit(`${Cypress.config('baseExampleUrl')}/example08`); + cy.get('h3').should('contain', 'Example 08 - Column Span & Header Grouping'); + }); + + it('should have exact Column Pre-Header & Column Header Titles in the grid', () => { + cy.get('.grid2') + .find('.slick-header-columns:nth(0)') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullPreTitles[index])); + + cy.get('.grid2') + .find('.slick-header-columns:nth(1)') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullTitles[index])); + }); + + it('should have a frozen grid on page load with 3 columns on the left and 4 columns on the right', () => { + cy.get('.grid2').find('[style="top:0px"]').should('have.length', 2); + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"]').children().should('have.length', 3); + cy.get('.grid2').find('.grid-canvas-right > [style="top:0px"]').children().should('have.length', 4); + + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(0)').should('contain', '0'); + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(1)').should('contain', 'Task 0'); + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(2)').should('contain', '5 days'); + + cy.get('.grid2').find('.grid-canvas-right > [style="top:0px"] > .slick-cell:nth(0)').should('contain', '01/01/2009'); + cy.get('.grid2').find('.grid-canvas-right > [style="top:0px"] > .slick-cell:nth(1)').should('contain', '01/05/2009'); + }); + + it('should have exact Column Pre-Header & Column Header Titles in the grid', () => { + cy.get('.grid2') + .find('.slick-header-columns:nth(0)') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullPreTitles[index])); + + cy.get('.grid2') + .find('.slick-header-columns:nth(1)') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullTitles[index])); + }); + + it('should click on the "Remove Frozen Columns" button to switch to a regular grid without frozen columns and expect 7 columns on the left container', () => { + cy.contains('Remove Frozen Columns') + .click({ force: true }); + + cy.get('.grid2').find('[style="top:0px"]').should('have.length', 1); + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"]').children().should('have.length', 7); + + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(0)').should('contain', '0'); + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(1)').should('contain', 'Task 0'); + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(2)').should('contain', '5 days'); + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(3)').should('contain', '01/01/2009'); + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(4)').should('contain', '01/05/2009'); + }); + + it('should have exact Column Pre-Header & Column Header Titles in the grid', () => { + cy.get('.grid2') + .find('.slick-header-columns:nth(0)') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullPreTitles[index])); + + cy.get('.grid2') + .find('.slick-header-columns:nth(1)') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullTitles[index])); + }); + + it('should click on the "Set 3 Frozen Columns" button to switch frozen columns grid and expect 3 frozen columns on the left and 4 columns on the right', () => { + cy.contains('Set 3 Frozen Columns') + .click({ force: true }); + + cy.get('.grid2').find('[style="top:0px"]').should('have.length', 2); + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"]').children().should('have.length', 3); + cy.get('.grid2').find('.grid-canvas-right > [style="top:0px"]').children().should('have.length', 4); + + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(0)').should('contain', '0'); + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(1)').should('contain', 'Task 0'); + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(2)').should('contain', '5 days'); + + cy.get('.grid2').find('.grid-canvas-right > [style="top:0px"] > .slick-cell:nth(0)').should('contain', '01/01/2009'); + cy.get('.grid2').find('.grid-canvas-right > [style="top:0px"] > .slick-cell:nth(1)').should('contain', '01/05/2009'); + }); + + it('should have exact Column Pre-Header & Column Header Titles in the grid', () => { + cy.get('.grid2') + .find('.slick-header-columns:nth(0)') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullPreTitles[index])); + + cy.get('.grid2') + .find('.slick-header-columns:nth(1)') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullTitles[index])); + }); + + it('should click on the Grid Menu command "Clear Frozen Columns" to switch to a regular grid without frozen columns and expect 7 columns on the left container', () => { + cy.get('.grid2') + .find('button.slick-gridmenu-button') + .click({ force: true }); + + cy.contains('Clear Frozen Columns') + .click({ force: true }); + + cy.get('.grid2').find('[style="top:0px"]').should('have.length', 1); + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"]').children().should('have.length', 7); + + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(0)').should('contain', '0'); + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(1)').should('contain', 'Task 0'); + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(2)').should('contain', '5 days'); + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(3)').should('contain', '01/01/2009'); + cy.get('.grid2').find('.grid-canvas-left > [style="top:0px"] > .slick-cell:nth(4)').should('contain', '01/05/2009'); + }); +}); diff --git a/test/cypress/integration/example09.spec.js b/test/cypress/integration/example09.spec.js index fb816b138..8ac49de37 100644 --- a/test/cypress/integration/example09.spec.js +++ b/test/cypress/integration/example09.spec.js @@ -19,7 +19,7 @@ describe('Example 09 - OData Grid', () => { cy.get('[data-test=alert-odata-query]').should('contain', 'OData Query'); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=odata-query-result]') .should(($span) => { @@ -31,7 +31,7 @@ describe('Example 09 - OData Grid', () => { cy.get('.icon-seek-next').click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=page-number-input]') .invoke('val') @@ -65,7 +65,7 @@ describe('Example 09 - OData Grid', () => { // wait for the query to start and finish cy.get('[data-test=status]').should('contain', 'loading...'); - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=page-number-input]') .invoke('val') @@ -98,7 +98,7 @@ describe('Example 09 - OData Grid', () => { cy.get('.icon-seek-end').click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=page-number-input]') .invoke('val') @@ -132,7 +132,7 @@ describe('Example 09 - OData Grid', () => { .click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=page-number-input]') .invoke('val') @@ -166,7 +166,7 @@ describe('Example 09 - OData Grid', () => { .click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=page-number-input]') .invoke('val') @@ -209,7 +209,7 @@ describe('Example 09 - OData Grid', () => { .click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=page-number-input]') .invoke('val') @@ -252,7 +252,7 @@ describe('Example 09 - OData Grid', () => { .click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=odata-query-result]') .should(($span) => { @@ -271,7 +271,7 @@ describe('Example 09 - OData Grid', () => { .type('John'); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=odata-query-result]') .should(($span) => { @@ -292,7 +292,7 @@ describe('Example 09 - OData Grid', () => { .type('John'); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=odata-query-result]') .should(($span) => { @@ -317,7 +317,7 @@ describe('Example 09 - OData Grid', () => { .then(text => expect(text).to.eq('A')); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=odata-query-result]') .should(($span) => { @@ -349,7 +349,7 @@ describe('Example 09 - OData Grid', () => { cy.get('[data-test=enable-count]').click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=odata-query-result]') .should(($span) => { @@ -361,7 +361,7 @@ describe('Example 09 - OData Grid', () => { cy.get('.icon-seek-next').click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=odata-query-result]') .should(($span) => { @@ -374,7 +374,7 @@ describe('Example 09 - OData Grid', () => { // wait for the query to start and finish cy.get('[data-test=status]').should('contain', 'loading...'); - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=odata-query-result]') .should(($span) => { @@ -386,7 +386,7 @@ describe('Example 09 - OData Grid', () => { cy.get('.icon-seek-end').click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=odata-query-result]') .should(($span) => { @@ -405,7 +405,7 @@ describe('Example 09 - OData Grid', () => { .should('be.visible'); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=odata-query-result]') .should(($span) => { @@ -426,7 +426,7 @@ describe('Example 09 - OData Grid', () => { .click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=odata-query-result]') .should(($span) => { @@ -447,7 +447,7 @@ describe('Example 09 - OData Grid', () => { .then(text => expect(text).to.eq('A')); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=odata-query-result]') .should(($span) => { @@ -468,7 +468,7 @@ describe('Example 09 - OData Grid', () => { .type('John'); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=odata-query-result]') .should(($span) => { @@ -489,7 +489,7 @@ describe('Example 09 - OData Grid', () => { .type('John'); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=odata-query-result]') .should(($span) => { @@ -515,7 +515,7 @@ describe('Example 09 - OData Grid', () => { }); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); }); it('should display page 0 of 0 but hide pagination from/to numbers when filtered data "xy" returns an empty dataset', () => { @@ -552,7 +552,7 @@ describe('Example 09 - OData Grid', () => { }); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.window().then((win) => { // expect(win.console.log).to.have.callCount(2); @@ -589,13 +589,13 @@ describe('Example 09 - OData Grid', () => { // wait for the query to finish cy.get('[data-test=status]').should('contain', 'loading'); - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=set-dynamic-sorting]') .click(); cy.get('[data-test=status]').should('contain', 'loading'); - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); }); it('should expect the grid to be sorted by "Name" descending', () => { diff --git a/test/cypress/integration/example10.spec.js b/test/cypress/integration/example10.spec.js index fcddcee6d..018e52f5c 100644 --- a/test/cypress/integration/example10.spec.js +++ b/test/cypress/integration/example10.spec.js @@ -46,7 +46,7 @@ describe('Example 10 - GraphQL Grid', () => { cy.get('[data-test=alert-graphql-query]').should('contain', 'GraphQL Query'); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=graphql-query-result]') .should(($span) => { @@ -65,7 +65,7 @@ describe('Example 10 - GraphQL Grid', () => { cy.get('.icon-seek-next').click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=graphql-query-result]') .should(($span) => { @@ -83,7 +83,7 @@ describe('Example 10 - GraphQL Grid', () => { cy.get('.icon-seek-end').click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=graphql-query-result]') .should(($span) => { @@ -102,7 +102,7 @@ describe('Example 10 - GraphQL Grid', () => { .click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=graphql-query-result]') .should(($span) => { @@ -124,7 +124,7 @@ describe('Example 10 - GraphQL Grid', () => { .click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=graphql-query-result]') .should(($span) => { @@ -144,7 +144,7 @@ describe('Example 10 - GraphQL Grid', () => { cy.get('#items-per-page-label').select('30'); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=graphql-query-result]') .should(($span) => { @@ -173,7 +173,7 @@ describe('Example 10 - GraphQL Grid', () => { .click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=graphql-query-result]') .should(($span) => { @@ -203,7 +203,7 @@ describe('Example 10 - GraphQL Grid', () => { .click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=graphql-query-result]') .should(($span) => { @@ -232,7 +232,7 @@ describe('Example 10 - GraphQL Grid', () => { .click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=graphql-query-result]') .should(($span) => { @@ -248,7 +248,7 @@ describe('Example 10 - GraphQL Grid', () => { cy.contains('Clear all Filter & Sorts').click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=graphql-query-result]') .should(($span) => { @@ -268,7 +268,7 @@ describe('Example 10 - GraphQL Grid', () => { .should('be.visible'); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=graphql-query-result]') .should(($span) => { @@ -311,7 +311,7 @@ describe('Example 10 - GraphQL Grid', () => { .then(text => expect(text).to.eq(`${presetLowestDay} to ${presetHighestDay}`)); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=graphql-query-result]') .should(($span) => { @@ -331,13 +331,13 @@ describe('Example 10 - GraphQL Grid', () => { .click(); cy.get('[data-test=status]').should('contain', 'loading'); - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); cy.get('[data-test=set-dynamic-sorting]') .click(); cy.get('[data-test=status]').should('contain', 'loading'); - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); }); it('should expect the grid to be sorted by "Zip" descending then by "Company" ascending', () => { @@ -370,7 +370,7 @@ describe('Example 10 - GraphQL Grid', () => { cy.contains('Clear all Filter & Sorts').click(); // wait for the query to finish - cy.get('[data-test=status]').should('contain', 'done'); + cy.get('[data-test=status]').should('contain', 'finished'); }); it('should have English Column Titles in the grid after switching locale', () => { diff --git a/test/translateServiceStub.ts b/test/translateServiceStub.ts index 031e4dbc6..9951900ea 100644 --- a/test/translateServiceStub.ts +++ b/test/translateServiceStub.ts @@ -35,6 +35,7 @@ export class TranslateServiceStub implements TranslaterService { case 'HELP': output = this._locale === 'en' ? 'Help' : 'Aide'; break; case 'HIDE_COLUMN': output = this._locale === 'en' ? 'Hide Column' : 'Cacher la colonne'; break; case 'LAST_NAME': output = this._locale === 'en' ? 'Last Name' : 'Nom de famille'; break; + case 'LAST_UPDATE': output = this._locale === 'en' ? 'Last Update' : 'Dernière mise à jour'; break; case 'MALE': output = this._locale === 'en' ? 'Male' : 'Mâle'; break; case 'ITEMS': output = this._locale === 'en' ? 'items' : 'éléments'; break; case 'ITEMS_PER_PAGE': output = this._locale === 'en' ? 'items per page' : 'éléments par page'; break; diff --git a/yarn.lock b/yarn.lock index 0aba32345..399ed7136 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1610,21 +1610,14 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/jest@^26.0.3": - version "26.0.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.3.tgz#79534e0e94857171c0edc596db0ebe7cb7863251" - integrity sha512-v89ga1clpVL/Y1+YI0eIu1VMW+KU7Xl8PhylVtDKVWaSUHBHYPLXMQGBdrpHewaKoTvlXkksbYqPgz8b4cmRZg== +"@types/jest@^26.0.4": + version "26.0.4" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.4.tgz#d2e513e85aca16992816f192582b5e67b0b15efb" + integrity sha512-4fQNItvelbNA9+sFgU+fhJo8ZFF+AS4Egk3GWwCW2jFtViukXbnztccafAdLhzE/0EiCogljtQQXP8aQ9J7sFg== dependencies: jest-diff "^25.2.1" pretty-format "^25.2.1" -"@types/jquery@^3.3.38": - version "3.3.38" - resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.38.tgz#6385f1e1b30bd2bff55ae8ee75ea42a999cc3608" - integrity sha512-nkDvmx7x/6kDM5guu/YpXkGZ/Xj/IwGiLDdKM99YA5Vag7pjGyTJ8BNUh/6hxEn/sEu5DKtyRgnONJ7EmOoKrA== - dependencies: - "@types/sizzle" "*" - "@types/jquery@^3.5.0": version "3.5.0" resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.0.tgz#ccb7dfd317d02d4227dd3803c75297d0c10dad68" @@ -1669,10 +1662,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.0.tgz#acaa89247afddc7967e9902fd11761dadea1a555" integrity sha512-j2tekvJCO7j22cs+LO6i0kRPhmQ9MXaPZ55TzOc1lzkN5b6BWqq4AFjl04s1oRRQ1v5rSe+KEvnLUSTonuls/A== -"@types/node@^14.0.14": - version "14.0.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.14.tgz#24a0b5959f16ac141aeb0c5b3cd7a15b7c64cbce" - integrity sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ== +"@types/node@^14.0.19": + version "14.0.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.19.tgz#994d99708822bca643a2364f8aeed04a16e0f5a1" + integrity sha512-yf3BP/NIXF37BjrK5klu//asUWitOEoUP5xE1mhSUjazotwJ/eJDgEmMQNlOeWOVv72j24QQ+3bqXHE++CFGag== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -1752,10 +1745,10 @@ "@types/webpack-sources" "*" source-map "^0.6.0" -"@types/webpack@^4.41.18": - version "4.41.18" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.18.tgz#2945202617866ecdffa582087f1b6de04a7eed55" - integrity sha512-mQm2R8vV2BZE/qIDVYqmBVLfX73a8muwjs74SpjEyJWJxeXBbsI9L65Pcia9XfYLYWzD1c1V8m+L0p30y2N7MA== +"@types/webpack@^4.41.21": + version "4.41.21" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.21.tgz#cc685b332c33f153bb2f5fc1fa3ac8adeb592dee" + integrity sha512-2j9WVnNrr/8PLAB5csW44xzQSJwS26aOnICsP3pSGCEdsu6KYtfQ6QJsVUKHWRnm1bL7HziJsfh5fHqth87yKA== dependencies: "@types/anymatch" "*" "@types/node" "*" @@ -1783,52 +1776,52 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.5.0.tgz#e7736e0808b5fb947a5f9dd949ae6736a7226b84" - integrity sha512-m4erZ8AkSjoIUOf8s4k2V1xdL2c1Vy0D3dN6/jC9d7+nEqjY3gxXCkgi3gW/GAxPaA4hV8biaCoTVdQmfAeTCQ== +"@typescript-eslint/eslint-plugin@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.6.0.tgz#ba2b6cae478b8fca3f2e58ff1313e4198eea2d8a" + integrity sha512-ubHlHVt1lsPQB/CZdEov9XuOFhNG9YRC//kuiS1cMQI6Bs1SsqKrEmZnpgRwthGR09/kEDtr9MywlqXyyYd8GA== dependencies: - "@typescript-eslint/experimental-utils" "3.5.0" + "@typescript-eslint/experimental-utils" "3.6.0" debug "^4.1.1" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.5.0.tgz#d09f9ffb890d1b15a7ffa9975fae92eee05597c4" - integrity sha512-zGNOrVi5Wz0jcjUnFZ6QUD0MCox5hBuVwemGCew2qJzUX5xPoyR+0EzS5qD5qQXL/vnQ8Eu+nv03tpeFRwLrDg== +"@typescript-eslint/experimental-utils@3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.6.0.tgz#0138152d66e3e53a6340f606793fb257bf2d76a1" + integrity sha512-4Vdf2hvYMUnTdkCNZu+yYlFtL2v+N2R7JOynIOkFbPjf9o9wQvRwRkzUdWlFd2YiiUwJLbuuLnl5civNg5ykOQ== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/types" "3.5.0" - "@typescript-eslint/typescript-estree" "3.5.0" + "@typescript-eslint/types" "3.6.0" + "@typescript-eslint/typescript-estree" "3.6.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.5.0.tgz#9ff8c11877c48df24e10e19d7bf542ee0359500d" - integrity sha512-sU07VbYB70WZHtgOjH/qfAp1+OwaWgrvD1Km1VXqRpcVxt971PMTU7gJtlrCje0M+Sdz7xKAbtiyIu+Y6QdnVA== +"@typescript-eslint/parser@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.6.0.tgz#79b5232e1a2d06f1fc745942b690cd87aca7b60e" + integrity sha512-taghDxuLhbDAD1U5Fk8vF+MnR0yiFE9Z3v2/bYScFb0N1I9SK8eKHkdJl1DAD48OGFDMFTeOTX0z7g0W6SYUXw== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "3.5.0" - "@typescript-eslint/types" "3.5.0" - "@typescript-eslint/typescript-estree" "3.5.0" + "@typescript-eslint/experimental-utils" "3.6.0" + "@typescript-eslint/types" "3.6.0" + "@typescript-eslint/typescript-estree" "3.6.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/types@3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.5.0.tgz#4e3d2a2272268d8ec3e3e4a37152a64956682639" - integrity sha512-Dreqb5idi66VVs1QkbAwVeDmdJG+sDtofJtKwKCZXIaBsINuCN7Jv5eDIHrS0hFMMiOvPH9UuOs4splW0iZe4Q== +"@typescript-eslint/types@3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.6.0.tgz#4bd6eee55d2f9d35a4b36c4804be1880bf68f7bc" + integrity sha512-JwVj74ohUSt0ZPG+LZ7hb95fW8DFOqBuR6gE7qzq55KDI3BepqsCtHfBIoa0+Xi1AI7fq5nCu2VQL8z4eYftqg== -"@typescript-eslint/typescript-estree@3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.5.0.tgz#dfc895db21a381b84f24c2a719f5bf9c600dcfdc" - integrity sha512-Na71ezI6QP5WVR4EHxwcBJgYiD+Sre9BZO5iJK2QhrmRPo/42+b0no/HZIrdD1sjghzlYv7t+7Jis05M1uMxQg== +"@typescript-eslint/typescript-estree@3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.6.0.tgz#9b4cab43f1192b64ff51530815b8919f166ce177" + integrity sha512-G57NDSABHjvob7zVV09ehWyD1K6/YUKjz5+AufObFyjNO4DVmKejj47MHjVHHlZZKgmpJD2yyH9lfCXHrPITFg== dependencies: - "@typescript-eslint/types" "3.5.0" - "@typescript-eslint/visitor-keys" "3.5.0" + "@typescript-eslint/types" "3.6.0" + "@typescript-eslint/visitor-keys" "3.6.0" debug "^4.1.1" glob "^7.1.6" is-glob "^4.0.1" @@ -1836,10 +1829,10 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/visitor-keys@3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.5.0.tgz#73c1ea2582f814735e4afdc1cf6f5e3af78db60a" - integrity sha512-7cTp9rcX2sz9Z+zua9MCOX4cqp5rYyFD5o8LlbSpXrMTXoRdngTtotRZEkm8+FNMHPWYFhitFK+qt/brK8BVJQ== +"@typescript-eslint/visitor-keys@3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.6.0.tgz#44185eb0cc47651034faa95c5e2e8b314ecebb26" + integrity sha512-p1izllL2Ubwunite0ITjubuMQRBGgjdVYwyG7lXPX8GbrA6qF0uwSRz9MnXZaHMxID4948gX0Ez8v9tUDi/KfQ== dependencies: eslint-visitor-keys "^1.1.0" @@ -2479,17 +2472,17 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^9.8.0: - version "9.8.0" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.0.tgz#68e2d2bef7ba4c3a65436f662d0a56a741e56511" - integrity sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A== +autoprefixer@^9.8.4: + version "9.8.4" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.4.tgz#736f1012673a70fa3464671d78d41abd54512863" + integrity sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A== dependencies: browserslist "^4.12.0" - caniuse-lite "^1.0.30001061" - chalk "^2.4.2" + caniuse-lite "^1.0.30001087" + colorette "^1.2.0" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.30" + postcss "^7.0.32" postcss-value-parser "^4.1.0" aws-sign2@~0.7.0: @@ -3058,11 +3051,16 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== -caniuse-lite@^1.0.30001043, caniuse-lite@^1.0.30001061: +caniuse-lite@^1.0.30001043: version "1.0.30001066" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001066.tgz#0a8a58a10108f2b9bf38e7b65c237b12fd9c5f04" integrity sha512-Gfj/WAastBtfxLws0RCh2sDbTK/8rJuSeZMecrSkNGYxPcv7EzblmDGfWQCFEQcSqYE2BRgQiJh8HOD07N5hIw== +caniuse-lite@^1.0.30001087: + version "1.0.30001094" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001094.tgz#0b11d02e1cdc201348dbd8e3e57bd9b6ce82b175" + integrity sha512-ufHZNtMaDEuRBpTbqD93tIQnngmJ+oBknjvr0IbFympSdtFpAUFmNv4mVKbb53qltxFx0nK3iy32S9AqkLzUNA== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -3348,6 +3346,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + colors@^1.1.2, colors@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -3630,21 +3633,21 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -copy-webpack-plugin@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.0.2.tgz#10efc6ad219a61acbf2f5fb50af83da38431bc34" - integrity sha512-9Gm8X0c6eXlKnmltMPFCBeGOKjtcRIyTt4VaO3k1TkNgVTe5Ov2lYsYVuyLp0kp8DItO3apewflM+1GYgh6V2Q== +copy-webpack-plugin@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.0.3.tgz#2b3d2bfc6861b96432a65f0149720adbd902040b" + integrity sha512-q5m6Vz4elsuyVEIUXr7wJdIdePWTubsqVbEMvf1WQnHGv0Q+9yPRu7MtYFPt+GBOXRav9lvIINifTQ1vSCs+eA== dependencies: cacache "^15.0.4" - fast-glob "^3.2.2" + fast-glob "^3.2.4" find-cache-dir "^3.3.1" glob-parent "^5.1.1" globby "^11.0.1" loader-utils "^2.0.0" normalize-path "^3.0.0" - p-limit "^2.3.0" + p-limit "^3.0.1" schema-utils "^2.7.0" - serialize-javascript "^3.1.0" + serialize-javascript "^4.0.0" webpack-sources "^1.4.3" copyfiles@^2.3.0: @@ -3870,10 +3873,10 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -cypress@^4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-4.9.0.tgz#c188a3864ddf841c0fdc81a9e4eff5cf539cd1c1" - integrity sha512-qGxT5E0j21FPryzhb0OBjCdhoR/n1jXtumpFFSBPYWsaZZhNaBvc3XlBUDEZKkkXPsqUFYiyhWdHN/zo0t5FcA== +cypress@^4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-4.10.0.tgz#6b507f4637af6a65ea285953f899951d65e82416" + integrity sha512-eFv1WPp4zFrAgZ6mwherBGVsTpHvay/hEF5F7U7yfAkTxsUQn/ZG/LdX67fIi3bKDTQXYzFv/CvywlQSeug8Bg== dependencies: "@cypress/listr-verbose-renderer" "0.4.1" "@cypress/request" "2.88.5" @@ -4306,11 +4309,6 @@ domhandler@^3.0.0: dependencies: domelementtype "^2.0.1" -dompurify@^2.0.11: - version "2.0.11" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.0.11.tgz#cd47935774230c5e478b183a572e726300b3891d" - integrity sha512-qVoGPjIW9IqxRij7klDQQ2j6nSe4UNWANBhZNLnsS7ScTtLb+3YdxkRY8brNTpkUiTtcXsCJO+jS0UCDfenLuA== - dompurify@^2.0.12: version "2.0.12" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.0.12.tgz#284a2b041e1c60b8e72d7b4d2fadad36141254ae" @@ -4741,10 +4739,10 @@ eslint-visitor-keys@^1.2.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz#74415ac884874495f78ec2a97349525344c981fa" integrity sha512-WFb4ihckKil6hu3Dp798xdzSfddwKKU3+nGniKF6HfeW6OLd2OUDEPP7TcHtB5+QXOKg2s6B2DaMPE1Nn/kxKQ== -eslint@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.3.1.tgz#76392bd7e44468d046149ba128d1566c59acbe19" - integrity sha512-cQC/xj9bhWUcyi/RuMbRtC3I0eW8MH0jhRELSvpKYkWep3C6YZ2OkvcvJVUeO6gcunABmzptbXBuDoXsjHmfTA== +eslint@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.4.0.tgz#4e35a2697e6c1972f9d6ef2b690ad319f80f206f" + integrity sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" @@ -5085,7 +5083,7 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" -fast-glob@^3.1.1, fast-glob@^3.2.2: +fast-glob@^3.1.1: version "3.2.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d" integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A== @@ -5097,6 +5095,18 @@ fast-glob@^3.1.1, fast-glob@^3.2.2: micromatch "^4.0.2" picomatch "^2.2.1" +fast-glob@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" + integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -5321,10 +5331,10 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -fork-ts-checker-webpack-plugin@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.0.5.tgz#4cf77f925008464db4670750a6e9266a4d25a988" - integrity sha512-2vpP+irspLOpZ1pcH3K3yR76MWXVSOYKTGwhwFQGnWjOs5MxzPN+dyDh1tNoaD5DUFP5kr4lGQURE9Qk+DpiUQ== +fork-ts-checker-webpack-plugin@^5.0.7: + version "5.0.7" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.0.7.tgz#a462bd863bbd654bad14a25518006ab99b7b13a0" + integrity sha512-X7zHKTx4is5YSKa9bDiXGzv8v5K3bsUrZlZgr3F8DeCVsb3oik/+0Mo+K138Sdjh4mpzoHcuUgsrIgZeLIXovw== dependencies: "@babel/code-frame" "^7.8.3" chalk "^2.4.1" @@ -7545,6 +7555,11 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +klona@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/klona/-/klona-1.1.2.tgz#a79e292518a5a5412ec8d097964bff1571a64db0" + integrity sha512-xf88rTeHiXk+XE2Vhi6yj8Wm3gMZrygGdKjJqN8HkV+PwF/t50/LdAKHoHpPcxFAlmQszTZ1CugrK25S7qDRLA== + latest-version@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" @@ -9163,10 +9178,10 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== +p-limit@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.1.tgz#584784ac0722d1aed09f19f90ed2999af6ce2839" + integrity sha512-mw/p92EyOzl2MhauKodw54Rx5ZK4624rNfgNaBguFZkHzyUG9WsDzFF5/yQVEJinbJDdP4jEfMN+uBquiGnaLg== dependencies: p-try "^2.0.0" @@ -9672,15 +9687,6 @@ postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.5, postcss@^7.0.6 source-map "^0.6.1" supports-color "^6.1.0" -postcss@^7.0.30: - version "7.0.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.31.tgz#332af45cb73e26c0ee2614d7c7fb02dfcc2bd6dd" - integrity sha512-a937VDHE1ftkjk+8/7nj/mrjtmkn69xxzJgRETXdAUU+IgOYPQNJF17haGWbeDxSyk++HA14UA98FurvPyBJOA== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - postcss@^7.0.32: version "7.0.32" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" @@ -10572,16 +10578,16 @@ sass-graph@2.2.5: scss-tokenizer "^0.2.3" yargs "^13.3.2" -sass-loader@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" - integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== +sass-loader@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-9.0.2.tgz#847c9b4c95328ddc8c7d35cf28c9d6e54e59a90b" + integrity sha512-nphcum3jNI442njnrZ5wJgSNX5lfEOHOKHCLf+PrTIaleploKqAMUuT9CVKjf+lyi6c2MCGPHh1vb9nGsjnZJA== dependencies: - clone-deep "^4.0.1" - loader-utils "^1.2.3" + klona "^1.1.1" + loader-utils "^2.0.0" neo-async "^2.6.1" - schema-utils "^2.6.1" - semver "^6.3.0" + schema-utils "^2.7.0" + semver "^7.3.2" saxes@^5.0.0: version "5.0.0" @@ -10599,7 +10605,7 @@ schema-utils@1.0.0, schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.6.1, schema-utils@^2.6.5: +schema-utils@^2.6.5: version "2.6.5" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== @@ -10705,10 +10711,10 @@ serialize-javascript@^2.1.2: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== -serialize-javascript@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" - integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg== +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== dependencies: randombytes "^2.1.0" @@ -11907,10 +11913,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^3.9.5: - version "3.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" - integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== +typescript@^3.9.6: + version "3.9.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a" + integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw== uglify-js@^3.1.4: version "3.8.0"