Commit a695ebf3 by Nattana Chaiyamat

แก้ไข รายงาน Excel portal

parent ee133ebf
......@@ -28,16 +28,18 @@
"@ng-select/ng-select": "^11.0.0",
"@ngrx/store": "^16.0.1",
"@swimlane/ngx-charts": "^20.4.1",
"@syncfusion/ej2-angular-base": "26.2.10",
"@syncfusion/ej2-angular-dropdowns": "26.2.13",
"@syncfusion/ej2-angular-grids": "26.2.14",
"@syncfusion/ej2-angular-inputs": "26.2.14",
"@syncfusion/ej2-base": "26.2.10",
"@syncfusion/ej2-buttons": "26.2.10",
"@syncfusion/ej2-data": "26.2.14",
"@syncfusion/ej2-dropdowns": "26.2.13",
"@syncfusion/ej2-grids": "26.2.14",
"@syncfusion/ej2-inputs": "26.2.14",
"@syncfusion/ej2-angular-base": "^29.2.4",
"@syncfusion/ej2-angular-charts": "^29.2.4",
"@syncfusion/ej2-angular-dropdowns": "^29.2.4",
"@syncfusion/ej2-angular-grids": "^29.2.4",
"@syncfusion/ej2-angular-inputs": "^29.2.4",
"@syncfusion/ej2-angular-pivotview": "^29.2.4",
"@syncfusion/ej2-base": "^29.2.4",
"@syncfusion/ej2-buttons": "^29.2.4",
"@syncfusion/ej2-data": "^29.2.4",
"@syncfusion/ej2-dropdowns": "^29.2.4",
"@syncfusion/ej2-grids": "^29.2.4",
"@syncfusion/ej2-inputs": "^29.2.4",
"@tailwindcss/forms": "^0.5.3",
"angular-calendar": "^0.31.0",
"angular2-multiselect-dropdown": "^5.0.4",
......@@ -6392,219 +6394,282 @@
}
},
"node_modules/@syncfusion/ej2-angular-base": {
"version": "26.2.10",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-angular-base/-/ej2-angular-base-26.2.10.tgz",
"integrity": "sha512-Qf088nJx9WgWs+h52QnW3HRTWgoGBuhS2Lx4XxXmohbOLnc91KlsG8Fjwq6hRhm1nxEQvaYnY7jTjtIr1lyong==",
"version": "29.2.10",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-angular-base/-/ej2-angular-base-29.2.10.tgz",
"integrity": "sha512-jU9K1pybX7CLEkWO7ufQmGKuSBWl1rsUOm9x04BLonGNUp6fSUXOqN1niruhhOE1ZlSHGqzKp1PTjR6EmMe6Xw==",
"hasInstallScript": true,
"dependencies": {
"@syncfusion/ej2-base": "~26.2.10",
"@syncfusion/ej2-icons": "~26.2.10"
"@syncfusion/ej2-base": "~29.2.4",
"@syncfusion/ej2-icons": "~29.2.4"
}
},
"node_modules/@syncfusion/ej2-angular-charts": {
"version": "29.2.11",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-angular-charts/-/ej2-angular-charts-29.2.11.tgz",
"integrity": "sha512-cO4vSTpDQxy4rdvEb1OlSRT2270YCBAUH9pdz9EhZI4lz3XCgcXL/ztv4D3V2MggvPQWU9yOpqjKv1Hg9EwrvQ==",
"dependencies": {
"@syncfusion/ej2-angular-base": "~29.2.10",
"@syncfusion/ej2-base": "~29.2.11",
"@syncfusion/ej2-charts": "29.2.11"
}
},
"node_modules/@syncfusion/ej2-angular-dropdowns": {
"version": "26.2.13",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-angular-dropdowns/-/ej2-angular-dropdowns-26.2.13.tgz",
"integrity": "sha512-VC47xbgnwqrZOlRwXc+jqm70JklMF8oDmce76afPm1hRX2A7jSJiZt11T5o4+PQOUXrD5mcwvyruZRgyhbZ0Xw==",
"version": "29.2.11",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-angular-dropdowns/-/ej2-angular-dropdowns-29.2.11.tgz",
"integrity": "sha512-RHqkitoaf+d34iBJJSbrbvB+9+B1ILPxYzxR0V+k/wThMd6XXYN8/vCO3g0KrG9vRB/OGOY6JjRJ5YPG9sP2/g==",
"dependencies": {
"@syncfusion/ej2-angular-base": "~26.2.10",
"@syncfusion/ej2-base": "~26.2.10",
"@syncfusion/ej2-dropdowns": "26.2.13",
"tslib": "^2.3.0"
"@syncfusion/ej2-angular-base": "~29.2.10",
"@syncfusion/ej2-base": "~29.2.11",
"@syncfusion/ej2-dropdowns": "29.2.11"
}
},
"node_modules/@syncfusion/ej2-angular-grids": {
"version": "26.2.14",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-angular-grids/-/ej2-angular-grids-26.2.14.tgz",
"integrity": "sha512-PUY0j4+SIMnJR2h/txj9HmtHnjk/s7Qjd0LthFyNfZQnUXmUPezON0fMWokeRb8Fi1qokjCSASKtc/pGu/2uGw==",
"version": "29.2.11",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-angular-grids/-/ej2-angular-grids-29.2.11.tgz",
"integrity": "sha512-b3LEMk0ol6+crlYtslaPsKGiVoS/XFU/M/koNiyxuX932qntjhMhyPQQW1sYap96u3lzTW9wef6/Y3aye7qnqQ==",
"dependencies": {
"@syncfusion/ej2-angular-base": "~26.2.10",
"@syncfusion/ej2-base": "~26.2.10",
"@syncfusion/ej2-grids": "26.2.14",
"tslib": "^2.3.0"
"@syncfusion/ej2-angular-base": "~29.2.10",
"@syncfusion/ej2-base": "~29.2.11",
"@syncfusion/ej2-grids": "29.2.11"
}
},
"node_modules/@syncfusion/ej2-angular-inputs": {
"version": "26.2.14",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-angular-inputs/-/ej2-angular-inputs-26.2.14.tgz",
"integrity": "sha512-k5Zw1o/V2zq8filYs2i2SnbVHnHvv72VMx0jscGqA7upha4Ztj3TboZHy+lYAPLc5Pe17iIggDecwlqt6Te7Ww==",
"version": "29.2.5",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-angular-inputs/-/ej2-angular-inputs-29.2.5.tgz",
"integrity": "sha512-839rdXnftfuXQXeLE/u3InLwNmjR/NiQifM7F1BY6ZfoKNAm2jfZMI+t3sX7j87/DBIeUPaUkJNhkjjhl1b2Jg==",
"dependencies": {
"@syncfusion/ej2-angular-base": "~26.2.10",
"@syncfusion/ej2-base": "~26.2.10",
"@syncfusion/ej2-inputs": "26.2.14",
"tslib": "^2.3.0"
"@syncfusion/ej2-angular-base": "~29.2.4",
"@syncfusion/ej2-base": "~29.2.4",
"@syncfusion/ej2-inputs": "29.2.5"
}
},
"node_modules/@syncfusion/ej2-angular-pivotview": {
"version": "29.2.4",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-angular-pivotview/-/ej2-angular-pivotview-29.2.4.tgz",
"integrity": "sha512-hodqoX+tMn2sShPWRaVny3cyJN24CYU5oHnnZUyjkEKrjz7v6iAmCVHzuxqTQczZHUXaGqKvekF/ZfwEdStZNQ==",
"dependencies": {
"@syncfusion/ej2-angular-base": "~29.2.4",
"@syncfusion/ej2-base": "~29.2.4",
"@syncfusion/ej2-pivotview": "29.2.4"
}
},
"node_modules/@syncfusion/ej2-base": {
"version": "26.2.10",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-base/-/ej2-base-26.2.10.tgz",
"integrity": "sha512-i7TCvXGNsHmCoLA9AlHn3dIAyH8Bce6KCZUGshJS0EKu623SkVKjvWVWtgfar75/8SbTGWZQlGqEW5egYm3uTA==",
"version": "29.2.11",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-base/-/ej2-base-29.2.11.tgz",
"integrity": "sha512-f1yM+6606zde7MR4q4d/q6foR3viHDA1/SkkTbLVwBME7I/0AcMG/i0eeTWJfJS8dgn91DGrsrEl0nZ9IA1CEQ==",
"dependencies": {
"@syncfusion/ej2-icons": "~26.2.10"
"@syncfusion/ej2-icons": "~29.2.4"
},
"bin": {
"syncfusion-license": "bin/syncfusion-license.js"
}
},
"node_modules/@syncfusion/ej2-buttons": {
"version": "26.2.10",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-buttons/-/ej2-buttons-26.2.10.tgz",
"integrity": "sha512-WcErxTAI9r5PQQSOQNSWsaKfzYdSww+YeQaT4SO1xItMPDAEhWSqscnTMk46vDg6w5vRbAbB1US+3BAXJtOS1w==",
"version": "29.2.5",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-buttons/-/ej2-buttons-29.2.5.tgz",
"integrity": "sha512-FbMi9rUi/7i8mpPA6KRaO7qW/3wIeH759u2/Ag0iMQUEdtdK7NvOCSFF29WESeBjW6GmEJ8zkW0340ymgXZruQ==",
"dependencies": {
"@syncfusion/ej2-base": "~26.2.10"
"@syncfusion/ej2-base": "~29.2.4"
}
},
"node_modules/@syncfusion/ej2-calendars": {
"version": "26.2.12",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-calendars/-/ej2-calendars-26.2.12.tgz",
"integrity": "sha512-6sAauvGexP2Wg7FodNi6ewna1JRyKS7VuKfPYh5Q6i3xrq0AvgxiZk7xaL3oq+U3t59w/de/S+eq4cpQSpI93Q==",
"version": "29.2.11",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-calendars/-/ej2-calendars-29.2.11.tgz",
"integrity": "sha512-RphIYxXwaDv59QiYjswIntNyDxOqd3oQqi2G9Z3zRD+Ez1u+ybY9koaWbj5Dq/5AsFhdNCwHhyEPX9gACZMsvA==",
"dependencies": {
"@syncfusion/ej2-base": "~29.2.11",
"@syncfusion/ej2-buttons": "~29.2.5",
"@syncfusion/ej2-inputs": "~29.2.5",
"@syncfusion/ej2-lists": "~29.2.4",
"@syncfusion/ej2-popups": "~29.2.8"
}
},
"node_modules/@syncfusion/ej2-charts": {
"version": "29.2.11",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-charts/-/ej2-charts-29.2.11.tgz",
"integrity": "sha512-OJ3BlnrPVC/p2rEQvv2l9RtjnAAZu8aszLVVuWlXi3ivjbt9MZb4AiA6f8alHDxKFbfUKoOnTnx/wGLNHUqmTA==",
"dependencies": {
"@syncfusion/ej2-base": "~26.2.10",
"@syncfusion/ej2-buttons": "~26.2.10",
"@syncfusion/ej2-inputs": "~26.2.11",
"@syncfusion/ej2-lists": "~26.2.11",
"@syncfusion/ej2-popups": "~26.2.11"
"@syncfusion/ej2-base": "~29.2.11",
"@syncfusion/ej2-calendars": "~29.2.11",
"@syncfusion/ej2-data": "~29.2.4",
"@syncfusion/ej2-excel-export": "~29.2.4",
"@syncfusion/ej2-navigations": "~29.2.8",
"@syncfusion/ej2-pdf-export": "~29.2.4",
"@syncfusion/ej2-svg-base": "~29.2.4"
}
},
"node_modules/@syncfusion/ej2-compression": {
"version": "26.2.10",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-compression/-/ej2-compression-26.2.10.tgz",
"integrity": "sha512-cCcABW1SUG+O8lGKzAj3zi7yLguslFVxEFSfMk9GWajC9SNgzICiKo7HR8Sz3HG9M4tmrH5aNKqM2mbYG6Lr0Q==",
"version": "29.2.4",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-compression/-/ej2-compression-29.2.4.tgz",
"integrity": "sha512-mcgFmgtITGxoX4zV4LrFGAOHOQD8Z7is85vQE+k2Bf4OI6rZsLNIQFm6KEFg+sZMOSrABzKzg49yrktmlus4TQ==",
"dependencies": {
"@syncfusion/ej2-file-utils": "~26.2.10"
"@syncfusion/ej2-file-utils": "~29.2.4"
}
},
"node_modules/@syncfusion/ej2-data": {
"version": "26.2.14",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-data/-/ej2-data-26.2.14.tgz",
"integrity": "sha512-KJ5JsRwBbKjNLkFvkLgUz5SkC4zTJxS40mmBdWJTTROopKYjcHAe9HJxQJmJUOy/gxqfx5iPINVJaArqdtpPeQ==",
"version": "29.2.4",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-data/-/ej2-data-29.2.4.tgz",
"integrity": "sha512-2R+N65OPq+yfwTXyBz7NdD8MHGoxUbJSEWGT0kNEGMiobiI4AL+hfMYEhXWXE+DqL5Pm0txA4gTXQprFXXbccg==",
"dependencies": {
"@syncfusion/ej2-base": "~26.2.10"
"@syncfusion/ej2-base": "~29.2.4"
}
},
"node_modules/@syncfusion/ej2-dropdowns": {
"version": "26.2.13",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-dropdowns/-/ej2-dropdowns-26.2.13.tgz",
"integrity": "sha512-aRQyN5unJz2bnXL90zuE23rG5l8Q4y24ymigL33chsa+bWQw7Fx8MCHXqNostzo2A4qtsL6FLT7MoCOnGYpmkg==",
"version": "29.2.11",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-dropdowns/-/ej2-dropdowns-29.2.11.tgz",
"integrity": "sha512-NtWQexED+1T4Ef/vPkG+C9ANkUD3QPvXelyQaS2+j+mzipOhSBGiDcJYIE1R1wtqC3BhLfMZBPJbuXGc0p+mmQ==",
"dependencies": {
"@syncfusion/ej2-base": "~26.2.10",
"@syncfusion/ej2-data": "~26.2.10",
"@syncfusion/ej2-inputs": "~26.2.13",
"@syncfusion/ej2-lists": "~26.2.11",
"@syncfusion/ej2-navigations": "~26.2.12",
"@syncfusion/ej2-notifications": "~26.2.10",
"@syncfusion/ej2-popups": "~26.2.11"
"@syncfusion/ej2-base": "~29.2.11",
"@syncfusion/ej2-data": "~29.2.4",
"@syncfusion/ej2-inputs": "~29.2.5",
"@syncfusion/ej2-lists": "~29.2.4",
"@syncfusion/ej2-navigations": "~29.2.8",
"@syncfusion/ej2-notifications": "~29.2.4",
"@syncfusion/ej2-popups": "~29.2.8"
}
},
"node_modules/@syncfusion/ej2-excel-export": {
"version": "26.2.11",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-excel-export/-/ej2-excel-export-26.2.11.tgz",
"integrity": "sha512-R0Q3QXXEDvdRrWrQIIxuGcJJCLPqrJpSlvGIw9SNmaB4FCOxDhgqHjrzorAremGw4e4Ke9lq0S5MZhaPU9Tebg==",
"version": "29.2.4",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-excel-export/-/ej2-excel-export-29.2.4.tgz",
"integrity": "sha512-N3VAdlhP+Wq/Uyl82ZSx6x8zL3slgtEKzWb13nrfas7cdJicYrbx02YZru5/euaeE3yGTlbKmhjjLLbkVFU/kQ==",
"dependencies": {
"@syncfusion/ej2-base": "~26.2.10",
"@syncfusion/ej2-compression": "~26.2.10"
"@syncfusion/ej2-base": "~29.2.4",
"@syncfusion/ej2-compression": "~29.2.4"
}
},
"node_modules/@syncfusion/ej2-file-utils": {
"version": "26.2.10",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-file-utils/-/ej2-file-utils-26.2.10.tgz",
"integrity": "sha512-sHWGPT6PrZcNKqNl27tfntEMjL6Ctr2dbTtsacTnlf68tM1dGyYSdKuGtE/Rhn866oCCCKyRvTmItEeh6MINOw=="
"version": "29.2.4",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-file-utils/-/ej2-file-utils-29.2.4.tgz",
"integrity": "sha512-nnvZ+1xVULe418habMciZnDAoMOM+TqFaFpO9kf4Cct9RPYUr22Tsvu84CZI7yzzKj/dLfD4n5TRRCHVo+5vVA=="
},
"node_modules/@syncfusion/ej2-grids": {
"version": "26.2.14",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-grids/-/ej2-grids-26.2.14.tgz",
"integrity": "sha512-2dmXpp3z2dFMKKy6aCyXmtGpBHA2vRH8ygd0aRm+YwVX1H3HLeHHhkODyCDDzUpN2TX9Pt0/0qzX1tP3Crnnwg==",
"dependencies": {
"@syncfusion/ej2-base": "~26.2.10",
"@syncfusion/ej2-buttons": "~26.2.10",
"@syncfusion/ej2-calendars": "~26.2.12",
"@syncfusion/ej2-compression": "~26.2.10",
"@syncfusion/ej2-data": "~26.2.14",
"@syncfusion/ej2-dropdowns": "~26.2.13",
"@syncfusion/ej2-excel-export": "~26.2.11",
"@syncfusion/ej2-file-utils": "~26.2.10",
"@syncfusion/ej2-inputs": "~26.2.14",
"@syncfusion/ej2-lists": "~26.2.14",
"@syncfusion/ej2-navigations": "~26.2.12",
"@syncfusion/ej2-notifications": "~26.2.10",
"@syncfusion/ej2-pdf-export": "~26.2.14",
"@syncfusion/ej2-popups": "~26.2.11",
"@syncfusion/ej2-splitbuttons": "~26.2.10"
"version": "29.2.11",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-grids/-/ej2-grids-29.2.11.tgz",
"integrity": "sha512-11jI7ve/qxQVsA4kP+v0Y1bEfO7kFCCtBekag80Fy+yio88Wcr5c1Q9SxgsmZtX+Kzk6oSymS497/zNcBDsUJw==",
"dependencies": {
"@syncfusion/ej2-base": "~29.2.11",
"@syncfusion/ej2-buttons": "~29.2.5",
"@syncfusion/ej2-calendars": "~29.2.11",
"@syncfusion/ej2-compression": "~29.2.4",
"@syncfusion/ej2-data": "~29.2.4",
"@syncfusion/ej2-dropdowns": "~29.2.11",
"@syncfusion/ej2-excel-export": "~29.2.4",
"@syncfusion/ej2-file-utils": "~29.2.4",
"@syncfusion/ej2-inputs": "~29.2.5",
"@syncfusion/ej2-lists": "~29.2.4",
"@syncfusion/ej2-navigations": "~29.2.8",
"@syncfusion/ej2-notifications": "~29.2.4",
"@syncfusion/ej2-pdf-export": "~29.2.4",
"@syncfusion/ej2-popups": "~29.2.8",
"@syncfusion/ej2-splitbuttons": "~29.2.4"
}
},
"node_modules/@syncfusion/ej2-icons": {
"version": "26.2.10",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-icons/-/ej2-icons-26.2.10.tgz",
"integrity": "sha512-ay+kr1oVqBOCe9MwJ0vjXS85CDAA5XwtwKb/Gf8cdz79IpsX/1VOvqOBofYu1+OPfbMX9w9mCLciNCMPCaRZFA=="
"version": "29.2.4",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-icons/-/ej2-icons-29.2.4.tgz",
"integrity": "sha512-2DYZglxLM++w0S2wB2bcr/Akk1MODdVhfFYLaLqe6mDHDRicFeTEyvnGPx2SHS2EXXlNNFm2GfNWoNNxgs5MhQ=="
},
"node_modules/@syncfusion/ej2-inputs": {
"version": "26.2.14",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-inputs/-/ej2-inputs-26.2.14.tgz",
"integrity": "sha512-Lo8pqhhhCT30PVzj+gX6idPySSq4R0Sh36vnMZ7ubxf46rbg0Bw7Ftov8mPP9lLQSql+ixLYTjVpTEP1b9UIuA==",
"version": "29.2.5",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-inputs/-/ej2-inputs-29.2.5.tgz",
"integrity": "sha512-3ZqMl005qL0tENHcKvBfKUHMYQ/S0FRYjUDQVDPRsg28tE0Lz87oyamrxLYne3zDBEJ7kxWWnaNpgrTVvxsVNw==",
"dependencies": {
"@syncfusion/ej2-base": "~26.2.10",
"@syncfusion/ej2-buttons": "~26.2.10",
"@syncfusion/ej2-popups": "~26.2.11",
"@syncfusion/ej2-splitbuttons": "~26.2.10"
"@syncfusion/ej2-base": "~29.2.4",
"@syncfusion/ej2-buttons": "~29.2.5",
"@syncfusion/ej2-popups": "~29.2.4",
"@syncfusion/ej2-splitbuttons": "~29.2.4"
}
},
"node_modules/@syncfusion/ej2-lists": {
"version": "26.2.14",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-lists/-/ej2-lists-26.2.14.tgz",
"integrity": "sha512-8tQdVIzbHYcCjxYns57etpoJvTTp3lMY2bExbD4agZij1mdgGv/PMdp29RepcnSZMw6FsX6Eqp2hriXzrwL6Lg==",
"version": "29.2.4",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-lists/-/ej2-lists-29.2.4.tgz",
"integrity": "sha512-U64nGdZMjnhHG/+YCTF+WhJ3BoUxFyN2DXxv2qlC+wtayMbfioDRwqSQgxTkH8XE4TgrkRFenRtj5SbYLKliSw==",
"dependencies": {
"@syncfusion/ej2-base": "~26.2.10",
"@syncfusion/ej2-buttons": "~26.2.10",
"@syncfusion/ej2-data": "~26.2.14",
"@syncfusion/ej2-popups": "~26.2.11"
"@syncfusion/ej2-base": "~29.2.4",
"@syncfusion/ej2-buttons": "~29.2.4",
"@syncfusion/ej2-data": "~29.2.4",
"@syncfusion/ej2-popups": "~29.2.4"
}
},
"node_modules/@syncfusion/ej2-navigations": {
"version": "26.2.12",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-navigations/-/ej2-navigations-26.2.12.tgz",
"integrity": "sha512-SAFkU75y/SZTSsrE+NyWX/+1HqyYr2sqARFAqXKu87mfYDsxVjsroSXQuDEbwRRujCr3reR0znEkW/zQ+RM5mA==",
"version": "29.2.8",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-navigations/-/ej2-navigations-29.2.8.tgz",
"integrity": "sha512-u14J+dEocqGIKgWCC1eiATv1nh40dgILsGPpGbYS+h9Y7y4YMBRzL2UCcuNHXgPKL7SiJ5lCaVORFco8cxyh6A==",
"dependencies": {
"@syncfusion/ej2-base": "~26.2.10",
"@syncfusion/ej2-buttons": "~26.2.10",
"@syncfusion/ej2-data": "~26.2.10",
"@syncfusion/ej2-inputs": "~26.2.11",
"@syncfusion/ej2-lists": "~26.2.11",
"@syncfusion/ej2-popups": "~26.2.11"
"@syncfusion/ej2-base": "~29.2.4",
"@syncfusion/ej2-buttons": "~29.2.5",
"@syncfusion/ej2-data": "~29.2.4",
"@syncfusion/ej2-inputs": "~29.2.5",
"@syncfusion/ej2-lists": "~29.2.4",
"@syncfusion/ej2-popups": "~29.2.8"
}
},
"node_modules/@syncfusion/ej2-notifications": {
"version": "26.2.10",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-notifications/-/ej2-notifications-26.2.10.tgz",
"integrity": "sha512-TXpsKfTK7lERvvFNOcEB7n7veNLIEUMM9SY1Ihk06fl+YJa4YGL6aSVUvQJilE8PJyFeu4MpPN6bmVvEM01NCw==",
"version": "29.2.4",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-notifications/-/ej2-notifications-29.2.4.tgz",
"integrity": "sha512-rB9OuGHWVfnl9aBno+4KRH3aESbakLKYT70V7wjTxwS7u11XbxYwLiA4/YKsTQg/zrgOtcr3Ma1sVOeMYW17gQ==",
"dependencies": {
"@syncfusion/ej2-base": "~26.2.10",
"@syncfusion/ej2-buttons": "~26.2.10",
"@syncfusion/ej2-popups": "~26.2.10"
"@syncfusion/ej2-base": "~29.2.4",
"@syncfusion/ej2-buttons": "~29.2.4",
"@syncfusion/ej2-popups": "~29.2.4"
}
},
"node_modules/@syncfusion/ej2-pdf-export": {
"version": "26.2.14",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-pdf-export/-/ej2-pdf-export-26.2.14.tgz",
"integrity": "sha512-sO2F2jUgmm8uNx1dAyFp+cz00UAU7mMM5p1ulQi8K2Km+mN90A9eZNcKzCBABX21anJqaXOgaicZHhOrqP2BTg==",
"dependencies": {
"@syncfusion/ej2-compression": "~26.2.10"
"version": "29.2.4",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-pdf-export/-/ej2-pdf-export-29.2.4.tgz",
"integrity": "sha512-Cb5QKYqhuvEb96DzqJT6/nLuan8FkA40mU4Lggg5Ujo1OdIK3Ca5GolM7HStTct4DnU02UKuXTrqoL5umGTfKQ==",
"dependencies": {
"@syncfusion/ej2-compression": "~29.2.4"
}
},
"node_modules/@syncfusion/ej2-pivotview": {
"version": "29.2.4",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-pivotview/-/ej2-pivotview-29.2.4.tgz",
"integrity": "sha512-C0u+4M+geatx8iTC75G9e7R7YIsVgt+HNmm6tuqWmPC2cjy5KCrdR/D/e6G+FkFrVa8WWUk+MfVmivfDAnsFIA==",
"dependencies": {
"@syncfusion/ej2-base": "~29.2.4",
"@syncfusion/ej2-buttons": "~29.2.4",
"@syncfusion/ej2-calendars": "~29.2.4",
"@syncfusion/ej2-charts": "~29.2.4",
"@syncfusion/ej2-compression": "~29.2.4",
"@syncfusion/ej2-data": "~29.2.4",
"@syncfusion/ej2-dropdowns": "~29.2.4",
"@syncfusion/ej2-excel-export": "~29.2.4",
"@syncfusion/ej2-file-utils": "~29.2.4",
"@syncfusion/ej2-grids": "~29.2.4",
"@syncfusion/ej2-inputs": "~29.2.4",
"@syncfusion/ej2-lists": "~29.2.4",
"@syncfusion/ej2-navigations": "~29.2.4",
"@syncfusion/ej2-pdf-export": "~29.2.4",
"@syncfusion/ej2-popups": "~29.2.4",
"@syncfusion/ej2-splitbuttons": "~29.2.4",
"@syncfusion/ej2-svg-base": "~29.2.4"
}
},
"node_modules/@syncfusion/ej2-popups": {
"version": "26.2.11",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-popups/-/ej2-popups-26.2.11.tgz",
"integrity": "sha512-JMIj3JLSgc6pjN3gAydCruD+DXyH565g5R+5jHsI78BfeDu+/uTdunm7May5zMgr2AmFAKOE6VdQhjEyr3/DJg==",
"version": "29.2.8",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-popups/-/ej2-popups-29.2.8.tgz",
"integrity": "sha512-LsXfTiFd6dyoE8XIxFOgC24TeQCqgLdjp3VOg0tWvyuWiZ/skH2sBlF2Y1CWqNJS07OKhtcjLY1h446RTBlalQ==",
"dependencies": {
"@syncfusion/ej2-base": "~26.2.10",
"@syncfusion/ej2-buttons": "~26.2.10"
"@syncfusion/ej2-base": "~29.2.4",
"@syncfusion/ej2-buttons": "~29.2.5"
}
},
"node_modules/@syncfusion/ej2-splitbuttons": {
"version": "26.2.10",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-splitbuttons/-/ej2-splitbuttons-26.2.10.tgz",
"integrity": "sha512-uvGS9e4K0qcVxhzFBP9VheWrAgOFciSLyHo1qcxgxAyOhuqVhBeBZgmjBiFXXwJHiSW9FM37FQVV0iD0LcVEnw==",
"version": "29.2.4",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-splitbuttons/-/ej2-splitbuttons-29.2.4.tgz",
"integrity": "sha512-sZKs0IZJ6+rDK2OLRl+m5Rs1ai84GE9NV2hpDG5CPFv5uM5WoOf33qYOyp6BSuBerpobpycoXDWH/mh1fZSCDw==",
"dependencies": {
"@syncfusion/ej2-base": "~29.2.4",
"@syncfusion/ej2-popups": "~29.2.4"
}
},
"node_modules/@syncfusion/ej2-svg-base": {
"version": "29.2.4",
"resolved": "https://registry.npmjs.org/@syncfusion/ej2-svg-base/-/ej2-svg-base-29.2.4.tgz",
"integrity": "sha512-rLEnJTBQ1AxmfiBo4T/sGwG0fOTVPyLVa3NDMx9Bre6yIjEbezHyRu5ujrFubgVDNLQZ1StkEnGlGVduPrr3fA==",
"dependencies": {
"@syncfusion/ej2-base": "~26.2.10",
"@syncfusion/ej2-popups": "~26.2.10"
"@syncfusion/ej2-base": "~29.2.4"
}
},
"node_modules/@tailwindcss/forms": {
......
......@@ -188,6 +188,22 @@ import { ReportPms2Component } from '../report-component/report-pms/report-pms-2
import { ReportPms3Component } from '../report-component/report-pms/report-pms-3/report-pms-3.component';
import { EssProfileComponent } from '../ess-profile/ess-profile.component';
import { ExcelReportComponent } from '../excel-report/excel-report.component';
import { PivotSyncfutionComponent } from '../pivot-syncfution/pivot-syncfution.component';
import { CalculatedFieldService, ConditionalFormattingService, DrillThroughService, FieldListService, GroupingBarService, NumberFormattingService, PivotFieldListModule, PivotViewModule, ToolbarService, VirtualScrollService } from '@syncfusion/ej2-angular-pivotview';
import {
ChartModule,
LineSeriesService,
ColumnSeriesService,
CategoryService,
LegendService,
TooltipService
} from '@syncfusion/ej2-angular-charts';
import {
ResizeService,
SortService,
PageService,
FilterService,
} from '@syncfusion/ej2-angular-grids';
export const MY_DATE_FORMATS = {
parse: {
......@@ -332,7 +348,8 @@ export class CustomDateAdapter extends NativeDateAdapter {
ReportPms2Component,
ReportPms3Component,
EssProfileComponent,
ExcelReportComponent
ExcelReportComponent,
PivotSyncfutionComponent
],
imports: [
CommonModule,
......@@ -357,6 +374,7 @@ export class CustomDateAdapter extends NativeDateAdapter {
RatingModule,
MatDialogModule,
BarRatingModule,
PivotViewModule,
NgxEchartsModule.forRoot({ // ✅ โหลด ECharts เพียงครั้งเดียว
echarts: () => import('echarts')
})
......@@ -408,7 +426,23 @@ export class CustomDateAdapter extends NativeDateAdapter {
EmpStatusService,
ConfigPermissionService,
TokenService,
FieldListService,
CalculatedFieldService,
ConditionalFormattingService,
NumberFormattingService,
ToolbarService,
GroupingBarService,
DrillThroughService,
VirtualScrollService,
LineSeriesService,
ColumnSeriesService,
CategoryService,
LegendService,
TooltipService,
ResizeService,
SortService,
PageService,
FilterService,
{
provide: HTTP_INTERCEPTORS,
useClass: HttpRequestInterceptor,
......
......@@ -164,6 +164,10 @@ export class DatagridSyncfutionComponent implements OnInit {
@Input() showImg = false
@Input() sendLayout = false
@Input() gridLayout = ''
@Output() layout = new EventEmitter<any>();
constructor(private cdr: ChangeDetectorRef,
private fileService: FileService
) {
......@@ -186,6 +190,20 @@ export class DatagridSyncfutionComponent implements OnInit {
this.dataSourceSearch = JSON.parse(JSON.stringify(this.dataSource || []))
this.dataSourceFilter = JSON.parse(JSON.stringify(this.dataSource || []))
}
if (changes['gridLayout']) {
if (changes['gridLayout'].currentValue) {
const layout = JSON.parse(changes['gridLayout'].currentValue)
this.grid?.setProperties(layout)
}
}
if (changes['sendLayout']) {
if (this.grid) {
const layout = this.grid?.getPersistData();
if (layout) {
this.layout.emit(layout)
}
}
}
}
}
onSelectData(args: any) {
......
......@@ -22,10 +22,10 @@
</label>
<div class="col-span-8 md:col-span-4" [class.ti-pagination]="item.type=='radio'">
<ng-container *ngIf="item.type=='text'">
<input type="text" class="ti-form-input h-16" [(ngModel)]="item.value">
<input type="text" class="ti-form-input h-16" [(ngModel)]="select[item.key]">
</ng-container>
<ng-container *ngIf="item.type=='list'">
<select class="ti-form-select h-16" [(ngModel)]="item.value">
<select class="ti-form-select h-16" [(ngModel)]="select[item.key]">
<option *ngFor="let list of item.option" [value]="list.value">
{{list.text}}
</option>
......@@ -37,14 +37,14 @@
<div class="grid col-span-3 grid-cols-6 gap-2">
<div class="col-span-1 ti-pagination ">
<input type="checkbox" class="ti-form-checkbox" [id]="'radioItem'+i"
[class.pointer-events-none]="item.value==radioItem.value"
[class.pointer-events-none]="select[item.key]==radioItem.value"
[name]="'radioItem'+item.label"
(change)="item.value=radioItem.value"
[checked]="item.value==radioItem.value">
(change)="select[item.key]=radioItem.value"
[checked]="select[item.key]==radioItem.value">
</div>
<div class="col-span-5 ti-pagination ">
<label [for]="'radioItem'+i" class="text-sm text-gray-500"
[class.pointer-events-none]="item.value==radioItem.value">
[class.pointer-events-none]="select[item.key]==radioItem.value">
{{radioItem.text}}
</label>
</div>
......@@ -55,11 +55,11 @@
<ng-container *ngIf="item.type=='help'">
<div class="relative flex rounded-md">
<input type="text" class="ti-form-input h-16" readonly
[(ngModel)]="item.value.tdesc">
[(ngModel)]="select[item.key].tdesc">
<div
class="absolute inset-y-0 ltr:right-0 rtl:left-0 flex items-center z-20 ltr:pr-4 rtl:pl-4 space-x-2">
<button type="button" class="flex items-center text-red-500"
(click)="item.value.tdesc=''" style="font-size: 17px;">
(click)="select[item.key]={id:'',tdesc:'',edesc:''}" style="font-size: 17px;">
<i class=" ti ti-circle-x cursor-pointer"></i>
</button>
<button type="button"
......@@ -95,10 +95,20 @@
<ng-container *ngIf="variableSheet.length&&!loadingExcel">
<div class="flex justify-center mb-1rem space-x-4">
<button type="submit" class="ti-btn ti-btn-secondary" [class.ti-btn-disabled]="loadingExcel"
(click)="getExcelData('grid')" [disabled]="loadingExcel">
Datagrid
</button>
<button type="submit" class="ti-btn ti-btn-secondary" [class.ti-btn-disabled]="loadingExcel"
(click)="getExcelData('pivot')" [disabled]="loadingExcel">
Pivot
</button>
</div>
<!-- <div class="flex justify-center mb-1rem space-x-4">
<button type="submit" class="ti-btn ti-btn-secondary" [class.ti-btn-disabled]="loadingExcel"
(click)="dowloadExcelReport()" [disabled]="loadingExcel">
พิมพ์
</button>
</div>
</div> -->
</ng-container>
<ng-container *ngIf="variableSheet.length&&loadingExcel">
<div class="flex justify-center">
......@@ -179,3 +189,60 @@
</button>
</mat-dialog-actions>
</ng-template>
<ng-template #girdModal let-modal>
<h3 mat-dialog-title>
GridData
</h3>
<mat-dialog-content>
<app-datagrid-syncfution [checkBoxSetting]='false' [actionSetting]="false" [searchSettings]="searchSettings"
[dataSource]="dataList" [columns]="columns" [gridLayout]="setPerspective"
[sendLayout]="gridLayout.stimulate" (layout)="gridLayout.data=$event">
</app-datagrid-syncfution>
</mat-dialog-content>
<mat-dialog-actions align="end">
<button *ngIf="!loadingExcel" type="button"
class="hs-dropdown-toggle ti-btn ti-border font-medium bg-white text-gray-700 shadow-sm align-middle hover:bg-gray-50 focus:ring-offset-white focus:ring-primary dark:bg-bgdark dark:hover:bg-black/20 dark:border-white/10 dark:text-white/70 dark:hover:text-white dark:focus:ring-offset-white/10"
(click)="gridLayout.stimulate=!gridLayout.stimulate;savePerspective('grid')">
{{"Save Perspective"}}
</button>
<button *ngIf="!loadingExcel" type="button" mat-button [mat-dialog-close]
class="hs-dropdown-toggle ti-btn ti-border font-medium bg-white text-gray-700 shadow-sm align-middle hover:bg-gray-50 focus:ring-offset-white focus:ring-primary dark:bg-bgdark dark:hover:bg-black/20 dark:border-white/10 dark:text-white/70 dark:hover:text-white dark:focus:ring-offset-white/10">
ย้อนกลับ
</button>
<div *ngIf="loadingExcel" class="flex justify-center">
<div *ngFor="let item of [1,2,3]" class="ti-spinner w-8 h-8 text-secondary mx-1" role="status"
aria-label="loading">
<span class="sr-only">Loading...</span>
</div>
</div>
</mat-dialog-actions>
</ng-template>
<ng-template #pivotModal let-modal>
<h3 mat-dialog-title>
Pivot
</h3>
<mat-dialog-content>
<app-pivot-syncfution [dataSource]="dataList" [columns]="pivotColumns" [pivotLayout]="setPerspective"
[sendLayout]="pivotLayout.stimulate" (layout)="pivotLayout.data=$event">
</app-pivot-syncfution>
</mat-dialog-content>
<mat-dialog-actions align="end">
<button *ngIf="!loadingExcel" type="button"
class="hs-dropdown-toggle ti-btn ti-border font-medium bg-white text-gray-700 shadow-sm align-middle hover:bg-gray-50 focus:ring-offset-white focus:ring-primary dark:bg-bgdark dark:hover:bg-black/20 dark:border-white/10 dark:text-white/70 dark:hover:text-white dark:focus:ring-offset-white/10"
(click)="pivotLayout.stimulate=!pivotLayout.stimulate;savePerspective('pivot')">
{{"Save Perspective"}}
</button>
<button *ngIf="!loadingExcel" type="button" mat-button [mat-dialog-close]
class="hs-dropdown-toggle ti-btn ti-border font-medium bg-white text-gray-700 shadow-sm align-middle hover:bg-gray-50 focus:ring-offset-white focus:ring-primary dark:bg-bgdark dark:hover:bg-black/20 dark:border-white/10 dark:text-white/70 dark:hover:text-white dark:focus:ring-offset-white/10">
ย้อนกลับ
</button>
<div *ngIf="loadingExcel" class="flex justify-center">
<div *ngFor="let item of [1,2,3]" class="ti-spinner w-8 h-8 text-secondary mx-1" role="status"
aria-label="loading">
<span class="sr-only">Loading...</span>
</div>
</div>
</mat-dialog-actions>
</ng-template>
\ No newline at end of file
import { ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { ActivatedRoute } from '@angular/router';
import { Subscription } from 'rxjs';
import { forkJoin, Subscription } from 'rxjs';
import { CustomCubeService } from 'src/app/shared/services/custom-cube.service';
import { ExcelReportService } from 'src/app/shared/services/excel-report.service';
import { ColumnModel } from '@syncfusion/ej2-grids';
import Swal from 'sweetalert2';
export interface ModalDetail {
text: { cardHead: string, search: string[], tableHead: string[] }
}
......@@ -40,9 +42,25 @@ export class ExcelReportComponent implements OnInit {
pathTitle = ['รายงาน Excel', 'รายงาน Excel 1']
excelReportServiceSub?: Subscription
@ViewChild("girdModal") girdModal: any;
@ViewChild("pivotModal") pivotModal: any;
columns: ColumnModel[] = []
pivotColumns: any[] = []
dataList: any[] = []
gridLayout: { stimulate: boolean, data: string } = { stimulate: false, data: '' }
pivotLayout: { stimulate: boolean, data: string } = { stimulate: false, data: '' }
setPerspective = ""
searchSettings = {
fields: [],
operator: 'contains',
ignoreCase: false
};
constructor(private route: ActivatedRoute,
private excelReportService: ExcelReportService,
private cdr: ChangeDetectorRef,
private customCubeService: CustomCubeService,
private dialog: MatDialog,
) {
......@@ -77,6 +95,7 @@ export class ExcelReportComponent implements OnInit {
this.loadingExcel = false
this.excelReportService.getTemplateFile(templateId, fileName).subscribe((res: any) => {
this.excelReport = res
this.getExcelColumn()
this.pathTitle = ['รายงาน Excel', this.excelReport.itemId + '.' + this.excelReport.tdesc]
if (this.excelReport.param) {
Object.entries(this.excelReport.param.variableSheet).forEach(([key, value]) => {
......@@ -104,7 +123,7 @@ export class ExcelReportComponent implements OnInit {
this.select[key] = data.value
} else if (data.type == 'help') {
this.variableSheet.push({ ...data, value: data.valueDefault ? { id: data.valueDefault, tdesc: data.valueDefault, edesc: data.valueDefault } : { id: "", tdesc: "", edesc: "" }, key: key })
this.select[key] = data.value
this.select[key] = { id: data.value, tdesc: data.value, edesc: data.value }
} else if (data.type == 'calendar') {
this.variableSheet.push({ ...data, value: data.valueDefault || '', key: key })
const [d, m, y] = data.valueDefault ? data.valueDefault.split('-').map(Number) : [null, null, null]
......@@ -119,6 +138,41 @@ export class ExcelReportComponent implements OnInit {
})
}
getExcelColumn() {
const body = {
templateId: this.excelReport.templateId,
fileName: this.excelReport.fileName
}
this.searchSettings = {
fields: [],
operator: 'contains',
ignoreCase: false
};
this.columns = []
this.pivotColumns = []
this.customCubeService.getExcelColumn(body).subscribe((response: any) => {
this.searchSettings = {
fields: response.map((e: any) => e.split(':')[0]),
operator: 'contains',
ignoreCase: false
};
response.forEach((e: any, i: number) => {
const [field, headerText] = e.split(':')
this.columns.push({
field: field,
headerText: headerText,
type: "string",
isPrimaryKey: i == 0,
})
this.pivotColumns.push({
name: field,
caption: headerText
})
});
}, error => {
})
}
matDateChange(target: { [key: string]: any }, field: string, dateIso: string) {
target[field] = this.toYYYYMMDD(dateIso)
}
......@@ -168,9 +222,66 @@ export class ExcelReportComponent implements OnInit {
selectData(data: any) {
const item = this.variableSheet.find((i: any) => i.key === this.keySelect);
if (item) item.value = data;
this.select[this.keySelect] = data
this.cdr.detectChanges()
}
getExcelData(type: 'grid' | 'pivot') {
this.loadingExcel = true
this.dataList = []
this.setPerspective = ''
const body: any = {
templateId: this.excelReport.templateId,
fileName: this.excelReport.fileName
};
this.variableSheet.forEach((item: any, index: number) => {
const i = index + 1;
body[`key${i}`] = item.key;
if (item.type == 'help') {
body[`val${i}`] = this.select[item.key].id
} else if (item.type == 'list' || item.type == 'radio' || item.type == 'text') {
body[`val${i}`] = this.select[item.key]
} else if (item.type == 'calendar') {
body[`val${i}`] = this.toDateStringOnly(this.select[item.key]).split('-').reverse().join('-')
}
});
forkJoin({
excelData: this.customCubeService.getExcelData(body),
excelPerspective: this.customCubeService.getExcelPerspective(body),
}).subscribe({
next: response => {
this.dataList = response.excelData as any
this.loadingExcel = false
if (type == 'grid') {
this.openGridModal((response.excelPerspective as any).dataGridStr)
} else if (type == 'pivot') {
this.openPivotModal((response.excelPerspective as any).pivotStr)
}
this.cdr.detectChanges()
}, error: error => {
this.loadingExcel = false
}
})
}
openGridModal(setPerspective: string) {
this.dialogRef = this.dialog.open(this.girdModal, {
width: '60vw',
disableClose: false,
});
setTimeout(() => {
this.setPerspective = setPerspective
}, 10)
}
openPivotModal(setPerspective: string) {
this.dialogRef = this.dialog.open(this.pivotModal, {
width: '60vw',
disableClose: false,
});
setTimeout(() => {
this.setPerspective = setPerspective
}, 10)
}
dowloadExcelReport() {
this.loadingExcel = true
const fileName = this.excelReport.param.excelFile
......@@ -181,7 +292,7 @@ export class ExcelReportComponent implements OnInit {
} else if (item.type == 'list' || item.type == 'radio' || item.type == 'text') {
return "__" + item.key + "=" + this.select[item.key]
} else if (item.type == 'calendar') {
return "__" + item.key + "=" + this.toDateStringOnly(this.select[item.key])
return "__" + item.key + "=" + this.toDateStringOnly(this.select[item.key]).split('-').reverse().join('-')
}
return ""
}).join('|')
......@@ -207,13 +318,82 @@ export class ExcelReportComponent implements OnInit {
})
}
toDateStringOnly(input: string | Date): string {
const date = new Date(input);
if (isNaN(date.getTime())) return ''; // ถ้าไม่ใช่วันจริง คืนค่าว่าง
let date: Date;
if (typeof input === 'string') {
// เช็กว่าเป็น dd-mm-yyyy
const ddMmYyyy = /^(\d{2})-(\d{2})-(\d{4})$/;
const match = input.match(ddMmYyyy);
if (match) {
// สลับเป็น yyyy-mm-dd เพื่อให้ new Date ทำงานถูกต้อง
const [_, day, month, year] = match;
date = new Date(`${year}-${month}-${day}`);
} else {
// ใช้ new Date ปกติ (เช่น yyyy-mm-dd หรือ ISO string)
date = new Date(input);
}
} else {
date = input;
}
if (isNaN(date.getTime())) return ''; // ไม่ใช่วันจริง
const year = date.getFullYear();
const month = `${date.getMonth() + 1}`.padStart(2, '0');
const day = `${date.getDate()}`.padStart(2, '0');
return `${year}-${month}-${day}`;
}
savePerspective(type: 'grid' | 'pivot') {
if (type == 'grid') {
this.loadingExcel = true
setTimeout(() => {
const body = {
templateId: this.excelReport.templateId,
fileName: this.excelReport.fileName,
dataGridStr: this.gridLayout.data,
pivotStr: "",
}
this.customCubeService.saveExcelPerspective(body).subscribe(response => {
this.loadingExcel = false
this.showAlert(response.message, 'success')
this.cdr.detectChanges()
}, error => {
this.loadingExcel = false
this.showAlert(error.message, 'error')
this.cdr.detectChanges()
})
this.cdr.detectChanges();
}, 500);
} else if (type == 'pivot') {
this.loadingExcel = true
setTimeout(() => {
const body = {
templateId: this.excelReport.templateId,
fileName: this.excelReport.fileName,
dataGridStr: '',
pivotStr: this.pivotLayout.data,
}
this.customCubeService.saveExcelPerspective(body).subscribe(response => {
this.loadingExcel = false
this.showAlert(response.message, 'success')
this.cdr.detectChanges()
}, error => {
this.loadingExcel = false
this.showAlert(error.message, 'error')
this.cdr.detectChanges()
})
this.cdr.detectChanges();
}, 500);
}
}
showAlert(text: string, type: 'success' | 'error') {
Swal.fire({
title: 'แจ้งเตือน',
text: text,
icon: type,
confirmButtonText: 'ตกลง',
});
}
}
<ejs-pivotview #pivotview id='PivotView' [dataSourceSettings]="dataSourceSettings" [displayOption]='displayOption'
[toolbar]='toolbarOptions' [allowExcelExport]='true' [allowNumberFormatting]='true'
[allowConditionalFormatting]='true' [allowPdfExport]='true' [showToolbar]='true' [allowCalculatedField]='true'
[showFieldList]='true' width='100%' height='550'></ejs-pivotview>
\ No newline at end of file
// th{
// position: relative; // เทียบเท่า class "relative"
// padding: 10px; // เทียบเท่า class "px-10px py-10px" (อาจเปลี่ยนตามต้องการ)
// background-color: rgb(96 165 250 / 0.1); // ตัวอย่างแทน "bg-soft-secondary"
// color: #2b2b2b; // ตัวอย่างแทน "text-primary"
// text-align: center !important; // เทียบเท่า "!text-center"
// // หากต้องการดีไซน์อื่น ๆ เพิ่มเติมก็ใส่ในนี้ได้เลย เช่น:
// font-weight: 600;
// border-bottom: 1px solid #eee;
// }
.e-headercell,
.e-detailheadercell {
background-color: rgb(96 165 250 / 0.1) !important;
}
.e-pager .e-currentitem, .e-pager .e-currentitem:hover {
background: rgb(96 165 250) !important;
color: #fff;
opacity: 1 !important;
}
.e-checkbox-wrapper .e-frame.e-check, .e-css.e-checkbox-wrapper .e-frame.e-check {
background-color: rgb(96 165 250) !important;
border-color: transparent;
color: #fff;
}
.e-checkbox-wrapper .e-frame, .e-css.e-checkbox-wrapper .e-frame {
border: 1px solid !important;
border-radius: 2px;
box-sizing: border-box;
cursor: pointer;
display: inline-block;
font-family: "e-icons";
height: 18px;
line-height: 10px;
padding: 2px 0;
text-align: center;
vertical-align: middle;
width: 1rem !important;
border-color: #64748b !important;
}
.e-grid td.e-selectionbackground {
background-color: #aec2ec !important;
}
import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, SimpleChanges, ViewChild } from "@angular/core";
import {
IDataOptions,
PivotView,
ToolbarItems,
GroupingBarService,
ToolbarService,
PDFExportService,
ExcelExportService,
DisplayOption,
IDataSet,
DataSourceSettings,
PivotViewComponent,
FieldList
} from '@syncfusion/ej2-angular-pivotview';
import { DataSourceSettingsModel } from '@syncfusion/ej2-pivotview/src/model/datasourcesettings-model';
@Component({
selector: 'app-pivot-syncfution',
templateUrl: './pivot-syncfution.component.html',
styleUrls: ['./pivot-syncfution.component.scss'],
providers: [
GroupingBarService,
ToolbarService,
PDFExportService,
ExcelExportService
]
})
export class PivotSyncfutionComponent implements OnInit {
dataSourceSettings: DataSourceSettingsModel = {
dataSource: [],
expandAll: false,
enableSorting: true,
drilledMembers: [],
columns: [],
values: [],
rows: [],
formatSettings: [],
filters: []
};
@Input() dataSource: any
@Input() columns: any
toolbarOptions: ToolbarItems[] = ['Grid', 'Chart', 'Export', 'SubTotal', 'GrandTotal', 'Formatting', 'FieldList']
displayOption: DisplayOption = { view: 'Both' } as DisplayOption;
@ViewChild('pivotview') public pivotview?: PivotViewComponent;
@Input() sendLayout = false
@Input() pivotLayout = ''
@Output() layout = new EventEmitter<any>();
constructor(private cdr: ChangeDetectorRef) { }
ngOnInit(): void {
}
ngOnChanges(changes: SimpleChanges): void {
if (changes['dataSource']?.currentValue || changes['columns']?.currentValue) {
this.dataSourceSettings = {
dataSource: this.dataSource,
columns: this.columns,
values: [],
rows: [],
expandAll: true,
enableSorting: true,
drilledMembers: [],
filters: [],
formatSettings: []
};
}
if (changes['pivotLayout']) {
if (changes['pivotLayout'].currentValue) {
const layout = JSON.parse(changes['pivotLayout'].currentValue)
this.pivotview?.setProperties(layout)
}
}
if (changes['sendLayout']) {
if (this.pivotview) {
const layout = this.pivotview?.getPersistData();
if (layout) {
this.layout.emit(layout)
}
}
}
}
}
\ No newline at end of file
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs';
import { TemplateFileMiniModel } from '../model/template-file-mini.model';
import { AlertModel } from '../model/alert.model';
import { environment } from 'src/environments/environment';
@Injectable({
providedIn: 'root'
})
export class CustomCubeService {
constructor(private http: HttpClient,
) { }
getExcelColumn(body: {
templateId: string,
fileName: string,
}) {
return this.http.post(environment.portal + "/customcube/get-excel-column?companyid=eb2f4f30-edaf-11ee-a69a-c7680edc0e47", body)
}
getExcelData(body: any) {
return this.http.post(environment.portal + "/customcube/get-excel-data?companyid=eb2f4f30-edaf-11ee-a69a-c7680edc0e47", body)
}
saveExcelPerspective(body: {
templateId: string,
fileName: string,
dataGridStr: string,
pivotStr: string,
}): Observable<AlertModel> {
return this.http.post<AlertModel>(environment.portal + "/customcube/save-excel-perspective?companyid=eb2f4f30-edaf-11ee-a69a-c7680edc0e47", body)
}
getExcelPerspective(body: {
templateId: string,
fileName: string,
}) {
return this.http.post(environment.portal + "/customcube/get-excel-perspective?companyid=eb2f4f30-edaf-11ee-a69a-c7680edc0e47", body)
}
}
\ No newline at end of file
......@@ -4,7 +4,8 @@ import { registerLicense } from '@syncfusion/ej2-base';
import { environment } from './environments/environment';
import { enableProdMode } from '@angular/core';
// Registering Syncfusion license key
registerLicense('ORg4AjUWIQA/Gnt2U1hhQlJBfV5AQmBIYVp/TGpJfl96cVxMZVVBJAtUQF1hTX5ad0VjXH9ac3NRQWhc');
registerLicense('ORg4AjUWIQA/Gnt2XFhhQlJHfV5AQmBIYVp/TGpJfl96cVxMZVVBJAtUQF1hTH5WdUVjWXtXdHNdRWFbWkdx');
if (environment.production) {
enableProdMode();
......
......@@ -46,11 +46,27 @@
@import '../node_modules/@syncfusion/ej2-splitbuttons/styles/material.css';
@import '../node_modules/@syncfusion/ej2-angular-grids/styles/material.css';
@import '../node_modules/@syncfusion/ej2-base/styles/material.css';
@import '../node_modules/@syncfusion/ej2-buttons/styles/material.css';
@import '../node_modules/@syncfusion/ej2-calendars/styles/material.css';
@import '../node_modules/@syncfusion/ej2-dropdowns/styles/material.css';
@import '../node_modules/@syncfusion/ej2-inputs/styles/material.css';
@import '../node_modules/@syncfusion/ej2-navigations/styles/material.css';
@import '../node_modules/@syncfusion/ej2-popups/styles/material.css';
@import '../node_modules/@syncfusion/ej2-splitbuttons/styles/material.css';
@import '../node_modules/@syncfusion/ej2-angular-grids/styles/material.css';
@import '../node_modules/@syncfusion/ej2-grids/styles/material.css';
@import '../node_modules/@syncfusion/ej2-lists/styles/material.css';
@import "../node_modules/@syncfusion/ej2-splitbuttons/styles/material.css";
@import '../node_modules/@syncfusion/ej2-angular-pivotview/styles/material.css';
@media (min-width: 992px) {
[data-nav-layout="horizontal"][dir="rtl"] .main-menu-container {
.slide-right {
@apply left-[3%];
}
.slide-left {
@apply right-[3%];
}
......@@ -87,15 +103,19 @@
.mdc-text-field--filled:not(.mdc-text-field--disabled) {
background-color: white !important;
}
mat-label {
font-size: 0.875rem !important;
}
.mat-mdc-form-field-focus-overlay {
background-color: rgba(0, 0, 0, 0);
}
.mdc-text-field--filled .mdc-line-ripple::after {
border-bottom-color: #ffffff;
}
.mdc-text-field--focused:not(.mdc-text-field--disabled) .mdc-floating-label {
color: #293549 !important;
}
......@@ -108,6 +128,7 @@
.responsive-logo-light {
display: block #{!important};
}
.responsive-logo-dark {
display: none #{!important};
}
......@@ -115,11 +136,13 @@
}
}
}
[data-nav-layout="horizontal"] {
@media (max-width: 991px) {
.landing-body .responsive-logo .responsive-logo-dark {
display: none !important;
}
.landing-body .responsive-logo .responsive-logo-light {
display: block !important;
}
......@@ -135,6 +158,7 @@
.ti-form-select {
@apply border-t-[0px] w-[100%] #{!important};
}
.ng-select.ng-select-single .ng-select-container {
@apply border-t-[0px] #{!important};
}
......@@ -143,6 +167,7 @@
[data-width="boxed"] {
@media (min-width: 1400px) {
.xxxl\:col-span-3,
.xxxl\:col-span-4,
.xxxl\:col-span-6,
......@@ -150,13 +175,16 @@
@apply col-span-12;
}
}
.mat-mdc-form-field-infix {
width: 90px;
}
.timepicker .mat-mdc-text-field-wrapper:not(.mdc-text-field--outlined) .mat-mdc-form-field-infix {
margin-inline-start: 10px;
}
}
@media (min-width: 1800px) {
.xxxl\:col-span-9 {
@apply col-span-9;
......@@ -167,39 +195,48 @@
::-webkit-scrollbar {
@apply w-[0px] bg-black/30 #{!important};
}
.input-date-picker .dp-input-container input::placeholder {
@apply text-white/50;
}
.ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected {
@apply bg-black/30;
}
.ng-select .ng-select-container {
@apply border-white/10 #{!important};
}
.mat-calendar-table-header th {
color: rgb(255 255 255 / 0.6) !important;
}
}
[dir="rtl"] {
.apexcharts-title-text,
.apexcharts-subtitle-text {
text-anchor: end;
}
.apexcharts-xaxis,
.apexcharts-yaxis {
text {
direction: ltr;
}
}
.apexcharts-legend-text {
// padding-right: 18px;
// margin-right: -15px;
@apply pr-[18px] pl-[0px] mr-[-15px] ml-[0px];
}
.mat-datepicker-content {
direction: ltr;
}
.mat-calendar-previous-button,
.mat-calendar-next-button {
transform: rotate(0deg) !important;
......@@ -222,23 +259,29 @@
@apply shrink-0;
}
}
.apexcharts-legend .apexcharts-legend-text {
@apply dark:text-white #{!important};
}
.mat-calendar-controls {
@apply m-0 #{!important};
}
.mat-datepicker-content {
@apply transform-none #{!important};
}
#todo-compose {
.ng-select-container {
width: 100% !important;
}
}
ngx-dropzone {
@apply border-gray-200 dark:border-white/10 h-20 #{!important};
}
.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value .ng-value-icon:hover {
@apply bg-primary;
}
......@@ -248,24 +291,27 @@ ngx-dropzone {
/* custom styles */
@media (min-width: 992px) {
[data-nav-style="icon-hover"],
[data-nav-style="menu-hover"] {
.app-sidebar {
.slide.has-sub {
.child1 > .sub-slide:hover > .child2 {
.child1>.sub-slide:hover>.child2 {
@apply block -mt-[30px] #{!important};
}
}
}
}
}
/* advanced forms */
.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::after {
--mdc-filled-text-field-focus-active-indicator-color: transparent;
}
/* advanced forms */
.ng-select.ng-select-focused:not(.ng-select-opened) > .ng-select-container {
.ng-select.ng-select-focused:not(.ng-select-opened)>.ng-select-container {
@apply shadow-none;
}
......@@ -278,59 +324,75 @@ ngx-dropzone {
::-webkit-calendar-picker-indicator {
@apply invert;
}
.ae-font .ae-picker-label {
@apply bg-bodybg border-white/10;
}
.ae-font .ae-picker-options {
@apply bg-bodybg;
}
.ae-font.ae-picker {
@apply text-white;
}
.ae-font .ae-picker-label:before {
@apply bg-none;
}
.ae-font .ae-picker-label:hover {
@apply bg-bodybg;
}
.ae-font .ae-picker-label svg .ae-stroke {
@apply stroke-[#fff];
}
.ae-font .ae-picker-label:hover:before {
background: linear-gradient(to right, #293549 100%, #293549 100%);
}
.ae-font.ae-expanded .ae-picker-options {
@apply border-white/10;
}
.swal2-input {
@apply bg-bgdark #{!important};
}
.angular-editor-toolbar {
@apply bg-bodybg border border-white/10 #{!important};
}
.angular-editor-button {
@apply bg-bgdark border border-white/10 #{!important};
}
.angular-editor-textarea {
@apply border border-white/10 #{!important};
}
.clock-face {
@apply bg-bodybg #{!important};
}
.mat-mdc-dialog-container .mdc-dialog__content {
// color: var(--mdc-dialog-supporting-text-color, rgba(0, 0, 0, 0.6));
--mdc-dialog-supporting-text-color: #fff;
}
}
/* dark */
/* tasks */
@media (width <= 23.75rem) {
@media (width <=23.75rem) {
.add-new-tasks {
.ng-select.ng-select-single .ng-select-container {
@apply w-[13.125rem];
}
}
}
/* tasks */
/* advanced forms */
......@@ -338,6 +400,7 @@ ngx-dropzone {
ngx-mat-timepicker-face .clock-face {
@apply w-[14.375rem] h-[14.375rem] #{!important};
}
ngx-mat-timepicker-face .clock-face__number--outer {
@apply h-[7.375rem] #{!important};
}
......@@ -346,16 +409,19 @@ ngx-dropzone {
@apply top-[calc(50%-120px)] #{!important};
}
}
/* advanced forms */
/* colorpicker */
.color-picker {
.left {
@apply py-[5px] #{!important};
}
.selected-color {
@apply top-[5px] #{!important};
}
}
/* colorpicker */
.block-main-content {
......@@ -371,45 +437,52 @@ ngx-dropzone {
margin-top: 3px;
}
.detail-td{
.detail-td {
font-size: 12px;
padding-left: 1.5rem;
}
.width-80{
.width-80 {
width: 80%;
}
.\!width-80{
.\!width-80 {
width: 80% !important;
}
.width-70{
.width-70 {
width: 70%;
}
.\!width-70{
.\!width-70 {
width: 70% !important;
}
.\!box-modal{
box-shadow: 0px 0px 0px 9999px rgba(0,0,0,0.25)!important;
-webkit-box-shadow: 0px 0px 0px 9999px rgba(0,0,0,0.25)!important;
-moz-box-shadow: 0px 0px 0px 9999px rgba(0,0,0,0.25)!important;
.\!box-modal {
box-shadow: 0px 0px 0px 9999px rgba(0, 0, 0, 0.25) !important;
-webkit-box-shadow: 0px 0px 0px 9999px rgba(0, 0, 0, 0.25) !important;
-moz-box-shadow: 0px 0px 0px 9999px rgba(0, 0, 0, 0.25) !important;
}
.mat-mdc-dialog-container .mdc-dialog__title {
font-family: inherit!important;
color: rgb(var(--color-primary))!important;
font-weight: 700!important;
font-size: 1.25rem!important;
line-height: 2.5rem!important;
border-bottom-width: 1px!important;
border-bottom-color: rgb(226, 232, 240)!important;
}
.mdc-dialog__actions{
border-top-width: 1px!important;
border-top-color: rgb(226, 232, 240)!important;
font-family: inherit !important;
color: rgb(var(--color-primary)) !important;
font-weight: 700 !important;
font-size: 1.25rem !important;
line-height: 2.5rem !important;
border-bottom-width: 1px !important;
border-bottom-color: rgb(226, 232, 240) !important;
}
.mdc-dialog__actions {
border-top-width: 1px !important;
border-top-color: rgb(226, 232, 240) !important;
}
.mat-mdc-dialog-content {
max-height: 80vh!important;
max-height: 80vh !important;
}
.mat-mdc-dialog-container .mdc-dialog__content {
padding-top: 10px!important;
padding-top: 10px !important;
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment