diff --git a/package-lock.json b/package-lock.json index 8b318de..9973a0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2988,7 +2988,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } @@ -3988,6 +3987,71 @@ } } }, + "@foliojs-fork/fontkit": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@foliojs-fork/fontkit/-/fontkit-1.9.1.tgz", + "integrity": "sha512-U589voc2/ROnvx1CyH9aNzOQWJp127JGU1QAylXGQ7LoEAF6hMmahZLQ4eqAcgHUw+uyW4PjtCItq9qudPkK3A==", + "requires": { + "@foliojs-fork/restructure": "^2.0.2", + "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", + "tiny-inflate": "^1.0.2", + "unicode-properties": "^1.2.2", + "unicode-trie": "^2.0.0" + }, + "dependencies": { + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + } + } + }, + "@foliojs-fork/linebreak": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@foliojs-fork/linebreak/-/linebreak-1.1.1.tgz", + "integrity": "sha512-pgY/+53GqGQI+mvDiyprvPWgkTlVBS8cxqee03ejm6gKAQNsR1tCYCIvN9FHy7otZajzMqCgPOgC4cHdt4JPig==", + "requires": { + "base64-js": "1.3.1", + "brfs": "^2.0.2", + "unicode-trie": "^2.0.0" + }, + "dependencies": { + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + } + } + }, + "@foliojs-fork/pdfkit": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@foliojs-fork/pdfkit/-/pdfkit-0.13.0.tgz", + "integrity": "sha512-YXeG1fml9k97YNC9K8e292Pj2JzGt9uOIiBFuQFxHsdQ45BlxW+JU3RQK6JAvXU7kjhjP8rCcYvpk36JLD33sQ==", + "requires": { + "@foliojs-fork/fontkit": "^1.9.1", + "@foliojs-fork/linebreak": "^1.1.1", + "crypto-js": "^4.0.0", + "png-js": "^1.0.0" + } + }, + "@foliojs-fork/restructure": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/restructure/-/restructure-2.0.2.tgz", + "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==" + }, "@fortawesome/fontawesome-free": { "version": "5.15.4", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", @@ -4799,6 +4863,12 @@ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true }, + "@types/raf": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.0.tgz", + "integrity": "sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==", + "optional": true + }, "@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", @@ -5317,6 +5387,28 @@ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, "add-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", @@ -5614,6 +5706,11 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==" + }, "array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", @@ -5663,6 +5760,58 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "ast-transform": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/ast-transform/-/ast-transform-0.0.0.tgz", + "integrity": "sha512-e/JfLiSoakfmL4wmTGPjv0HpTICVmxwXgYOB8x+mzozHL8v+dSfCbrJ8J8hJ0YBP0XcYu1aLZ6b/3TnxNK3P2A==", + "requires": { + "escodegen": "~1.2.0", + "esprima": "~1.0.4", + "through": "~2.3.4" + }, + "dependencies": { + "escodegen": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.2.0.tgz", + "integrity": "sha512-yLy3Cc+zAC0WSmoT2fig3J87TpQ8UaZGx8ahCAs9FL8qNbyV7CVyPKS74DG4bsHiL5ew9sxdYx131OkBQMFnvA==", + "requires": { + "esprima": "~1.0.4", + "estraverse": "~1.5.0", + "esutils": "~1.0.0", + "source-map": "~0.1.30" + } + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==" + }, + "estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ==" + }, + "esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==" + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "ast-types": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "integrity": "sha512-RIOpVnVlltB6PcBJ5BMLx+H+6JJ/zjDGU0t7f0L6c2M1dqcK92VQopLBlPQ9R80AVXelfqYgjcPLtHtDbNFg0Q==" + }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -5694,8 +5843,7 @@ "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { "version": "10.4.13", @@ -5859,11 +6007,15 @@ } } }, + "base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==" + }, "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==" }, "base64id": { "version": "2.0.0", @@ -6055,6 +6207,50 @@ "fill-range": "^7.0.1" } }, + "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" + } + }, + "brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "requires": { + "base64-js": "^1.1.2" + } + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==" + } + } + }, + "browserify-optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-optional/-/browserify-optional-1.0.1.tgz", + "integrity": "sha512-VrhjbZ+Ba5mDiSYEuPelekQMfTbhcA2DhLk2VQWqdcCROWeFqlTcXZ7yfRkXCIl8E+g4gINJYJiRB7WEtfomAQ==", + "requires": { + "ast-transform": "0.0.0", + "ast-types": "^0.7.0", + "browser-resolve": "^1.8.1" + } + }, "browserslist": { "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", @@ -6114,6 +6310,11 @@ } } }, + "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": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -6124,11 +6325,15 @@ "ieee754": "^1.1.13" } }, + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==" + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "builtin-modules": { "version": "1.1.1", @@ -6341,7 +6546,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -6388,6 +6592,30 @@ "integrity": "sha512-PDd20WuOBPiasZ7KbFnmQRyuLE7cFXW2PVd7dmALzbkUXEP46upAuCDm9eY9vho8fgNMGmbAX92QBZHzcnWIqw==", "dev": true }, + "canvg": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.10.tgz", + "integrity": "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==", + "optional": true, + "requires": { + "@babel/runtime": "^7.12.5", + "@types/raf": "^3.4.0", + "core-js": "^3.8.3", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "rgbcolor": "^1.0.1", + "stackblur-canvas": "^2.0.0", + "svg-pathdata": "^6.0.3" + }, + "dependencies": { + "core-js": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.1.tgz", + "integrity": "sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==", + "optional": true + } + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -6512,12 +6740,6 @@ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", @@ -6627,8 +6849,7 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" }, "clone-deep": { "version": "4.0.1", @@ -6922,6 +7143,17 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "connect": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", @@ -7580,8 +7812,7 @@ "convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "cookie": { "version": "0.5.0", @@ -7801,6 +8032,11 @@ "which": "^1.2.9" } }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, "csextends": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/csextends/-/csextends-1.2.0.tgz", @@ -7831,6 +8067,14 @@ "postcss-selector-parser": "^6.0.9" } }, + "css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "requires": { + "utrie": "^1.0.2" + } + }, "css-loader": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", @@ -8027,6 +8271,15 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "d3-array": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", @@ -8175,6 +8428,11 @@ "number-is-nan": "^1.0.0" } }, + "dash-ast": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-2.0.1.tgz", + "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==" + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -8195,6 +8453,11 @@ "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", "dev": true }, + "dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -8284,8 +8547,7 @@ "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "default-gateway": { "version": "6.0.3", @@ -8315,7 +8577,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -8396,6 +8657,11 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==" + }, "di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", @@ -8630,6 +8896,12 @@ "domelementtype": "^2.2.0" } }, + "dompurify": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz", + "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==", + "optional": true + }, "domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", @@ -8972,11 +9244,43 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==", + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "es6-promisify": { "version": "5.0.0", @@ -8987,6 +9291,35 @@ "es6-promise": "^4.0.3" } }, + "es6-set": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.6.tgz", + "integrity": "sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==", + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "es6-iterator": "~2.0.3", + "es6-symbol": "^3.1.3", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + } + } + }, + "es6-symbol": { + "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==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "esbuild-android-64": { "version": "0.15.5", "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", @@ -9150,6 +9483,61 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, "eslint": { "version": "8.30.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", @@ -9477,8 +9865,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==" }, "esquery": { "version": "1.4.0", @@ -9517,14 +9904,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", @@ -9537,19 +9927,13 @@ "resolved": "https://registry.npmjs.org/eva-icons/-/eva-icons-1.1.3.tgz", "integrity": "sha512-QBSEWNbEx1H0numXP1qgxKVCZHonRaky5ft4pGzQBcO4cy7mEja6TuJ8rc7BqX2pmkvetVQWKDH+DK/8y7GTag==" }, - "event-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", - "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", - "dev": true, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", "requires": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" + "d": "1", + "es5-ext": "~0.10.14" } }, "eventemitter-asyncresource": { @@ -9793,6 +10177,21 @@ } } }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -9905,8 +10304,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "fastparse": { "version": "1.1.2", @@ -9932,6 +10330,11 @@ "websocket-driver": ">=0.5.1" } }, + "fflate": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", + "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" + }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -10016,12 +10419,6 @@ "pkg-dir": "^4.1.0" } }, - "find-parent-dir": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.1.tgz", - "integrity": "sha512-o4UcykWV/XN9wm+jMEtWLPlV8RXCZnMhQI6F6OdHeSez7iiJWePw8ijOlskJZMsaQoGR/b7dH6lO02HhaTN7+A==", - "dev": true - }, "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", @@ -10246,8 +10643,7 @@ "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" }, "gather-stream": { "version": "1.0.0", @@ -10284,6 +10680,11 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, + "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": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -10293,7 +10694,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -11070,7 +11470,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, "requires": { "get-intrinsic": "^1.1.1" } @@ -11078,14 +11477,12 @@ "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -11208,6 +11605,25 @@ "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", "dev": true }, + "html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "requires": { + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" + } + }, + "html2pdf.js": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/html2pdf.js/-/html2pdf.js-0.10.1.tgz", + "integrity": "sha512-3onwwhOWsZfNjIZwV6YIJ6FVhXk+X9YxHSqzeS6hup+1dGi2DHI+zZYUJ+iFnvtaYcjlhyrILL1fvRCUOa8Fcg==", + "requires": { + "es6-promise": "^4.2.5", + "html2canvas": "^1.0.0", + "jspdf": "^2.3.1" + } + }, "htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -11348,26 +11764,6 @@ "ms": "^2.0.0" } }, - "husky": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-0.13.3.tgz", - "integrity": "sha1-vCBmCAutyLj+NRbogfW8aKVwUv8=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "find-parent-dir": "^0.3.0", - "is-ci": "^1.0.9", - "normalize-path": "^1.0.0" - }, - "dependencies": { - "normalize-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", - "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", - "dev": true - } - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -11737,7 +12133,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -11812,15 +12207,6 @@ "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - } - }, "is-core-module": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", @@ -11853,7 +12239,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -12020,7 +12405,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -12535,6 +12919,29 @@ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, + "jspdf": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz", + "integrity": "sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA==", + "requires": { + "@babel/runtime": "^7.14.0", + "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.31.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.1.tgz", + "integrity": "sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==", + "optional": true + } + } + }, "jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -13041,6 +13448,16 @@ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -13053,16 +13470,25 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "event-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", + "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } }, "ms": { "version": "2.1.3", @@ -13073,17 +13499,14 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true }, - "opn": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", - "integrity": "sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } + "proxy-middleware": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", + "integrity": "sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==", + "dev": true }, "send": { "version": "0.18.0", @@ -13532,6 +13955,21 @@ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "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": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==", + "requires": { + "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + } + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -13992,6 +14430,11 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, "ng2-ckeditor": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/ng2-ckeditor/-/ng2-ckeditor-1.2.9.tgz", @@ -14014,6 +14457,15 @@ "tslib": "^2.0.0" } }, + "ngx-daterangepicker-material": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ngx-daterangepicker-material/-/ngx-daterangepicker-material-5.0.1.tgz", + "integrity": "sha512-vbxsiRqyBgXExRBPxuCodLlOOsVEZJ20nTPZks/7z943gZcb2XKwRuQ9hi43MG0xl7RVzDKZdsNKU8bzB86g7g==", + "requires": { + "dayjs": "^1.10.4", + "tslib": "^2.0.0" + } + }, "ngx-echarts": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/ngx-echarts/-/ngx-echarts-4.2.2.tgz", @@ -14534,14 +14986,12 @@ "object-inspect": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "dev": true + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" }, "object-is": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -14550,8 +15000,7 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-visit": { "version": "1.0.1", @@ -14648,6 +15097,23 @@ "is-wsl": "^2.2.0" } }, + "opn": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", + "integrity": "sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true + } + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -14739,6 +15205,21 @@ } } }, + "ornamentum": { + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/ornamentum/-/ornamentum-8.1.4.tgz", + "integrity": "sha512-1MujnM1PpmN+AUPjgXUjZnF3eYFKu7kquhRKTZX6ZP/1Dy3fX/SDOLvQghKGUbgqR8+tjAfw/6DdOMhEmpl3ZQ==", + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -15091,6 +15572,27 @@ "through": "~2.3" } }, + "pdfmake": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.7.tgz", + "integrity": "sha512-ClLpgx30H5G3EDvRW1MrA1Xih6YxEaSgIVFrOyBMgAAt62V+hxsyWAi6JNP7u1Fc5JKYAbpb4RRVw8Rhvmz5cQ==", + "requires": { + "@foliojs-fork/linebreak": "^1.1.1", + "@foliojs-fork/pdfkit": "^0.13.0", + "iconv-lite": "^0.6.3", + "xmldoc": "^1.1.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -15202,6 +15704,11 @@ "irregular-plurals": "^1.0.0" } }, + "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==" + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -16113,12 +16620,6 @@ } } }, - "proxy-middleware": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", - "integrity": "sha1-o/3xvvtzD5UZZYcqwvYHTGFHelY=", - "dev": true - }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -16220,6 +16721,25 @@ "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", "dev": true }, + "quote-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", + "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==", + "requires": { + "buffer-equal": "0.0.1", + "minimist": "^1.1.3", + "through2": "^2.0.0" + } + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "optional": true, + "requires": { + "performance-now": "^2.1.0" + } + }, "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", @@ -16490,8 +17010,7 @@ "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { "version": "0.15.1", @@ -16531,7 +17050,6 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -16733,6 +17251,12 @@ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, + "rgbcolor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", + "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==", + "optional": true + }, "rimraf": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", @@ -16906,8 +17430,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==" }, "scandirectory": { "version": "2.5.0", @@ -16951,6 +17474,20 @@ "ajv-keywords": "^3.5.2" } }, + "scope-analyzer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.1.2.tgz", + "integrity": "sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==", + "requires": { + "array-from": "^2.1.1", + "dash-ast": "^2.0.1", + "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", @@ -17196,6 +17733,11 @@ "kind-of": "^6.0.2" } }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -17553,8 +18095,7 @@ "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "sparkles": { "version": "1.0.1", @@ -17700,6 +18241,20 @@ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", "dev": true }, + "stackblur-canvas": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.6.0.tgz", + "integrity": "sha512-8S1aIA+UoF6erJYnglGPug6MaHYGo1Ot7h5fuXx4fUPvcvQfcdw2o/ppCse63+eZf8PPidSu4v1JnmEVtEDnpg==", + "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", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -17721,6 +18276,45 @@ } } }, + "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": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "requires": { + "readable-stream": "^2.0.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" + } + } + } + }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -18483,6 +19077,12 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "svg-pathdata": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", + "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", + "optional": true + }, "svg-tags": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", @@ -18710,6 +19310,14 @@ "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true }, + "text-segmentation": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "requires": { + "utrie": "^1.0.2" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -18719,14 +19327,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" @@ -18744,6 +19350,11 @@ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", "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==" + }, "tinymce": { "version": "4.5.7", "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-4.5.7.tgz", @@ -19071,6 +19682,11 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -19111,6 +19727,11 @@ "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", "dev": true }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, "typeface-exo": { "version": "0.0.22", "resolved": "https://registry.npmjs.org/typeface-exo/-/typeface-exo-0.0.22.tgz", @@ -19178,12 +19799,37 @@ "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true }, + "unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "requires": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, "unicode-property-aliases-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, + "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" + }, + "dependencies": { + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" + } + } + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -19319,6 +19965,14 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, + "utrie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "requires": { + "base64-arraybuffer": "^1.0.2" + } + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -19768,8 +20422,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", @@ -19880,11 +20533,18 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true }, + "xmldoc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.3.0.tgz", + "integrity": "sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng==", + "requires": { + "sax": "^1.2.4" + } + }, "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": "4.0.3", diff --git a/package.json b/package.json index 1843426..b60bf90 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "core-js": "2.5.1", "echarts": "^4.9.0", "eva-icons": "^1.1.3", + "html2pdf.js": "^0.10.1", "intl": "1.2.5", "ionicons": "2.0.1", "leaflet": "1.2.0", @@ -61,10 +62,13 @@ "ng2-ckeditor": "~1.2.9", "ng2-completer": "^9.0.1", "ng2-smart-table": "^1.6.0", + "ngx-daterangepicker-material": "^5.0.1", "ngx-echarts": "^4.2.2", "node-sass": "^4.14.1", "normalize.css": "6.0.0", + "ornamentum": "^8.1.4", "pace-js": "1.0.2", + "pdfmake": "^0.2.7", "roboto-fontface": "0.8.0", "rxjs": "6.6.2", "rxjs-compat": "6.3.0", @@ -98,7 +102,6 @@ "codelyzer": "^6.0.2", "conventional-changelog-cli": "1.3.4", "eslint": "^8.23.0", - "husky": "0.13.3", "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~5.0.0", "karma": "~6.3.19", diff --git a/src/app/@theme/components/header/header.component.html b/src/app/@theme/components/header/header.component.html index 862d62f..0a2666f 100644 --- a/src/app/@theme/components/header/header.component.html +++ b/src/app/@theme/components/header/header.component.html @@ -21,7 +21,7 @@ diff --git a/src/app/@theme/components/header/header.component.ts b/src/app/@theme/components/header/header.component.ts index 20ed8e8..2244a79 100644 --- a/src/app/@theme/components/header/header.component.ts +++ b/src/app/@theme/components/header/header.component.ts @@ -17,7 +17,7 @@ export class HeaderComponent implements OnInit, OnDestroy { private destroy$: Subject = new Subject(); userPictureOnly: boolean = false; user: any; - + userName:any =[] themes = [ { value: 'default', @@ -50,6 +50,7 @@ export class HeaderComponent implements OnInit, OnDestroy { } ngOnInit() { + this.userName = localStorage.getItem('user_role') this.currentTheme = this.themeService.currentTheme; console.log(this.userService) diff --git a/src/app/@theme/styles/styles.scss b/src/app/@theme/styles/styles.scss index 3872aa3..15e2df2 100644 --- a/src/app/@theme/styles/styles.scss +++ b/src/app/@theme/styles/styles.scss @@ -2,7 +2,17 @@ // themes - our custom or/and out of the box themes @import 'themes'; - +:not(.dark-theme) { + @import "~ornamentum/themes/base.theme.scss"; + @import "~ornamentum/themes/addon.base.theme.scss"; + } + *{ + + -webkit-user-select: none; /* Safari */ + -ms-user-select: none; /* IE 10 and IE 11 */ + user-select: none; /* Standard syntax */ + + } // framework component themes (styles tied to theme variables) @import '@nebular/theme/styles/globals'; @import '@nebular/auth/styles/globals'; @@ -44,4 +54,4 @@ // background-attachment: fixed; // background-size: cover; // } - \ No newline at end of file + diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 6796e36..8d93c93 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -10,6 +10,8 @@ import { } from '@nebular/auth'; import { LoginComponent } from '../app/pages/auth/login/login.component'; import { AuthGuard } from './pages/_guard/auth.guard'; +import { ForgotPasswordComponent } from './pages/auth/forgot-password/forgot-password.component'; +import { ResetPasswordComponent } from './pages/auth/reset-password/reset-password.component'; const token = localStorage.getItem('user_token'); @@ -54,11 +56,11 @@ export const routes: Routes = [ }, { path: 'request-password', - component: NbRequestPasswordComponent, + component: ForgotPasswordComponent, }, { - path: 'reset-password', - component: NbResetPasswordComponent, + path: 'reset-password/:email', + component: ResetPasswordComponent, }, ], }, diff --git a/src/app/pages/_guard/auth.guard.ts b/src/app/pages/_guard/auth.guard.ts index e86f90e..4c10514 100644 --- a/src/app/pages/_guard/auth.guard.ts +++ b/src/app/pages/_guard/auth.guard.ts @@ -1,10 +1,11 @@ import { Injectable } from '@angular/core'; import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, CanActivateChild } from '@angular/router'; import { Observable , of } from 'rxjs'; + // import { CognitoService } from '../AwsService/cognito.service'; @Injectable() export class AuthGuard implements CanActivate, CanActivateChild { - + token:any =[]; constructor(private router: Router) { } canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { @@ -12,6 +13,7 @@ export class AuthGuard implements CanActivate, CanActivateChild { const token = localStorage.getItem('user_token'); if(token != '' && token != undefined && token != null){ + // this.checkToken(); return true }else{ // alert("else"); @@ -36,6 +38,7 @@ export class AuthGuard implements CanActivate, CanActivateChild { const token = localStorage.getItem('user_token'); console.log(token) if(token != '' && token != undefined && token != null){ + // this.checkToken(); return true }else{ // setTimeout(() => { @@ -68,4 +71,27 @@ export class AuthGuard implements CanActivate, CanActivateChild { // this.router.navigate(['/login']); // } // } + + + checkToken() { + const storedToken = localStorage.getItem('token'); + if (storedToken) { + try { + // this.token = jwt.verify(storedToken, 'vnms2023feb'); + // this.isAuthenticated = true; + } catch (err) { + console.error('Invalid token:', err); + //this.isAuthenticated = false; + this.logout(); + } + } else { + // this.isAuthenticated = false; + } + } + + logout() { + localStorage.removeItem('token'); + localStorage.clear(); + this.router.navigate(['/auth/login']); + } } \ No newline at end of file diff --git a/src/app/pages/auth/auth.service.ts b/src/app/pages/auth/auth.service.ts index 44c062a..204a963 100644 --- a/src/app/pages/auth/auth.service.ts +++ b/src/app/pages/auth/auth.service.ts @@ -18,4 +18,24 @@ export class AuthService { return this._http.post(this.apiUrl + "login",{'email':params.email,'password':params.password}) } + + getForgotToken(params): Observable { + console.log(params.email) + return this._http.post(this.apiUrl + "forget-password",{'email':params.email,'password':params.password}) + + } + + + verifyOtp(params): Observable { + console.log(params.email) + return this._http.post(this.apiUrl + "otp-verify",params) + + } + resetPasswordApi(params): Observable { + // console.log(params.email) + return this._http.post(this.apiUrl + "reset-password",params) + + } + + } diff --git a/src/app/pages/auth/forgot-password/forgot-password.component.html b/src/app/pages/auth/forgot-password/forgot-password.component.html new file mode 100644 index 0000000..a0b5d0c --- /dev/null +++ b/src/app/pages/auth/forgot-password/forgot-password.component.html @@ -0,0 +1,57 @@ +

Forgot Password

+

Enter your email address and we’ll send a link to reset your password

+ + +
+
+
+ + + +

+ Email is required! +

+

+ Email should be the real one! +

+
+
+ + +
+
+
+

{{forgotTokenEmail.message}}

