From a845d755d36d8c397b5a7d3113fa4bccb15b3ef1 Mon Sep 17 00:00:00 2001 From: chandaniprajapati Date: Wed, 31 Mar 2021 12:49:06 +0530 Subject: [PATCH] react-datatable: fluent ui design and added some advanced features --- samples/react-datatable/README.md | 3 + samples/react-datatable/assets/preview.png | Bin 62504 -> 62504 bytes samples/react-datatable/package-lock.json | 628 ++++++++++++------ samples/react-datatable/package.json | 3 +- .../ExportListItemsToCSV.module.scss | 9 + .../ExportListItemsToCSV.tsx | 23 +- .../ExportListItemsToCSVFormatter.ts | 14 + .../ExportListItemsToPDF.module.scss | 9 + .../ExportListItemsToPDF.tsx | 69 +- .../ExportListItemsToPDFFormatter.ts | 15 + .../common/Pagination/Pagination.module.scss | 28 + .../shared/common/Pagination/Pagination.tsx | 201 +++++- .../src/shared/service/SPService.ts | 13 + .../src/shared/utilities/utilities.ts | 3 + .../ReactDatatableWebPart.manifest.json | 2 +- .../components/IReactDatatableState.ts | 20 +- .../components/ReactDatatable.module.scss | 10 +- .../components/ReactDatatable.tsx | 250 +++---- .../src/webparts/reactDatatable/loc/en-us.js | 2 +- samples/react-datatable/tsconfig.json | 7 +- 20 files changed, 897 insertions(+), 412 deletions(-) create mode 100644 samples/react-datatable/src/shared/common/ExportListItemsToCSV/ExportListItemsToCSV.module.scss create mode 100644 samples/react-datatable/src/shared/common/ExportListItemsToCSV/ExportListItemsToCSVFormatter.ts create mode 100644 samples/react-datatable/src/shared/common/ExportListItemsToPDF/ExportListItemsToPDF.module.scss create mode 100644 samples/react-datatable/src/shared/common/ExportListItemsToPDF/ExportListItemsToPDFFormatter.ts create mode 100644 samples/react-datatable/src/shared/common/Pagination/Pagination.module.scss create mode 100644 samples/react-datatable/src/shared/utilities/utilities.ts diff --git a/samples/react-datatable/README.md b/samples/react-datatable/README.md index f08522677..c628662de 100644 --- a/samples/react-datatable/README.md +++ b/samples/react-datatable/README.md @@ -42,6 +42,9 @@ Version|Date|Comments 1.0|February 19, 2021|Initial release 1.1|February 24, 2021|Added support for large lists 1.2|March 01, 2021|Fixed search issue for number field +1.3|March 31,2021| Changed UI as per SharePoint list, Set themeing as per current SharePoint site theme, Created custom pagination by using reusable controls, Added features to export CSV based on the filter if the filter is available, Added hyperlink feature for image and link column in export to pdf and also set alternative row formatting in generated pdf as per property pane configuration odd/even row color, fixed object issue (for people/hyperlink, etc) in export to CSV. + + ## Disclaimer **THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.** diff --git a/samples/react-datatable/assets/preview.png b/samples/react-datatable/assets/preview.png index a7b8f9a46cd19372fe9acdf645aa69a55982ec63..044640cbd623d82329d8a20687aff964194f84cf 100644 GIT binary patch delta 31438 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.0.4" + } + } + } + }, "ast-types": { "version": "0.9.6", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", @@ -4586,7 +4635,8 @@ "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true }, "autoprefixer": { "version": "9.1.5", @@ -4845,7 +4895,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -4977,17 +5026,10 @@ } } }, - "base64-arraybuffer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", - "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==", - "optional": true - }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "batch": { "version": "0.6.1", @@ -5146,12 +5188,31 @@ } } }, + "brfs": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-2.0.2.tgz", + "integrity": "sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ==", + "requires": { + "quote-stream": "^1.0.1", + "resolve": "^1.1.5", + "static-module": "^3.0.2", + "through2": "^2.0.0" + } + }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, + "brotli": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", + "integrity": "sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y=", + "requires": { + "base64-js": "^1.1.2" + } + }, "browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", @@ -5162,7 +5223,6 @@ "version": "1.11.3", "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, "requires": { "resolve": "1.1.7" }, @@ -5170,8 +5230,7 @@ "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" } } }, @@ -5218,6 +5277,23 @@ "integrity": "sha1-rrGvKN5sDXpqLOQK22j/GEIq8x8=", "dev": true }, + "browserify-optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-optional/-/browserify-optional-1.0.1.tgz", + "integrity": "sha1-HhNyLP3g2F8SFnbCpyztUzoBiGk=", + "requires": { + "ast-transform": "0.0.0", + "ast-types": "^0.7.0", + "browser-resolve": "^1.8.1" + }, + "dependencies": { + "ast-types": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=" + } + } + }, "browserify-rsa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", @@ -5295,11 +5371,6 @@ "node-int64": "^0.4.0" } }, - "btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==" - }, "buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -5320,8 +5391,7 @@ "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "buffer-xor": { "version": "1.0.3", @@ -5500,20 +5570,6 @@ "integrity": "sha512-Fpi4kVNtNvJ15H0F6vwmXtb3tukv3Zg3qhKkOGUq7KJ1J6b9kf4dnNgtEAFXhRsJo0gNj9W60+wBvn0JcTvdTg==", "dev": true }, - "canvg": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.7.tgz", - "integrity": "sha512-4sq6iL5Q4VOXS3PL1BapiXIZItpxYyANVzsAKpTPS5oq4u3SKbGfUcbZh2gdLCQ3jWpG/y5wRkMlBBAJhXeiZA==", - "optional": true, - "requires": { - "@babel/runtime-corejs3": "^7.9.6", - "@types/raf": "^3.4.0", - "raf": "^3.4.1", - "rgbcolor": "^1.0.1", - "stackblur-canvas": "^2.0.0", - "svg-pathdata": "^5.0.5" - } - }, "capture-exit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", @@ -5936,7 +5992,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -6019,7 +6074,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, "requires": { "safe-buffer": "~5.1.1" } @@ -6069,20 +6123,12 @@ "core-js": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true - }, - "core-js-pure": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.8.3.tgz", - "integrity": "sha512-V5qQZVAr9K0xu7jXg1M7qTEwuxUgqr7dUOezGaNa7i+Xn9oXAU/d1fzqD9ObuwpVQOaorO5s70ckyi1woP9lVA==", - "optional": true + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { "version": "5.2.1", @@ -6194,6 +6240,11 @@ "randomfill": "^1.0.3" } }, + "crypto-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" + }, "css-color-names": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", @@ -6218,15 +6269,6 @@ "hyphenate-style-name": "^1.0.3" } }, - "css-line-break": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-1.1.1.tgz", - "integrity": "sha512-1feNVaM4Fyzdj4mKPIQNL2n70MmuYzAXZ1aytlROFX1JsOo070OsugwGjj7nl6jnDJWHDM8zRZswkmeYVWZJQA==", - "optional": true, - "requires": { - "base64-arraybuffer": "^0.2.0" - } - }, "css-loader": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.0.2.tgz", @@ -6620,12 +6662,16 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, "requires": { "es5-ext": "^0.10.50", "type": "^1.0.1" } }, + "dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -6748,8 +6794,7 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "default-compare": { "version": "1.0.0", @@ -6935,6 +6980,11 @@ "wrappy": "1" } }, + "dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==" + }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -7023,12 +7073,6 @@ } } }, - "dompurify": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.2.6.tgz", - "integrity": "sha512-7b7ZArhhH0SP6W2R9cqK6RjaU82FZ2UPM7RO8qN1b1wyvC/NY1FNWcX1Pu00fFOAnzEORtwXe4bPaClg6pUybQ==", - "optional": true - }, "domutils": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", @@ -7285,7 +7329,6 @@ "version": "0.10.53", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, "requires": { "es6-iterator": "~2.0.3", "es6-symbol": "~3.1.3", @@ -7301,7 +7344,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, "requires": { "d": "1", "es5-ext": "^0.10.35", @@ -7312,7 +7354,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, "requires": { "d": "1", "es5-ext": "~0.10.14", @@ -7340,7 +7381,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, "requires": { "d": "1", "es5-ext": "~0.10.14", @@ -7353,7 +7393,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, "requires": { "d": "1", "es5-ext": "~0.10.14" @@ -7365,7 +7404,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, "requires": { "d": "^1.0.1", "ext": "^1.1.2" @@ -7415,7 +7453,6 @@ "version": "1.14.3", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, "requires": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -7428,7 +7465,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "optional": true } } @@ -7458,8 +7494,7 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esrecurse": { "version": "4.3.0", @@ -7481,14 +7516,17 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "estree-is-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-is-function/-/estree-is-function-1.0.0.tgz", + "integrity": "sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==" }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", @@ -7500,7 +7538,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, "requires": { "d": "1", "es5-ext": "~0.10.14" @@ -7748,7 +7785,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, "requires": { "type": "^2.0.0" }, @@ -7756,8 +7792,7 @@ "type": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", - "dev": true + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" } } }, @@ -8071,11 +8106,6 @@ "fast-loops": "^1.0.0" } }, - "fflate": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", - "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" - }, "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", @@ -8295,6 +8325,45 @@ "readable-stream": "^2.3.6" } }, + "fontkit": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-1.8.1.tgz", + "integrity": "sha512-BsNCjDoYRxmNWFdAuK1y9bQt+igIxGtTC9u/jSFjR9MKhmI00rP1fwSvERt+5ddE82544l0XH5mzXozQVUy2Tw==", + "requires": { + "babel-runtime": "^6.26.0", + "brfs": "^2.0.0", + "brotli": "^1.2.0", + "browserify-optional": "^1.0.1", + "clone": "^1.0.4", + "deep-equal": "^1.0.0", + "dfa": "^1.2.0", + "restructure": "^0.5.3", + "tiny-inflate": "^1.0.2", + "unicode-properties": "^1.2.2", + "unicode-trie": "^0.3.0" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + }, + "unicode-trie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz", + "integrity": "sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU=", + "requires": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + } + } + }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -8503,6 +8572,11 @@ } } }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -9605,15 +9679,6 @@ } } }, - "html2canvas": { - "version": "1.0.0-rc.7", - "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.0.0-rc.7.tgz", - "integrity": "sha512-yvPNZGejB2KOyKleZspjK/NruXVQuowu8NnV2HYG7gW7ytzl+umffbtUI62v2dCHQLDdsK6HIDtyJZ0W3neerA==", - "optional": true, - "requires": { - "css-line-break": "1.1.1" - } - }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -9844,8 +9909,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", @@ -10357,8 +10421,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -12044,33 +12107,6 @@ "integrity": "sha1-XAxWhRBxYOcv50ib3eoLRMK8Z70=", "dev": true }, - "jspdf": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.3.0.tgz", - "integrity": "sha512-KdWe3y5YGjuD8E3Yv1vN8BMuuaQR1jvLTlcZ4dQxUSr1ZveuTv1CnyXyafNL7xfi4eDcIdzs6z9tb9JRDiDCbg==", - "requires": { - "atob": "^2.1.2", - "btoa": "^1.2.1", - "canvg": "^3.0.6", - "core-js": "^3.6.0", - "dompurify": "^2.2.0", - "fflate": "^0.4.8", - "html2canvas": "^1.0.0-rc.5" - }, - "dependencies": { - "core-js": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz", - "integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==", - "optional": true - } - } - }, - "jspdf-autotable": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-3.5.13.tgz", - "integrity": "sha512-0oF5eHefuBjlKm60tNpPMmMS2oDNhY5U7vPkMh+s4/JZbnSjsmcUcP4j2r3k0sDvQz4ysmAi3MoOii9niJn7Og==" - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -12263,7 +12299,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -12285,6 +12320,23 @@ "resolve": "^1.1.7" } }, + "linebreak": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.0.2.tgz", + "integrity": "sha512-bJwSRsJeAmaZYnkcwl5sCQNfSDAhBuXxb6L27tb+qkBRtUQSSTUa5bcgCPD6hFEkRNlpWHfK7nFMmcANU7ZP1w==", + "requires": { + "base64-js": "0.0.8", + "brfs": "^2.0.2", + "unicode-trie": "^1.0.0" + }, + "dependencies": { + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" + } + } + }, "livereload-js": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", @@ -12565,6 +12617,14 @@ "yallist": "^2.1.2" } }, + "magic-string": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", + "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", + "requires": { + "sourcemap-codec": "^1.4.1" + } + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -12767,6 +12827,14 @@ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, + "merge-source-map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", + "requires": { + "source-map": "^0.5.6" + } + }, "merge-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", @@ -12878,8 +12946,7 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { "version": "2.9.0", @@ -13106,8 +13173,7 @@ "next-tick": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, "nice-try": { "version": "1.0.5", @@ -13466,8 +13532,7 @@ "object-inspect": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" }, "object-is": { "version": "1.1.4", @@ -13721,7 +13786,6 @@ "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -13734,8 +13798,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" } } }, @@ -14038,8 +14101,7 @@ "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-root": { "version": "0.1.1", @@ -14095,10 +14157,34 @@ "sha.js": "^2.4.8" } }, + "pdfkit": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.11.0.tgz", + "integrity": "sha512-1s9gaumXkYxcVF1iRtSmLiISF2r4nHtsTgpwXiK8Swe+xwk/1pm8FJjYqN7L3x13NsWnGyUFntWcO8vfqq+wwA==", + "requires": { + "crypto-js": "^3.1.9-1", + "fontkit": "^1.8.0", + "linebreak": "^1.0.2", + "png-js": "^1.0.0" + } + }, + "pdfmake": { + "version": "0.1.70", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.1.70.tgz", + "integrity": "sha512-xPhkblaQ71U97qhRTPj/1HknAHHFZ3cPRmRdrqEWD2xXBcEjEM3Yw0MIjML8DRy9Dt9n6QRjHVf662f0eLtd7Q==", + "requires": { + "iconv-lite": "^0.6.2", + "linebreak": "^1.0.2", + "pdfkit": "^0.11.0", + "svg-to-pdfkit": "^0.1.8", + "xmldoc": "^1.1.2" + } + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true }, "picomatch": { "version": "2.2.2", @@ -14219,6 +14305,11 @@ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", "dev": true }, + "png-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", + "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==" + }, "popper.js": { "version": "1.16.1-lts", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", @@ -14851,8 +14942,7 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "preserve": { "version": "0.2.0", @@ -14908,8 +14998,7 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "promise": { "version": "7.3.1", @@ -15070,13 +15159,21 @@ "fast-diff": "1.1.2" } }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "optional": true, + "quote-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", + "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", "requires": { - "performance-now": "^2.1.0" + "buffer-equal": "0.0.1", + "minimist": "^1.1.3", + "through2": "^2.0.0" + }, + "dependencies": { + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" + } } }, "ramda": { @@ -15306,7 +15403,6 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15391,8 +15487,7 @@ "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, "regex-cache": { "version": "0.4.4", @@ -15578,7 +15673,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "dev": true, "requires": { "path-parse": "^1.0.5" } @@ -15633,6 +15727,14 @@ "signal-exit": "^3.0.2" } }, + "restructure": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-0.5.4.tgz", + "integrity": "sha1-9U591WNZD7NP1r9Vh2EJrsyyjeg=", + "requires": { + "browserify-optional": "^1.0.0" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -15651,12 +15753,6 @@ "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, - "rgbcolor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", - "integrity": "sha1-1lBezbMEplldom+ktDMHMGd1lF0=", - "optional": true - }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -15726,8 +15822,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -15798,8 +15893,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "scheduler": { "version": "0.13.6", @@ -15834,6 +15928,20 @@ } } }, + "scope-analyzer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.1.1.tgz", + "integrity": "sha512-azEAihtQ9mEyZGhfgTJy3IbOWEzeOrYbg7NcYEshPKnKd+LZmC3TNd5dmDxbLBsTG/JVWmCp+vDJ03vJjeXMHg==", + "requires": { + "array-from": "^2.1.1", + "dash-ast": "^1.0.0", + "es6-map": "^0.1.5", + "es6-set": "^0.1.5", + "es6-symbol": "^3.1.1", + "estree-is-function": "^1.0.0", + "get-assigned-identifiers": "^1.1.0" + } + }, "scss-tokenizer": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", @@ -15981,6 +16089,11 @@ "safe-buffer": "^5.0.1" } }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" + }, "shallow-equal": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", @@ -16202,6 +16315,11 @@ "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, "sparkles": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", @@ -16328,11 +16446,13 @@ } } }, - "stackblur-canvas": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.4.0.tgz", - "integrity": "sha512-Z+HixfgYV0ss3C342DxPwc+UvN1SYWqoz7Wsi3xEDWEnaBkSCL3Ey21gF4io+WlLm8/RIrSnCrDBIEcH4O+q5Q==", - "optional": true + "static-eval": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", + "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", + "requires": { + "escodegen": "^1.11.1" + } }, "static-extend": { "version": "0.1.2", @@ -16355,6 +16475,37 @@ } } }, + "static-module": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-3.0.4.tgz", + "integrity": "sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==", + "requires": { + "acorn-node": "^1.3.0", + "concat-stream": "~1.6.0", + "convert-source-map": "^1.5.1", + "duplexer2": "~0.1.4", + "escodegen": "^1.11.1", + "has": "^1.0.1", + "magic-string": "0.25.1", + "merge-source-map": "1.0.4", + "object-inspect": "^1.6.0", + "readable-stream": "~2.3.3", + "scope-analyzer": "^2.0.1", + "shallow-copy": "~0.0.1", + "static-eval": "^2.0.5", + "through2": "~2.0.3" + }, + "dependencies": { + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "^2.0.2" + } + } + } + }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", @@ -16511,7 +16662,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -16613,11 +16763,13 @@ "es6-symbol": "^3.1.1" } }, - "svg-pathdata": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-5.0.5.tgz", - "integrity": "sha512-TAAvLNSE3fEhyl/Da19JWfMAdhSXTYeviXsLSoDT1UM76ADj5ndwAPX1FKQEgB/gFMPavOy6tOqfalXKUiXrow==", - "optional": true + "svg-to-pdfkit": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/svg-to-pdfkit/-/svg-to-pdfkit-0.1.8.tgz", + "integrity": "sha512-QItiGZBy5TstGy+q8mjQTMGRlDDOARXLxH+sgVm1n/LYeo0zFcQlcCh8m4zi8QxctrxB9Kue/lStc/RD5iLadQ==", + "requires": { + "pdfkit": ">=0.8.1" + } }, "svgo": { "version": "1.3.2", @@ -16941,14 +17093,12 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -16994,6 +17144,11 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, + "tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" + }, "tiny-lr": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", @@ -17305,14 +17460,12 @@ "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, "requires": { "prelude-ls": "~1.1.2" } @@ -17330,8 +17483,7 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { "version": "3.3.4000", @@ -17460,6 +17612,47 @@ "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", "dev": true }, + "unicode-properties": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.3.1.tgz", + "integrity": "sha512-nIV3Tf3LcUEZttY/2g4ZJtGXhWwSkuLL+rCu0DIAMbjyVPj+8j5gNVz4T/sVbnQybIsd5SFGkPKg/756OY6jlA==", + "requires": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + }, + "dependencies": { + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + }, + "unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "requires": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + } + } + }, + "unicode-trie": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-1.0.0.tgz", + "integrity": "sha512-v5raLKsobbFbWLMoX9+bChts/VhPPj3XpkNr/HbqkirXR1DPk8eo9IYKyvk0MQZFkaoRsFj2Rmaqgi2rfAZYtA==", + "requires": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + }, + "dependencies": { + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + } + } + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -17646,8 +17839,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { "version": "1.1.1", @@ -18200,8 +18392,7 @@ "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "wordwrap": { "version": "1.0.0", @@ -18290,11 +18481,18 @@ "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", "dev": true }, + "xmldoc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz", + "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==", + "requires": { + "sax": "^1.2.1" + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "3.2.2", diff --git a/samples/react-datatable/package.json b/samples/react-datatable/package.json index 1b6411066..64864862b 100644 --- a/samples/react-datatable/package.json +++ b/samples/react-datatable/package.json @@ -25,9 +25,8 @@ "@pnp/spfx-controls-react": "^2.4.0", "@pnp/spfx-property-controls": "^2.3.0", "export-to-csv": "^0.2.1", - "jspdf": "^2.3.0", - "jspdf-autotable": "^3.5.13", "office-ui-fabric-react": "6.214.0", + "pdfmake": "^0.1.70", "react": "16.8.5", "react-dom": "16.8.5" }, diff --git a/samples/react-datatable/src/shared/common/ExportListItemsToCSV/ExportListItemsToCSV.module.scss b/samples/react-datatable/src/shared/common/ExportListItemsToCSV/ExportListItemsToCSV.module.scss new file mode 100644 index 000000000..3b3d11fc8 --- /dev/null +++ b/samples/react-datatable/src/shared/common/ExportListItemsToCSV/ExportListItemsToCSV.module.scss @@ -0,0 +1,9 @@ +@import '~office-ui-fabric-react/dist/sass/References.scss'; + +.exportToCsv { + .btnCSV { + background-color: "[theme:themePrimary, default:#0078d7]"; + border-color: "[theme: themePrimary, default: #0078d7]"; + color: "[theme:white, default:white]" + } +} diff --git a/samples/react-datatable/src/shared/common/ExportListItemsToCSV/ExportListItemsToCSV.tsx b/samples/react-datatable/src/shared/common/ExportListItemsToCSV/ExportListItemsToCSV.tsx index 64ecc4983..2ed6a0242 100644 --- a/samples/react-datatable/src/shared/common/ExportListItemsToCSV/ExportListItemsToCSV.tsx +++ b/samples/react-datatable/src/shared/common/ExportListItemsToCSV/ExportListItemsToCSV.tsx @@ -1,20 +1,23 @@ import * as React from 'react'; import * as strings from 'ReactDatatableWebPartStrings'; import { ExportToCsv } from 'export-to-csv'; -import { Button } from '@material-ui/core'; -import GetAppSharpIcon from '@material-ui/icons/GetAppSharp'; +import { IIconProps, PrimaryButton } from 'office-ui-fabric-react'; +import styles from './ExportListItemsToCSV.module.scss'; interface IExportToCSV { columnHeader: Array; - listItems: any[]; listName: string; description: string; + dataSource: ()=> any[]; } export function ExportListItemsToCSV(props: IExportToCSV) { - let { columnHeader, listItems, listName, description } = props; + const downloadIcon: IIconProps = { iconName: 'Download' }; + + let { columnHeader, listName, dataSource } = props; function generateCSV() { + let colHeader = columnHeader; const options = { filename: listName, @@ -30,15 +33,15 @@ export function ExportListItemsToCSV(props: IExportToCSV) { headers: colHeader }; const csvExporter = new ExportToCsv(options); - csvExporter.generateCsv(listItems); + csvExporter.generateCsv(dataSource()); } return ( - + className={styles.btnCSV} + /> ); - } \ No newline at end of file diff --git a/samples/react-datatable/src/shared/common/ExportListItemsToCSV/ExportListItemsToCSVFormatter.ts b/samples/react-datatable/src/shared/common/ExportListItemsToCSV/ExportListItemsToCSVFormatter.ts new file mode 100644 index 000000000..529857d6d --- /dev/null +++ b/samples/react-datatable/src/shared/common/ExportListItemsToCSV/ExportListItemsToCSVFormatter.ts @@ -0,0 +1,14 @@ +export function csvCellFormatter(value: any, type: string) { + if (!value) { + return value; + } + switch (type) { + case 'SP.FieldUrl': + value = value.props.children; + break; + default: + break; + } + return value; + } + diff --git a/samples/react-datatable/src/shared/common/ExportListItemsToPDF/ExportListItemsToPDF.module.scss b/samples/react-datatable/src/shared/common/ExportListItemsToPDF/ExportListItemsToPDF.module.scss new file mode 100644 index 000000000..006fc662e --- /dev/null +++ b/samples/react-datatable/src/shared/common/ExportListItemsToPDF/ExportListItemsToPDF.module.scss @@ -0,0 +1,9 @@ +@import '~office-ui-fabric-react/dist/sass/References.scss'; + +.exportToPdf { + .btnPDF { + background-color: "[theme:themePrimary, default:#0078d7]"; + border-color: "[theme: themePrimary, default: #0078d7]"; + color: "[theme:white, default:white]" + } +} diff --git a/samples/react-datatable/src/shared/common/ExportListItemsToPDF/ExportListItemsToPDF.tsx b/samples/react-datatable/src/shared/common/ExportListItemsToPDF/ExportListItemsToPDF.tsx index d7413e16e..8fd650329 100644 --- a/samples/react-datatable/src/shared/common/ExportListItemsToPDF/ExportListItemsToPDF.tsx +++ b/samples/react-datatable/src/shared/common/ExportListItemsToPDF/ExportListItemsToPDF.tsx @@ -1,29 +1,70 @@ import * as React from 'react'; import * as strings from 'ReactDatatableWebPartStrings'; -import jsPDF from 'jspdf'; -import autoTable from 'jspdf-autotable'; -import { Button } from '@material-ui/core'; -import GetAppSharpIcon from '@material-ui/icons/GetAppSharp'; +import pdfMake from 'pdfmake/build/pdfmake'; +import pdfFonts from 'pdfmake/build/vfs_fonts'; +pdfMake.vfs = pdfFonts.pdfMake.vfs; +import { IIconProps, PrimaryButton } from 'office-ui-fabric-react'; +import styles from './ExportListItemsToPDF.module.scss'; +import { isNullOrUndefined } from '../../utilities/utilities'; +import { IPropertyPaneDropdownOption } from '@microsoft/sp-property-pane'; + interface IExportToPDF { - htmlElementForPDF: string; listName: string; + title: string; + columns: any[]; + oddRowColor?: string; + evenRowColor?: string; + dataSource: ()=> any[]; } export function ExportListItemsToPDF(props: IExportToPDF) { - let { htmlElementForPDF, listName } = props; + const downloadIcon: IIconProps = { iconName: 'Download' }; + + let { title, listName, columns, oddRowColor, evenRowColor, dataSource } = props; function genearatePDF() { - const doc = new jsPDF(); - autoTable(doc, { html: htmlElementForPDF, theme: 'grid' }); - doc.save(`${listName}.pdf`); - } + + let dataTableRows = dataSource().map(lItem => columns.reduce((arr, c) => [...arr, isNullOrUndefined(lItem[c]) ? '' : lItem[c]], [])); + + let data = { + content: [ + { + text: title, + fontSize: 16, + alignment: 'center', + margin: [0, 0, 0, 15] + }, + { + style: 'tableExample', + table: { + widths: new Array(columns.length).fill("auto"), + headerRows: 1, + body: [ + columns.map(c=> ({text: c, bold: true})), + ...dataTableRows + ] + }, + layout: { + fillColor: function (rowIndex: number) { + if (oddRowColor && evenRowColor) + return (rowIndex % 2 === 0) ? evenRowColor : oddRowColor; + else + return (rowIndex % 2 === 0) ? '#CCCCCC' : null; + } + } + } + ] + }; + pdfMake.createPdf(data).download(`${listName}.pdf`); + } return ( - + className={styles.btnPDF} + /> ); } \ No newline at end of file diff --git a/samples/react-datatable/src/shared/common/ExportListItemsToPDF/ExportListItemsToPDFFormatter.ts b/samples/react-datatable/src/shared/common/ExportListItemsToPDF/ExportListItemsToPDFFormatter.ts new file mode 100644 index 000000000..bb33f9654 --- /dev/null +++ b/samples/react-datatable/src/shared/common/ExportListItemsToPDF/ExportListItemsToPDFFormatter.ts @@ -0,0 +1,15 @@ +export function pdfCellFormatter(value: any, type: string) { + if (!value) { + return value; + } + switch (type) { + case 'SP.FieldUrl': + let { children: text, href: link } = value.props; + value = { text, link, color: 'blue' }; + break; + default: + break; + } + return value; + } + diff --git a/samples/react-datatable/src/shared/common/Pagination/Pagination.module.scss b/samples/react-datatable/src/shared/common/Pagination/Pagination.module.scss new file mode 100644 index 000000000..45e6dd536 --- /dev/null +++ b/samples/react-datatable/src/shared/common/Pagination/Pagination.module.scss @@ -0,0 +1,28 @@ +.pagination{ + padding-top: 10px; + text-align: center; + float: right; + + .rowsPerPage{ + float: left; + } + + .buttonStyle { + min-width: auto; + text-align: center; + border: 2px solid white; + &:not([class*="ms-Button--primary"]){ + background-color: #f0f0f0; + &:hover{ + background-color: #f7f7f7; + } + } + } + + .buttonStyle:disabled{ + color: lightgray; + i{ + color: lightgray + } + } +} \ No newline at end of file diff --git a/samples/react-datatable/src/shared/common/Pagination/Pagination.tsx b/samples/react-datatable/src/shared/common/Pagination/Pagination.tsx index 66878b31d..99cb385e7 100644 --- a/samples/react-datatable/src/shared/common/Pagination/Pagination.tsx +++ b/samples/react-datatable/src/shared/common/Pagination/Pagination.tsx @@ -1,44 +1,177 @@ -import TablePagination from '@material-ui/core/TablePagination'; -import * as React from 'react'; +import * as React from "react"; +import { PrimaryButton, DefaultButton } from 'office-ui-fabric-react/lib/Button'; +import styles from "./Pagination.module.scss"; +import { isEqual } from "lodash"; +import { Dropdown, DropdownMenuItemType, IDropdownOption, IDropdownProps } from 'office-ui-fabric-react/lib/Dropdown'; -interface IPagination { - colSpan: number; +export interface IPaginationProps { + /** + * The page initial selected + */ + currentPage: number; + /** + * The total items for which you want to generate pagination + */ totalItems: number; - onPaginationUpdate: (pageNo: number, pageSize: number) => void; + /** + * When the page number change send the page number selected + */ + onChange: (pageNo: number, rowsPerPage: number) => void; + /** + * The number of pages showing before the icon + */ + limiter?: number; + /** + * Hide the quick jump to the first page + */ + hideFirstPageJump?: boolean; + /** + * Hide the quick jump to the last page + */ + hideLastPageJump?: boolean; + /** + * Limitir icon, by default is More icon + */ + limiterIcon?: string; + } -export function Pagination(props: IPagination) { +export interface IPaginationState { + totalPages: number; + currentPage: number; + paginationElements: number[]; + limiter: number; + rowsPerPage?: number; +} +export class Pagination extends React.Component { + constructor(props: Readonly) { + super(props); + this.state = { + currentPage: props.currentPage, + paginationElements : [], + limiter: props.limiter ? props.limiter : 3, + totalPages: 0, + rowsPerPage: 10 + }; + } - let { colSpan, totalItems, onPaginationUpdate } = props; - const [page, setPage] = React.useState(0); - const [rowsPerPage, setRowsPerPage] = React.useState(5); + public componentDidMount(){ + let totalPages = this.getTotalPages(this.props.totalItems); + const paginationElements = this.preparePaginationElements(totalPages); + this.setState({totalPages, paginationElements}); + } - React.useEffect(() => { - onPaginationUpdate(page, rowsPerPage); - }, [page, rowsPerPage]); + private getTotalPages(totalItems: number) { + return totalItems ? Math.ceil(totalItems / this.state.rowsPerPage) : 0; + } - const handlePageChange = (event, newPage: number) => { - setPage(newPage); - }; + public componentDidUpdate(prevProps: IPaginationProps) { + let { currentPage, paginationElements, totalPages } = this.state; - const handleChangeRowsPerPage = (event) => { - setRowsPerPage(parseInt(event.target.value, 10)); - setPage(0); - }; + if (prevProps.totalItems !== this.props.totalItems) { + totalPages = this.getTotalPages(this.props.totalItems); + paginationElements = this.preparePaginationElements(totalPages); + currentPage = (currentPage > totalPages) ? totalPages : currentPage; + } + if (this.props.currentPage !== prevProps.currentPage) { + currentPage = this.props.currentPage > totalPages ? totalPages : this.props.currentPage; + } - return ( - - ); + if (!isEqual(this.state.currentPage, currentPage) || !isEqual(this.state.paginationElements, paginationElements) || !isEqual(this.state.totalPages, totalPages)) { + this.setState({ + paginationElements, + currentPage, + totalPages + }); + } + } + + public render(): React.ReactElement { + return ( +
+ {!this.props.hideFirstPageJump && + this.onClick(1)} + iconProps={{ iconName: "DoubleChevronLeft" }}> First + + } + this.onClick(this.state.currentPage - 1)} + iconProps={{ iconName: "ChevronLeft" }}> Prev + + {this.state.paginationElements.map((pageNumber) => this.renderPageNumber(pageNumber))} + this.onClick(this.state.currentPage + 1)} + iconProps={{ iconName: "ChevronRight" }}> Next + + {!this.props.hideLastPageJump && + this.onClick(this.state.totalPages)} + iconProps={{ iconName: "DoubleChevronRight" }}> Last + + } +
+ ); + } + + private preparePaginationElements = (totalPages: number) => { + let paginationElementsArray = []; + for (let i = 0; i < totalPages; i++) { + paginationElementsArray.push(i + 1); + } + return paginationElementsArray; + } + + private onClick = (page: number) => { + this.setState({ currentPage: page }); + this.props.onChange(page, this.state.rowsPerPage); + } + + private renderPageNumber(pageNumber) { + if (pageNumber === this.state.currentPage) { + return ( + this.onClick(pageNumber)} + text={pageNumber}> + + ); + } else { + if (!(pageNumber < this.state.currentPage - this.state.limiter || pageNumber > this.state.currentPage + this.state.limiter)) { + return ( + this.onClick(pageNumber)} + text={pageNumber}> + ); + } + else if (!(pageNumber < this.state.currentPage - this.state.limiter - 1 || pageNumber > this.state.currentPage + this.state.limiter + 1)) { + if (this.props.limiterIcon) { + return ( this.onClick(pageNumber)} + iconProps={{ iconName: this.props.limiterIcon ? this.props.limiterIcon : "More" }}> + ); + } + else { + return ( this.onClick(pageNumber)} + iconProps={{ iconName: this.props.limiterIcon ? this.props.limiterIcon : "More" }}> + ); + } + } + else { + return; + } + } + } } \ No newline at end of file diff --git a/samples/react-datatable/src/shared/service/SPService.ts b/samples/react-datatable/src/shared/service/SPService.ts index 69e62b05d..d70df0aec 100644 --- a/samples/react-datatable/src/shared/service/SPService.ts +++ b/samples/react-datatable/src/shared/service/SPService.ts @@ -17,6 +17,9 @@ export class SPService { for (var i = 0; i < selectedFields.length; i++) { switch (selectedFields[i].fieldType) { case 'SP.FieldUser': + selectQuery.push(`${selectedFields[i].key}/Title,${selectedFields[i].key}/Name`); + expandQuery.push(selectedFields[i].key); + break; case 'SP.FieldLookup': selectQuery.push(`${selectedFields[i].key}/Title`); expandQuery.push(selectedFields[i].key); @@ -59,4 +62,14 @@ export class SPService { Promise.reject(err); } } + + public async getUserProfileUrl(loginName: string, propertyName: string) { + try { + const profileUrl = await sp.profiles.getUserProfilePropertyFor(loginName, propertyName); + return profileUrl; + } + catch (err) { + Promise.reject(err); + } + } } diff --git a/samples/react-datatable/src/shared/utilities/utilities.ts b/samples/react-datatable/src/shared/utilities/utilities.ts new file mode 100644 index 000000000..8b03bd8ee --- /dev/null +++ b/samples/react-datatable/src/shared/utilities/utilities.ts @@ -0,0 +1,3 @@ +/** utility function to check null or undefined */ +export const isNullOrUndefined = (value: any) => value === null || value === undefined; + diff --git a/samples/react-datatable/src/webparts/reactDatatable/ReactDatatableWebPart.manifest.json b/samples/react-datatable/src/webparts/reactDatatable/ReactDatatableWebPart.manifest.json index 73b8a9d08..1f9e7daf7 100644 --- a/samples/react-datatable/src/webparts/reactDatatable/ReactDatatableWebPart.manifest.json +++ b/samples/react-datatable/src/webparts/reactDatatable/ReactDatatableWebPart.manifest.json @@ -20,7 +20,7 @@ "default": "Other" }, "title": { - "default": "react-datatable" + "default": "Datatable" }, "description": { "default": "Shows the sharepoint list items in data table format with some advanced features." diff --git a/samples/react-datatable/src/webparts/reactDatatable/components/IReactDatatableState.ts b/samples/react-datatable/src/webparts/reactDatatable/components/IReactDatatableState.ts index 294a7e6c3..bd2ebbc8e 100644 --- a/samples/react-datatable/src/webparts/reactDatatable/components/IReactDatatableState.ts +++ b/samples/react-datatable/src/webparts/reactDatatable/components/IReactDatatableState.ts @@ -1,12 +1,16 @@ -import { ColDef } from "@material-ui/data-grid"; +import { + IColumn, +} from 'office-ui-fabric-react/lib/DetailsList'; + export interface IReactDatatableState { listItems: any[]; - columns: ColDef[]; - page: number; - rowsPerPage: number; - searchText: string; - contentType: string; - sortingFields: string; - sortDirection: 'asc'|'desc'; + columns: IColumn[]; + page: number; + rowsPerPage?: number; + searchText: string; + contentType: string; + sortingFields: string; + pageOfItems: any[]; + sortDirection: 'asc' | 'desc'; } diff --git a/samples/react-datatable/src/webparts/reactDatatable/components/ReactDatatable.module.scss b/samples/react-datatable/src/webparts/reactDatatable/components/ReactDatatable.module.scss index b694e0ca2..1847d5867 100644 --- a/samples/react-datatable/src/webparts/reactDatatable/components/ReactDatatable.module.scss +++ b/samples/react-datatable/src/webparts/reactDatatable/components/ReactDatatable.module.scss @@ -3,8 +3,16 @@ .reactDatatable { .dataTableUtilities{ margin-bottom: 10px; + margin-top: 10px; .downloadButtons > *{ margin-right: 10px; - } + } + } + .txtSearchBox{ + min-width: 250px; + } + .colHeader{ + font-weight: 600; + font-size: 12px; } } diff --git a/samples/react-datatable/src/webparts/reactDatatable/components/ReactDatatable.tsx b/samples/react-datatable/src/webparts/reactDatatable/components/ReactDatatable.tsx index 6a144264e..94a2b00af 100644 --- a/samples/react-datatable/src/webparts/reactDatatable/components/ReactDatatable.tsx +++ b/samples/react-datatable/src/webparts/reactDatatable/components/ReactDatatable.tsx @@ -6,34 +6,18 @@ import * as strings from 'ReactDatatableWebPartStrings'; import { SPService } from '../../../shared/service/SPService'; import { Placeholder } from "@pnp/spfx-controls-react/lib/Placeholder"; import { DisplayMode } from '@microsoft/sp-core-library'; -import Paper from '@material-ui/core/Paper'; -import Table from '@material-ui/core/Table'; -import TableBody from '@material-ui/core/TableBody'; -import TableCell from '@material-ui/core/TableCell'; -import { Alert, AlertTitle } from '@material-ui/lab'; -import TableContainer from '@material-ui/core/TableContainer'; -import TableHead from '@material-ui/core/TableHead'; -import TableFooter from '@material-ui/core/TableFooter'; -import TableRow from '@material-ui/core/TableRow'; -import { Grid, InputAdornment, Link, TextField } from '@material-ui/core'; -import SearchIcon from '@material-ui/icons/Search'; +import { TextField } from 'office-ui-fabric-react/lib/TextField'; +import { Grid } from '@material-ui/core'; +import { Link, Text } from 'office-ui-fabric-react'; import { WebPartTitle } from "@pnp/spfx-controls-react/lib/WebPartTitle"; -import { withStyles, Theme, createStyles, makeStyles } from '@material-ui/core/styles'; -import TableSortLabel from '@material-ui/core/TableSortLabel'; import { ExportListItemsToCSV } from '../../../shared/common/ExportListItemsToCSV/ExportListItemsToCSV'; import { ExportListItemsToPDF } from '../../../shared/common/ExportListItemsToPDF/ExportListItemsToPDF'; import { Pagination } from '../../../shared/common/Pagination/Pagination'; +import { DetailsList, DetailsListLayoutMode, DetailsRow, IDetailsRowStyles, IDetailsListProps, IColumn, MessageBar, SelectionMode } from 'office-ui-fabric-react'; +import { pdfCellFormatter } from '../../../shared/common/ExportListItemsToPDF/ExportListItemsToPDFFormatter'; +import { csvCellFormatter } from '../../../shared/common/ExportListItemsToCSV/ExportListItemsToCSVFormatter'; +import { IPropertyPaneDropdownOption } from '@microsoft/sp-property-pane'; -const StyledTableCell = withStyles((theme: Theme) => - createStyles({ - head: { - backgroundColor: theme.palette.grey[200], - }, - body: { - fontSize: 14, - }, - }), -)(TableCell); export default class ReactDatatable extends React.Component { @@ -44,12 +28,13 @@ export default class ReactDatatable extends React.Component ({ field: f.key as string, headerName: f.text })); + let dataGridColumns: IColumn[] = [...fields].map(f => ({ + key: f.key as string, + name: f.text, + fieldName: f.key as string, + isResizable: true, + onColumnClick: this.props.sortBy && this.props.sortBy.filter(field => field === f.key).length ? this.handleSorting(f.key as string) : undefined, + minWidth: 70, + maxWidth: 100, + headerClassName: styles.colHeader + })); this.setState({ listItems: listItems, columns: dataGridColumns }); } } @@ -88,6 +82,7 @@ export default class ReactDatatable extends React.Component{description}; + break; + default: + break; + } + return value; + } + + private exportDataFormatter(fields: Array, listItems: any[], cellFormatterFn: (value: any, type: string) => any){ + return listItems && listItems.map(item => ({ + ...fields.reduce((ob, f) => { + ob[f.text] = item[f.key] ? cellFormatterFn(item[f.key], f.fieldType) : '-'; + return ob; + }, {}) + })); + } private handlePaginationChange(pageNo: number, pageSize: number) { this.setState({ page: pageNo, rowsPerPage: pageSize }); @@ -174,22 +197,40 @@ export default class ReactDatatable extends React.Component { let { rowsPerPage, page } = this.state; return (rowsPerPage > 0 - ? filterItem.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage) + ? filterItem.slice((page - 1) * rowsPerPage, (page - 1) * rowsPerPage + rowsPerPage) : filterItem ); } - private handleSorting = (property: string) => (event: React.MouseEvent) => { + private handleSorting = (property: string) => (event: React.MouseEvent, column: IColumn) => { + property = column.key; let { sortingFields, sortDirection } = this.state; - const isAsc = sortingFields === property && sortDirection === 'asc'; - this.setState({ sortDirection: (isAsc ? 'desc' : 'asc'), sortingFields: property }); + const isAsc = sortingFields && sortingFields === property && sortDirection === 'asc'; + let updateColumns = this.state.columns.map(c => { + return c.key === property ? { ...c, isSorted: true, isSortedDescending: (isAsc ? false : true) } : { ...c, isSorted: false, isSortedDescending: true }; + }); + this.setState({ sortDirection: (isAsc ? 'desc' : 'asc'), sortingFields: property, columns: updateColumns }); + } + + private _onRenderRow: IDetailsListProps['onRenderRow'] = props => { + const customStyles: Partial = {}; + if (props) { + if (props.itemIndex % 2 === 0) { + customStyles.root = { backgroundColor: this.props.evenRowColor }; + } + else { + customStyles.root = { backgroundColor: this.props.oddRowColor }; + } + return ; + } + return null; } public render(): React.ReactElement { let filteredItems = this.filterListItems(); - let { list, fields, enableDownloadAsCsv, enableDownloadAsPdf, enablePagination, displayMode, enableSearching, title, evenRowColor, oddRowColor, sortBy } = this.props; - let { sortingFields, sortDirection, columns, listItems } = this.state; - filteredItems = enablePagination ? this.paginateFn(filteredItems) : filteredItems; + let { list, fields, enableDownloadAsCsv, enableDownloadAsPdf, enablePagination, displayMode, enableSearching, title, evenRowColor, oddRowColor } = this.props; + let { columns } = this.state; + let filteredPageItems = enablePagination ? this.paginateFn(filteredItems) : filteredItems; return (
@@ -201,104 +242,65 @@ export default class ReactDatatable extends React.Component : <> - { }}> - - { list && fields && fields.length ? -
- - - { - enableDownloadAsCsv + onConfigure={this._onConfigure} /> : <><> + { }}> + + {list && fields && fields.length ? +
+ + + {enableDownloadAsCsv ? c.headerName)} + columnHeader={columns.map(c => c.name)} listName={list} description={title} - listItems={listItems} - /> : <> - } - { - enableDownloadAsPdf + dataSource={()=> this.exportDataFormatter(fields, filteredItems, csvCellFormatter)} + /> : <>} + {enableDownloadAsPdf ? - : <> - } - - - { - enableSearching ? + title={title} + columns={columns.map(c => c.name)} + oddRowColor={oddRowColor} + evenRowColor={evenRowColor} + dataSource={()=> this.exportDataFormatter(fields, filteredItems, pdfCellFormatter)} /> + : <>} + + + {enableSearching ? - - - ), - }} - /> - : <> - } + placeholder="Search" + className={styles.txtSearchBox} /> + : <>} + - -
- - - - - {columns.map((c) => ( - - { - (sortBy && sortBy.indexOf(c.field) !== -1) - ? - {c.headerName} - - : c.headerName - } - - ))} - - - - {filteredItems.map((row, index) => ( - - {columns.map((c) => ( - {row[c.field]} - ))} - - ))} - - {enablePagination ? - - - - - - - : <> - } -
-
-
-
: - {strings.ListFieldValidation} - } +
+ +
+ {this.props.enablePagination ? + + : <>} +
+
+
: + {strings.ListFieldValidation} + } + }
); diff --git a/samples/react-datatable/src/webparts/reactDatatable/loc/en-us.js b/samples/react-datatable/src/webparts/reactDatatable/loc/en-us.js index 717950084..937659300 100644 --- a/samples/react-datatable/src/webparts/reactDatatable/loc/en-us.js +++ b/samples/react-datatable/src/webparts/reactDatatable/loc/en-us.js @@ -7,7 +7,7 @@ define([], function () { "ConfigureWebpartDescription": "Please configure the web part.", "ListFieldValidation": "Please select the list fields.", "ListPickerLabel": "Select a list", - "MultiSelectFieldLabel": "Multi select field", + "MultiSelectFieldLabel": "Select list fields", "SortingToggleLabel": "Enable Sort", "SortByLabel": "Default Sort By", "SearchingToggleLabel": "Enable Search", diff --git a/samples/react-datatable/tsconfig.json b/samples/react-datatable/tsconfig.json index 56e33450c..264774ca1 100644 --- a/samples/react-datatable/tsconfig.json +++ b/samples/react-datatable/tsconfig.json @@ -11,6 +11,7 @@ "experimentalDecorators": true, "skipLibCheck": true, "outDir": "lib", + "downlevelIteration": true, "inlineSources": false, "strictNullChecks": false, "noUnusedLocals": false, @@ -25,7 +26,9 @@ "lib": [ "es5", "dom", - "es2015.collection" + "es2015", + "es2015.collection", + "ES2017" ] }, "include": [ @@ -36,4 +39,4 @@ "node_modules", "lib" ] -} +} \ No newline at end of file