+ +
+ + + diff --git a/src/app/pages/auth/forgot-password/forgot-password.component.scss b/src/app/pages/auth/forgot-password/forgot-password.component.scss new file mode 100644 index 0000000..77bfde0 --- /dev/null +++ b/src/app/pages/auth/forgot-password/forgot-password.component.scss @@ -0,0 +1,12 @@ +@import '../../../@theme/styles/themes'; + +@include nb-install-component() { + nb-card { + transform: translate3d(0, 0, 0); + } +} +:host { + .form-group:last-of-type { + margin-bottom: 3rem; + } + } \ No newline at end of file diff --git a/src/app/pages/auth/forgot-password/forgot-password.component.spec.ts b/src/app/pages/auth/forgot-password/forgot-password.component.spec.ts new file mode 100644 index 0000000..79f223d --- /dev/null +++ b/src/app/pages/auth/forgot-password/forgot-password.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ForgotPasswordComponent } from './forgot-password.component'; + +describe('ForgotPasswordComponent', () => { + let component: ForgotPasswordComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ForgotPasswordComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ForgotPasswordComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/auth/forgot-password/forgot-password.component.ts b/src/app/pages/auth/forgot-password/forgot-password.component.ts new file mode 100644 index 0000000..95e3dbe --- /dev/null +++ b/src/app/pages/auth/forgot-password/forgot-password.component.ts @@ -0,0 +1,105 @@ +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; + +import { Router } from '@angular/router'; +import { NbToastrService, NbWindowControlButtonsConfig, NbWindowRef, NbWindowService } from '@nebular/theme'; +import { environment } from '../../../../environments/environment'; +import { AuthService } from '../auth.service'; +import { OtpComponent } from '../otp/otp.component'; + +@Component({ + selector: 'ngx-forgot-password', + templateUrl: './forgot-password.component.html', + styleUrls: ['./forgot-password.component.scss'] +}) +export class ForgotPasswordComponent implements OnInit { + redirectDelay: number; + showMessages: any; + strategy: string; + submitted: boolean; + errors: string[]; + messages: string[]; + user: any; + forgotMailDara: any; + form: FormGroup; + email: string; + password: string; + forgotTokenEmail: any; + public mailUrl = environment.mailUrl; + resetLink: any = 0; + minimize = false; + maximize = false; + fullScreen = true; + close = true; + formData:any=[] + index = 1; + destroyByClick = true; + duration = 2000; + constructor(private router:Router,public _ser:AuthService,private toastrService: NbToastrService,private windowService: NbWindowService) { + // this._ser.forgotEmail_observable$.subscribe((res) => { + // console.log('email', res); + // this.forgotMailDara = res + // }) + } + + ngOnInit() { + this.form = new FormGroup({ + email: new FormControl('',[Validators.required,Validators.email,Validators.pattern('[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,63}$')]), + }); + this.form.controls['email'].setValue(this.forgotMailDara) + } + + submit(){ + console.log(this.form.value) + const mailid = this.form['value'].email.split(/\s/).join(''); + // this.router.navigate(['/reset-password']) + let forgotMail = {'email':mailid} + // let forgotMail = {'email':mailid} + console.log(forgotMail) + this._ser.getForgotToken(forgotMail).subscribe(res => { + if(res.status == 200){ + this.resetLink = 1 + console.log(res) + this.forgotTokenEmail = res + + const buttonsConfig: NbWindowControlButtonsConfig = { + minimize: this.minimize, + maximize: this.maximize, + fullScreen: this.fullScreen, + close: this.close, + }; + const windowRef: NbWindowRef = this.windowService.open(OtpComponent, { title: `Otp`, context: forgotMail + , buttons: buttonsConfig }); + + + + // Subscribe to the afterClosed event + windowRef.onClose.subscribe((data) => { + // Handle the window closure + console.log(data); + if(data == 1){ + // this.showToast('success', 'Data Changed Successfully', 'Order Cancel Completed..!'); + // this.getorderlistApi(); + this.router.navigate(['auth/reset-password/'+mailid]) + console.log('Window closed 123'); + }else if(data == 0){ + // this.showToast('warning', 'Somthing is Wrong...!', 'Order Cancel Failed..!'); + } + + + }); + // this.toastrService.success('Login',res.message) + // this._ser.getForgotDetails(this.forgotTokenEmail) + // this.notifierService.notify('success', res.message); + //this.router.navigate(['authentication/reset-password']) + } else{ + // this.toastrService.warning('Login',res.message) + } + }, err => { + + //alert(err.message); + }) + + } + +} diff --git a/src/app/pages/auth/login/login.component.html b/src/app/pages/auth/login/login.component.html index b79bb9e..264585c 100644 --- a/src/app/pages/auth/login/login.component.html +++ b/src/app/pages/auth/login/login.component.html @@ -1,66 +1,45 @@
-
- - vnms - -
-
- -
- - - - - -
Email is required.
- -
- Please enter a valid email address -
-
- +
+ + vnms + + +
+ + + +
Email is required.
+ +
+ Please enter a valid email address
-
-
- -
- - - -
Password is required.
- - -
- Password is required -
- -
-
-
-
-
-
- Remember me + +
+
+ + + + + + +
Password is required.
+
+ Password length must be greater than or equal to 8, and the password must contain one or more uppercase, lowercase, numeric, and special characters.
-
-
-
-
- -
-
- - - -
+ + +
+ + + + +
- - - - - - \ No newline at end of file +
diff --git a/src/app/pages/auth/login/login.component.scss b/src/app/pages/auth/login/login.component.scss index 173e4e0..0583996 100644 --- a/src/app/pages/auth/login/login.component.scss +++ b/src/app/pages/auth/login/login.component.scss @@ -1,27 +1,50 @@ nb-checkbox { - margin-bottom: 1rem; - } - - .form-inline [fullWidth] { - flex: 1; - } - - .form-inline > * { - margin: 0 1.5rem 1.5rem 0; - } - - nb-card.inline-form-card nb-card-body { - padding-bottom: 0; - } -// nb-card-header{ -// display: none; + margin-bottom: 1rem; +} + +.form-inline [fullWidth] { + flex: 1; +} + +.form-inline > * { + margin: 0 1.5rem 1.5rem 0; +} + + +[nbInput].size-medium:not(.input-full-width){ + max-width: 30rem !important; +} +[nbInput].shape-rectangle { + max-width: 30rem !important; +} +.nb-form-field-limited-width.nb-form-field-size-medium{ + max-width: 30rem !important; +} + +// nb-card.inline-form-card nb-card-body { +// padding-bottom: 0; // } -// ::ng-deep .nb-theme-default nb-card-header { +// ::ng-deep nb-card-header{ // display: none !important; -// } - +// } + +// ::ng-deep .layout-container .content .columns nb-layout-column{ +// background-image: url(../../../../assets/images/login.jpg) !important; +// background-repeat: no-repeat; +// background-attachment: fixed; +// background-size: cover; +// } +// .loginBg{ +// background-repeat: no-repeat; +// background-attachment: fixed; +// background-size: cover; +// } +// .headLogin{ +// display: block !important; +// } - - \ No newline at end of file +.eyeIcon{ +margin-top: 22px; +} \ No newline at end of file diff --git a/src/app/pages/auth/login/login.component.ts b/src/app/pages/auth/login/login.component.ts index 334500f..adac451 100644 --- a/src/app/pages/auth/login/login.component.ts +++ b/src/app/pages/auth/login/login.component.ts @@ -12,7 +12,7 @@ import { NbComponentStatus, NbGlobalPhysicalPosition, NbGlobalPosition, NbToastr }) export class LoginComponent implements OnInit { loginForm: FormGroup | any; - + disable:any =true; minimize = false; maximize = false; @@ -27,6 +27,7 @@ export class LoginComponent implements OnInit { position: NbGlobalPosition = NbGlobalPhysicalPosition.TOP_RIGHT; preventDuplicates = false; status: NbComponentStatus = 'primary'; + showPassword: boolean = false; constructor( private router:Router,public _ser:AuthService,private toastrService: NbToastrService) { } ngOnInit(): void { @@ -35,14 +36,24 @@ export class LoginComponent implements OnInit { email: new FormControl('', [Validators.required, Validators.email,Validators.pattern( '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,63}$', ),]), - password: new FormControl('', [ Validators.required]) - // password: new FormControl('', [Validators.required,Validators.pattern( - // '^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*_=+-]).{8,12}$' - // )]) + // password: new FormControl('', [ Validators.required]) + password: new FormControl('', [Validators.required,Validators.pattern( + '^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*_=+-]).{8,12}$' + )]) }); } + toggleShowPassword() { + this.showPassword = !this.showPassword; + } + getInputType() { + if (this.showPassword) { + return 'text'; + } + return 'password'; + } onSubmit(){ + this.disable= false console.log("enter", this.loginForm.value) let auth = { 'email': this.loginForm.value.email, 'password': this.loginForm.value.password}; @@ -53,8 +64,9 @@ export class LoginComponent implements OnInit { localStorage.setItem('user_token',res.token); localStorage.setItem('user_role',res.role); localStorage.setItem('roleId',res.roleId); - localStorage.setItem('email',JSON.stringify(auth)) + localStorage.setItem('email',JSON.stringify(auth)) + this.disable= true this.showToast('success', 'Login Successfully', 'Welcome..!'); setTimeout(() => { this.router.navigate(['/home']) @@ -88,4 +100,8 @@ export class LoginComponent implements OnInit { `${titleContent}`, config); } + + openForgot(){ + + } } diff --git a/src/app/pages/auth/otp/otp.component.html b/src/app/pages/auth/otp/otp.component.html new file mode 100644 index 0000000..56b00c3 --- /dev/null +++ b/src/app/pages/auth/otp/otp.component.html @@ -0,0 +1,27 @@ +
+ + + + + +
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+ + +
+
\ No newline at end of file diff --git a/src/app/pages/auth/otp/otp.component.scss b/src/app/pages/auth/otp/otp.component.scss new file mode 100644 index 0000000..ad2e921 --- /dev/null +++ b/src/app/pages/auth/otp/otp.component.scss @@ -0,0 +1,10 @@ +@import '../../../@theme/styles/themes'; + +@include nb-install-component() { + ::ng-deep .form { + display: flex; + flex-direction: column; + + + } +} diff --git a/src/app/pages/auth/otp/otp.component.spec.ts b/src/app/pages/auth/otp/otp.component.spec.ts new file mode 100644 index 0000000..c356acc --- /dev/null +++ b/src/app/pages/auth/otp/otp.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OtpComponent } from './otp.component'; + +describe('OtpComponent', () => { + let component: OtpComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ OtpComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(OtpComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/auth/otp/otp.component.ts b/src/app/pages/auth/otp/otp.component.ts new file mode 100644 index 0000000..4c0d66c --- /dev/null +++ b/src/app/pages/auth/otp/otp.component.ts @@ -0,0 +1,54 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { NB_WINDOW_CONTEXT, NbWindowRef, NbWindowService } from '@nebular/theme'; +import { AuthService } from '../auth.service'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; + +@Component({ + selector: 'ngx-otp', + templateUrl: './otp.component.html', + styleUrls: ['./otp.component.scss'] +}) +export class OtpComponent { + + otpform:any; + + constructor(@Inject(NB_WINDOW_CONTEXT) public data: any,public _api:AuthService,private windowService: NbWindowService, private windowRef: NbWindowRef) { + + this.otpform = new FormGroup({ + + + reason: new FormControl('', [ Validators.required]) + + }); + console.log(this.data) + } + + close() { + this.windowRef.close(); + } + onSubmit(){ + console.log( this.data , this.otpform.value) + + + // let param ={id:this.data.id, reason: this.otpform.value.reason, status:'Cancelled'} + + + + let param ={email:this.data.email, otp: this.otpform.value.reason, } + + + + this._api.verifyOtp (param).subscribe(res => { + if (res.status == 200) { + console.log(res) + this.windowRef.close(1); + + + }else{ + this.windowRef.close(0); + } + }) + + } + +} diff --git a/src/app/pages/auth/reset-password/reset-password.component.html b/src/app/pages/auth/reset-password/reset-password.component.html new file mode 100644 index 0000000..b2d1756 --- /dev/null +++ b/src/app/pages/auth/reset-password/reset-password.component.html @@ -0,0 +1,90 @@ +

Change password

+

Please set a new password

+ + + +
+
+ + +
+ + + +
+ +
+ Password is required! +
+
+ Password length must be greater than or equal to 8 and password must contain one or more uppercase , lowercase , numeric and special characters +
+
+
+
+ +
+ + +
+ + + +
+ +
+ Password is required! +
+
+ Password length must be greater than or equal to 8 and password must contain one or more uppercase , lowercase , numeric and special characters +
+
+ Password does not match the confirm password. +
+
+
+
+ + + +
+ + diff --git a/src/app/pages/auth/reset-password/reset-password.component.scss b/src/app/pages/auth/reset-password/reset-password.component.scss new file mode 100644 index 0000000..3e4f87c --- /dev/null +++ b/src/app/pages/auth/reset-password/reset-password.component.scss @@ -0,0 +1,31 @@ +:host { + .form-group:last-of-type { + margin-bottom: 3rem; + } + } + + .form-inline [fullWidth] { + flex: 1; + } + + .form-inline > * { + margin: 0 1.5rem 1.5rem 0; + } + + + [nbInput].size-medium:not(.input-full-width){ + max-width: 35rem !important; + } + .nb-form-field-limited-width.nb-form-field-size-medium{ + max-width: 35rem !important; + } + +.input-with-icon { + display: flex; + align-items: center; +} + +.input-with-icon input { + flex: 1; + margin-right: 5px; +} \ No newline at end of file diff --git a/src/app/pages/auth/reset-password/reset-password.component.spec.ts b/src/app/pages/auth/reset-password/reset-password.component.spec.ts new file mode 100644 index 0000000..1d70527 --- /dev/null +++ b/src/app/pages/auth/reset-password/reset-password.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ResetPasswordComponent } from './reset-password.component'; + +describe('ResetPasswordComponent', () => { + let component: ResetPasswordComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ResetPasswordComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ResetPasswordComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/auth/reset-password/reset-password.component.ts b/src/app/pages/auth/reset-password/reset-password.component.ts new file mode 100644 index 0000000..581a4bc --- /dev/null +++ b/src/app/pages/auth/reset-password/reset-password.component.ts @@ -0,0 +1,92 @@ +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { NbToastrService } from '@nebular/theme'; + +import { ActivatedRoute, Router } from '@angular/router'; +import { AuthService } from '../auth.service'; + +@Component({ + selector: 'ngx-reset-password', + templateUrl: './reset-password.component.html', + styleUrls: ['./reset-password.component.scss'] +}) +export class ResetPasswordComponent implements OnInit { + form: FormGroup; + forgotApiDetails: string; + email:any=[]; + token:any = []; + hide: boolean; + hide2:boolean; + submitted: boolean; + showPassword = false; + showPassword2 = false; + constructor(private router:Router,public _ser:AuthService,private toastrService: NbToastrService,private route: ActivatedRoute) { } + + ngOnInit(): void { + this.hide = true; + this.hide2 =true + // this._ser.name.subscribe(data=>{ + // this.forgotApiDetails = data; + // console.log(this.forgotApiDetails) + // }); + this.email = this.route.snapshot.paramMap.get('email'); + // this.token = this.route.snapshot.paramMap.get('token'); +console.log(this.email) + this.form = new FormGroup({ + password: new FormControl('', [Validators.required,Validators.pattern( + '^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*_=+-]).{8,16}$' + )]), + confirm_password: new FormControl('', [Validators.required,Validators.pattern( + '^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*_=+-]).{8,16}$' + )]), + }); + } + // public myError = (controlName: string, errorName: string) =>{ + // return this.form.controls[controlName].hasError(errorName); + // } + + submit(){ + console.log(this.form.value) + let param ={email :this.email,password:this.form.value.password,password2:this.form.value.confirm_password} + this._ser.resetPasswordApi(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + this.toastrService.success('Reset',res.message) + setTimeout(() => { + this.router.navigate(['auth/login']); + return false; + },1000); + } + + // this.forgotTokenEmail = res + }, err => { + + //alert(err.message); + }) + + } + + getInputType(event) { + if(event == 1){ + if (this.showPassword) { + return 'text'; + } + return 'password'; + } else { + if (this.showPassword2) { + return 'text'; + } + return 'password'; + } + + } + + toggleShowPassword(event) { + if(event == 1){ + this.showPassword = !this.showPassword; + } else { + this.showPassword2 = !this.showPassword2; + } + } + +} diff --git a/src/app/pages/customer/customer-form/customer-form.component.html b/src/app/pages/customer/customer-form/customer-form.component.html index 1766c41..948fcfd 100644 --- a/src/app/pages/customer/customer-form/customer-form.component.html +++ b/src/app/pages/customer/customer-form/customer-form.component.html @@ -1,126 +1,124 @@ -
- - - - - - - - -
- -
-
-
- - - + + {{heading}} + + +
+
+ + + +
Name is required.
- - -
+ +
-
-
-
- -
- - -
Email is required.
- -
+
+ + + + +
Email is required.
+
Please enter a valid email address -
-
+
+ +
-
-
- -
- - - - +
+ + + + + + +
- Password is required + Password is required
-
-
-
- -
-
-
- -
- -
Mobile No is required.
- - -
- + + +
-
-
- -
- -
Address is required.
- - -
-
-
+
+
+ + + + +
Mobile No is required.
+ + +
+
+
+
+ + + + +
Address is required.
+ + +
+
+
+
+ -
- + +
State is required.
- - -
-
-
+ + +
+
-
-
-
- -
- -
City is required.
- - -
-
-
-
-
- - Medical - Industrial - - -
Customer Type is required.
- - -
-
-
-
- - -
-
+
+
+ + + + +
City is required.
+
+
+
+
+ + + + +
Pincode is required.
+
+
+
+
+ +
+ + Medical + Industrial + + +
Customer Type is required.
- + +
+
+ +
+
- - - - -
\ No newline at end of file + + + + +
+ +
\ No newline at end of file diff --git a/src/app/pages/customer/customer-form/customer-form.component.scss b/src/app/pages/customer/customer-form/customer-form.component.scss index bf05095..a312e65 100644 --- a/src/app/pages/customer/customer-form/customer-form.component.scss +++ b/src/app/pages/customer/customer-form/customer-form.component.scss @@ -1,23 +1,19 @@ @import '../../../@theme/styles/themes'; @include nb-install-component() { - ::ng-deep .form { - display: flex; - flex-direction: column; - - .text-label { - margin-top: 1.5rem; - } - .cancel { - margin-right: 1rem; - } - + input { + width: 100%; } - .custom-window{ - zoom:96%; + + .cancel { + margin-right: 1rem; } } -// ::ng-deep nb-window { -// flex: 1 0 auto; -// min-width: 50rem !important; -// } \ No newline at end of file +.custom-dialog-class { + width: 50%; /* Set the desired width here */ + height: 300px; /* Set the desired height here */ + } + .show-grid{ + margin-bottom: 2rem; + } + \ No newline at end of file diff --git a/src/app/pages/customer/customer-form/customer-form.component.ts b/src/app/pages/customer/customer-form/customer-form.component.ts index 16e0afa..698929c 100644 --- a/src/app/pages/customer/customer-form/customer-form.component.ts +++ b/src/app/pages/customer/customer-form/customer-form.component.ts @@ -1,7 +1,7 @@ import { Component, Inject, OnInit } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; import { PageapiService } from '../../pageapi.service'; -import { NbWindowService ,NbWindowRef, NB_WINDOW_CONTEXT } from '@nebular/theme'; +import { NbWindowService ,NbWindowRef, NB_WINDOW_CONTEXT, NbDialogRef, NbDialogService } from '@nebular/theme'; @Component({ selector: 'ngx-customer-form', @@ -9,15 +9,21 @@ import { NbWindowService ,NbWindowRef, NB_WINDOW_CONTEXT } from '@nebular/theme' styleUrls: ['./customer-form.component.scss'] }) export class CustomerFormComponent implements OnInit { - + data:any =[]; userForm: FormGroup | any; formData:any =[] - constructor(@Inject(NB_WINDOW_CONTEXT) public data: any,public _api:PageapiService,private windowService: NbWindowService, private windowRef: NbWindowRef) { + heading:any =[]; + constructor(private dialogRef: NbDialogRef ,public _api:PageapiService,private dialogService: NbDialogService) { - console.log(this.data) + } - ngOnInit(): void { + ngOnInit() { + console.log('dialogRef', this.dialogRef.componentRef.instance); + let details:any = this.dialogRef.componentRef.instance + + this.heading = details.title + this.data = details.details this.userForm = new FormGroup({ @@ -39,12 +45,14 @@ export class CustomerFormComponent implements OnInit { address_1: new FormControl('', [Validators.required,Validators.maxLength(100)]), state: new FormControl('', [Validators.required]), city: new FormControl('', [Validators.required]), + pincode: new FormControl('', [Validators.required]), cusType: new FormControl('', [Validators.required]), }); this.data.address_1 = this.data['CusDetails.address_1'] this.data.state = this.data['CusDetails.state'] this.data.city = this.data['CusDetails.city'] + this.data.pincode = this.data['CusDetails.pincode'] this.data.cusType = this.data['CusDetails.cusType'] if(this.data.hasOwnProperty('id')){ this.userForm.controls['password'].clearValidators(); @@ -54,9 +62,9 @@ export class CustomerFormComponent implements OnInit { } cancel(){ - this.windowService - console.log( this.windowService) - this.windowRef.close(); + // this.windowService + // console.log( this.windowService) + this.dialogRef.close(); } onSubmit(){ @@ -69,19 +77,23 @@ export class CustomerFormComponent implements OnInit { } - let cus = { cusName : tmp.userName, + let cus:any = { cusName : tmp.userName, email : tmp.email, phoneNo : tmp.mobileNo, address_1 : tmp.address_1, state : tmp.state, city : tmp.city, + pincode:tmp.pincode, cusType:tmp.cusType, - - - + } + if(this.data.hasOwnProperty('customerId')){ + cus.id = this.data.customerId + } + console.log(cus) + this._api.CreateCustomersDetails (cus).subscribe(res => { if (res.status == 200) { console.log(res) @@ -91,13 +103,22 @@ export class CustomerFormComponent implements OnInit { this.formData.append('password', tmp.password); this.formData.append('role', 'CUSTOMER'); this.formData.append('mobileNo', tmp.mobileNo); + + if(this.data.hasOwnProperty('customerId')){ + //cus.id = this.data.customerId + this.formData.append('customerId',this.data.customerId); + }else{ this.formData.append('customerId', res.data.id); + } + this._api.addUserFormDetails (this.formData).subscribe(res => { if (res.status == 200) { console.log(res) -this.windowRef.close(1); +this.dialogRef.close(1) +//this.windowRef.close(1); }else{ - this.windowRef.close(0); + this.dialogRef.close(0) + // this.windowRef.close(0); } }) } diff --git a/src/app/pages/customer/customer.component.html b/src/app/pages/customer/customer.component.html index 588ac67..48e99ea 100644 --- a/src/app/pages/customer/customer.component.html +++ b/src/app/pages/customer/customer.component.html @@ -1,12 +1,151 @@ - Customer Management + + +
+
+
Customer Management
+
+
+
+ + + +
+
+
+
+ + +
+
+
- - + --> + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + Active + + + Inactive + + + + + +
+ + +
+
+ + + + + + + + + + + + +
+ + + +
+ + +
+
+
\ No newline at end of file diff --git a/src/app/pages/customer/customer.component.scss b/src/app/pages/customer/customer.component.scss index 53f743c..b62f00f 100644 --- a/src/app/pages/customer/customer.component.scss +++ b/src/app/pages/customer/customer.component.scss @@ -8,4 +8,121 @@ // ::ng-deep nb-window { // flex: 1 0 auto; // min-width: 50rem !important; -// } \ No newline at end of file +// } + + +.align-left{ + text-align: left !important; +} +.align-center{ + text-align: center !important; +} +.align-right{ + text-align: right !important; +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table tbody > tr.row-even td { + background: white; + font-family: var(--smart-table-font-family); +font-size: var(--smart-table-font-size); +font-weight: var(--smart-table-font-weight); +line-height: var(--smart-table-line-height); +color: var(--smart-table-fg); +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table thead > tr .ng-data-table-column-header .ng-data-table-column-header-label:first-child { + font-size: 18px; padding: 10px; color: #1e6bb8; + text-decoration: none; + font-family: var(--smart-table-header-font-family); + font-size: var(--smart-table-header-font-size); + font-weight: var(--smart-table-header-font-weight); + line-height: var(--smart-table-header-line-height); +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table tbody > tr.row-odd td { + +font-family: var(--smart-table-font-family); +font-size: var(--smart-table-font-size); +font-weight: var(--smart-table-font-weight); +line-height: var(--smart-table-line-height); +color: var(--smart-table-fg); +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table-content-container .ng-data-table-content { + min-height: 100px !important; + font-size: 18px; +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table thead > tr:last-child th { + + background-color:#fff; font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + +} +tr{ + color: white; + background-color:#fff; +} +th{ + color: white; + background-color:#fff; +} + + * { + box-sizing: border-box; + } + .row { + display: flex; + background-color:#fff; + } + + /* Create two equal columns that sits next to each other */ + .column { + flex: 50%; + // + // height: 300px; /* Should be removed. Only for demonstration */ + } + ::ng-deep .mat-select-value{ + color: white!important; } + .column1 { + width: 210px; + text-align: center; + text-overflow: ellipsis; + padding: 30px; + //height: 300px; /* Should be removed. Only for demonstration */ + } + + + .add { + display: flex; + align-items: center; + justify-content: center; + font-size: 1.75rem !important; + padding: var(--smart-table-filter-padding); + border-color: var(--smart-table-add-button-border-color); + background-color: var(--smart-table-add-button-background-color); + color: var(--smart-table-add-button-text-color); + border-radius: 0.375rem; + + font-family: var(--smart-table-header-font-family); + font-size: var(--smart-table-header-font-size); + font-weight: var(--smart-table-header-font-weight); + line-height: var(--smart-table-header-line-height); + } + span{ + + color: #000; + } + +span:hover{ + + color: #1e6bb8; + } + a[disabled="disabled"] { + pointer-events: none; +} + .check{ + display: flex; align-items: center; text-decoration: none; + height: 100%; width: 100%; font-size: 2rem!important; + } + + + \ No newline at end of file diff --git a/src/app/pages/customer/customer.component.ts b/src/app/pages/customer/customer.component.ts index 140a4ae..8023928 100644 --- a/src/app/pages/customer/customer.component.ts +++ b/src/app/pages/customer/customer.component.ts @@ -3,7 +3,7 @@ import { Component, OnInit } from '@angular/core'; import { LocalDataSource } from 'ng2-smart-table'; import { SmartTableData } from '../../@core/data/smart-table'; import { PageapiService } from '../pageapi.service'; -import { NbToastrService, NbWindowControlButtonsConfig, NbWindowRef, NbWindowService } from '@nebular/theme'; +import { NbDialogService, NbToastrService, NbWindowControlButtonsConfig, NbWindowRef, NbWindowService } from '@nebular/theme'; @@ -23,7 +23,7 @@ import { CustomerFormComponent } from './customer-form/customer-form.component'; styleUrls: ['./customer.component.scss'] }) export class CustomerComponent { - + customer:any =[]; settings = { actions: { @@ -83,7 +83,7 @@ export class CustomerComponent { }, }; - + searchTerm:any=[];filteredItems:any=[]; source: LocalDataSource = new LocalDataSource(); minimize = false; maximize = false; @@ -97,114 +97,169 @@ export class CustomerComponent { position: NbGlobalPosition = NbGlobalPhysicalPosition.TOP_RIGHT; preventDuplicates = false; status: NbComponentStatus = 'primary'; - constructor(private toastrService: NbToastrService,private service: SmartTableData,public _api:PageapiService,private windowService: NbWindowService) { + constructor(private dialogService: NbDialogService,private toastrService: NbToastrService,private service: SmartTableData,public _api:PageapiService,private windowService: NbWindowService) { const data = this.service.getData(); this.getuserlistApi() + } + + onCreateConfirm() { + let data:any = {details:'',action:'Add',title:'Add Customer'} + const dialogRef = this.dialogService.open(CustomerFormComponent, { + hasBackdrop: true, + dialogClass: 'custom-dialog-class', // Add your custom CSS class here + context: data + }); + + dialogRef.onClose.subscribe((result) => { + // Execute custom logic when the dialog is closed + console.log(result); + if(result == 1){ + // this.getEntityDetails() + this.getuserlistApi(); + this.showToast('success', 'Data Saved Successfully', 'Add Customer Data Completed..!'); + // this.toastrService.success('Entity Added Successfully','Entity'); + console.log('Window closed 123'); + }else if(result == 0){ + + this.showToast('warning', 'Somthing is Wrong...!', 'Add Customer Data Failed..!'); + // this.toastrService.success('Somthing is Wrong...!', 'Add Entity Failed..!'); + } + }); + } onDeleteConfirm(event): void { console.log(event) - let passData = event.data - if (window.confirm('Are you sure you want to delete?')) { + let passData = event + // if (window.confirm('Are you sure you want to delete?')) { //event.confirm.resolve(); - let deletedata = {'isActive':0,'id':passData.id} + let deletedata = {'isActive':event.isActive,'id':passData.id} this._api.addUserFormDetails (deletedata).subscribe(res => { if (res.status == 200) { console.log(res) this.getuserlistApi(); - this.showToast('success', 'Data Removed Successfully', 'Removed User Data Completed..!'); + if(event.isActive == 1){ + this.showToast('success', 'Data Removed Successfully', 'Active Customer Data Completed..!'); + }else{ + this.showToast('success', 'Data Removed Successfully', 'Inactive Customer Data Completed..!'); + } + + //this.showToast('success', 'Data Removed Successfully', 'Removed User Data Completed..!'); }else{ this.showToast('warning', 'Somthing is Wrong...!', 'Edit User Data Failed..!'); } }) - } else { - event.confirm.reject(); - } + // } else { + // event.confirm.reject(); + // } } - onCreateConfirm(event) { - console.log("Create Event In Console") - console.log(event); - const buttonsConfig: NbWindowControlButtonsConfig = { - minimize: this.minimize, - maximize: this.maximize, - fullScreen: this.fullScreen, - close: this.close, - }; + // onCreateConfirm() { + // console.log("Create Event In Console") + // // console.log(event); + // const buttonsConfig: NbWindowControlButtonsConfig = { + // minimize: this.minimize, + // maximize: this.maximize, + // fullScreen: this.fullScreen, + // close: this.close, + // }; - const windowOptions = { - title: 'New Customer', - hasBackdrop: true, - minimize: this.minimize, - maximize: this.maximize, - fullScreen: this.fullScreen, - close: this.close, - closeOnBackdropClick: false, - closeOnEsc: false, - buttonsConfig:buttonsConfig, - dimensions: { - width: '2500px', - height: '300px', - }, - /* other window options */ - }; + // const windowOptions = { + // title: 'New Customer', + // hasBackdrop: true, + // minimize: this.minimize, + // maximize: this.maximize, + // fullScreen: this.fullScreen, + // close: this.close, + // closeOnBackdropClick: false, + // closeOnEsc: false, + // buttonsConfig:buttonsConfig, + // dimensions: { + // width: '2500px', + // height: '300px', + // }, + // /* other window options */ + // }; - const windowRef: NbWindowRef = this.windowService.open(CustomerFormComponent, { title: `Add Customer`, - buttons: buttonsConfig },); + // const windowRef: NbWindowRef = this.windowService.open(CustomerFormComponent, { title: `Add Customer`, + // buttons: buttonsConfig },); - // Subscribe to the afterClosed event - windowRef.onClose.subscribe((data) => { - // Handle the window closure - console.log(data); - if(data == 1){ - this.showToast('success', 'Data Saved Successfully', 'Add Customer Data Completed..!'); - this.getuserlistApi(); - console.log('Window closed 123'); - }else if(data == 0){ - this.showToast('warning', 'Somthing is Wrong...!', 'Add Customer Data Failed..!'); - } - }); - } + // // Subscribe to the afterClosed event + // windowRef.onClose.subscribe((data) => { + // // Handle the window closure + // console.log(data); + // if(data == 1){ + // this.showToast('success', 'Data Saved Successfully', 'Add Customer Data Completed..!'); + // this.getuserlistApi(); + // console.log('Window closed 123'); + // }else if(data == 0){ + // this.showToast('warning', 'Somthing is Wrong...!', 'Add Customer Data Failed..!'); + // } + // }); + // } onSaveConfirm(event) { - console.log("Edit Event In Console") - console.log(event); + // console.log("Edit Event In Console") + // console.log(event); - const buttonsConfig: NbWindowControlButtonsConfig = { - minimize: this.minimize, - maximize: this.maximize, - fullScreen: this.fullScreen, - close: this.close, - }; - const windowRef: NbWindowRef = this.windowService.open(CustomerFormComponent, { title: `Edit Customer`, context: event.data - , buttons: buttonsConfig }); + // const buttonsConfig: NbWindowControlButtonsConfig = { + // minimize: this.minimize, + // maximize: this.maximize, + // fullScreen: this.fullScreen, + // close: this.close, + // }; + // const windowRef: NbWindowRef = this.windowService.open(CustomerFormComponent, { title: `Edit Customer`, context: event + // , buttons: buttonsConfig }); - // Subscribe to the afterClosed event - windowRef.onClose.subscribe((data) => { - // Handle the window closure - console.log(data); - if(data == 1){ - this.showToast('success', 'Data Changed Successfully', 'Edit Customer Data Completed..!'); - this.getuserlistApi(); - console.log('Window closed 123'); - }else if(data == 0){ - this.showToast('warning', 'Somthing is Wrong...!', 'Edit Customer Data Failed..!'); - } + // // Subscribe to the afterClosed event + // windowRef.onClose.subscribe((data) => { + // // Handle the window closure + // console.log(data); + // if(data == 1){ + // this.showToast('success', 'Data Changed Successfully', 'Edit Customer Data Completed..!'); + // this.getuserlistApi(); + // console.log('Window closed 123'); + // }else if(data == 0){ + // this.showToast('warning', 'Somthing is Wrong...!', 'Edit Customer Data Failed..!'); + // } - }); + // }); + + let data:any = {details:event,action:'Edit',title:'Edit Customer'} + const dialogRef = this.dialogService.open(CustomerFormComponent, { + hasBackdrop: true, + dialogClass: 'custom-dialog-class', // Add your custom CSS class here + context: data + }); + + dialogRef.onClose.subscribe((result) => { + // Execute custom logic when the dialog is closed + console.log(result); + if(result == 1){ + // this.getEntityDetails() + this.getuserlistApi(); + this.showToast('success', 'Data Changed Successfully', 'Edit Customer Data Completed..!'); + // this.toastrService.success('Entity Added Successfully','Entity'); + console.log('Window closed 123'); + }else if(result == 0){ + + this.showToast('warning', 'Somthing is Wrong...!', 'Edit Customer Data Failed..!'); + // this.toastrService.success('Somthing is Wrong...!', 'Add Entity Failed..!'); + } + }); } @@ -219,10 +274,12 @@ export class CustomerComponent { let customer = passData.filter(arr=>{return arr.role == 'CUSTOMER'}) customer.forEach((element:any, index) => { element.index = index +1 - + element.type =element['CusDetails.cusType'] + }); + this.customer = customer // console.log(data) - this.source.load(customer); + //this.source.load(customer); } }) } @@ -246,4 +303,54 @@ export class CustomerComponent { config); } + +filterItems() { + console.log( this.searchTerm) + + if( this.searchTerm !=''){ + + + this.filteredItems = this.customer.filter(item => + Object.values(item).some(value => { + if (typeof value === 'string') { + return value.toLowerCase().includes(this.searchTerm.toLowerCase()); + } + return false; + }) + ); + this.customer = this.filteredItems +}else{ + console.log( 'fhjsgsajdhgasksjgfcckjsdfgckjsdhfk') + + this.getuserlistApi() +} + + + +console.log( this.filteredItems) +} + +resetPassword(data){ + console.log(data) + + this.formData= new FormData(); + if(data.hasOwnProperty('id')){ + this.formData.append('id', data.id); + + } + + this.formData.append('password', 'Test@123'); + + + this._api.addUserFormDetails (this.formData).subscribe(res => { + if (res.status == 200) { +console.log(res) +this.showToast('success', 'Password Changed Successfully', ''); + + }else{ + this.showToast('warning', 'Password Changed Failed', ''); + } + }) + + } } diff --git a/src/app/pages/dashboard/dashboard.component.html b/src/app/pages/dashboard/dashboard.component.html index 1bd9310..e4d9980 100644 --- a/src/app/pages/dashboard/dashboard.component.html +++ b/src/app/pages/dashboard/dashboard.component.html @@ -1,5 +1,73 @@
- - Hello from VNMS Order Management System - +
+ + + + +
+
+
Dashboard
+
+ + + +
+
+ +
+
+ + + Orders + + +
+
+ +
+
+

{{orders.length}}

+
+
+
+
+
+
+ + + In progress + + +
+
+ +
+
+

{{inprogress.length}}

+
+
+
+
+
+
+ + + Delivered + + +
+
+ +
+
+

{{delivery.length}}

+
+
+
+
+
+
+
+
+
diff --git a/src/app/pages/dashboard/dashboard.component.scss b/src/app/pages/dashboard/dashboard.component.scss new file mode 100644 index 0000000..0e858e0 --- /dev/null +++ b/src/app/pages/dashboard/dashboard.component.scss @@ -0,0 +1,43 @@ +.card { + background-color: #fff; + border-radius: 4px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + margin-left: 6rem; + } + + .card-header { + background-color: #f2f2f2; + padding: 10px; + border-bottom: 1px solid #ddd; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + } + + .card-body { + padding: 20px; + } + + .card h3 { + margin: 0; + } + + .card.status-primary { + background-color: #3f51b5; + color: #fff; + } + + .card.status-info { + background-color: #00bcd4; + color: #fff; + } + + .card.status-success { + background-color: #4caf50; + color: #fff; + } + .dashboard{ + display: flex; + } + + + \ No newline at end of file diff --git a/src/app/pages/dashboard/dashboard.component.ts b/src/app/pages/dashboard/dashboard.component.ts index 27af176..f581409 100644 --- a/src/app/pages/dashboard/dashboard.component.ts +++ b/src/app/pages/dashboard/dashboard.component.ts @@ -1,21 +1,63 @@ import { Component } from '@angular/core'; import { Router } from '@angular/router'; - +import { PageapiService } from '../pageapi.service'; +import * as moment from 'moment'; @Component({ selector: 'ngx-dashboard', templateUrl: './dashboard.component.html', + styleUrls: ['./dashboard.component.scss'] }) export class DashboardComponent { - - constructor(private router: Router){ + orders:any =[];inprogress:any=[];delivery:any =[]; + constructor(private router: Router,public _api:PageapiService){ const token = localStorage.getItem('user_token'); console.log(token) if(!token){ this.router.navigate(['/auth/login']); } + + this.dateWiseFilter() } + + + dateWiseFilter() { + + let from = (moment().subtract(6, 'days'))['_d'] + let param = {fromDate:from + ,toDate: moment()['_d']} + console.log(param) + + this._api.getOrders(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + + let passData = res.data + passData.sort((a: any, b: any) => { + return b.id - a.id; + }); + passData.forEach((element:any, index) => { + element.index = index +1 + element. selected =false + element. selectedval =0 + element.customer = element['OrderDetails.CusDetails.cusName'] + + element.address = element['OrderDetails.CusDetails.address_1']+","+element['OrderDetails.CusDetails.city']+","+element['OrderDetails.CusDetails.pincode'] + element.productName = element['ProductDetails.productName'] + element. orderDate = element.createdAt + }); + this.orders = passData.filter(arr=>{return arr.status == "ordered"}) + this.inprogress = passData.filter(arr=>{return arr.status == "In Progress"}) + this.delivery = passData.filter(arr=>{return arr.status == "Delivered"}) + + + // console.log(data) + // this.source.load(passData); + } + }) + + } } diff --git a/src/app/pages/dashboard/dashboard.module.ts b/src/app/pages/dashboard/dashboard.module.ts index ba4ef26..5cf1ede 100644 --- a/src/app/pages/dashboard/dashboard.module.ts +++ b/src/app/pages/dashboard/dashboard.module.ts @@ -1,5 +1,5 @@ import { NgModule } from '@angular/core'; -import { NbCardModule } from '@nebular/theme'; +import { NbCardModule, NbIconModule } from '@nebular/theme'; import { ThemeModule } from '../../@theme/theme.module'; import { DashboardComponent } from './dashboard.component'; @@ -7,7 +7,7 @@ import { DashboardComponent } from './dashboard.component'; @NgModule({ imports: [ NbCardModule, - ThemeModule, + ThemeModule, NbIconModule, ], declarations: [ DashboardComponent, diff --git a/src/app/pages/driver/driver.component.html b/src/app/pages/driver/driver.component.html index 32087fd..3f40c39 100644 --- a/src/app/pages/driver/driver.component.html +++ b/src/app/pages/driver/driver.component.html @@ -1,12 +1,158 @@ - Driver Management + +
+
+
Driver Management
+
+
+
+ + + +
+
+
+
+ + +
+
+
- - + --> + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + Active + + + Inactive + + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+
+
\ No newline at end of file diff --git a/src/app/pages/driver/driver.component.scss b/src/app/pages/driver/driver.component.scss index 88bfd33..b68fba3 100644 --- a/src/app/pages/driver/driver.component.scss +++ b/src/app/pages/driver/driver.component.scss @@ -8,4 +8,121 @@ // ::ng-deep nb-window { // flex: 1 0 auto; // min-width: 20rem !important; -// } \ No newline at end of file +// } + + +.align-left{ + text-align: left !important; +} +.align-center{ + text-align: center !important; +} +.align-right{ + text-align: right !important; +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table tbody > tr.row-even td { + background: white; + font-family: var(--smart-table-font-family); +font-size: var(--smart-table-font-size); +font-weight: var(--smart-table-font-weight); +line-height: var(--smart-table-line-height); +color: var(--smart-table-fg); +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table thead > tr .ng-data-table-column-header .ng-data-table-column-header-label:first-child { + font-size: 18px;padding: 10px; color: #1e6bb8; + text-decoration: none; + font-family: var(--smart-table-header-font-family); + font-size: var(--smart-table-header-font-size); + font-weight: var(--smart-table-header-font-weight); + line-height: var(--smart-table-header-line-height); +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table tbody > tr.row-odd td { + +font-family: var(--smart-table-font-family); +font-size: var(--smart-table-font-size); +font-weight: var(--smart-table-font-weight); +line-height: var(--smart-table-line-height); +color: var(--smart-table-fg); +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table-content-container .ng-data-table-content { + min-height: 100px !important; + font-size: 18px; +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table thead > tr:last-child th { + + background-color:#fff; font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + +} +tr{ + color: white; + background-color:#fff; +} +th{ + color: white; + background-color:#fff; +} + + * { + box-sizing: border-box; + } + .row { + display: flex; + background-color:#fff; + } + + /* Create two equal columns that sits next to each other */ + .column { + flex: 50%; + // + // height: 300px; /* Should be removed. Only for demonstration */ + } + ::ng-deep .mat-select-value{ + color: white!important; } + .column1 { + width: 210px; + text-align: center; + text-overflow: ellipsis; + padding: 30px; + //height: 300px; /* Should be removed. Only for demonstration */ + } + + + .add { + display: flex; + align-items: center; + justify-content: center; + font-size: 1.75rem !important; + padding: var(--smart-table-filter-padding); + border-color: var(--smart-table-add-button-border-color); + background-color: var(--smart-table-add-button-background-color); + color: var(--smart-table-add-button-text-color); + border-radius: 0.375rem; + + font-family: var(--smart-table-header-font-family); + font-size: var(--smart-table-header-font-size); + font-weight: var(--smart-table-header-font-weight); + line-height: var(--smart-table-header-line-height); + } + span{ + + color: #000; + } + +span:hover{ + + color: #1e6bb8; + } + a[disabled="disabled"] { + pointer-events: none; +} + .check{ + display: flex; align-items: center; text-decoration: none; + height: 100%; width: 100%; font-size: 2rem!important; + } + + + \ No newline at end of file diff --git a/src/app/pages/driver/driver.component.ts b/src/app/pages/driver/driver.component.ts index bb4efe3..69c370e 100644 --- a/src/app/pages/driver/driver.component.ts +++ b/src/app/pages/driver/driver.component.ts @@ -22,7 +22,7 @@ import { DriverFormComponent } from './driver-form/driver-form.component'; styleUrls: ['./driver.component.scss'] }) export class DriverComponent { - + driver:any =[]; settings = { actions: { @@ -77,10 +77,10 @@ export class DriverComponent { index = 1; destroyByClick = true; duration = 2000; - hasIcon = true; + hasIcon = true; searchTerm:any=[];filteredItems:any=[]; position: NbGlobalPosition = NbGlobalPhysicalPosition.TOP_RIGHT; preventDuplicates = false; - status: NbComponentStatus = 'primary'; + status: NbComponentStatus = 'primary';toggleValue :boolean = false; constructor(private toastrService: NbToastrService,private service: SmartTableData,public _api:PageapiService,private windowService: NbWindowService) { const data = this.service.getData(); @@ -92,31 +92,36 @@ export class DriverComponent { onDeleteConfirm(event): void { console.log(event) - let passData = event.data - if (window.confirm('Are you sure you want to delete?')) { + let passData = event + // if (window.confirm('Are you sure you want to delete?')) { //event.confirm.resolve(); - let deletedata = {'isActive':0,'id':passData.id} + let deletedata = {'isActive':event.isActive,'id':passData.id} this._api.addUserFormDetails (deletedata).subscribe(res => { if (res.status == 200) { console.log(res) this.getuserlistApi(); - this.showToast('success', 'Data Removed Successfully', 'Removed Driver Data Completed..!'); + if(event.isActive == 1){ + this.showToast('success', 'Data Removed Successfully', 'Active Driver Data Completed..!'); + }else{ + this.showToast('success', 'Data Removed Successfully', 'Inactive Driver Data Completed..!'); + } + //this.showToast('success', 'Data Removed Successfully', 'Removed Driver Data Completed..!'); }else{ this.showToast('warning', 'Somthing is Wrong...!', 'Edit Driver Data Failed..!'); } }) - } else { - event.confirm.reject(); - } + // } else { + // event.confirm.reject(); + // } } - onCreateConfirm(event) { + onCreateConfirm() { console.log("Create Event In Console") - console.log(event); + const buttonsConfig: NbWindowControlButtonsConfig = { minimize: this.minimize, maximize: this.maximize, @@ -157,7 +162,7 @@ export class DriverComponent { fullScreen: this.fullScreen, close: this.close, }; - const windowRef: NbWindowRef = this.windowService.open(DriverFormComponent, { title: `Edit Driver`, context: event.data + const windowRef: NbWindowRef = this.windowService.open(DriverFormComponent, { title: `Edit Driver`, context: event , buttons: buttonsConfig }); @@ -191,8 +196,9 @@ export class DriverComponent { element.index = index +1 }); + this.driver = driver // console.log(data) - this.source.load(driver); + //this.source.load(driver); } }) } @@ -215,4 +221,55 @@ export class DriverComponent { `${titleContent}`, config); } + + filterItems() { + console.log( this.searchTerm) + + if( this.searchTerm !=''){ + + + this.filteredItems = this.driver.filter(item => + Object.values(item).some(value => { + if (typeof value === 'string') { + return value.toLowerCase().includes(this.searchTerm.toLowerCase()); + } + return false; + }) + ); + this.driver = this.filteredItems + }else{ + console.log( 'fhjsgsajdhgasksjgfcckjsdfgckjsdhfk') + + this.getuserlistApi() + } + + + + console.log( this.filteredItems) + } + + + resetPassword(data){ + console.log(data) + + this.formData= new FormData(); + if(data.hasOwnProperty('id')){ + this.formData.append('id', data.id); + + } + + this.formData.append('password', 'Test@123'); + + + this._api.addUserFormDetails (this.formData).subscribe(res => { + if (res.status == 200) { +console.log(res) +this.showToast('success', 'Password Changed Successfully', ''); + + }else{ + this.showToast('warning', 'Password Changed Failed', ''); + } + }) + + } } diff --git a/src/app/pages/drivery-sheet/drivery-sheet.component.html b/src/app/pages/drivery-sheet/drivery-sheet.component.html new file mode 100644 index 0000000..7249c23 --- /dev/null +++ b/src/app/pages/drivery-sheet/drivery-sheet.component.html @@ -0,0 +1,254 @@ + + + + +
+
+
Delivery Sheet
+
+
+
+ + + +
+
+
+
+ + + + + + +
+
+
+
+
+
+ + Select Drivers + + {{user.userName }} + + + + +
+
+ +
+
+ + +
+
+
+
+ + +
+ vnms + + + +
+
+
https://vnms.in/services/
+
+
+
Delivery Sheet
+
+
+
+ Date :{{DateDisplay | date :'dd/MM/yy'}} +
+
+
+ +
+ + + + + + + + + + + +
+ + + {{row.item['OrderDetails.CusDetails.cusName']}}
+ {{row.item['OrderDetails.CusDetails.address_1']}}
+ {{row.item['OrderDetails.CusDetails.city']}}
+ {{row.item['OrderDetails.CusDetails.pincode']}}
+ + ph:- {{row.item['OrderDetails.CusDetails.phoneNo']}} + + +
+
+ + +
+ +
+ + + + + +
+ + + + + + + + + + + + + +
{{ product }}
+ + +
+ + +
+ +
+ + + +
+ + + + + + + + + + + + + +
{{ product }}
+ + +
+ + +
+ +
+ + + +
+
+ + + +
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+ + +
+
+
diff --git a/src/app/pages/drivery-sheet/drivery-sheet.component.scss b/src/app/pages/drivery-sheet/drivery-sheet.component.scss new file mode 100644 index 0000000..ac99c0f --- /dev/null +++ b/src/app/pages/drivery-sheet/drivery-sheet.component.scss @@ -0,0 +1,176 @@ + + td ,input[type="checkbox"] { + font-size: 1px !important; + } + + .highlight-cell { + background-color: yellow; + /* Add any other styling properties as desired */ + } + + ::ng-deep .ng2-smart-action-multiple-select{ + text-align: center; + } + + ::ng-deep .ng2-smart-action-multiple-select > input{ + width:15px; + height:15px; + display: unset; + } + + ::ng-deep .desired-value-row{ +color: red !important; + } + + .align-left{ + text-align: left !important; + } + .align-center{ + text-align: center !important; + } + .align-right{ + text-align: right !important; + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table tbody > tr.row-even td { + background: white; + //padding: 10px; + font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table thead > tr .ng-data-table-column-header .ng-data-table-column-header-label:first-child { + font-size: 18px; + padding: 10px; + color: #1e6bb8; + text-decoration: none; + font-family: var(--smart-table-header-font-family); + font-size: var(--smart-table-header-font-size); + font-weight: var(--smart-table-header-font-weight); + line-height: var(--smart-table-header-line-height); + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table tbody > tr.row-odd td { + // padding: 10px; + font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table-content-container .ng-data-table-content { + min-height: 100px !important; + font-size: 18px; + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table thead > tr:last-child th { + + background-color:#fff; font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + + } + tr{ + color: white; + background-color:#fff; + } + th{ + color: white; + background-color:#fff; + } + + * { + box-sizing: border-box; + } + .row { + display: flex; + background-color:#fff; + } + + /* Create two equal columns that sits next to each other */ + .column { + flex: 50%; + // padding: 10px; + // height: 300px; /* Should be removed. Only for demonstration */ + } + ::ng-deep .mat-select-value{ + color: white!important; } + .column1 { + width: 210px; + text-align: center; + text-overflow: ellipsis; + padding: 30px; + //height: 300px; /* Should be removed. Only for demonstration */ + } + + + .add { + display: flex; + align-items: center; + justify-content: center; + font-size: 1.75rem !important; + padding: var(--smart-table-filter-padding); + border-color: var(--smart-table-add-button-border-color); + background-color: var(--smart-table-add-button-background-color); + color: var(--smart-table-add-button-text-color); + border-radius: 0.375rem; + + font-family: var(--smart-table-header-font-family); + font-size: var(--smart-table-header-font-size); + font-weight: var(--smart-table-header-font-weight); + line-height: var(--smart-table-header-line-height); + } + span{ + + color: #000; + } + + span:hover{ + + color: #1e6bb8; + } + a[disabled="disabled"] { + pointer-events: none; + } + .check{ + display: flex; align-items: center; text-decoration: none; + height: 100%; width: 100%; font-size: 2rem!important; + } + + .checkTxt{ + //background: white; + // padding: 10px; + font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + text-transform: capitalize; + } + + + ::ng-deep .md-drppicker .btn, .md-drppicker .btn:focus, .md-drppicker .btn:hover { + background-color: #4caf50 !important; + margin-left: 10px !important; + } + + ::ng-deep .md-drppicker .btn.btn-default{ + color: #000 !important; + background-color: #dcdcdc !important; + } + + ::ng-deep .md-drppicker td.active{ + background-color: #1f7f6f !important; + } + ::ng-deep .md-drppicker .ranges ul li button.active { + background-color: #1f7f6f !important; + } + ::ng-deep .md-drppicker.double { + width: 640px !important; + } + + h5{ + text-align: center; + } + \ No newline at end of file diff --git a/src/app/pages/drivery-sheet/drivery-sheet.component.spec.ts b/src/app/pages/drivery-sheet/drivery-sheet.component.spec.ts new file mode 100644 index 0000000..378bd8e --- /dev/null +++ b/src/app/pages/drivery-sheet/drivery-sheet.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DriverySheetComponent } from './drivery-sheet.component'; + +describe('DriverySheetComponent', () => { + let component: DriverySheetComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ DriverySheetComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(DriverySheetComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/drivery-sheet/drivery-sheet.component.ts b/src/app/pages/drivery-sheet/drivery-sheet.component.ts new file mode 100644 index 0000000..161dcf9 --- /dev/null +++ b/src/app/pages/drivery-sheet/drivery-sheet.component.ts @@ -0,0 +1,264 @@ +import { Component, OnInit } from '@angular/core'; +import * as html2pdf from 'html2pdf.js' +import * as moment from 'moment'; +import { PageapiService } from '../pageapi.service'; +import { Router } from '@angular/router'; +@Component({ + selector: 'ngx-drivery-sheet', + templateUrl: './drivery-sheet.component.html', + styleUrls: ['./drivery-sheet.component.scss'] +}) +export class DriverySheetComponent implements OnInit { + ranges: any = { + 'Today': [moment(), moment()], + // 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + // 'Last 7 Days': [moment().subtract(6, 'days'), moment()], + // 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + // 'This Month': [moment().startOf('month'), moment().endOf('month')], + // 'Last Month': [ + // moment().subtract(1, 'month').startOf('month'), + // moment().subtract(1, 'month').endOf('month') + // ] + + };productDeatils:any =[]; DateDisplay:any =[]; + selectedDateRange:any =[];drivers:any =[];summaryaData:any=[];driverval:any=[];returnSummary:any =[]; + constructor(public _api:PageapiService, private router:Router) { } + + ngOnInit(): void { + this.selectedDateRange =[]; + console.log(moment()['_d']) + this.getDriverlistApi() + this.DateDisplay = moment()['_d'] + + + } + + + back(){ + + } + save(){ + + } + + generatePDF(data){ + + + } + dateWiseFilter(){ + console.log(this.selectedDateRange,this.driverval) + if(this.selectedDateRange.length!=0){ + + + + } + //this.getDriverSummaryAdminList(result) + + } + + mergeOrders(orderItems: any[]) { + this.summaryaData = orderItems.reduce((acc, curr) => { + const existingOrder = acc.find((order) => order.orderId === curr.orderId); + if (existingOrder) { + existingOrder.total_qty += curr.total_qty; + } else { + acc.push(curr); + } + return acc; + }, []); + } + getDriverlistApi(){ + // console.log(this.selectedDateRange) + let param ={} + this._api.getusers(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + + let passData = res.data + let driver = passData.filter(arr=>{return arr.role == 'DRIVER'}) + driver.sort((a: any, b: any) => { + return b.id - a.id; + }); + driver.forEach((element:any, index) => { + element.index = index +1 + + }); + + + + this.drivers = driver + // console.log(data) + + } + }) + } + + + getDriverSummaryAdminList(date){ + let param ={date:new Date(date)} + this._api.getDriverSummaryAdminList(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + + console.log(res.data) + + } + }) + } + + val(data){ + console.log(data.id) + + let result; + if(this.selectedDateRange.length != 0){ + result= this.selectedDateRange.endDate['$d'] + }else{ + + result = moment()['_d'] + } + this.DateDisplay = result + + console.log(result) + let param ={date:new Date(result),id:data.id} + this._api.getDriverSheet(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + + console.log(res.data) + + this.summaryaData = res.data + this.summaryaData.forEach(element => { + element.name = element['UserDetails.userName'] + + }); + + this.mergeOrders( this.summaryaData) + + }else{ + this.summaryaData =[]; + } + }) + + this._api.getReturnDriverSummaryListadmin(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + + console.log(res.data) + + this.returnSummary = res.data + + + + // this.mergeOrders( this.summaryaData) + + } + }) + + this._api.getProductDeliverysheet(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + + console.log(res.data) + + this.productDeatils = res.data + + + + // this.mergeOrders( this.summaryaData) + + } + }) + + + + + } + + + returnCount(data){ + let result = this.returnSummary.filter(arr=>{return arr.orderId == data}) +console.log(result) + if(result.length>0){ + + return result[0].total_amount + }else{ + return '-' + } + + } + + view(data){ + this.router.navigate(['/pages/summary/'+data]) + } + + + filterData(param){ + + let tmp=[]; + let order = this.productDeatils.filter(arr=>{return arr.orderId == param}) +if(order.length>0){ + + console.log(param) + + + order.forEach(element => { + + if(element.ProductDetails.length>0){ + + tmp.push(element.ProductDetails[0].productName) + } + + + + }); + //console.log(tmp) + return tmp +}else{ + return tmp +} + + + } + + filterDataqty(param){ + + let tmp=[]; + let order = this.productDeatils.filter(arr=>{return arr.orderId == param}) +if(order.length>0){ + + console.log(param) + + + order.forEach(element => { + + if(element.ProductDetails.length>0){ + + tmp.push(element.qty) + } + + + + }); + //console.log(tmp) + return tmp +}else{ + return tmp +} + + + } + download(){ + var element = document.getElementById('table'); +var opt = { + margin: 1, + filename: 'sheet.pdf', + image: { type: 'jpg', quality: 0.98 }, + html2canvas: { scale: 2 }, + jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' } +}; + +// New Promise-based usage: +html2pdf().from(element).set(opt).save(); + } + +} diff --git a/src/app/pages/email/email.component.html b/src/app/pages/email/email.component.html new file mode 100644 index 0000000..ef4ce35 --- /dev/null +++ b/src/app/pages/email/email.component.html @@ -0,0 +1,77 @@ +
+
+
+ + Email SMTP Settings + + + +
Name is required.
+ + +
+ + + +
Email is required.
+ +
+ Please enter a valid email address +
+
+ + + + + + +
+ Password is required +
+
+ + + + + + +
Mobile No is required.
+ + +
+ + + + true + false + + + +
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+ + +
+
+
+
+
+ +
\ No newline at end of file diff --git a/src/app/pages/email/email.component.scss b/src/app/pages/email/email.component.scss new file mode 100644 index 0000000..1854d8c --- /dev/null +++ b/src/app/pages/email/email.component.scss @@ -0,0 +1,27 @@ +nb-card-body { + overflow: visible; + padding-top: 0; + + > * { + margin-top: 1rem; + } + } + + .full-name-inputs, + .validation-checkboxes { + display: flex; + margin: 0 -0.5rem; + + > * { + margin: 0 0.5rem; + } + } + + .checkbox-radio { + display: flex; + } + + .demo-items { + flex: 1 0 33%; + } + \ No newline at end of file diff --git a/src/app/pages/email/email.component.spec.ts b/src/app/pages/email/email.component.spec.ts new file mode 100644 index 0000000..53664d1 --- /dev/null +++ b/src/app/pages/email/email.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EmailComponent } from './email.component'; + +describe('EmailComponent', () => { + let component: EmailComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ EmailComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(EmailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/email/email.component.ts b/src/app/pages/email/email.component.ts new file mode 100644 index 0000000..99d52e8 --- /dev/null +++ b/src/app/pages/email/email.component.ts @@ -0,0 +1,119 @@ +import { Component, OnInit } from '@angular/core'; + +import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { PageapiService } from '../pageapi.service'; +import { NbComponentStatus, NbGlobalPhysicalPosition, NbGlobalPosition, NbToastrService } from '@nebular/theme'; +@Component({ + selector: 'ngx-email', + templateUrl: './email.component.html', + styleUrls: ['./email.component.scss'] +}) +export class EmailComponent implements OnInit { + userForm: FormGroup | any; formData:any =[] + + emailDetails:any =[]; + index = 1; + destroyByClick = true; + duration = 2000; + hasIcon = true; + admin:any =[]; + position: NbGlobalPosition = NbGlobalPhysicalPosition.TOP_RIGHT; + preventDuplicates = false; + status: NbComponentStatus = 'primary'; + constructor(public _api:PageapiService,private toastrService: NbToastrService) { } + + ngOnInit(): void { + + this.userForm = new FormGroup({ + + + + + port: new FormControl('', [Validators.required]), + secure: new FormControl('', [Validators.required]), + hostname: new FormControl('', [Validators.required]), + // contactNo: new FormControl('', [Validators.required, Validators.maxLength(20)]), + + // lastName: new FormControl('', [Validators.required, Validators.maxLength(20)]), + email: new FormControl('', [Validators.required, Validators.email,Validators.pattern( + '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,63}$', + )]), + // password: new FormControl('', [Validators.required, Validators.minLength(6)]), + password: new FormControl('', [Validators.required]), + + + }); + let userRole = localStorage.getItem('roleId'); + + this. getemaillistApi(userRole) + } + close(){ + + } + + onSubmit(){ + this.formData =[] + this.formData= new FormData(); + let tmp = this.userForm .value + console.log(tmp) + + this.emailDetails + let param ; + if( this.emailDetails.length>0){ + param = {host:tmp.hostname, user:tmp.email,pass:tmp.password,port:tmp.port,secure:tmp.secure,id: this.emailDetails[0].id} + }else{ + param = {host:tmp.hostname, user:tmp.email,pass:tmp.password,port:tmp.port,secure:tmp.secure} + } + + + console.log(param) + + + + + this._api.CreateSmtpDetails (param).subscribe(res => { + if (res.status == 200) { +console.log(res) +this.showToast('success', 'Data Changed Successfully', 'SMTP Update Completed..!'); + }else{ + this.showToast('warning', 'Data Changed Failed', 'SMTP Update Failed..!'); + } + }) + } + + getemaillistApi(id){ + let param={} + this._api.getSmtpList(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + this.emailDetails = res.data + let passData = res.data[0] + passData.email = res.data[0].user + passData.password = res.data[0].pass + passData.hostname = res.data[0].host + + this.userForm.patchValue(passData) + + } + }) + } + + + private showToast(type: NbComponentStatus, title: string, body: string) { + const config = { + status: type, + destroyByClick: this.destroyByClick, + duration: this.duration, + hasIcon: this.hasIcon, + position: this.position, + preventDuplicates: this.preventDuplicates, + }; + const titleContent = title ? ` ${title}` : ''; + + this.index += 1; + this.toastrService.show( + body, + `${titleContent}`, + config); + } +} diff --git a/src/app/pages/order/cancel-form/cancel-form.component.ts b/src/app/pages/order/cancel-form/cancel-form.component.ts index 29249b0..5744c35 100644 --- a/src/app/pages/order/cancel-form/cancel-form.component.ts +++ b/src/app/pages/order/cancel-form/cancel-form.component.ts @@ -29,7 +29,7 @@ export class CancelFormComponent { console.log( this.data , this.cancelForm.value) - let param ={id:this.data.id, reason: this.cancelForm.value.reason, status:'canceled'} + let param ={id:this.data.id, reason: this.cancelForm.value.reason, status:'Cancelled' ,orderId:this.data.orderId} diff --git a/src/app/pages/order/mixed-form/mixed-form.component.html b/src/app/pages/order/mixed-form/mixed-form.component.html index 884de92..43e8a64 100644 --- a/src/app/pages/order/mixed-form/mixed-form.component.html +++ b/src/app/pages/order/mixed-form/mixed-form.component.html @@ -18,23 +18,26 @@
- + + +
- + +
- + - + diff --git a/src/app/pages/order/mixed-form/mixed-form.component.scss b/src/app/pages/order/mixed-form/mixed-form.component.scss index a97cfd0..479651f 100644 --- a/src/app/pages/order/mixed-form/mixed-form.component.scss +++ b/src/app/pages/order/mixed-form/mixed-form.component.scss @@ -2,4 +2,8 @@ div{ margin-top: 1rem; } - \ No newline at end of file +input[type=number]::-webkit-inner-spin-button, +input[type=number]::-webkit-outer-spin-button { + -webkit-appearance: none; + -moz-appearance: none; +} \ No newline at end of file diff --git a/src/app/pages/order/mixed-form/mixed-form.component.ts b/src/app/pages/order/mixed-form/mixed-form.component.ts index d14f984..bcc9126 100644 --- a/src/app/pages/order/mixed-form/mixed-form.component.ts +++ b/src/app/pages/order/mixed-form/mixed-form.component.ts @@ -9,33 +9,54 @@ import { PageapiService } from '../../pageapi.service'; export class MixedFormComponent implements OnInit { setData:any =[]; - + fieldTitle:any =[]; @Output() childButtonEvent = new EventEmitter(); - inputFieldGroups: { qty: string, productSpec: string }[] = [{ qty: '0', productSpec: '' }]; // Array to hold input field groups + inputFieldGroups: {id:any, qty: string, productSpec: string }[] = [{id:'', qty: '0', productSpec: '' }]; // Array to hold input field groups constructor(public _api:PageapiService) { this._api.orderDetails_observable$.subscribe((res) => { console.log('booked', res); - if(res){ - this. setData = res.data + if(res != null){ + this. setData = res + this.getAnswerProduct(this.setData.orderId) + let result = localStorage.getItem('viewOrder') + if(result == '1'){ + this.fieldTitle = 'View Order' + }else{ + this.fieldTitle = 'Edit Order' + } if( this. setData['ProductDetails.productName'] == "Mixed Gas"){ - this.inputFieldGroups[0].qty = this. setData.qty - this.inputFieldGroups[0].productSpec = this. setData.productSpec +// this.inputFieldGroups[0].qty = this. setData.qty +// this.inputFieldGroups[0].productSpec = this. setData.productSpec // this.inputFieldGroups.push({ qty: this. setData.qty, productSpec: this. setData.productSpec }); } + }else{ + localStorage.setItem('viewOrder','0') + let result = localStorage.getItem('viewOrder') + if(result == '1'){ + this.fieldTitle = 'View Order' + }else{ + this.fieldTitle = 'Edit Order' + } } }) } - ngOnInit(): void { + ngOnInit() { + let result = localStorage.getItem('viewOrder') + if(result == '1'){ + this.fieldTitle = 'View Order' + }else{ + this.fieldTitle = 'Edit Order' + } } addInputFieldGroup() { - this.inputFieldGroups.push({ qty: '0', productSpec: '' }); // Add a new input field group to the array + this.inputFieldGroups.push({id:null, qty: '0', productSpec: '' }); // Add a new input field group to the array this.childButtonEvent.emit( this.inputFieldGroups); } @@ -49,4 +70,78 @@ export class MixedFormComponent implements OnInit { this.childButtonEvent.emit( this.inputFieldGroups); } + getAnswerProduct(orderId){ + + console.log(orderId) + + + + let param={orderId:orderId} + this._api.getProductList(param).subscribe(res => { + + if(res.status == 200){ + +let result = res.data + +console.log(result) +let final = result.filter(arr=>{return arr.productId == 6}) + +if(final.length>0){ + this.inputFieldGroups=[]; + +// this.inputFieldGroups=[]; +final.forEach(element => { + // if(element.ProductDetails.length>0){ + + +// if(element.productId =="6"){ + this.inputFieldGroups.push({id:element.id, qty: element.qty, productSpec: element.productSpec }) + // } +//} + +}); + +} +console.log( this.inputFieldGroups) + +this.inputFieldGroups = this.inputFieldGroups.filter(arr=>{return arr.productSpec != null}) + +// if( this.inputFieldGroups.length>0){ +// this.inputFieldGroups.push({id:null, qty: '0', productSpec: '' }); +// } +// this.product.forEach(element => { +// result.forEach(e => { +// console.log(e,element) +// if(element.productName == e.ProductDetails[0].productName ){ +// //id: 110 +// element.id = e.id +// element.qty = parseInt(e.qty) +// } +// }); + +// }); +// } + +// }) + +// this.product.forEach(res => { + + +// res.name = res.productName +// res.qty = res.qty +// res.price = this.setData['OrderDetails.CusDetails.cusType'] +// this.invoice.additionalDetails = 'https://vnms.in/services/' + +// this.invoice.products.push(res) + + + + +// }) +//console.log(this.product,this.invoice.products) + } +}) + } + + } diff --git a/src/app/pages/order/order-form/order-form.component.html b/src/app/pages/order/order-form/order-form.component.html index 313d306..2f02c52 100644 --- a/src/app/pages/order/order-form/order-form.component.html +++ b/src/app/pages/order/order-form/order-form.component.html @@ -3,14 +3,22 @@
-
+
{{fieldTitle}}
-
-
+
+
+ + + +
@@ -21,7 +29,9 @@
- +
+ {{selectCustomer}} + @@ -42,7 +52,13 @@
-
+
+
ORDER ID
+ +

{{setData.orderId}}


+
Status
+

({{setData.status}})

+ Reason: {{setData.reason}} +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ + + +
+
+
Product Information
+
+
+ +
+
+
@@ -66,10 +131,11 @@
- +
+
@@ -82,8 +148,8 @@
- - + +
@@ -94,7 +160,7 @@
+ (onInitEvent)="receiveAutoMsgHandler($event)" *ngIf="item.productName == 'Mixed Gas'">
@@ -116,9 +182,9 @@
-
+
- +
diff --git a/src/app/pages/order/order-form/order-form.component.scss b/src/app/pages/order/order-form/order-form.component.scss index ceb375c..600f688 100644 --- a/src/app/pages/order/order-form/order-form.component.scss +++ b/src/app/pages/order/order-form/order-form.component.scss @@ -51,4 +51,12 @@ input[type=number]::-webkit-outer-spin-button { -moz-appearance: none; appearance: none; margin: 0; +} + +option:disabled { + background: #000; +} + +nb-select.appearance-outline.status-basic .select-button[disabled] { + background: #000 !important; } \ No newline at end of file diff --git a/src/app/pages/order/order-form/order-form.component.ts b/src/app/pages/order/order-form/order-form.component.ts index b8768ec..ed3bbff 100644 --- a/src/app/pages/order/order-form/order-form.component.ts +++ b/src/app/pages/order/order-form/order-form.component.ts @@ -4,7 +4,24 @@ import { NbComponentStatus, NbGlobalPhysicalPosition, NbGlobalPosition, NbToastr import { SmartTableData } from '../../../@core/data/smart-table'; import { OrderSummaryFormComponent } from '../order-summary-form/order-summary-form.component'; import { ActivatedRoute, Router } from '@angular/router'; - + +import pdfMake from "pdfmake/build/pdfmake"; +import pdfFonts from "pdfmake/build/vfs_fonts"; +pdfMake.vfs = pdfFonts.pdfMake.vfs; +class Product{ + name: string; + price: string; + qty: number; +} +class Invoice{ + customerName: string; + address: string; + contactNo: number; + email: string; + + products: Product[] = []; + additionalDetails: string; +} @Component({ selector: 'ngx-order-form', templateUrl: './order-form.component.html', @@ -13,7 +30,7 @@ import { ActivatedRoute, Router } from '@angular/router'; export class OrderFormComponent implements OnInit { customer:any =[]; product:any =[]; - mixedGas:any =[]; + mixedGas:any =[];productfull:any=[]; selectCustomer:any =""; items = [ { label: 'Item 1', quantity: 0 }, @@ -35,14 +52,20 @@ fieldTitle:any =' New Order' preventDuplicates = false; status: NbComponentStatus = 'primary'; selectCustomerData :any =[]; + invoice = new Invoice(); constructor(private route :ActivatedRoute,private router: Router,public _api:PageapiService,private toastrService: NbToastrService,private service: SmartTableData ,private windowService: NbWindowService) { this._api.orderDetails_observable$.subscribe((res) => { console.log('booked', res); if(res){ - this. setData = res.data - + this. setData = res + +// res.name = res.productName +// res.qty = parseInt(res.qty) +// res.price = this.setData['OrderDetails.CusDetails.cusType'] +// this.invoice.additionalDetails = 'https://vnms.in/services/' +// this.invoice.products.push(res) } @@ -50,18 +73,22 @@ fieldTitle:any =' New Order' } receivedMessageHandler(res){ - console.log(res, this.product) + console.log(res, this.productfull) let tmp =[]; - this.product.forEach(element => { + this.productfull.forEach(element => { if(element.productName == "Mixed Gas"){ tmp.push(element) } }); + console.log(tmp) let tmp2 = []; res.forEach(element => { - tmp2.push({"productName": tmp[0].productName , id: tmp[0].id ,qty:element.qty, productSpec:element.productSpec}) + // if(element.id !=null ){ + tmp2.push({"productName": tmp[0].productName , productId:tmp[0].id, id:element.id ,qty:element.qty, productSpec:element.productSpec}) + // } + }); this.mixedGas = tmp2 console.log(tmp2) @@ -75,7 +102,13 @@ fieldTitle:any =' New Order' if( Object.keys(this.setData).length != 0){ - this.fieldTitle = 'Edit Order' + let result = localStorage.getItem('viewOrder') + if(result == '1'){ + this.fieldTitle = 'View Order' + }else{ + this.fieldTitle = 'Edit Order' + } + } } this.getuserlistApi() @@ -100,9 +133,19 @@ fieldTitle:any =' New Order' this.customer = customer if( Object.keys(this.setData).length != 0){ this.selectCustomer = this.setData['OrderDetails.CusDetails.cusName'] + this.invoice.customerName = this.selectCustomer + this.invoice.address = this.setData['OrderDetails.CusDetails.address_1'] + this.invoice.email = this.setData['OrderDetails.CusDetails.email'] + this.invoice.contactNo = this.setData['OrderDetails.CusDetails.phoneNo'] + this.setData['OrderDetails.CusDetails.cusType'] + + this.selectCustomerData['CusDetails.address_1'] = this.setData['OrderDetails.CusDetails.address_1'] + this.selectCustomerData['CusDetails.city'] = this.setData['OrderDetails.CusDetails.city'] + this.selectCustomerData['CusDetails.phoneNo'] = this.setData['OrderDetails.CusDetails.phoneNo'] this.getProductlistApi( this.setData['OrderDetails.CusDetails.cusType']) - // console.log(data) + this.getProductlistApi2( this.setData['OrderDetails.CusDetails.cusType']) + console.log( this.setData['OrderDetails.CusDetails.cusType']) } } }) @@ -110,28 +153,32 @@ fieldTitle:any =' New Order' getProductlistApi(param){ let data ={type : param} + this.getProductlistApi2( param) this._api.getProducts(data).subscribe(res => { console.log(res) if(res.status == 200){ let passData = res.data let product = passData - +console.log(product) product.forEach((element:any, index) => { element.index = index +1 element.qty = 0; + element.pId = element.id + }); this.product = product + // this.productfull = product if(this.setData != undefined){ if( Object.keys(this.setData).length != 0){ - - this.product.forEach(element => { - if(element.productName == this.setData['ProductDetails.productName'] ){ - element.qty = this.setData.qty - } - }); + this.getAnswerProduct(this.setData.orderId) + // this.product.forEach(element => { + // if(element.productName == this.setData['ProductDetails.productName'] ){ + // element.qty = this.setData.qty + // } + // }); } } // console.log(data) @@ -142,6 +189,25 @@ fieldTitle:any =' New Order' }) } + + getProductlistApi2(param){ + let data ={type : param} + this._api.getProducts(data).subscribe(res => { + console.log(res) + if(res.status == 200){ + + let passData = res.data + let product = passData + + this.productfull = product + + // console.log(data) + + }else{ + + } + }) + } checkType(data){ console.log(data) this.selectCustomerData = data @@ -157,15 +223,19 @@ fieldTitle:any =' New Order' save(){ console.log(this.selectCustomer) - let product= this.product.filter(arr=>{return arr.qty != 0}) + let mixProd= this.product.filter(arr=>{return arr.qty != 0}) + let product = mixProd.filter(arr=>{return arr.productName != "Mixed Gas"}) - console.log( product) + console.log( product,this.mixedGas) + + if(this.setData != undefined){ if( Object.keys(this.setData).length != 0){ product.forEach(element => { element.productSpec = this. setData.productSpec + }); } } @@ -236,4 +306,229 @@ fieldTitle:any =' New Order' back(){ this.router.navigate(['../'], { relativeTo: this.route }); } + + + generatePDF(action = 'open') { + this.invoice.products = this.invoice.products.filter(arr=>{return arr.qty != 0}) + let docDefinition = { + content: [ + { + image: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAC7gAAAQWCAYAAACkS/UOAAAACXBIWXMAAC4jAAAuIwF4pT92AAAL5WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTA0LTI1VDE3OjE3OjE5KzA1OjMwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDE5LTA2LTI3VDE3OjE5OjIzKzA1OjMwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0wNi0yN1QxNzoxOToyMyswNTozMCIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0OTRkMjgzNC1lMWJjLTViNGQtOGVjNS1jNGZlNTRjMzQ2ZjEiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo2NDdmMDIwOS1kYzIyLTRjNGUtYmI1Yy0yM2Y5Y2JlYzAxNmUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozOGRmYzU2NC02Njk1LWFiNDctYmUyNy00ZTI2ZWNmYTUwMDEiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6WVJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6Q29sb3JTcGFjZT0iMSIgZXhpZjpQaXhlbFhEaW1lbnNpb249IjMwMDAiIGV4aWY6UGl4ZWxZRGltZW5zaW9uPSIxMTE4Ij4gPHBob3Rvc2hvcDpUZXh0TGF5ZXJzPiA8cmRmOkJhZz4gPHJkZjpsaSBwaG90b3Nob3A6TGF5ZXJOYW1lPSJWTk1TIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSJWTk1TIi8+IDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0iVk5NUyIgcGhvdG9zaG9wOkxheWVyVGV4dD0iVk5NUyIvPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOlRleHRMYXllcnM+IDxwaG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+IDxyZGY6QmFnPiA8cmRmOmxpPkM5RkZBQjJFRkExRDcxRUFGQ0Q2MjhDMTEyOTcxMzAxPC9yZGY6bGk+IDwvcmRmOkJhZz4gPC9waG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MzhkZmM1NjQtNjY5NS1hYjQ3LWJlMjctNGUyNmVjZmE1MDAxIiBzdEV2dDp3aGVuPSIyMDE5LTA0LTI1VDE3OjE3OjE5KzA1OjMwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmFhYTYzOGNlLWRmYTYtNjE0MC1hYjJkLTcwMjM1YTEzN2FlNiIgc3RFdnQ6d2hlbj0iMjAxOS0wNC0yNVQxODowNToyMSswNTozMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiZTZmOGQyYS01YzRiLTk3NDktYjViMy02YjIwY2E5YzNhODkiIHN0RXZ0OndoZW49IjIwMTktMDYtMjdUMTc6MTk6MjMrMDU6MzAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NDk0ZDI4MzQtZTFiYy01YjRkLThlYzUtYzRmZTU0YzM0NmYxIiBzdEV2dDp3aGVuPSIyMDE5LTA2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AAAAAACAKbC6OgAAAAAAAAAAAAAAABInuAMAAAAAAAAAAAAAMBBOcAcAAAAAAAAAAAAAYBAM3AEAAAAAAAAAAAAAGAQDdwAAAAAAAAAAAAAABsHAHQAAAAAAAAAAAACAQTBwBwAAAAAAAAAAAABgEAzcAQAAAAAAAAAAAAAYBAN3AAAAAAAAAAAAAAAGwcAdAAAAAAAAAAAAAIBBMHAHAAAAAAAAAAAAAGAQDNwBAAAAAAAAAAAAABgEA3cAAAAAAAAAAAAAAAbBwB0AAAAAAAAAAAAAgEEwcAcAAAAAAAAAAAAAYBAM3AEAAAAAAAAAAAAAGAQDdwAAAAAAAAAAAAAABsHAHQAAAAAAAAAAAACAQTBwBwAAAAAAAAAAAABgEAzcAQAAAAAAAAAAAAAYBAN3AAAAAAAAAAAAAAAGwcAdAAAAAAAAAAAAAIBBMHAHAAAAAAAAAAAAAGAQDNwBAAAAAAAAAAAAABgEA3cAAAAAAAAAAAAAAAbBwB0AAAAAAAAAAAAAgEEwcAcAAAAAAAAAAAAAYBAM3AEAAAAAAAAAAAAAGAQDdwAAAAAAAAAAAAAABsHAHQAAAAAAAAAAAACAQTBwBwAAAAAAAAAAAABgEAzcAQAAAAAAAAAAAAAYBAN3AAAAAAAAAAAAAAAGwcAdAAAAAAAAAAAAAIBBMHAHAAAAAAAAAAAAAGAQDNwBAAAAAAAAAAAAABgEA3cAAAAAAAAAAAAAAAbBwB0AAAAAAAAAAAAAgEEwcAcAAAAAAAAAAAAAYBAM3AEAAAAAAAAAAAAAGAQDdwAAAAAAAAAAAAAABsHAHQAAAAAAAAAAAACAQTBwBwAAAAAAAAAAAABgEAzcAQAAAAAAAAAAAAAYBAN3AAAAAAAAAAAAAAAGwcAdAAAAAAAAAAAAAIBBMHAHAAAAAAAAAAAAAGAQDNwBAAAAAAAAAAAAABgEA3cAAAAAAAAAAAAAAAbBwB0AAAAAAAAAAAAAgEEwcAcAAAAAAAAAAAAAYBAM3AEAAAAAAAAAAAAAGAQDdwAAAAAAAAAAAAAABsHAHQAAAAAAAAAAAACAQTBwBwAAAAAAAAAAAABgEAzcAQAAAAAAAAAAAAAYBAN3AAAAAAAAAAAAAAAGwcAdAAAAAAAAAAAAAIBBMHAHAAAAAAAAAAAAAGAQDNwBAAAAAAAAAAAAABgEA3cAAAAA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OwAAAAAAAAAAAAAAi2DgDgAAAAAAAAAAAADAIhi4AwAAAAAAAAAAAACwCAbuAAAAAAAAAAAAAAAsgoE7AAAAAAAAAAAAAACLYOAOAAAAAAAAAAAAAMAiGLgDAAAAAAAAAAAAALAIBu4AAAAAAAAAAAAAACyCgTsAAAAAAAAAAAAAAItg4A4AAAAAAAAAAAAAwCIYuAMAAAAAAAAAAAAAsAgG7gAAAAAAAAAAAAAALIKBOwAAAAAAAAAAAAAAi2DgDgAAAAAAAAAAAADAIhi4AwAAAAAAAAAAAACwCAbuAAAAAAAAAAAAAAAsgoE7AAAAAAAAAAAAAACLYOAOAAAAAAAAAAAAAMAiGLgDAAAAAAAAAAAAALAIBu4AAAAAAAAAAAAAACyCgTsAAAAAAAAAAAAAAItg4A4AAAAAAAAAAAAAwCIYuAMAAAAAAAAAAAAAsAgG7gAAAAAAAAAAAAAALIKBOwAAAAAAAAAAAAAAi2DgDgAAAAAAAAAAAADAIhi4AwAAAAAAAAAAAACwCAbuAAAAAAAAAAAAAAAsgoE7AAAAAAAAAAAAAACLYOAOAAAAAAAAAAAAAMAiGLgDAAAAAAAAAAAAALAIBu4AAAAAAAAAAAAAACyCgTsAAAAAAAAAAAAAAItg4A4AAAAAAAAAAAAAwCIYuAMAAAAAAAAAAAAAsAgG7gAAAAAAAAAAAAAALIKBOwAAAAAAAAAAAAAAi2DgDgAAAAAAAAAAAADAIhi4AwAAAAAAAAAAAACwCAbuAAAAAAAAAAAAAAAsgoE7AAAAAAAAAAAAAACLYOAOAAAAAAAAAAAAAMAiGLgDAAAAAAAAAAAAALAIBu4AAAAAAAAAAAAAACyCgTsAAAAAAAAAAAAAAItg4A4AAAAAAAAAAAAAwCIYuAMAAAAAAAAAAAAAsAgG7gAAAAAAAAAAAAAALIKBOwAAAAAAAAAAAAAAi2DgDgAAAAAAAAAAAADAIhi4AwAAAAAAAAAAAACwCAbuAAAAAAAAAAAAAAAsgoE7AAAAAAAAAAAAAACLYOAOAAAAAAAAAAAAAMAiGLgDAAAAAAAAAAAAALAIBu4AAAAAAAAAAAAAACyCgTsAAAAAAAAAAAAAAItg4A4AAAAAAAAAAAAAwCIYuAMAAAAAAAAAAAAAsAgG7gAAAAAAAAAAAAAALIKBOwAAAAAAAAAAAAAAi2Dg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', // Path to your logo image + width: 100, + alignment: 'center', + margin: [0, 10] // Adjust the margins as needed + }, + // { + // text: 'VNMS', + // fontSize: 16, + // alignment: 'center', + // color: '#047886' + // }, + // { + // text: 'INVOICE', + // fontSize: 20, + // bold: true, + // alignment: 'center', + // decoration: 'underline', + // color: 'skyblue' + // }, + { + text: 'Customer Details', + style: 'sectionHeader' + }, + { + columns: [ + [ + { + text: this.invoice.customerName, + bold:true + }, + { text: this.invoice.address }, + { text: this.invoice.email }, + { text: this.invoice.contactNo } + ], + [ + { + text: `Date: ${new Date(this.setData.createdAt).toLocaleString()}`, + alignment: 'right' + }, + { + text: `ORDER ID : ${this.setData.orderId}`, + alignment: 'right' + } + ] + ] + }, + { + text: 'Order Details', + style: 'sectionHeader' + }, + { + table: { + headerRows: 1, + widths: ['*', 'auto', 'auto'], + body: [ + [ + { text: 'Product', color: 'white', fillColor: 'black' }, + { text: 'Type', color: 'white', fillColor: 'black' }, + { text: 'Quantity', color: 'white', fillColor: 'black' } + ], + ...this.invoice.products.map((p) => [ + p.name, + p.price, + + ( p.qty) , + ]), + [{text: 'Total Qty', colSpan: 2}, {}, this.invoice.products .reduce((sum, p) => sum + p.qty, 0)] + + ] + } + }, + { + text: 'Additional Details', + style: 'sectionHeader' + }, + { + text: this.invoice.additionalDetails, + margin: [0, 0 ,0, 15] + }, + { + columns: [ + [{ qr: `${this.invoice.customerName}`, fit: '50' }], + [{ text: 'Signature', alignment: 'right', italics: true}], + ] + }, + { + text: 'Terms and Conditions', + style: 'sectionHeader' + }, + { + ul: [ + 'Order can be return in max 10 days.', + 'Warrenty of the product will be subject to the manufacturer terms and conditions.', + 'This is system generated invoice.', + ], + } + ], + styles: { + sectionHeader: { + bold: true, + decoration: 'underline', + fontSize: 14, + margin: [0, 15,0, 15] + } + } + }; + + if(action==='download'){ + pdfMake.createPdf(docDefinition).download(); + + }else if(action === 'print'){ + pdfMake.createPdf(docDefinition).print(); + }else{ + pdfMake.createPdf(docDefinition).open(); + } + + } + + getAnswerProduct(orderId){ + + console.log(orderId) + + + + let param={orderId:orderId} + this._api.getProductList(param).subscribe(res => { + + if(res.status == 200){ + +let result = res.data +result.forEach(element => { + console.log(element) + if(element.ProductDetails.length>0){ + + + if(element.ProductDetails[0].productName =="Mixed Gas"){ + console.log("hiiii") + element.name = element.ProductDetails[0].productName + element.qty = parseInt(element.qty) + element.price = this.setData['OrderDetails.CusDetails.cusType'] + this.invoice.products.push(element) + } +} + + +}); +this.product.forEach(element => { + + delete element.id + +}) + +this.product.forEach(element => { + result.forEach(e => { + console.log(e,element) + if( e.ProductDetails.length>0){ + if(element.productName == e.ProductDetails[0].productName ){ + //id: 110 + element.productId= element.id + element.id = e.id + element.qty = parseInt(e.qty) + } + } + +}); + +}); + } + const uniqueArray = this.invoice.products.filter((obj:any, index, self) => + index === self.findIndex((o:any) => o.id === obj.id) +); +this.invoice.products = uniqueArray + console.log(this.product,this.invoice.products) + }) + + this.product.forEach(res => { + + + res.name = res.productName + res.qty = res.qty + res.price = this.setData['OrderDetails.CusDetails.cusType'] + this.invoice.additionalDetails = 'https://vnms.in/services/' + + this.invoice.products.push(res) + + + + +}) +console.log(this.product,this.invoice.products) + } + + +edit(){ + + localStorage.setItem('viewOrder','0') + let result = localStorage.getItem('viewOrder') + if(result == '1'){ + this.fieldTitle = 'View Order' + }else{ + this.fieldTitle = 'Edit Order' + this._api.orderDetails.next( this. setData) + + } + console.log(this.fieldTitle) +} + +cancelData(){ + localStorage.setItem('viewOrder','1') + let result = localStorage.getItem('viewOrder') + if(result == '1'){ + this.fieldTitle = 'View Order' + this._api.orderDetails.next( this. setData) + }else{ + this.fieldTitle = 'Edit Order' + } + console.log(this.fieldTitle) +} } diff --git a/src/app/pages/order/order-summary-form/order-summary-form.component.html b/src/app/pages/order/order-summary-form/order-summary-form.component.html index 080364e..4b9f090 100644 --- a/src/app/pages/order/order-summary-form/order-summary-form.component.html +++ b/src/app/pages/order/order-summary-form/order-summary-form.component.html @@ -21,7 +21,7 @@
- Specification +
diff --git a/src/app/pages/order/order-summary-form/order-summary-form.component.ts b/src/app/pages/order/order-summary-form/order-summary-form.component.ts index f4dc7a8..559785a 100644 --- a/src/app/pages/order/order-summary-form/order-summary-form.component.ts +++ b/src/app/pages/order/order-summary-form/order-summary-form.component.ts @@ -21,9 +21,9 @@ export class OrderSummaryFormComponent implements OnInit { console.log('booked', res); if(res){ - this. setData = res.data - + this. setData = res + this.getAnswerProduct() } }) @@ -38,13 +38,14 @@ export class OrderSummaryFormComponent implements OnInit { } save(){ - console.log(this.data) + console.log(this.data,this.setData) let cus = this.data.customerData['CusDetails.id'] let role = localStorage.getItem('user_role') let param; if(this.setData != undefined){ if(this.setData.hasOwnProperty('id')){ - param ={id:this.setData.id,customerId:cus,status:'ordered' , product: this.data.product ,createdBy:role } + cus = this.setData['OrderDetails.CusDetails.id'] + param ={id:this.setData.id,customerId:cus,status:'ordered' , product: this.data.product ,createdBy:role , orderId:this.setData.orderId } }else{ param ={customerId:cus,status:'ordered' , product: this.data.product ,createdBy:role } } @@ -55,7 +56,7 @@ export class OrderSummaryFormComponent implements OnInit { - +console.log(param) this._api.CreateOrder (param).subscribe(res => { if (res.status == 200) { @@ -71,4 +72,9 @@ console.log(res) console.log( this.windowService) this.windowRef.close(); } + + + getAnswerProduct(){ + + } } diff --git a/src/app/pages/order/order.component.html b/src/app/pages/order/order.component.html index f1282e2..fce8c8e 100644 --- a/src/app/pages/order/order.component.html +++ b/src/app/pages/order/order.component.html @@ -2,39 +2,255 @@
-
+
Order Management
+
-
+ +
- + + +
+
+ +
+
+ + --> +
- - + --> + + + + + + + + + + + + + + + +
+ + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + +
+ + + {{row.item.updatedAt | date :'dd/MM/yy'}} + +
+ + +
+ +
+ + + + + + + + + + + + +
+ + {{row.item.status}}

({{row.item['UserDetails.userName']}})

+
+ + {{row.item.status}} + +
+ + +
+
+ + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+
+ +
+
-
-
+
+
- + Select All
-
+
@@ -48,13 +264,27 @@
-
-
+
+
+ + +
+
+ + Change Status + + In Progresss + + + + +
+
diff --git a/src/app/pages/order/order.component.scss b/src/app/pages/order/order.component.scss index 267e7bb..0ac0151 100644 --- a/src/app/pages/order/order.component.scss +++ b/src/app/pages/order/order.component.scss @@ -20,4 +20,153 @@ ::ng-deep .desired-value-row{ color: red !important; - } \ No newline at end of file + } + + .align-left{ + text-align: left !important; + } + .align-center{ + text-align: center !important; + } + .align-right{ + text-align: right !important; + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table tbody > tr.row-even td { + background: white; + //padding: 10px; + font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table thead > tr .ng-data-table-column-header .ng-data-table-column-header-label:first-child { + font-size: 18px; + padding: 10px; + color: #1e6bb8; + text-decoration: none; + font-family: var(--smart-table-header-font-family); + font-size: var(--smart-table-header-font-size); + font-weight: var(--smart-table-header-font-weight); + line-height: var(--smart-table-header-line-height); + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table tbody > tr.row-odd td { + // padding: 10px; + font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table-content-container .ng-data-table-content { + min-height: 100px !important; + font-size: 18px; + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table thead > tr:last-child th { + + background-color:#fff; font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + + } + tr{ + color: white; + background-color:#fff; + } + th{ + color: white; + background-color:#fff; + } + + * { + box-sizing: border-box; + } + .row { + display: flex; + background-color:#fff; + } + + /* Create two equal columns that sits next to each other */ + .column { + flex: 50%; + // padding: 10px; + // height: 300px; /* Should be removed. Only for demonstration */ + } + ::ng-deep .mat-select-value{ + color: white!important; } + .column1 { + width: 210px; + text-align: center; + text-overflow: ellipsis; + padding: 30px; + //height: 300px; /* Should be removed. Only for demonstration */ + } + + + .add { + display: flex; + align-items: center; + justify-content: center; + font-size: 1.75rem !important; + padding: var(--smart-table-filter-padding); + border-color: var(--smart-table-add-button-border-color); + background-color: var(--smart-table-add-button-background-color); + color: var(--smart-table-add-button-text-color); + border-radius: 0.375rem; + + font-family: var(--smart-table-header-font-family); + font-size: var(--smart-table-header-font-size); + font-weight: var(--smart-table-header-font-weight); + line-height: var(--smart-table-header-line-height); + } + span{ + + color: #000; + } + + span:hover{ + + color: #1e6bb8; + } + a[disabled="disabled"] { + pointer-events: none; + } + .check{ + display: flex; align-items: center; text-decoration: none; + height: 100%; width: 100%; font-size: 2rem!important; + } + + .checkTxt{ + //background: white; + // padding: 10px; + font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + text-transform: capitalize; + } + + + ::ng-deep .md-drppicker .btn, .md-drppicker .btn:focus, .md-drppicker .btn:hover { + background-color: #4caf50 !important; + margin-left: 10px !important; + } + + ::ng-deep .md-drppicker .btn.btn-default{ + color: #000 !important; + background-color: #dcdcdc !important; + } + + ::ng-deep .md-drppicker td.active{ + background-color: #1f7f6f !important; + } + ::ng-deep .md-drppicker .ranges ul li button.active { + background-color: #1f7f6f !important; + } + ::ng-deep .md-drppicker.double { + width: 640px !important; + } + \ No newline at end of file diff --git a/src/app/pages/order/order.component.ts b/src/app/pages/order/order.component.ts index 6e13005..6d3fc85 100644 --- a/src/app/pages/order/order.component.ts +++ b/src/app/pages/order/order.component.ts @@ -1,10 +1,10 @@ import { Component, OnInit } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; - +import * as moment from 'moment'; import { LocalDataSource } from 'ng2-smart-table'; import { SmartTableData } from '../../@core/data/smart-table'; import { PageapiService } from '../pageapi.service'; -import { NbToastrService, NbWindowControlButtonsConfig, NbWindowRef, NbWindowService } from '@nebular/theme'; +import { NbDialogService, NbToastrService, NbWindowControlButtonsConfig, NbWindowRef, NbWindowService } from '@nebular/theme'; @@ -20,14 +20,20 @@ import { Router } from '@angular/router'; import { CancelFormComponent } from './cancel-form/cancel-form.component'; import { AssignFormComponent } from './assign-form/assign-form.component'; import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { ViewDetailsComponent } from './view-details/view-details.component'; +interface Item { + index: number; +} @Component({ selector: 'ngx-order', templateUrl: './order.component.html', styleUrls: ['./order.component.scss'] }) -export class OrderComponent { +export class OrderComponent { + orders:Item[] =[]; + isChecked: boolean = false; settings:any =[]; source: LocalDataSource = new LocalDataSource(); minimize = false; @@ -45,7 +51,23 @@ export class OrderComponent { drivers:any=[]; status: NbComponentStatus = 'primary'; driverForm:any =[]; - constructor(private domSanitizer: DomSanitizer, private router:Router,private toastrService: NbToastrService,private service: SmartTableData,public _api:PageapiService,private windowService: NbWindowService) { + singleRow:any =[]; + + filteredItems: any[]; + searchTerm: string; + ranges: any = { + 'Today': [moment(), moment()], + 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'Last 7 Days': [moment().subtract(6, 'days'), moment()], + 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + 'This Month': [moment().startOf('month'), moment().endOf('month')], + 'Last Month': [ + moment().subtract(1, 'month').startOf('month'), + moment().subtract(1, 'month').endOf('month') + ] + }; + selectedDateRange: {startDate: moment.Moment, endDate: moment.Moment}; + constructor(private dialogService: NbDialogService,private domSanitizer: DomSanitizer, private router:Router,private toastrService: NbToastrService,private service: SmartTableData,public _api:PageapiService,private windowService: NbWindowService) { const data = this.service.getData(); this.settings = { @@ -153,7 +175,7 @@ export class OrderComponent { onDeleteConfirm(event): void { console.log(event) - let passData = event.data + let passData = event const buttonsConfig: NbWindowControlButtonsConfig = { minimize: this.minimize, @@ -161,7 +183,7 @@ export class OrderComponent { fullScreen: this.fullScreen, close: this.close, }; - const windowRef: NbWindowRef = this.windowService.open(CancelFormComponent, { title: `Cancel Product`, context: event.data + const windowRef: NbWindowRef = this.windowService.open(CancelFormComponent, { title: `Cancel Product`, context: event , buttons: buttonsConfig }); @@ -186,9 +208,9 @@ export class OrderComponent { getFuelColor(w){ console.log(w) } - onCreateConfirm(event) { + onCreateConfirm() { console.log("Create Event In Console") - console.log(event); + const buttonsConfig: NbWindowControlButtonsConfig = { minimize: this.minimize, maximize: this.maximize, @@ -216,14 +238,40 @@ export class OrderComponent { console.log("add") this._api.orderDetails.next(event) - + localStorage.setItem('viewOrder','0') this.router.navigate(['/pages/order/add']) } + onViewConfirm(event) { + console.log("Edit Event In Console") + console.log(event); + + const buttonsConfig: NbWindowControlButtonsConfig = { + minimize: this.minimize, + maximize: this.maximize, + fullScreen: this.fullScreen, + close: this.close, + }; + console.log("add") + this._api.orderDetails.next(event) + + localStorage.setItem('viewOrder','1') + + this.router.navigate(['/pages/order/add']) + } getorderlistApi(){ - let param ={} + + let element ={ + "startDate": (moment().subtract(6, 'days'))['_d'], + "endDate": moment()['_d'] + } + this.selectedDateRange = element + let from = (moment().subtract(6, 'days'))['_d'] + let param = {fromDate:from + ,toDate: moment()['_d']} + console.log(param) this._api.getOrders(param).subscribe(res => { console.log(res) if(res.status == 200){ @@ -234,15 +282,55 @@ export class OrderComponent { }); passData.forEach((element:any, index) => { element.index = index +1 + element. selected =false + element. selectedval =0 + element.customer = element['OrderDetails.CusDetails.cusName'] + + element.address = element['OrderDetails.CusDetails.address_1']+","+element['OrderDetails.CusDetails.city']+","+element['OrderDetails.CusDetails.pincode'] + element.productName = element['ProductDetails.productName'] }); + this.orders = passData // console.log(data) - this.source.load(passData); + this.source.load(passData); } }) } + dateWiseFilter() { + console.log(this.selectedDateRange) + let param = {fromDate :this.selectedDateRange.startDate['$d'] + ,toDate:this.selectedDateRange.endDate['$d']} + this._api.getOrders(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + + let passData = res.data + passData.sort((a: any, b: any) => { + return b.id - a.id; + }); + passData.forEach((element:any, index) => { + element.index = index +1 + element. selected =false + element. selectedval =0 + element.customer = element['OrderDetails.CusDetails.cusName'] + + element.address = element['OrderDetails.CusDetails.address_1']+","+element['OrderDetails.CusDetails.city']+","+element['OrderDetails.CusDetails.pincode'] + element.productName = element['ProductDetails.productName'] + element. orderDate = element.createdAt + }); + // this.orders =[]; + this.orders = passData + // console.log(data) + this.source.load(passData); + }else{ + + // this.orders =[]; + } + }) + + } private showToast(type: NbComponentStatus, title: string, body: string) { const config = { status: type, @@ -373,4 +461,139 @@ onSubmit(){ } } + +onSubmit2(){ + if(this.selectedRows.length>0){ + + + console.log( this.selectedRows , this.driverForm.value) + let tmp=[]; + this.selectedRows.forEach(element => { + tmp.push({id:element.id , status:'In Progress' }) + + }); + + let param ={driver:tmp} + + + + + + + + this._api.CreateOrder (param).subscribe(res => { + if (res.status == 200) { + console.log(res) + this.showToast('success', 'Data Changed Successfully', 'Orders Inprogress Completed..!'); + this.getorderlistApi(); + }else{ + this.showToast('warning', 'Somthing is Wrong...!', 'Orders Inprogress Failed..!'); + } + }) + }else{ + this.showToast('warning', 'Somthing is Wrong...!', 'Please Select Orders..!'); + } +} + +updateAllComplete(pa,s,d){ + +} + +selectall(){ + if(this.isChecked == false){ + this.isChecked = true + }else{ + this.isChecked = false + } + console.log(this.isChecked) + + this.orders.forEach((element:any, index) => { + + element. selected = this.isChecked + + }) + + if(this.isChecked == true){ + this.selectedRows = this.orders + } + + +} +selectSingleRow(data){ + console.log(data) + // this.singleRow.push(data) + + if(data.selected == false){ + data.selectedval = true + }else{ + data.selectedval = false + } + this.selectedRows = this.orders.filter((arr:any)=>{return arr.selectedval == true}) + console.log( this.orders, this.selectedRows) + +} +handleCheckboxChange(event: boolean) { + console.log(event); + + if(this.isChecked == false){ + this.isChecked = true + }else{ + this.isChecked = false + } + + // Output the current value of the checkbox +} + + +viewData(param:any){ + console.log(param) + let data:any = {details:param,action:'Edit',title:'Edit Customer'} + const dialogRef = this.dialogService.open(ViewDetailsComponent, { + hasBackdrop: true, + dialogClass: 'custom-dialog-class', // Add your custom CSS class here + context: data + }); + + dialogRef.onClose.subscribe((result) => { + // Execute custom logic when the dialog is closed + console.log(result); + if(result == 1){ + // this.getEntityDetails() + //this.getuserlistApi(); + // this.showToast('success', 'Data Changed Successfully', 'Edit Customer Data Completed..!'); + // this.toastrService.success('Entity Added Successfully','Entity'); + console.log('Window closed 123'); + }else if(result == 0){ + + //this.showToast('warning', 'Somthing is Wrong...!', 'Edit Customer Data Failed..!'); + // this.toastrService.success('Somthing is Wrong...!', 'Add Entity Failed..!'); + } + }); +} + +filterItems() { + console.log( this.searchTerm) + + if( this.searchTerm !=''){ + + + this.filteredItems = this.orders.filter(item => + Object.values(item).some(value => { + if (typeof value === 'string') { + return value.toLowerCase().includes(this.searchTerm.toLowerCase()); + } + return false; + }) + ); + this.orders = this.filteredItems +}else{ + console.log( 'fhjsgsajdhgasksjgfcckjsdfgckjsdhfk') + + this.getorderlistApi() +} + + + +console.log( this.filteredItems) +} } diff --git a/src/app/pages/order/view-details/view-details.component.html b/src/app/pages/order/view-details/view-details.component.html new file mode 100644 index 0000000..ca4f627 --- /dev/null +++ b/src/app/pages/order/view-details/view-details.component.html @@ -0,0 +1,31 @@ + + View List + +
+
Product Name
+
Qty
+
+
+
{{ product.ProductDetails[0].productName }}
+
{{ product.qty }}
+
+ + + +
+ + + + +
\ No newline at end of file diff --git a/src/app/pages/order/view-details/view-details.component.scss b/src/app/pages/order/view-details/view-details.component.scss new file mode 100644 index 0000000..773fb58 --- /dev/null +++ b/src/app/pages/order/view-details/view-details.component.scss @@ -0,0 +1,38 @@ +@import '../../../@theme/styles/themes'; + +@include nb-install-component() { + input { + width: 100%; + } + + .cancel { + margin-right: 1rem; + } +} +.custom-dialog-class { + width: 100%; /* Set the desired width here */ + height: 300px; /* Set the desired height here */ + } + .show-grid{ + margin-bottom: 2rem; + } + + + .product-item { + display: flex; + align-items: center; + margin-bottom: 10px; + } + + .product-name { + flex: 1; + } + + .product-qty { + margin-left: 10px; + } + + + nb-card-footer{ + text-align: end; + } \ No newline at end of file diff --git a/src/app/pages/order/view-details/view-details.component.spec.ts b/src/app/pages/order/view-details/view-details.component.spec.ts new file mode 100644 index 0000000..dc0f6f1 --- /dev/null +++ b/src/app/pages/order/view-details/view-details.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewDetailsComponent } from './view-details.component'; + +describe('ViewDetailsComponent', () => { + let component: ViewDetailsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ViewDetailsComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ViewDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/order/view-details/view-details.component.ts b/src/app/pages/order/view-details/view-details.component.ts new file mode 100644 index 0000000..4216f41 --- /dev/null +++ b/src/app/pages/order/view-details/view-details.component.ts @@ -0,0 +1,42 @@ +import { Component, OnInit } from '@angular/core'; +import { NbDialogRef } from '@nebular/theme'; +import { PageapiService } from '../../pageapi.service'; + +@Component({ + selector: 'ngx-view-details', + templateUrl: './view-details.component.html', + styleUrls: ['./view-details.component.scss'] +}) +export class ViewDetailsComponent implements OnInit { + products:any =[]; + constructor(private dialogRef: NbDialogRef,public _api:PageapiService) { } + + ngOnInit(): void { + + console.log('dialogRef', this.dialogRef.componentRef.instance); + let details:any = this.dialogRef.componentRef.instance + + + + let param ={orderId:details.details.orderId} + + + + + + + + this._api.getProductList (param).subscribe(res => { + if (res.status == 200) { + + this.products = res.data + + } + }) + } + + close(){ + this.dialogRef.close(0) + } + +} diff --git a/src/app/pages/pageapi.service.ts b/src/app/pages/pageapi.service.ts index 7e4c48f..5fa3162 100644 --- a/src/app/pages/pageapi.service.ts +++ b/src/app/pages/pageapi.service.ts @@ -12,6 +12,11 @@ import { environment } from '../../environments/environment'; export class PageapiService { public orderDetails:BehaviorSubject = new BehaviorSubject([]); public orderDetails_observable$ = this.orderDetails.asObservable(); + + +public mixDetails:BehaviorSubject = new BehaviorSubject([]); +public mixDetails_observable$ = this.mixDetails.asObservable(); + private apiUrl = environment.apiEndpoint; constructor(private _http: HttpClient) { } @@ -20,6 +25,54 @@ public orderDetails_observable$ = this.orderDetails.asObservable(); return this._http.post(this.apiUrl + "getusers",param) } + getSmtpList(param): Observable { + //console.log(params.email) + return this._http.post(this.apiUrl + "getSmtpList",param) + + } + + + + getDriverSummaryAdminList(param): Observable { + //console.log(params.email) + return this._http.post(this.apiUrl + "getDriverSummaryAdminList",param) + + } + getDriverSheet(param): Observable { + //console.log(params.email) + return this._http.post(this.apiUrl + "getDriverSheet",param) + + } + + + + + getReturnDriverSummaryListadmin(param): Observable { + //console.log(params.email) + return this._http.post(this.apiUrl + "getReturnDriverSummaryListadmin",param) + + } + getProductDeliverysheet(param): Observable { + //console.log(params.email) + return this._http.post(this.apiUrl + "getProductDeliverysheet",param) + + } + + + + getProductListSummary(param): Observable { + //console.log(params.email) + return this._http.post(this.apiUrl + "getProductListSummary",param) + + } + getReturnProductListSummary(param): Observable { + //console.log(params.email) + return this._http.post(this.apiUrl + "getReturnProductListSummary",param) + + } + + + getProducts(param): Observable { //console.log(params.email) return this._http.post(this.apiUrl + "getProducts",param) @@ -39,6 +92,12 @@ public orderDetails_observable$ = this.orderDetails.asObservable(); return this._http.post(this.apiUrl + 'CreateCustomers', addParams) } + CreateSmtpDetails(addParams): Observable { + return this._http.post(this.apiUrl + 'CreateSmtpDetails', addParams) + + } + + CreateProductDetails(addParams): Observable { return this._http.post(this.apiUrl + 'CreateProducts', addParams) @@ -48,6 +107,11 @@ public orderDetails_observable$ = this.orderDetails.asObservable(); return this._http.post(this.apiUrl + 'CreateOrder', addParams) } + + getProductList(addParams): Observable { + return this._http.post(this.apiUrl + 'getProductList', addParams) + + } } diff --git a/src/app/pages/pages-menu.ts b/src/app/pages/pages-menu.ts index 8e9f1ee..199120b 100644 --- a/src/app/pages/pages-menu.ts +++ b/src/app/pages/pages-menu.ts @@ -10,9 +10,39 @@ export const MENU_ITEMS: NbMenuItem[] = [ { title: 'Orders', icon: 'shopping-bag-outline', - link: '/pages/order', - home: true, + children: [ + { + title: 'Order List', + link: '/pages/order', + }, + { + title: 'Delivery Summary', + link: '/pages/summary', + }, + { + title: 'Delivery Sheet', + link: '/pages/delivery-sheet', + }, + + ], + // link: '/pages/order', + // home: true, }, + // { + // title: 'Summary', + // icon: 'grid-outline', + // link: '/pages/summary', + // home: true, + // }, + + // { + // title: 'delivery', + // icon: 'grid-outline', + // link: '/pages/delivery-sheet', + // home: true, + // }, + + { title: 'Products', icon: 'shopping-cart-outline', @@ -46,7 +76,7 @@ export const MENU_ITEMS: NbMenuItem[] = [ { title: 'Email', icon: 'email-outline', - link: '/pages/dashboard', + link: '/pages/email', home: true, }, { diff --git a/src/app/pages/pages-routing.module.ts b/src/app/pages/pages-routing.module.ts index b124070..520eea8 100644 --- a/src/app/pages/pages-routing.module.ts +++ b/src/app/pages/pages-routing.module.ts @@ -11,6 +11,10 @@ import { AuthGuard } from './_guard/auth.guard'; import { OrderComponent } from './order/order.component'; import { OrderFormComponent } from './order/order-form/order-form.component'; import { ProfileComponent } from './profile/profile.component'; +import { SummaryListComponent } from './summary-list/summary-list.component'; +import { SummaryDetailsComponent } from './summary-list/summary-details/summary-details.component'; +import { EmailComponent } from './email/email.component'; +import { DriverySheetComponent } from './drivery-sheet/drivery-sheet.component'; const routes: Routes = [{ path: '', @@ -43,6 +47,10 @@ const routes: Routes = [{ path: 'order', component: OrderComponent, }, + { + path: 'email', + component: EmailComponent, + }, { path: 'profile', component: ProfileComponent, @@ -50,7 +58,19 @@ const routes: Routes = [{ { path: 'order/add', component: OrderFormComponent, - }, + },{ + path: 'summary', + component:SummaryListComponent + },{ + path: 'summary/:orderId', + component:SummaryDetailsComponent + + },{ + + path: 'delivery-sheet', + component:DriverySheetComponent + + } diff --git a/src/app/pages/pages.component.ts b/src/app/pages/pages.component.ts index 61287cd..7614b01 100644 --- a/src/app/pages/pages.component.ts +++ b/src/app/pages/pages.component.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; import { MENU_ITEMS } from './pages-menu'; +import { Router } from '@angular/router'; @Component({ selector: 'ngx-pages', @@ -14,5 +15,26 @@ import { MENU_ITEMS } from './pages-menu'; }) export class PagesComponent { + + menu = MENU_ITEMS; + + constructor(private router: Router){ + let role = localStorage.getItem('user_role') + console.log(role) + + if(role == "FRONT-OFFICE"){ + this.menu = this.menu.filter(arr=>{return arr.title != 'Users'}) + } + + + console.log(this.menu) + + this.router.navigate(['/pages/dashboard']); + + + + + + } } diff --git a/src/app/pages/pages.module.ts b/src/app/pages/pages.module.ts index caad04e..084c1a2 100644 --- a/src/app/pages/pages.module.ts +++ b/src/app/pages/pages.module.ts @@ -1,5 +1,5 @@ import { NgModule,NO_ERRORS_SCHEMA ,CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { NbDialogModule, NbListModule, NbMenuModule } from '@nebular/theme'; +import { NbDialogModule, NbListModule, NbMenuModule, NbToggleModule } from '@nebular/theme'; import { ThemeModule } from '../@theme/theme.module'; import { PagesComponent } from './pages.component'; @@ -7,6 +7,7 @@ import { DashboardModule } from './dashboard/dashboard.module'; import { PagesRoutingModule } from './pages-routing.module'; import { LoginComponent } from './auth/login/login.component'; import { FormsModule as ngFormsModule } from '@angular/forms'; +import { DataTableModule } from 'ornamentum'; import { FormGroup, FormsModule, ReactiveFormsModule} from '@angular/forms'; import { NbActionsModule, @@ -38,6 +39,15 @@ import { AssignFormComponent } from './order/assign-form/assign-form.component'; import { ProfileComponent } from './profile/profile.component'; import { MixedFormComponent } from './order/mixed-form/mixed-form.component'; import { AuthComponent } from './auth/auth/auth.component'; +import { ForgotPasswordComponent } from './auth/forgot-password/forgot-password.component'; +import { OtpComponent } from './auth/otp/otp.component'; +import { ResetPasswordComponent } from './auth/reset-password/reset-password.component'; +import { NgxDaterangepickerMd } from 'ngx-daterangepicker-material'; +import { ViewDetailsComponent } from './order/view-details/view-details.component'; +import { SummaryListComponent } from './summary-list/summary-list.component'; +import { SummaryDetailsComponent } from './summary-list/summary-details/summary-details.component'; +import { EmailComponent } from './email/email.component'; +import { DriverySheetComponent } from './drivery-sheet/drivery-sheet.component'; @NgModule({ imports: [ PagesRoutingModule, @@ -62,8 +72,8 @@ import { AuthComponent } from './auth/auth/auth.component'; NbIconModule, NbInputModule, ThemeModule, - NbListModule, - NbDialogModule.forChild(), + NbListModule,NbToggleModule, + NbDialogModule.forChild(), DataTableModule.forRoot(), NgxDaterangepickerMd.forRoot(), Ng2SmartTableModule, ], declarations: [ @@ -84,7 +94,7 @@ import { AuthComponent } from './auth/auth/auth.component'; AssignFormComponent, ProfileComponent, MixedFormComponent, - AuthComponent, + AuthComponent,ForgotPasswordComponent, OtpComponent,ResetPasswordComponent, ViewDetailsComponent, SummaryListComponent, SummaryDetailsComponent, EmailComponent, DriverySheetComponent, ], schemas: [CUSTOM_ELEMENTS_SCHEMA,NO_ERRORS_SCHEMA], }) diff --git a/src/app/pages/product/product-form/product-form.component.html b/src/app/pages/product/product-form/product-form.component.html index b0008b5..2889617 100644 --- a/src/app/pages/product/product-form/product-form.component.html +++ b/src/app/pages/product/product-form/product-form.component.html @@ -1,7 +1,7 @@
- + Medical @@ -13,7 +13,7 @@ - + Gas @@ -25,7 +25,7 @@ - +
Product Name is required.
@@ -33,12 +33,20 @@
- +
Description is required.
+
+ + + + +
skuId is required.
+ +
diff --git a/src/app/pages/product/product-form/product-form.component.scss b/src/app/pages/product/product-form/product-form.component.scss index 8acb610..707cc3b 100644 --- a/src/app/pages/product/product-form/product-form.component.scss +++ b/src/app/pages/product/product-form/product-form.component.scss @@ -14,6 +14,11 @@ } } + + +::ng-deep .cdk-global-scrollblock { + overflow-y: hidden !important; +} // ::ng-deep nb-window { // flex: 1 0 auto; // min-width: 20rem !important; diff --git a/src/app/pages/product/product-form/product-form.component.ts b/src/app/pages/product/product-form/product-form.component.ts index cead3ec..c7561fd 100644 --- a/src/app/pages/product/product-form/product-form.component.ts +++ b/src/app/pages/product/product-form/product-form.component.ts @@ -26,6 +26,7 @@ export class ProductFormComponent implements OnInit { productType: new FormControl('', [Validators.required]), productName: new FormControl('', [Validators.required]), description:new FormControl('', [Validators.required]), + skuId:new FormControl('', [Validators.required]), }); if(this.data.hasOwnProperty('id')){ diff --git a/src/app/pages/product/product.component.html b/src/app/pages/product/product.component.html index d66bf20..7e4e001 100644 --- a/src/app/pages/product/product.component.html +++ b/src/app/pages/product/product.component.html @@ -1,12 +1,164 @@ - Product Management + +
+
+
Product Management
+
+ +
+
+ + + +
+
+
+
+ + +
+
+
- - + --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + Active + + + Inactive + + + + + +
+ + +
+
+ + + + + + + + + + + + + + +
+ + + +
+ + +
+
+
\ No newline at end of file diff --git a/src/app/pages/product/product.component.scss b/src/app/pages/product/product.component.scss index 88bfd33..5f9b5dd 100644 --- a/src/app/pages/product/product.component.scss +++ b/src/app/pages/product/product.component.scss @@ -8,4 +8,120 @@ // ::ng-deep nb-window { // flex: 1 0 auto; // min-width: 20rem !important; -// } \ No newline at end of file +// } + +.align-left{ + text-align: left !important; +} +.align-center{ + text-align: center !important; +} +.align-right{ + text-align: right !important; +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table tbody > tr.row-even td { + background: white; + font-family: var(--smart-table-font-family); +font-size: var(--smart-table-font-size); +font-weight: var(--smart-table-font-weight); +line-height: var(--smart-table-line-height); +color: var(--smart-table-fg); +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table thead > tr .ng-data-table-column-header .ng-data-table-column-header-label:first-child { + font-size: 18px; color: #1e6bb8; + text-decoration: none; padding: 10px; + font-family: var(--smart-table-header-font-family); + font-size: var(--smart-table-header-font-size); + font-weight: var(--smart-table-header-font-weight); + line-height: var(--smart-table-header-line-height); +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table tbody > tr.row-odd td { + +font-family: var(--smart-table-font-family); +font-size: var(--smart-table-font-size); +font-weight: var(--smart-table-font-weight); +line-height: var(--smart-table-line-height); +color: var(--smart-table-fg); +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table-content-container .ng-data-table-content { + min-height: 100px !important; + font-size: 18px; +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table thead > tr:last-child th { + + background-color:#fff; font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + +} +tr{ + color: white; + background-color:#fff; +} +th{ + color: white; + background-color:#fff; +} + + * { + box-sizing: border-box; + } + .row { + display: flex; + background-color:#fff; + } + + /* Create two equal columns that sits next to each other */ + .column { + flex: 50%; + // + // height: 300px; /* Should be removed. Only for demonstration */ + } + ::ng-deep .mat-select-value{ + color: white!important; } + .column1 { + width: 210px; + text-align: center; + text-overflow: ellipsis; + padding: 30px; + //height: 300px; /* Should be removed. Only for demonstration */ + } + + + .add { + display: flex; + align-items: center; + justify-content: center; + font-size: 1.75rem !important; + padding: var(--smart-table-filter-padding); + border-color: var(--smart-table-add-button-border-color); + background-color: var(--smart-table-add-button-background-color); + color: var(--smart-table-add-button-text-color); + border-radius: 0.375rem; + + font-family: var(--smart-table-header-font-family); + font-size: var(--smart-table-header-font-size); + font-weight: var(--smart-table-header-font-weight); + line-height: var(--smart-table-header-line-height); + } + span{ + + color: #000; + } + +span:hover{ + + color: #1e6bb8; + } + a[disabled="disabled"] { + pointer-events: none; +} + .check{ + display: flex; align-items: center; text-decoration: none; + height: 100%; width: 100%; font-size: 2rem!important; + } + + + \ No newline at end of file diff --git a/src/app/pages/product/product.component.ts b/src/app/pages/product/product.component.ts index 1e69b49..68a84e5 100644 --- a/src/app/pages/product/product.component.ts +++ b/src/app/pages/product/product.component.ts @@ -56,7 +56,7 @@ export class ProductComponent { }, }; - + product:any =[]; source: LocalDataSource = new LocalDataSource(); minimize = false; maximize = false; @@ -65,7 +65,8 @@ export class ProductComponent { formData:any=[] index = 1; destroyByClick = true; - duration = 2000; + duration = 2000; filteredItems: any[]; + searchTerm: string; hasIcon = true; position: NbGlobalPosition = NbGlobalPhysicalPosition.TOP_RIGHT; preventDuplicates = false; @@ -81,32 +82,51 @@ export class ProductComponent { onDeleteConfirm(event): void { console.log(event) - let passData = event.data - if (window.confirm('Are you sure you want to delete?')) { + let passData = event + //if (window.confirm('Are you sure you want to delete?')) { //event.confirm.resolve(); - let deletedata = {'isActive':0,'id':passData.id} + let deletedata = {'isActive':event.isActive,'id':passData.id} this._api.CreateProductDetails (deletedata).subscribe(res => { if (res.status == 200) { console.log(res) this.getProductlistApi(); - this.showToast('success', 'Data Removed Successfully', 'Removed Product Data Completed..!'); + if(event.isActive == 1){ + this.showToast('success', 'Data Removed Successfully', 'Active Product Data Completed..!'); + }else{ + this.showToast('success', 'Data Removed Successfully', 'Inactive Product Data Completed..!'); + } + + // this.showToast('success', 'Data Removed Successfully', 'Removed Product Data Completed..!'); event.confirm.resolve(); }else{ this.showToast('warning', 'Somthing is Wrong...!', 'Edit Product Data Failed..!'); } }) - } else { - event.confirm.reject(); - } + // } else { + // event.confirm.reject(); + // } } - onCreateConfirm(event) { + onCreateConfirm() { console.log("Create Event In Console") - console.log(event); + // console.log(event); + // const buttonsConfig: NbWindowControlButtonsConfig = { + // minimize: this.minimize, + // maximize: this.maximize, + // fullScreen: this.fullScreen, + // close: this.close, + // }; + // let config= { + // hasBackdrop: true, + // width: '500px', + // height: '300px', + // } + // const windowRef: NbWindowRef = this.windowService.open(ProductFormComponent, { title: `New Product`, buttons: buttonsConfig , }); + const buttonsConfig: NbWindowControlButtonsConfig = { minimize: this.minimize, maximize: this.maximize, @@ -119,8 +139,6 @@ export class ProductComponent { height: '300px', } const windowRef: NbWindowRef = this.windowService.open(ProductFormComponent, { title: `New Product`, buttons: buttonsConfig , }); - - // Subscribe to the afterClosed event windowRef.onClose.subscribe((data) => { @@ -146,7 +164,7 @@ export class ProductComponent { fullScreen: this.fullScreen, close: this.close, }; - const windowRef: NbWindowRef = this.windowService.open(ProductFormComponent, { title: `Edit Product`, context: event.data + const windowRef: NbWindowRef = this.windowService.open(ProductFormComponent, { title: `Edit Product`, context: event , buttons: buttonsConfig }); @@ -181,8 +199,9 @@ export class ProductComponent { element.index = index +1 }); + this.product = product // console.log(data) - this.source.load(product); + // this.source.load(product); }else{ this.source.load([]); } @@ -207,4 +226,29 @@ export class ProductComponent { `${titleContent}`, config); } + filterItems() { + console.log( this.searchTerm) + + if( this.searchTerm !=''){ + + + this.filteredItems = this.product.filter(item => + Object.values(item).some(value => { + if (typeof value === 'string') { + return value.toLowerCase().includes(this.searchTerm.toLowerCase()); + } + return false; + }) + ); + this.product = this.filteredItems + }else{ + console.log( 'fhjsgsajdhgasksjgfcckjsdfgckjsdhfk') + + this.getProductlistApi() + } + + + + console.log( this.filteredItems) + } } diff --git a/src/app/pages/profile/profile.component.html b/src/app/pages/profile/profile.component.html index c476c2e..a780213 100644 --- a/src/app/pages/profile/profile.component.html +++ b/src/app/pages/profile/profile.component.html @@ -10,30 +10,33 @@ -
- + + - +
+ Password length must be greater than or equal to 8, and the password must contain one or more uppercase, lowercase, numeric, and special characters. +
Password is required
- + - +
+ Password length must be greater than or equal to 8, and the password must contain one or more uppercase, lowercase, numeric, and special characters. +
Confirm Password is required
+
+ Password not Matching +
-
+
Email is required.
@@ -62,7 +65,7 @@
- +
diff --git a/src/app/pages/profile/profile.component.ts b/src/app/pages/profile/profile.component.ts index 4892d88..3ec40a2 100644 --- a/src/app/pages/profile/profile.component.ts +++ b/src/app/pages/profile/profile.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; import { PageapiService } from '../pageapi.service'; +import { NbComponentStatus, NbGlobalPhysicalPosition, NbGlobalPosition, NbToastrService } from '@nebular/theme'; @Component({ selector: 'ngx-profile', @@ -9,7 +10,17 @@ import { PageapiService } from '../pageapi.service'; }) export class ProfileComponent implements OnInit { userForm: FormGroup | any; formData:any =[] - constructor(public _api:PageapiService) { } + + + index = 1; + destroyByClick = true; + duration = 2000; + hasIcon = true; + admin:any =[]; + position: NbGlobalPosition = NbGlobalPhysicalPosition.TOP_RIGHT; + preventDuplicates = false; + status: NbComponentStatus = 'primary'; + constructor(public _api:PageapiService,private toastrService: NbToastrService) { } ngOnInit(): void { @@ -66,9 +77,9 @@ export class ProfileComponent implements OnInit { this._api.addUserFormDetails (this.formData).subscribe(res => { if (res.status == 200) { console.log(res) - +this.showToast('success', 'Data Changed Successfully', 'Profile Update Completed..!'); }else{ - + this.showToast('warning', 'Data Changed Failed', 'Profile Update Failed..!'); } }) } @@ -86,4 +97,23 @@ console.log(res) } }) } + + + private showToast(type: NbComponentStatus, title: string, body: string) { + const config = { + status: type, + destroyByClick: this.destroyByClick, + duration: this.duration, + hasIcon: this.hasIcon, + position: this.position, + preventDuplicates: this.preventDuplicates, + }; + const titleContent = title ? ` ${title}` : ''; + + this.index += 1; + this.toastrService.show( + body, + `${titleContent}`, + config); + } } diff --git a/src/app/pages/summary-list/summary-details/summary-details.component.html b/src/app/pages/summary-list/summary-details/summary-details.component.html new file mode 100644 index 0000000..d889724 --- /dev/null +++ b/src/app/pages/summary-list/summary-details/summary-details.component.html @@ -0,0 +1,349 @@ + + + + +
+
+
Summary Product List
+
+
+
+ + + +
+
+
+
+ + + + +
+
+ ORDER ID :

{{orderId}}

+
+
+
+ +
+
+
+
+ + + + + +
+
+
Delivery Information
+
+
+ +
+
+
+ + +
+
+ + + + + + +
+
+
+ + + +
+
+
+
+ +
+ + + + +
+
+
+
+ + +
+
+ +
+
+ + + + + +
+ +
+ +
+
+ +
+
+ +
+
+ + + + + + +
+
+
+ + + + +
+
+
+
+ +
+ + + + +
+
+
+
+ + +
+
+ +
+
+ + + + + + +
+
+ + +
+ +
+
+ + +
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+ + +
+ + + +
+
+
Return Information
+
+
+ +
+
+
+ + +
+
+ + + + + + +
+
+
+ + + +
+
+
+
+ +
+ + + + +
+
+
+
+ + +
+
+ +
+
+ + + + + +
+ +
+ +
+
+ +
+
+ + +
+
+ + + + + + +
+
+
+ + + + +
+
+
+
+ +
+ + + + +
+
+
+
+ + +
+
+ +
+
+ + + + + + +
+
+ + +
+ +
+
+ + +
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+ + +
+
+
diff --git a/src/app/pages/summary-list/summary-details/summary-details.component.scss b/src/app/pages/summary-list/summary-details/summary-details.component.scss new file mode 100644 index 0000000..0ac0151 --- /dev/null +++ b/src/app/pages/summary-list/summary-details/summary-details.component.scss @@ -0,0 +1,172 @@ + + td ,input[type="checkbox"] { + font-size: 1px !important; + } + + .highlight-cell { + background-color: yellow; + /* Add any other styling properties as desired */ + } + + ::ng-deep .ng2-smart-action-multiple-select{ + text-align: center; + } + + ::ng-deep .ng2-smart-action-multiple-select > input{ + width:15px; + height:15px; + display: unset; + } + + ::ng-deep .desired-value-row{ +color: red !important; + } + + .align-left{ + text-align: left !important; + } + .align-center{ + text-align: center !important; + } + .align-right{ + text-align: right !important; + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table tbody > tr.row-even td { + background: white; + //padding: 10px; + font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table thead > tr .ng-data-table-column-header .ng-data-table-column-header-label:first-child { + font-size: 18px; + padding: 10px; + color: #1e6bb8; + text-decoration: none; + font-family: var(--smart-table-header-font-family); + font-size: var(--smart-table-header-font-size); + font-weight: var(--smart-table-header-font-weight); + line-height: var(--smart-table-header-line-height); + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table tbody > tr.row-odd td { + // padding: 10px; + font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table-content-container .ng-data-table-content { + min-height: 100px !important; + font-size: 18px; + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table thead > tr:last-child th { + + background-color:#fff; font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + + } + tr{ + color: white; + background-color:#fff; + } + th{ + color: white; + background-color:#fff; + } + + * { + box-sizing: border-box; + } + .row { + display: flex; + background-color:#fff; + } + + /* Create two equal columns that sits next to each other */ + .column { + flex: 50%; + // padding: 10px; + // height: 300px; /* Should be removed. Only for demonstration */ + } + ::ng-deep .mat-select-value{ + color: white!important; } + .column1 { + width: 210px; + text-align: center; + text-overflow: ellipsis; + padding: 30px; + //height: 300px; /* Should be removed. Only for demonstration */ + } + + + .add { + display: flex; + align-items: center; + justify-content: center; + font-size: 1.75rem !important; + padding: var(--smart-table-filter-padding); + border-color: var(--smart-table-add-button-border-color); + background-color: var(--smart-table-add-button-background-color); + color: var(--smart-table-add-button-text-color); + border-radius: 0.375rem; + + font-family: var(--smart-table-header-font-family); + font-size: var(--smart-table-header-font-size); + font-weight: var(--smart-table-header-font-weight); + line-height: var(--smart-table-header-line-height); + } + span{ + + color: #000; + } + + span:hover{ + + color: #1e6bb8; + } + a[disabled="disabled"] { + pointer-events: none; + } + .check{ + display: flex; align-items: center; text-decoration: none; + height: 100%; width: 100%; font-size: 2rem!important; + } + + .checkTxt{ + //background: white; + // padding: 10px; + font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + text-transform: capitalize; + } + + + ::ng-deep .md-drppicker .btn, .md-drppicker .btn:focus, .md-drppicker .btn:hover { + background-color: #4caf50 !important; + margin-left: 10px !important; + } + + ::ng-deep .md-drppicker .btn.btn-default{ + color: #000 !important; + background-color: #dcdcdc !important; + } + + ::ng-deep .md-drppicker td.active{ + background-color: #1f7f6f !important; + } + ::ng-deep .md-drppicker .ranges ul li button.active { + background-color: #1f7f6f !important; + } + ::ng-deep .md-drppicker.double { + width: 640px !important; + } + \ No newline at end of file diff --git a/src/app/pages/summary-list/summary-details/summary-details.component.spec.ts b/src/app/pages/summary-list/summary-details/summary-details.component.spec.ts new file mode 100644 index 0000000..967cb89 --- /dev/null +++ b/src/app/pages/summary-list/summary-details/summary-details.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SummaryDetailsComponent } from './summary-details.component'; + +describe('SummaryDetailsComponent', () => { + let component: SummaryDetailsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ SummaryDetailsComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SummaryDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/summary-list/summary-details/summary-details.component.ts b/src/app/pages/summary-list/summary-details/summary-details.component.ts new file mode 100644 index 0000000..dba91c8 --- /dev/null +++ b/src/app/pages/summary-list/summary-details/summary-details.component.ts @@ -0,0 +1,200 @@ +import { Component, OnInit } from '@angular/core'; +import * as moment from 'moment'; +import { PageapiService } from '../../pageapi.service'; +import { ActivatedRoute, Router } from '@angular/router'; + @Component({ + selector: 'ngx-summary-details', + templateUrl: './summary-details.component.html', + styleUrls: ['./summary-details.component.scss'] +}) +export class SummaryDetailsComponent implements OnInit { + + ranges: any = { + 'Today': [moment(), moment()], + // 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + // 'Last 7 Days': [moment().subtract(6, 'days'), moment()], + // 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + // 'This Month': [moment().startOf('month'), moment().endOf('month')], + // 'Last Month': [ + // moment().subtract(1, 'month').startOf('month'), + // moment().subtract(1, 'month').endOf('month') + // ] + }; + productlistReturn:any =[];orderId:any=[]; + selectedDateRange:any =[];drivers:any =[];summaryaData:any=[];driverval:any=[];returnSummary:any =[];productlist:any=[]; + constructor(public _api:PageapiService,private route: ActivatedRoute, private router:Router) { + + this.route.params.subscribe(params => { + console.log(params) //log the entire params object + console.log(params['orderId']) //log the value of id +let orderId = params['orderId'] +this.orderId = orderId + this._api.getProductListSummary({orderId:orderId}).subscribe(res => { + console.log(res) + if(res.status == 200){ + + this.productlist = res.data + + + + } + }) + + this._api.getReturnProductListSummary({orderId:orderId}).subscribe(res => { + console.log(res) + if(res.status == 200){ + + this.productlistReturn = res.data + + + + } + }) + + + }); + + } + + ngOnInit(): void { + this.selectedDateRange =[]; + console.log(moment()['_d']) + + this.getDriverlistApi() + } + + + back(){ + this.router.navigate(['/pages/summary']) + } + save(){ + + } + + generatePDF(data){ + + + } + dateWiseFilter(){ + console.log(this.selectedDateRange,this.driverval) + if(this.selectedDateRange.length!=0){ + + + + } + //this.getDriverSummaryAdminList(result) + + } + + mergeOrders(orderItems: any[]) { + this.summaryaData = orderItems.reduce((acc, curr) => { + const existingOrder = acc.find((order) => order.orderId === curr.orderId); + if (existingOrder) { + existingOrder.total_qty += curr.total_qty; + } else { + acc.push(curr); + } + return acc; + }, []); + } + getDriverlistApi(){ + // console.log(this.selectedDateRange) + let param ={} + this._api.getusers(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + + let passData = res.data + let driver = passData.filter(arr=>{return arr.role == 'DRIVER'}) + driver.sort((a: any, b: any) => { + return b.id - a.id; + }); + driver.forEach((element:any, index) => { + element.index = index +1 + + }); + + + + this.drivers = driver + // console.log(data) + + } + }) + } + + + getDriverSummaryAdminList(date){ + let param ={date:new Date(date)} + this._api.getDriverSummaryAdminList(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + + console.log(res.data) + + } + }) + } + + val(data){ + console.log(data.id) + + let result; + if(this.selectedDateRange.length != 0){ + result= this.selectedDateRange.endDate['$d'] + }else{ + + result = moment()['_d'] + } + + console.log(result) + let param ={date:new Date(result),id:data.id} + this._api.getDriverSummaryAdminList(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + + console.log(res.data) + + this.summaryaData = res.data + this.summaryaData.forEach(element => { + element.name = element['UserDetails.userName'] + + }); + + this.mergeOrders( this.summaryaData) + + } + }) + + this._api.getReturnDriverSummaryListadmin(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + + console.log(res.data) + + this.returnSummary = res.data + + + + // this.mergeOrders( this.summaryaData) + + } + }) + + + } + + + returnCount(data){ + let result = this.returnSummary.filter(arr=>{return arr.orderId == data}) +console.log(result) + if(result.length>0){ + + return result[0].total_amount + }else{ + return '-' + } + + } + +} diff --git a/src/app/pages/summary-list/summary-list.component.html b/src/app/pages/summary-list/summary-list.component.html new file mode 100644 index 0000000..634207b --- /dev/null +++ b/src/app/pages/summary-list/summary-list.component.html @@ -0,0 +1,197 @@ + + + + +
+
+
Summary
+
+
+
+ + + +
+
+
+
+ + + + +
+
+
+
+
+
+ + Select Drivers + + {{user.userName }} + + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + + +
+
+
+
+ +
+ + + + +
+
+
+
+ + +
+
+ +
+
+ + + + + +
+ +
+ +
+
+ +
+
+ +
+
+ + + + + + +
+
+
+ + + +
+
+
+
+ +
+ + + + +
+
+
+
+ + +
+
+ +
+
+ + + + + + +
+
+ + +
+ +
+
+ + +
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+ + +
+
+
diff --git a/src/app/pages/summary-list/summary-list.component.scss b/src/app/pages/summary-list/summary-list.component.scss new file mode 100644 index 0000000..0ac0151 --- /dev/null +++ b/src/app/pages/summary-list/summary-list.component.scss @@ -0,0 +1,172 @@ + + td ,input[type="checkbox"] { + font-size: 1px !important; + } + + .highlight-cell { + background-color: yellow; + /* Add any other styling properties as desired */ + } + + ::ng-deep .ng2-smart-action-multiple-select{ + text-align: center; + } + + ::ng-deep .ng2-smart-action-multiple-select > input{ + width:15px; + height:15px; + display: unset; + } + + ::ng-deep .desired-value-row{ +color: red !important; + } + + .align-left{ + text-align: left !important; + } + .align-center{ + text-align: center !important; + } + .align-right{ + text-align: right !important; + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table tbody > tr.row-even td { + background: white; + //padding: 10px; + font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table thead > tr .ng-data-table-column-header .ng-data-table-column-header-label:first-child { + font-size: 18px; + padding: 10px; + color: #1e6bb8; + text-decoration: none; + font-family: var(--smart-table-header-font-family); + font-size: var(--smart-table-header-font-size); + font-weight: var(--smart-table-header-font-weight); + line-height: var(--smart-table-header-line-height); + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table tbody > tr.row-odd td { + // padding: 10px; + font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table-content-container .ng-data-table-content { + min-height: 100px !important; + font-size: 18px; + } + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table thead > tr:last-child th { + + background-color:#fff; font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + + } + tr{ + color: white; + background-color:#fff; + } + th{ + color: white; + background-color:#fff; + } + + * { + box-sizing: border-box; + } + .row { + display: flex; + background-color:#fff; + } + + /* Create two equal columns that sits next to each other */ + .column { + flex: 50%; + // padding: 10px; + // height: 300px; /* Should be removed. Only for demonstration */ + } + ::ng-deep .mat-select-value{ + color: white!important; } + .column1 { + width: 210px; + text-align: center; + text-overflow: ellipsis; + padding: 30px; + //height: 300px; /* Should be removed. Only for demonstration */ + } + + + .add { + display: flex; + align-items: center; + justify-content: center; + font-size: 1.75rem !important; + padding: var(--smart-table-filter-padding); + border-color: var(--smart-table-add-button-border-color); + background-color: var(--smart-table-add-button-background-color); + color: var(--smart-table-add-button-text-color); + border-radius: 0.375rem; + + font-family: var(--smart-table-header-font-family); + font-size: var(--smart-table-header-font-size); + font-weight: var(--smart-table-header-font-weight); + line-height: var(--smart-table-header-line-height); + } + span{ + + color: #000; + } + + span:hover{ + + color: #1e6bb8; + } + a[disabled="disabled"] { + pointer-events: none; + } + .check{ + display: flex; align-items: center; text-decoration: none; + height: 100%; width: 100%; font-size: 2rem!important; + } + + .checkTxt{ + //background: white; + // padding: 10px; + font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + text-transform: capitalize; + } + + + ::ng-deep .md-drppicker .btn, .md-drppicker .btn:focus, .md-drppicker .btn:hover { + background-color: #4caf50 !important; + margin-left: 10px !important; + } + + ::ng-deep .md-drppicker .btn.btn-default{ + color: #000 !important; + background-color: #dcdcdc !important; + } + + ::ng-deep .md-drppicker td.active{ + background-color: #1f7f6f !important; + } + ::ng-deep .md-drppicker .ranges ul li button.active { + background-color: #1f7f6f !important; + } + ::ng-deep .md-drppicker.double { + width: 640px !important; + } + \ No newline at end of file diff --git a/src/app/pages/summary-list/summary-list.component.spec.ts b/src/app/pages/summary-list/summary-list.component.spec.ts new file mode 100644 index 0000000..b3f9a3b --- /dev/null +++ b/src/app/pages/summary-list/summary-list.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SummaryListComponent } from './summary-list.component'; + +describe('SummaryListComponent', () => { + let component: SummaryListComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ SummaryListComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SummaryListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/summary-list/summary-list.component.ts b/src/app/pages/summary-list/summary-list.component.ts new file mode 100644 index 0000000..4937844 --- /dev/null +++ b/src/app/pages/summary-list/summary-list.component.ts @@ -0,0 +1,170 @@ +import { Component, OnInit } from '@angular/core'; +import * as moment from 'moment'; +import { PageapiService } from '../pageapi.service'; +import { Router } from '@angular/router'; +@Component({ + selector: 'ngx-summary-list', + templateUrl: './summary-list.component.html', + styleUrls: ['./summary-list.component.scss'] +}) +export class SummaryListComponent implements OnInit { + ranges: any = { + 'Today': [moment(), moment()], + // 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + // 'Last 7 Days': [moment().subtract(6, 'days'), moment()], + // 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + // 'This Month': [moment().startOf('month'), moment().endOf('month')], + // 'Last Month': [ + // moment().subtract(1, 'month').startOf('month'), + // moment().subtract(1, 'month').endOf('month') + // ] + }; + selectedDateRange:any =[];drivers:any =[];summaryaData:any=[];driverval:any=[];returnSummary:any =[]; + constructor(public _api:PageapiService, private router:Router) { } + + ngOnInit(): void { + this.selectedDateRange =[]; + console.log(moment()['_d']) + + this.getDriverlistApi() + } + + + back(){ + + } + save(){ + + } + + generatePDF(data){ + + + } + dateWiseFilter(){ + console.log(this.selectedDateRange,this.driverval) + if(this.selectedDateRange.length!=0){ + + + + } + //this.getDriverSummaryAdminList(result) + + } + + mergeOrders(orderItems: any[]) { + this.summaryaData = orderItems.reduce((acc, curr) => { + const existingOrder = acc.find((order) => order.orderId === curr.orderId); + if (existingOrder) { + existingOrder.total_qty += curr.total_qty; + } else { + acc.push(curr); + } + return acc; + }, []); + } + getDriverlistApi(){ + // console.log(this.selectedDateRange) + let param ={} + this._api.getusers(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + + let passData = res.data + let driver = passData.filter(arr=>{return arr.role == 'DRIVER'}) + driver.sort((a: any, b: any) => { + return b.id - a.id; + }); + driver.forEach((element:any, index) => { + element.index = index +1 + + }); + + + + this.drivers = driver + // console.log(data) + + } + }) + } + + + getDriverSummaryAdminList(date){ + let param ={date:new Date(date)} + this._api.getDriverSummaryAdminList(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + + console.log(res.data) + + } + }) + } + + val(data){ + console.log(data.id) + + let result; + if(this.selectedDateRange.length != 0){ + result= this.selectedDateRange.endDate['$d'] + }else{ + + result = moment()['_d'] + } + + console.log(result) + let param ={date:new Date(result),id:data.id} + this._api.getDriverSummaryAdminList(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + + console.log(res.data) + + this.summaryaData = res.data + this.summaryaData.forEach(element => { + element.name = element['UserDetails.userName'] + + }); + + this.mergeOrders( this.summaryaData) + + } + }) + + this._api.getReturnDriverSummaryListadmin(param).subscribe(res => { + console.log(res) + if(res.status == 200){ + + console.log(res.data) + + this.returnSummary = res.data + + + + // this.mergeOrders( this.summaryaData) + + } + }) + + + } + + + returnCount(data){ + let result = this.returnSummary.filter(arr=>{return arr.orderId == data}) +console.log(result) + if(result.length>0){ + + return result[0].total_amount + }else{ + return '-' + } + + } + + view(data){ + this.router.navigate(['/pages/summary/'+data]) + } + +} diff --git a/src/app/pages/users/user-form/user-form.component.html b/src/app/pages/users/user-form/user-form.component.html index 44a9c34..208aa21 100644 --- a/src/app/pages/users/user-form/user-form.component.html +++ b/src/app/pages/users/user-form/user-form.component.html @@ -37,12 +37,13 @@ - + diff --git a/src/app/pages/users/user-form/user-form.component.ts b/src/app/pages/users/user-form/user-form.component.ts index 942ae95..12b4fea 100644 --- a/src/app/pages/users/user-form/user-form.component.ts +++ b/src/app/pages/users/user-form/user-form.component.ts @@ -23,7 +23,7 @@ export class UserFormComponent implements OnInit { - // role: new FormControl('', [Validators.required]), + role: new FormControl('', [Validators.required]), userName: new FormControl('', [Validators.required]), // contactNo: new FormControl('', [Validators.required, Validators.maxLength(20)]), mobileNo: new FormControl('', [Validators.required, Validators.minLength(10),Validators.maxLength(10)]), @@ -62,7 +62,7 @@ export class UserFormComponent implements OnInit { this.formData.append('userName',tmp.userName) this.formData.append('email', tmp.email); this.formData.append('password', tmp.password); - this.formData.append('role', 'ADMIN'); + this.formData.append('role', tmp.role); this.formData.append('mobileNo', tmp.mobileNo); this._api.addUserFormDetails (this.formData).subscribe(res => { diff --git a/src/app/pages/users/users.component.html b/src/app/pages/users/users.component.html index 8556d27..7c461a5 100644 --- a/src/app/pages/users/users.component.html +++ b/src/app/pages/users/users.component.html @@ -1,12 +1,151 @@ - User Management +
+
+
User Management
+
+
+
+ + + +
+
+
+
+ + +
+
+
+
- - + + --> + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + Active + + + Inactive + + + + + +
+ + +
+
+ + + + + + + + + + + + +
+ + + + + +
+ + +
+
+
\ No newline at end of file diff --git a/src/app/pages/users/users.component.scss b/src/app/pages/users/users.component.scss index 88bfd33..4abbd2f 100644 --- a/src/app/pages/users/users.component.scss +++ b/src/app/pages/users/users.component.scss @@ -8,4 +8,120 @@ // ::ng-deep nb-window { // flex: 1 0 auto; // min-width: 20rem !important; -// } \ No newline at end of file +// } + +.align-left{ + text-align: left !important; +} +.align-center{ + text-align: center !important; +} +.align-right{ + text-align: right !important; +} + ::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table tbody > tr.row-even td { + background: white; + font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table thead > tr .ng-data-table-column-header .ng-data-table-column-header-label:first-child { + font-size: 18px;padding: 10px; color: #1e6bb8; + text-decoration: none; + font-family: var(--smart-table-header-font-family); + font-size: var(--smart-table-header-font-size); + font-weight: var(--smart-table-header-font-weight); + line-height: var(--smart-table-header-line-height); +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table tbody > tr.row-odd td { + + font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table-content-container .ng-data-table-content { + min-height: 100px !important; + font-size: 18px; +} +::ng-deep :not(.dark-theme) .ng-data-table-container .ng-data-table thead > tr:last-child th { + + background-color:#fff; font-family: var(--smart-table-font-family); + font-size: var(--smart-table-font-size); + font-weight: var(--smart-table-font-weight); + line-height: var(--smart-table-line-height); + color: var(--smart-table-fg); + +} +tr{ + color: white; + background-color:#fff; +} +th{ + color: white; + background-color:#fff; +} + + * { + box-sizing: border-box; + } + .row { + display: flex; + background-color:#fff; + } + + /* Create two equal columns that sits next to each other */ + .column { + flex: 50%; + // + // height: 300px; /* Should be removed. Only for demonstration */ + } + ::ng-deep .mat-select-value{ + color: white!important; } + .column1 { + width: 210px; + text-align: center; + text-overflow: ellipsis; + padding: 30px; + //height: 300px; /* Should be removed. Only for demonstration */ + } + + + .add { + display: flex; + align-items: center; + justify-content: center; + font-size: 1.75rem !important; + padding: var(--smart-table-filter-padding); + border-color: var(--smart-table-add-button-border-color); + background-color: var(--smart-table-add-button-background-color); + color: var(--smart-table-add-button-text-color); + border-radius: 0.375rem; + + font-family: var(--smart-table-header-font-family); + font-size: var(--smart-table-header-font-size); + font-weight: var(--smart-table-header-font-weight); + line-height: var(--smart-table-header-line-height); + } + span{ + + color: #000; + } + + span:hover{ + + color: #1e6bb8; + } + a[disabled="disabled"] { + pointer-events: none; +} + .check{ + display: flex; align-items: center; text-decoration: none; + height: 100%; width: 100%; font-size: 2rem!important; + } + + + \ No newline at end of file diff --git a/src/app/pages/users/users.component.ts b/src/app/pages/users/users.component.ts index c5e9270..c501674 100644 --- a/src/app/pages/users/users.component.ts +++ b/src/app/pages/users/users.component.ts @@ -26,6 +26,10 @@ export class UsersComponent { position: 'right', // left|right }, + pager : { + display : true, + perPage:5 + }, mode: 'external', add: { addButtonContent: '', @@ -61,12 +65,13 @@ export class UsersComponent { role: { title: 'Role', type: 'string', - }, + } - }, + } }; - - source: LocalDataSource = new LocalDataSource(); + filteredItems: any[]; + searchTerm: string; + public source: LocalDataSource = new LocalDataSource(); minimize = false; maximize = false; fullScreen = true; @@ -76,9 +81,11 @@ export class UsersComponent { destroyByClick = true; duration = 2000; hasIcon = true; + admin:any =[]; position: NbGlobalPosition = NbGlobalPhysicalPosition.TOP_RIGHT; preventDuplicates = false; status: NbComponentStatus = 'primary'; + constructor(private toastrService: NbToastrService,private service: SmartTableData,public _api:PageapiService,private windowService: NbWindowService) { const data = this.service.getData(); @@ -90,31 +97,36 @@ export class UsersComponent { onDeleteConfirm(event): void { console.log(event) - let passData = event.data - if (window.confirm('Are you sure you want to delete?')) { + let passData = event + // if (window.confirm('Are you sure you want to delete?')) { //event.confirm.resolve(); - let deletedata = {'isActive':0,'id':passData.id} + let deletedata = {'isActive':event.isActive,'id':passData.id} this._api.addUserFormDetails (deletedata).subscribe(res => { if (res.status == 200) { console.log(res) this.getuserlistApi(); - this.showToast('success', 'Data Removed Successfully', 'Removed User Data Completed..!'); + if(event.isActive == 1){ + this.showToast('success', 'Data Removed Successfully', 'Active User Data Completed..!'); + }else{ + this.showToast('success', 'Data Removed Successfully', 'Inactive User Data Completed..!'); + } + }else{ this.showToast('warning', 'Somthing is Wrong...!', 'Edit User Data Failed..!'); } }) - } else { - event.confirm.reject(); - } + // } else { + // event.confirm.reject(); + // } } - onCreateConfirm(event) { + onCreateConfirm() { console.log("Create Event In Console") - console.log(event); + console.log(); const buttonsConfig: NbWindowControlButtonsConfig = { minimize: this.minimize, maximize: this.maximize, @@ -154,7 +166,7 @@ export class UsersComponent { fullScreen: this.fullScreen, close: this.close, }; - const windowRef: NbWindowRef = this.windowService.open(UserFormComponent, { title: `Edit User`, context: event.data + const windowRef: NbWindowRef = this.windowService.open(UserFormComponent, { title: `Edit User`, context: event , buttons: buttonsConfig }); @@ -178,19 +190,24 @@ export class UsersComponent { getuserlistApi(){ let param ={} - this._api.getusers(param).subscribe(res => { + this._api.getusers(param).subscribe(async res => { console.log(res) if(res.status == 200){ let passData = res.data - let admin = passData.filter(arr=>{return arr.role == 'ADMIN'}) + let admin = passData.filter(arr=>{return arr.role == 'ADMIN' || arr.role == 'FRONT-OFFICE'}) admin.forEach((element:any, index) => { element.index = index +1 }); // console.log(data) - this.source.load(admin); + + this.admin = admin + + await this.source.load(admin); + this.source.setPaging(1, 10, true); + } }) } @@ -213,4 +230,54 @@ export class UsersComponent { `${titleContent}`, config); } + + filterItems() { + console.log( this.searchTerm) + + if( this.searchTerm !=''){ + + + this.filteredItems = this.admin.filter(item => + Object.values(item).some(value => { + if (typeof value === 'string') { + return value.toLowerCase().includes(this.searchTerm.toLowerCase()); + } + return false; + }) + ); + this.admin = this.filteredItems + }else{ + console.log( 'fhjsgsajdhgasksjgfcckjsdfgckjsdhfk') + + this.getuserlistApi() + } + + + + console.log( this.filteredItems) + } + + resetPassword(data){ + console.log(data) + + this.formData= new FormData(); + if(data.hasOwnProperty('id')){ + this.formData.append('id', data.id); + + } + + this.formData.append('password', 'Test@123'); + + + this._api.addUserFormDetails (this.formData).subscribe(res => { + if (res.status == 200) { +console.log(res) +this.showToast('success', 'Password Changed Successfully', ''); + + }else{ + this.showToast('warning', 'Password Changed Failed', ''); + } + }) + + } } diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 3b862d3..e5f5642 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -4,5 +4,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. */ export const environment = { + apiEndpoint:'https://dev.venbait.in/vnms/api/', production: true, }; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 8a17549..0e99785 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -1,6 +1,6 @@ /** * @license - * Copyright Akveo. All Rights Reserved. + * Copyright venba. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ // The file contents for the current environment will overwrite these during build. @@ -9,6 +9,8 @@ // The list of which env maps to which file can be found in `.angular-cli.json`. export const environment = { - apiEndpoint:'http://192.168.1.200:8081/api/', +//apiEndpoint:'https://dev.venbait.in/vnms/api/', +apiEndpoint:'http://192.168.1.29:8081/api/', + mailUrl:'', production: false, }; diff --git a/vnms-admin-14-07-2023.zip b/vnms-admin-14-07-2023.zip new file mode 100644 index 0000000..ee0e207 Binary files /dev/null and b/vnms-admin-14-07-2023.zip differ