diff --git a/concept-modern/package-lock.json b/concept-modern/package-lock.json index 0a0c55a..0834ddb 100644 --- a/concept-modern/package-lock.json +++ b/concept-modern/package-lock.json @@ -20,16 +20,18 @@ "chart.js": "^4.5.0", "datatables.net": "^2.3.2", "datatables.net-bs5": "^2.3.2", + "datatables.net-responsive": "^3.0.5", + "datatables.net-responsive-bs5": "^3.0.5", "daterangepicker": "^3.1.0", "moment": "^2.30.1", "sortablejs": "^1.15.6", "tom-select": "^2.4.3" }, "devDependencies": { - "@vitejs/plugin-legacy": "^5.4.3", - "sass": "^1.81.0", - "terser": "^5.37.0", - "vite": "^5.4.11", + "@vitejs/plugin-legacy": "^7.1.0", + "sass": "^1.89.2", + "terser": "^5.43.1", + "vite": "^7.0.6", "vite-plugin-handlebars": "^2.0.0" } }, @@ -1562,9 +1564,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", + "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", "cpu": [ "ppc64" ], @@ -1575,13 +1577,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz", + "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", "cpu": [ "arm" ], @@ -1592,13 +1594,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", + "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", "cpu": [ "arm64" ], @@ -1609,13 +1611,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz", + "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", "cpu": [ "x64" ], @@ -1626,13 +1628,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", + "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", "cpu": [ "arm64" ], @@ -1643,13 +1645,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", + "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", "cpu": [ "x64" ], @@ -1660,13 +1662,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", + "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", "cpu": [ "arm64" ], @@ -1677,13 +1679,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", + "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", "cpu": [ "x64" ], @@ -1694,13 +1696,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", + "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", "cpu": [ "arm" ], @@ -1711,13 +1713,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", + "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", "cpu": [ "arm64" ], @@ -1728,13 +1730,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", + "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", "cpu": [ "ia32" ], @@ -1745,13 +1747,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", + "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", "cpu": [ "loong64" ], @@ -1762,13 +1764,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", + "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", "cpu": [ "mips64el" ], @@ -1779,13 +1781,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", + "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", "cpu": [ "ppc64" ], @@ -1796,13 +1798,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", + "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", "cpu": [ "riscv64" ], @@ -1813,13 +1815,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", + "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", "cpu": [ "s390x" ], @@ -1830,13 +1832,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", + "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", "cpu": [ "x64" ], @@ -1847,13 +1849,30 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", + "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", + "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", "cpu": [ "x64" ], @@ -1864,13 +1883,30 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", + "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", + "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", "cpu": [ "x64" ], @@ -1881,13 +1917,30 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", + "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", + "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", "cpu": [ "x64" ], @@ -1898,13 +1951,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", + "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", "cpu": [ "arm64" ], @@ -1915,13 +1968,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", + "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", "cpu": [ "ia32" ], @@ -1932,13 +1985,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", + "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", "cpu": [ "x64" ], @@ -1949,7 +2002,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@fortawesome/fontawesome-free": { @@ -2697,30 +2750,34 @@ "license": "MIT" }, "node_modules/@vitejs/plugin-legacy": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-5.4.3.tgz", - "integrity": "sha512-wsyXK9mascyplcqvww1gA1xYiy29iRHfyciw+a0t7qRNdzX6PdfSWmOoCi74epr87DujM+5J+rnnSv+4PazqVg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-7.1.0.tgz", + "integrity": "sha512-dzpcfN7gWWgzUwSxv7/ntUTEvoA8BYQWsdrawZFfwDSbitsEOXj8oSLn7I8QHJ8ijDukmCxsuUcib42EyTEVMw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.25.8", - "@babel/preset-env": "^7.25.8", - "browserslist": "^4.24.0", + "@babel/core": "^7.28.0", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/preset-env": "^7.28.0", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "browserslist": "^4.25.1", "browserslist-to-esbuild": "^2.1.1", - "core-js": "^3.38.1", - "magic-string": "^0.30.12", + "core-js": "^3.44.0", + "magic-string": "^0.30.17", "regenerator-runtime": "^0.14.1", "systemjs": "^6.15.1" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "peerDependencies": { - "terser": "^5.4.0", - "vite": "^5.0.0" + "terser": "^5.16.0", + "vite": "^7.0.0" } }, "node_modules/acorn": { @@ -2978,6 +3035,27 @@ "jquery": ">=1.7" } }, + "node_modules/datatables.net-responsive": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/datatables.net-responsive/-/datatables.net-responsive-3.0.5.tgz", + "integrity": "sha512-EnDY2OQN+f4XE72J+dajNuJwT78/GnCuuw8ACusrXaF/VpGyFEpBNr1JDzUTBj+cv7KGpDObks8AaL2p/Z2OVg==", + "license": "MIT", + "dependencies": { + "datatables.net": "^2", + "jquery": ">=1.7" + } + }, + "node_modules/datatables.net-responsive-bs5": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/datatables.net-responsive-bs5/-/datatables.net-responsive-bs5-3.0.5.tgz", + "integrity": "sha512-dp/4gBowyJIEjeD1bDKyjCGCiYvusxG/Rxrnfp2QBpKTZaEBP+17uo9mooCm5a7HMS3j5IDFSy1dUoAJrzk6sg==", + "license": "MIT", + "dependencies": { + "datatables.net-bs5": "^2", + "datatables.net-responsive": "3.0.5", + "jquery": ">=1.7" + } + }, "node_modules/daterangepicker": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/daterangepicker/-/daterangepicker-3.1.0.tgz", @@ -3028,9 +3106,9 @@ "license": "ISC" }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", + "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3038,32 +3116,35 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.25.8", + "@esbuild/android-arm": "0.25.8", + "@esbuild/android-arm64": "0.25.8", + "@esbuild/android-x64": "0.25.8", + "@esbuild/darwin-arm64": "0.25.8", + "@esbuild/darwin-x64": "0.25.8", + "@esbuild/freebsd-arm64": "0.25.8", + "@esbuild/freebsd-x64": "0.25.8", + "@esbuild/linux-arm": "0.25.8", + "@esbuild/linux-arm64": "0.25.8", + "@esbuild/linux-ia32": "0.25.8", + "@esbuild/linux-loong64": "0.25.8", + "@esbuild/linux-mips64el": "0.25.8", + "@esbuild/linux-ppc64": "0.25.8", + "@esbuild/linux-riscv64": "0.25.8", + "@esbuild/linux-s390x": "0.25.8", + "@esbuild/linux-x64": "0.25.8", + "@esbuild/netbsd-arm64": "0.25.8", + "@esbuild/netbsd-x64": "0.25.8", + "@esbuild/openbsd-arm64": "0.25.8", + "@esbuild/openbsd-x64": "0.25.8", + "@esbuild/openharmony-arm64": "0.25.8", + "@esbuild/sunos-x64": "0.25.8", + "@esbuild/win32-arm64": "0.25.8", + "@esbuild/win32-ia32": "0.25.8", + "@esbuild/win32-x64": "0.25.8" } }, "node_modules/escalade": { @@ -3717,6 +3798,51 @@ "node": ">=10" } }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3838,21 +3964,24 @@ } }, "node_modules/vite": { - "version": "5.4.19", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", - "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", + "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.25.0", + "fdir": "^6.4.6", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.40.0", + "tinyglobby": "^0.2.14" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -3861,19 +3990,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -3894,6 +4029,12 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, @@ -3908,6 +4049,524 @@ "vite": "^5.0.0" } }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/vite": { + "version": "5.4.19", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", + "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/concept-modern/package.json b/concept-modern/package.json index c831e65..6672a0d 100644 --- a/concept-modern/package.json +++ b/concept-modern/package.json @@ -1,6 +1,6 @@ { "name": "concept-modern", - "version": "2.0.0", + "version": "2.0.1", "description": "Concept - Modern Bootstrap 5 Admin Dashboard Template", "type": "module", "scripts": { @@ -10,10 +10,10 @@ "clean": "rm -rf dist" }, "devDependencies": { - "@vitejs/plugin-legacy": "^5.4.3", - "sass": "^1.81.0", - "terser": "^5.37.0", - "vite": "^5.4.11", + "@vitejs/plugin-legacy": "^7.1.0", + "sass": "^1.89.2", + "terser": "^5.43.1", + "vite": "^7.0.6", "vite-plugin-handlebars": "^2.0.0" }, "dependencies": { @@ -29,6 +29,8 @@ "chart.js": "^4.5.0", "datatables.net": "^2.3.2", "datatables.net-bs5": "^2.3.2", + "datatables.net-responsive": "^3.0.5", + "datatables.net-responsive-bs5": "^3.0.5", "daterangepicker": "^3.1.0", "moment": "^2.30.1", "sortablejs": "^1.15.6", diff --git a/concept-modern/src/js/pages/data-tables.js b/concept-modern/src/js/pages/data-tables.js new file mode 100644 index 0000000..db752a8 --- /dev/null +++ b/concept-modern/src/js/pages/data-tables.js @@ -0,0 +1,57 @@ +import DataTable from 'datatables.net-bs5'; +import 'datatables.net-buttons-bs5'; +import 'datatables.net-buttons/js/buttons.html5'; +import 'datatables.net-buttons/js/buttons.print'; +import 'datatables.net-responsive-bs5'; + +// Data Tables functionality +export function initializeDataTables() { + // Basic DataTable + const basicTable = document.getElementById('basic-datatable'); + if (basicTable) { + new DataTable(basicTable, { + responsive: true, + dom: 'Bfrtip', + buttons: [ + 'copy', 'csv', 'excel', 'pdf', 'print' + ] + }); + } + + // Advanced DataTable with custom controls + const advancedTable = document.getElementById('advanced-datatable'); + if (advancedTable) { + new DataTable(advancedTable, { + responsive: true, + dom: '<"row"<"col-sm-12 col-md-6"l><"col-sm-12 col-md-6"f>>rtip', + pageLength: 10, + lengthMenu: [[5, 10, 25, 50, -1], [5, 10, 25, 50, "All"]], + columnDefs: [ + { orderable: false, targets: -1 } // Disable sorting on last column (actions) + ], + order: [[0, 'asc']], + language: { + search: '_INPUT_', + searchPlaceholder: 'Search records...', + lengthMenu: 'Show _MENU_ records per page', + paginate: { + previous: '', + next: '' + } + } + }); + } + + // Initialize tooltips + const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); + tooltipTriggerList.map(function (tooltipTriggerEl) { + return new bootstrap.Tooltip(tooltipTriggerEl); + }); +} + +// Initialize on DOM ready +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initializeDataTables); +} else { + initializeDataTables(); +} \ No newline at end of file diff --git a/concept-modern/src/js/pages/influencer.js b/concept-modern/src/js/pages/influencer.js new file mode 100644 index 0000000..80c568d --- /dev/null +++ b/concept-modern/src/js/pages/influencer.js @@ -0,0 +1,246 @@ +import Chart from 'chart.js/auto'; + +// Influencer Dashboard functionality +export function initializeInfluencerDashboard() { + // Initialize Engagement Chart + const engagementCtx = document.getElementById('engagementChart'); + if (engagementCtx) { + new Chart(engagementCtx, { + type: 'line', + data: { + labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + datasets: [ + { + label: 'Instagram', + data: [3.2, 3.5, 3.8, 4.2, 4.5, 4.8, 5.1, 5.3, 5.2, 5.5, 5.8, 6.1], + borderColor: '#E1306C', + backgroundColor: 'rgba(225, 48, 108, 0.1)', + tension: 0.4 + }, + { + label: 'TikTok', + data: [2.8, 3.1, 3.6, 4.0, 4.3, 4.7, 5.0, 5.4, 5.7, 6.0, 6.3, 6.8], + borderColor: '#000000', + backgroundColor: 'rgba(0, 0, 0, 0.1)', + tension: 0.4 + }, + { + label: 'YouTube', + data: [2.5, 2.6, 2.8, 3.0, 3.2, 3.1, 3.3, 3.5, 3.4, 3.6, 3.8, 3.9], + borderColor: '#FF0000', + backgroundColor: 'rgba(255, 0, 0, 0.1)', + tension: 0.4 + }, + { + label: 'Twitter', + data: [1.8, 2.0, 2.1, 2.3, 2.5, 2.7, 2.6, 2.8, 2.9, 3.0, 3.1, 3.2], + borderColor: '#1DA1F2', + backgroundColor: 'rgba(29, 161, 242, 0.1)', + tension: 0.4 + } + ] + }, + options: { + responsive: true, + maintainAspectRatio: false, + plugins: { + legend: { + display: true, + position: 'bottom' + }, + tooltip: { + mode: 'index', + intersect: false, + callbacks: { + label: function(context) { + return context.dataset.label + ': ' + context.parsed.y.toFixed(1) + '%'; + } + } + } + }, + scales: { + y: { + beginAtZero: true, + max: 8, + ticks: { + callback: function(value) { + return value + '%'; + } + }, + title: { + display: true, + text: 'Engagement Rate' + } + }, + x: { + grid: { + display: false + } + } + }, + interaction: { + mode: 'nearest', + axis: 'x', + intersect: false + } + } + }); + } + + // Initialize Demographics Chart + const demographicsCtx = document.getElementById('demographicsChart'); + if (demographicsCtx) { + new Chart(demographicsCtx, { + type: 'doughnut', + data: { + labels: ['18-24', '25-34', '35-44', '45-54', '55+'], + datasets: [{ + data: [35, 42, 15, 6, 2], + backgroundColor: [ + '#667eea', + '#48bb78', + '#f39c12', + '#e74c3c', + '#9b59b6' + ], + borderWidth: 0 + }] + }, + options: { + responsive: true, + maintainAspectRatio: false, + plugins: { + legend: { + position: 'right', + labels: { + padding: 20, + usePointStyle: true, + font: { + size: 12 + }, + generateLabels: function(chart) { + const data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map((label, i) => { + const dataset = data.datasets[0]; + const value = dataset.data[i]; + return { + text: label + ' (' + value + '%)', + fillStyle: dataset.backgroundColor[i], + hidden: false, + index: i + }; + }); + } + return []; + } + } + }, + tooltip: { + callbacks: { + label: function(context) { + return context.label + ': ' + context.parsed + '%'; + } + } + } + }, + cutout: '70%' + } + }); + } + + // Animate progress bars on scroll + const progressBars = document.querySelectorAll('.progress-bar'); + const observerOptions = { + threshold: 0.1, + rootMargin: '0px 0px -100px 0px' + }; + + const progressObserver = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + const progressBar = entry.target; + const width = progressBar.style.width; + progressBar.style.width = '0%'; + setTimeout(() => { + progressBar.style.width = width; + progressBar.style.transition = 'width 1s ease-out'; + }, 100); + progressObserver.unobserve(progressBar); + } + }); + }, observerOptions); + + progressBars.forEach(bar => { + progressObserver.observe(bar); + }); + + // Campaign actions + document.addEventListener('click', function(e) { + if (e.target.closest('.dropdown-item')) { + const action = e.target.textContent.trim(); + const row = e.target.closest('tr'); + const campaignName = row.querySelector('h6').textContent; + + switch(action) { + case 'View Details': + console.log('View details for:', campaignName); + break; + case 'Analytics': + console.log('Show analytics for:', campaignName); + break; + case 'Pause': + if (confirm(`Are you sure you want to pause the "${campaignName}" campaign?`)) { + const statusBadge = row.querySelector('.badge'); + statusBadge.classList.remove('bg-success'); + statusBadge.classList.add('bg-secondary'); + statusBadge.textContent = 'Paused'; + showNotification(`Campaign "${campaignName}" has been paused.`, 'info'); + } + break; + case 'Start': + const statusBadge = row.querySelector('.badge'); + statusBadge.classList.remove('bg-warning', 'text-dark'); + statusBadge.classList.add('bg-success'); + statusBadge.textContent = 'Active'; + showNotification(`Campaign "${campaignName}" has been started.`, 'success'); + break; + } + } + }); + + // Add new campaign button + const newCampaignBtn = document.querySelector('.btn-primary.btn-sm'); + if (newCampaignBtn) { + newCampaignBtn.addEventListener('click', function() { + console.log('Open new campaign modal'); + showNotification('New campaign feature coming soon!', 'info'); + }); + } +} + +// Notification helper +function showNotification(message, type = 'info') { + const alertHtml = ` + + `; + + document.body.insertAdjacentHTML('beforeend', alertHtml); + + setTimeout(() => { + const alert = document.querySelector('.alert'); + if (alert) { + alert.remove(); + } + }, 5000); +} + +// Initialize on DOM ready +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initializeInfluencerDashboard); +} else { + initializeInfluencerDashboard(); +} \ No newline at end of file diff --git a/concept-modern/src/js/pages/settings.js b/concept-modern/src/js/pages/settings.js new file mode 100644 index 0000000..f4e5438 --- /dev/null +++ b/concept-modern/src/js/pages/settings.js @@ -0,0 +1,260 @@ +// Settings page functionality +export function initializeSettings() { + // Color scheme buttons + const colorSchemeButtons = document.querySelectorAll('.color-scheme-btn'); + colorSchemeButtons.forEach(button => { + button.addEventListener('click', function() { + colorSchemeButtons.forEach(btn => btn.classList.remove('active')); + this.classList.add('active'); + const color = this.dataset.color; + // Here you would apply the color scheme + console.log('Color scheme changed to:', color); + }); + }); + + // Font size range + const fontSizeRange = document.getElementById('fontSize'); + if (fontSizeRange) { + fontSizeRange.addEventListener('input', function() { + document.documentElement.style.fontSize = this.value + 'px'; + }); + } + + // Enable desktop notifications + const desktopNotifications = document.getElementById('desktopNotifications'); + if (desktopNotifications) { + desktopNotifications.addEventListener('change', function() { + if (this.checked) { + if ('Notification' in window) { + Notification.requestPermission().then(permission => { + if (permission === 'granted') { + new Notification('Desktop notifications enabled!', { + body: 'You will now receive desktop notifications.', + icon: '/assets/images/logo.png' + }); + } + }); + } + } + }); + } + + // Send test email button + const sendTestEmailBtn = document.querySelector('.btn-outline-primary'); + if (sendTestEmailBtn && sendTestEmailBtn.textContent.includes('Send Test Email')) { + sendTestEmailBtn.addEventListener('click', function() { + const btn = this; + const originalText = btn.innerHTML; + btn.innerHTML = 'Sending...'; + btn.disabled = true; + + setTimeout(() => { + btn.innerHTML = 'Test Email Sent!'; + btn.classList.remove('btn-outline-primary'); + btn.classList.add('btn-success'); + + setTimeout(() => { + btn.innerHTML = originalText; + btn.classList.remove('btn-success'); + btn.classList.add('btn-outline-primary'); + btn.disabled = false; + }, 3000); + }, 2000); + }); + } + + // Copy API key + const copyApiKeyBtn = document.querySelector('.input-group .btn-outline-secondary'); + if (copyApiKeyBtn) { + copyApiKeyBtn.addEventListener('click', function() { + const apiKeyInput = document.getElementById('apiKey'); + apiKeyInput.select(); + document.execCommand('copy'); + + // Show tooltip + const tooltip = new bootstrap.Tooltip(this, { + title: 'Copied!', + trigger: 'manual' + }); + tooltip.show(); + + setTimeout(() => { + tooltip.hide(); + }, 2000); + }); + } + + // Generate new API key + const generateKeyBtn = document.querySelector('.btn-primary'); + if (generateKeyBtn && generateKeyBtn.textContent.includes('Generate New Key')) { + generateKeyBtn.addEventListener('click', function() { + if (confirm('Are you sure you want to generate a new API key? The old key will be invalidated.')) { + const newKey = 'sk_test_' + Math.random().toString(36).substr(2, 20); + document.getElementById('apiKey').value = newKey; + } + }); + } + + // Clear cache buttons + document.querySelectorAll('.btn-outline-secondary').forEach(button => { + if (button.textContent.includes('Clear') && button.textContent.includes('Cache')) { + button.addEventListener('click', function() { + const btn = this; + const originalText = btn.textContent; + btn.innerHTML = 'Clearing...'; + btn.disabled = true; + + setTimeout(() => { + btn.innerHTML = 'Cleared!'; + btn.classList.remove('btn-outline-secondary'); + btn.classList.add('btn-success'); + + setTimeout(() => { + btn.textContent = originalText; + btn.classList.remove('btn-success'); + btn.classList.add('btn-outline-secondary'); + btn.disabled = false; + }, 2000); + }, 1500); + }); + } + }); + + // Backup now button + const backupBtn = document.querySelector('.btn-primary'); + if (backupBtn && backupBtn.textContent === 'Backup Now') { + backupBtn.addEventListener('click', function() { + const btn = this; + btn.innerHTML = 'Creating backup...'; + btn.disabled = true; + + setTimeout(() => { + btn.innerHTML = 'Backup completed!'; + btn.classList.remove('btn-primary'); + btn.classList.add('btn-success'); + + // Show download link + const downloadLink = document.createElement('a'); + downloadLink.href = '#'; + downloadLink.className = 'btn btn-sm btn-outline-primary ms-2'; + downloadLink.innerHTML = 'Download'; + btn.parentNode.insertBefore(downloadLink, btn.nextSibling); + + setTimeout(() => { + btn.textContent = 'Backup Now'; + btn.classList.remove('btn-success'); + btn.classList.add('btn-primary'); + btn.disabled = false; + downloadLink.remove(); + }, 5000); + }, 3000); + }); + } + + // Save buttons functionality + document.querySelectorAll('button[type="submit"]').forEach(button => { + button.addEventListener('click', function(e) { + e.preventDefault(); + const btn = this; + const originalText = btn.textContent; + + btn.innerHTML = 'Saving...'; + btn.disabled = true; + + setTimeout(() => { + btn.innerHTML = 'Saved!'; + btn.classList.add('btn-success'); + + setTimeout(() => { + btn.textContent = originalText; + btn.classList.remove('btn-success'); + btn.disabled = false; + }, 2000); + }, 1500); + }); + }); + + // Two-factor authentication toggle + const enable2FA = document.getElementById('enable2FA'); + if (enable2FA) { + enable2FA.addEventListener('change', function() { + if (this.checked) { + // Show QR code modal + const modal = new bootstrap.Modal(document.getElementById('twoFactorModal') || createTwoFactorModal()); + modal.show(); + } + }); + } + + // Integration connect buttons + document.querySelectorAll('.list-group-item .btn-outline-primary').forEach(button => { + if (button.textContent === 'Connect') { + button.addEventListener('click', function() { + const btn = this; + btn.innerHTML = ''; + btn.disabled = true; + + setTimeout(() => { + btn.textContent = 'Connected'; + btn.classList.remove('btn-outline-primary'); + btn.classList.add('btn-success'); + btn.disabled = true; + }, 2000); + }); + } + }); + + // Handle form validation + const forms = document.querySelectorAll('form'); + forms.forEach(form => { + form.addEventListener('submit', function(event) { + event.preventDefault(); + event.stopPropagation(); + + if (form.checkValidity()) { + // Form is valid, would submit here + console.log('Form submitted'); + } + + form.classList.add('was-validated'); + }); + }); +} + +// Create Two-Factor Authentication Modal +function createTwoFactorModal() { + const modalHtml = ` + + `; + + document.body.insertAdjacentHTML('beforeend', modalHtml); + return document.getElementById('twoFactorModal'); +} + +// Initialize on DOM ready +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initializeSettings); +} else { + initializeSettings(); +} \ No newline at end of file diff --git a/concept-modern/src/js/pages/timeline.js b/concept-modern/src/js/pages/timeline.js new file mode 100644 index 0000000..344d579 --- /dev/null +++ b/concept-modern/src/js/pages/timeline.js @@ -0,0 +1,366 @@ +// Timeline functionality +export function initializeTimeline() { + let visibleActivities = new Set(['user', 'system', 'security', 'transaction', 'milestone']); + + // Filter checkboxes + const filterCheckboxes = document.querySelectorAll('.activity-filters input[type="checkbox"]'); + filterCheckboxes.forEach(checkbox => { + checkbox.addEventListener('change', updateVisibility); + }); + + function updateVisibility() { + visibleActivities.clear(); + filterCheckboxes.forEach(checkbox => { + if (checkbox.checked) { + visibleActivities.add(checkbox.value); + } + }); + + // Update timeline items visibility + document.querySelectorAll('.timeline-item').forEach(item => { + const type = item.dataset.type; + if (visibleActivities.has(type)) { + item.style.display = 'flex'; + } else { + item.style.display = 'none'; + } + }); + } + + // Apply filters button + document.getElementById('applyFilters').addEventListener('click', function() { + const btn = this; + const originalText = btn.textContent; + + btn.innerHTML = 'Applying...'; + btn.disabled = true; + + setTimeout(() => { + updateVisibility(); + showNotification('Filters applied successfully!', 'success'); + + btn.textContent = originalText; + btn.disabled = false; + }, 500); + }); + + // Reset filters + document.getElementById('resetFilters').addEventListener('click', function() { + filterCheckboxes.forEach(checkbox => { + checkbox.checked = true; + }); + document.getElementById('dateFilter').value = 'week'; + document.getElementById('userSearch').value = ''; + updateVisibility(); + }); + + // Refresh timeline + document.getElementById('refreshTimeline').addEventListener('click', function() { + const btn = this; + const originalHtml = btn.innerHTML; + + btn.innerHTML = 'Refreshing...'; + btn.disabled = true; + + setTimeout(() => { + // Add new activity + addNewActivity(); + showNotification('Timeline refreshed!', 'info'); + + btn.innerHTML = originalHtml; + btn.disabled = false; + }, 1000); + }); + + // Export timeline + document.getElementById('exportTimeline').addEventListener('click', function() { + const btn = this; + const originalHtml = btn.innerHTML; + + btn.innerHTML = 'Exporting...'; + btn.disabled = true; + + setTimeout(() => { + // Generate and download timeline data + exportTimelineData(); + + btn.innerHTML = 'Exported!'; + + setTimeout(() => { + btn.innerHTML = originalHtml; + btn.disabled = false; + }, 2000); + }, 1500); + }); + + // Load more activities + document.getElementById('loadMore').addEventListener('click', function() { + const btn = this; + const originalHtml = btn.innerHTML; + + btn.innerHTML = 'Loading...'; + btn.disabled = true; + + setTimeout(() => { + loadMoreActivities(); + + btn.innerHTML = originalHtml; + btn.disabled = false; + }, 1000); + }); + + // Like and Reply buttons + document.addEventListener('click', function(e) { + if (e.target.closest('.btn-outline-primary') && e.target.textContent.includes('Like')) { + const btn = e.target; + btn.classList.toggle('active'); + const icon = btn.querySelector('i'); + + if (btn.classList.contains('active')) { + icon.classList.remove('far'); + icon.classList.add('fas'); + btn.classList.remove('btn-outline-primary'); + btn.classList.add('btn-primary'); + } else { + icon.classList.remove('fas'); + icon.classList.add('far'); + btn.classList.remove('btn-primary'); + btn.classList.add('btn-outline-primary'); + } + } + + if (e.target.closest('.btn-outline-secondary') && e.target.textContent.includes('Reply')) { + // Show reply input + const timelineBody = e.target.closest('.timeline-body'); + if (!timelineBody.querySelector('.reply-input')) { + const replyHtml = ` +
+
+ + +
+
+ `; + timelineBody.insertAdjacentHTML('beforeend', replyHtml); + } + } + }); + + // Send reply + document.addEventListener('click', function(e) { + if (e.target.textContent === 'Send' && e.target.closest('.reply-input')) { + const input = e.target.previousElementSibling; + const replyText = input.value.trim(); + + if (replyText) { + const replyHtml = ` +
+
+
+ Avatar +
+ You +

${replyText}

+
+ Just now +
+
+
+ `; + + const replyInput = e.target.closest('.reply-input'); + replyInput.insertAdjacentHTML('beforebegin', replyHtml); + replyInput.remove(); + + showNotification('Reply posted!', 'success'); + } + } + }); + + // Block IP button + document.addEventListener('click', function(e) { + if (e.target.textContent === 'Block IP') { + const btn = e.target; + btn.innerHTML = 'Blocking...'; + btn.disabled = true; + + setTimeout(() => { + btn.innerHTML = 'Blocked'; + btn.classList.remove('btn-danger'); + btn.classList.add('btn-success'); + + showNotification('IP address has been blocked!', 'success'); + }, 1000); + } + }); + + function addNewActivity() { + const newActivity = ` +
+
+
+
+ Avatar +
+
System new user registered
+ Just now +
+ New +
+
+

A new user has joined the platform.

+
+
+
+ `; + + const todaySection = document.querySelector('.timeline-date'); + todaySection.insertAdjacentHTML('afterend', newActivity); + + // Animate new item + setTimeout(() => { + document.querySelector('.new-item').classList.add('animate-in'); + }, 100); + } + + function loadMoreActivities() { + const activities = [ + { + type: 'user', + title: 'Sarah Wilson', + action: 'uploaded documents', + time: '3 days ago', + body: 'Uploaded 5 new documents to the shared folder.', + avatar: 'Sarah+Wilson', + bgColor: '9b59b6' + }, + { + type: 'system', + title: 'System Update', + action: 'installed successfully', + time: '4 days ago', + body: 'Version 2.1.0 has been installed with new features and bug fixes.', + icon: 'fas fa-download text-info' + }, + { + type: 'transaction', + title: 'Payment Received', + action: 'from client', + time: '5 days ago', + body: 'Invoice #INV-2024-0156 has been paid.', + amount: '+$1,250.00' + } + ]; + + const loadMoreBtn = document.getElementById('loadMore'); + const timeline = document.getElementById('timeline'); + + activities.forEach(activity => { + const activityHtml = createActivityHtml(activity); + loadMoreBtn.insertAdjacentHTML('beforebegin', activityHtml); + }); + + // Add date separator + const dateSeparator = ` +
+
Last Week
+
+ `; + loadMoreBtn.insertAdjacentHTML('beforebegin', dateSeparator); + } + + function createActivityHtml(activity) { + let headerContent = ''; + + if (activity.avatar) { + headerContent = `Avatar`; + } else if (activity.icon) { + headerContent = ``; + } + + const markerColor = { + user: 'bg-primary', + system: 'bg-warning', + security: 'bg-danger', + transaction: 'bg-success', + milestone: 'bg-info' + }[activity.type] || 'bg-secondary'; + + return ` +
+
+
+
+ ${headerContent} +
+
${activity.title} ${activity.action}
+ ${activity.time} +
+ ${activity.amount ? `${activity.amount}` : ''} +
+
+

${activity.body}

+
+
+
+ `; + } + + function exportTimelineData() { + const visibleItems = document.querySelectorAll('.timeline-item:not([style*="display: none"])'); + const data = []; + + visibleItems.forEach(item => { + const header = item.querySelector('.timeline-header'); + const body = item.querySelector('.timeline-body'); + const time = header.querySelector('.text-muted').textContent; + const title = header.querySelector('h6').textContent; + const content = body.querySelector('p')?.textContent || ''; + + data.push({ + time: time, + title: title, + content: content, + type: item.dataset.type + }); + }); + + // Convert to CSV + const csv = 'Time,Title,Content,Type\n' + + data.map(row => `"${row.time}","${row.title}","${row.content}","${row.type}"`).join('\n'); + + // Download + const blob = new Blob([csv], { type: 'text/csv' }); + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = 'timeline_export.csv'; + a.click(); + window.URL.revokeObjectURL(url); + } + + function showNotification(message, type = 'info') { + const alertHtml = ` + + `; + + document.body.insertAdjacentHTML('beforeend', alertHtml); + + setTimeout(() => { + const alert = document.querySelector('.alert'); + if (alert) { + alert.remove(); + } + }, 3000); + } +} + +// Initialize on DOM ready +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initializeTimeline); +} else { + initializeTimeline(); +} \ No newline at end of file diff --git a/concept-modern/src/js/pages/users.js b/concept-modern/src/js/pages/users.js new file mode 100644 index 0000000..6ffc9a8 --- /dev/null +++ b/concept-modern/src/js/pages/users.js @@ -0,0 +1,374 @@ +import DataTable from 'datatables.net-bs5'; +import 'datatables.net-responsive'; +import 'datatables.net-responsive-bs5'; +import 'datatables.net-responsive-bs5/css/responsive.bootstrap5.min.css'; + +// User Management functionality +export function initializeUserManagement() { + let selectedUsers = new Set(); + + // Initialize DataTable + const table = new DataTable('#userTable', { + responsive: true, + pageLength: 10, + order: [[5, 'desc']], // Sort by joined date + columnDefs: [ + { orderable: false, targets: [0, 7] }, // Disable sorting for checkbox and actions + { searchable: false, targets: [0, 7] } + ], + language: { + search: '_INPUT_', + searchPlaceholder: 'Search users...', + lengthMenu: '_MENU_ users per page', + info: 'Showing _START_ to _END_ of _TOTAL_ users', + paginate: { + previous: '', + next: '' + } + }, + drawCallback: function() { + // Re-initialize tooltips after table redraw + const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); + tooltipTriggerList.map(function (tooltipTriggerEl) { + return new bootstrap.Tooltip(tooltipTriggerEl); + }); + } + }); + + // Hide default search box as we're using custom search + document.querySelector('.dataTables_filter').style.display = 'none'; + + // Custom search functionality + const searchInput = document.getElementById('searchInput'); + searchInput.addEventListener('keyup', function() { + table.search(this.value).draw(); + }); + + // Filter functionality + const roleFilter = document.getElementById('roleFilter'); + const statusFilter = document.getElementById('statusFilter'); + + roleFilter.addEventListener('change', function() { + filterTable(); + }); + + statusFilter.addEventListener('change', function() { + filterTable(); + }); + + function filterTable() { + const role = roleFilter.value; + const status = statusFilter.value; + + // Custom filtering logic + $.fn.dataTable.ext.search.push(function(settings, data, dataIndex) { + const roleCell = data[3]; // Role column + const statusCell = data[4]; // Status column + + let roleMatch = true; + let statusMatch = true; + + if (role && !roleCell.toLowerCase().includes(role.toLowerCase())) { + roleMatch = false; + } + + if (status && !statusCell.toLowerCase().includes(status.toLowerCase())) { + statusMatch = false; + } + + return roleMatch && statusMatch; + }); + + table.draw(); + + // Clear custom filter + $.fn.dataTable.ext.search.pop(); + } + + // Reset filters + document.getElementById('resetFilters').addEventListener('click', function() { + searchInput.value = ''; + roleFilter.value = ''; + statusFilter.value = ''; + table.search('').draw(); + }); + + // Select all checkbox + const selectAllCheckbox = document.getElementById('selectAll'); + selectAllCheckbox.addEventListener('change', function() { + const checkboxes = document.querySelectorAll('#userTable tbody input[type="checkbox"]'); + checkboxes.forEach(checkbox => { + checkbox.checked = this.checked; + const row = checkbox.closest('tr'); + if (this.checked) { + selectedUsers.add(row); + row.classList.add('table-active'); + } else { + selectedUsers.delete(row); + row.classList.remove('table-active'); + } + }); + updateBulkActions(); + }); + + // Individual checkbox handling + document.addEventListener('change', function(e) { + if (e.target.type === 'checkbox' && e.target.closest('#userTable tbody')) { + const row = e.target.closest('tr'); + if (e.target.checked) { + selectedUsers.add(row); + row.classList.add('table-active'); + } else { + selectedUsers.delete(row); + row.classList.remove('table-active'); + selectAllCheckbox.checked = false; + } + updateBulkActions(); + } + }); + + // Update bulk actions visibility + function updateBulkActions() { + const bulkActions = document.getElementById('bulkActions'); + const selectedCount = document.getElementById('selectedCount'); + + if (selectedUsers.size > 0) { + bulkActions.style.display = 'block'; + selectedCount.textContent = selectedUsers.size; + } else { + bulkActions.style.display = 'none'; + } + } + + // Export functionality + document.getElementById('exportBtn').addEventListener('click', function() { + const btn = this; + const originalText = btn.innerHTML; + + btn.innerHTML = 'Exporting...'; + btn.disabled = true; + + setTimeout(() => { + // Simulate export + const csvContent = generateCSV(); + downloadCSV(csvContent, 'users_export.csv'); + + btn.innerHTML = 'Exported!'; + + setTimeout(() => { + btn.innerHTML = originalText; + btn.disabled = false; + }, 2000); + }, 1500); + }); + + function generateCSV() { + const headers = ['Name', 'Email', 'Username', 'Role', 'Status', 'Joined Date']; + const rows = []; + + // Get visible rows from DataTable + table.rows({ search: 'applied' }).every(function() { + const data = this.data(); + const name = $(data[1]).find('h6').text(); + const username = $(data[1]).find('small').text().replace('@', ''); + const email = data[2]; + const role = $(data[3]).text(); + const status = $(data[4]).text(); + const joined = data[5]; + + rows.push([name, email, username, role, status, joined]); + }); + + // Create CSV content + let csv = headers.join(',') + '\n'; + rows.forEach(row => { + csv += row.map(cell => `"${cell}"`).join(',') + '\n'; + }); + + return csv; + } + + function downloadCSV(content, filename) { + const blob = new Blob([content], { type: 'text/csv' }); + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.setAttribute('hidden', ''); + a.setAttribute('href', url); + a.setAttribute('download', filename); + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + } + + // Add user form + const addUserForm = document.getElementById('addUserForm'); + addUserForm.addEventListener('submit', function(e) { + e.preventDefault(); + + const submitBtn = this.querySelector('button[type="submit"]'); + const originalText = submitBtn.innerHTML; + + submitBtn.innerHTML = 'Adding...'; + submitBtn.disabled = true; + + setTimeout(() => { + // Get form data + const formData = { + firstName: document.getElementById('firstName').value, + lastName: document.getElementById('lastName').value, + email: document.getElementById('email').value, + username: document.getElementById('username').value, + role: document.getElementById('role').value, + status: document.getElementById('status').value, + sendInvite: document.getElementById('sendInvite').checked + }; + + // Add new row to table + const newRow = createUserRow(formData); + table.row.add($(newRow)).draw(); + + // Close modal + const modal = bootstrap.Modal.getInstance(document.getElementById('addUserModal')); + modal.hide(); + + // Reset form + addUserForm.reset(); + + // Show success message + showNotification('User added successfully!', 'success'); + + submitBtn.innerHTML = originalText; + submitBtn.disabled = false; + }, 1500); + }); + + function createUserRow(data) { + const name = `${data.firstName} ${data.lastName}`; + const initials = `${data.firstName[0]}${data.lastName[0]}`; + const bgColor = getRandomColor(); + const roleClass = getRoleBadgeClass(data.role); + const statusClass = getStatusBadgeClass(data.status); + const joinedDate = new Date().toLocaleDateString('en-US', { + year: 'numeric', + month: 'short', + day: 'numeric' + }); + + return ` + + +
+ +
+ + +
+ Avatar +
+
${name}
+ @${data.username} +
+
+ + ${data.email} + ${capitalizeFirst(data.role)} + ${capitalizeFirst(data.status)} + ${joinedDate} + Just now + + + + + `; + } + + function getRandomColor() { + const colors = ['667eea', '48bb78', 'f39c12', 'e74c3c', '3498db', '9b59b6', '1abc9c']; + return colors[Math.floor(Math.random() * colors.length)]; + } + + function getRoleBadgeClass(role) { + const classes = { + admin: 'danger', + manager: 'primary', + user: 'info', + guest: 'secondary' + }; + return classes[role] || 'secondary'; + } + + function getStatusBadgeClass(status) { + const classes = { + active: 'success', + pending: 'warning text-dark', + inactive: 'secondary', + suspended: 'danger' + }; + return classes[status] || 'secondary'; + } + + function capitalizeFirst(str) { + return str.charAt(0).toUpperCase() + str.slice(1); + } + + function showNotification(message, type = 'info') { + const alertHtml = ` + + `; + + document.body.insertAdjacentHTML('beforeend', alertHtml); + + setTimeout(() => { + const alert = document.querySelector('.alert'); + if (alert) { + alert.remove(); + } + }, 5000); + } + + // Handle action buttons + document.addEventListener('click', function(e) { + if (e.target.closest('.dropdown-item')) { + const action = e.target.textContent.trim(); + const row = e.target.closest('tr'); + const userName = row.querySelector('h6').textContent; + + switch(action) { + case 'View': + // Show user details + console.log('View user:', userName); + break; + case 'Edit': + // Open edit modal + console.log('Edit user:', userName); + break; + case 'Delete': + if (confirm(`Are you sure you want to delete ${userName}?`)) { + table.row(row).remove().draw(); + showNotification('User deleted successfully!', 'success'); + } + break; + } + } + }); +} + +// Initialize on DOM ready +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initializeUserManagement); +} else { + initializeUserManagement(); +} \ No newline at end of file diff --git a/concept-modern/src/pages/misc/404.html b/concept-modern/src/pages/misc/404.html index 8e996e8..83934f9 100644 --- a/concept-modern/src/pages/misc/404.html +++ b/concept-modern/src/pages/misc/404.html @@ -1,179 +1,307 @@ - + - {{> layouts/head pageTitle="Page Not Found" }} + {{> layouts/head pageTitle="404 - Page Not Found" }} + + +
+ {{> layouts/header }} + {{> layouts/sidebar }} + +
+
+
+
+
+
+
+

404

+
+ +
+ + + + + + + + + + + ? + + + + + + + + + + + + + + + +
+ +

Oops! Page Not Found

+

+ The page you are looking for might have been removed, had its name changed, or is temporarily unavailable. +

+ + + +
+ + Go to Homepage + + +
+ +
+
Here are some helpful links:
+ +
+ + +
+
+
+
+
+ {{> layouts/footer }} +
+
+ + + + + {{> layouts/scripts }} + + + - - -
-
-
- 🚀 -

404

-

Oops! Lost in Space

-

- The page you're looking for has drifted away into the digital cosmos. -
Let's get you back on track! -

- - - - - -
-

Popular destinations:

-
- Dashboard - • - Charts - • - Tables - • - Login -
-
- - -
-
-
- - + } + \ No newline at end of file diff --git a/concept-modern/src/pages/settings.html b/concept-modern/src/pages/settings.html new file mode 100644 index 0000000..e94063b --- /dev/null +++ b/concept-modern/src/pages/settings.html @@ -0,0 +1,697 @@ + + + + {{> layouts/head pageTitle="Settings" }} + + +
+ {{> layouts/header }} + {{> layouts/sidebar activeMenu="settings" }} + +
+
+ +
+
+ +
+
+ +
+ + + + +
+
+ +
+
+
+
General Settings
+
+
+
+
+ + + The name of your website displayed in the header and title +
+ +
+ + + Brief description of your website for SEO purposes +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+
+ + +
+
+
+
Account Settings
+
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+
+
+
+ JD +
+
+
+
+
+ + +

JPG, GIF or PNG. Max size of 2MB

+
+
+
+ +
+ +
Delete Account
+

Once you delete your account, there is no going back. Please be certain.

+ +
+
+
+
+ + +
+
+
+
Security Settings
+
+
+
+
Change Password
+
+ + +
+ +
+ + + Use 8 or more characters with a mix of letters, numbers & symbols +
+ +
+ + +
+ + + +
+ +
Two-Factor Authentication
+

Add an extra layer of security to your account by enabling two-factor authentication.

+
+ + +
+ +
+ +
Sessions
+

Manage and logout your active sessions on other browsers and devices.

+ +
+
+
+
+
Chrome on Windows
+

Your current session

+
+ Active +
+
+
+
+
+
Safari on iPhone
+

Last active 2 hours ago

+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+
Email Settings
+
+
+
+
Email Configuration
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+
+ + +
+
+
+
Notification Settings
+
+
+
+
Email Notifications
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
Push Notifications
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
Desktop Notifications
+

Show notifications on desktop when the app is in background

+
+ + +
+ + +
+
+
+
+ + +
+
+
+
Appearance Settings
+
+
+
+
Theme
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
Color Scheme
+
+ + + + + + +
+ +
Layout
+
+ + +
+ +
+ + +
+ +
Font Size
+
+ +
+ Small + Large +
+
+ + +
+
+
+
+ + +
+
+
+
Integrations
+
+
+
+
+
+
+
+ +
+
+
Google Analytics
+ Track website traffic and user behavior +
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+
Slack
+ Get notifications in your Slack workspace +
+
+ +
+
+ +
+
+
+
+ +
+
+
Stripe
+ Accept payments and manage subscriptions +
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+
Mailchimp
+ Email marketing automation +
+
+ +
+
+ +
+
+
+
+ +
+
+
GitHub
+ Source code management +
+
+ Connected +
+
+
+ +
+
API Keys
+
+ +
+ + +
+
+ +
+
+
+
+ + +
+
+
+
Advanced Settings
+
+
+
+
Developer Options
+ +
+ + + Show detailed error messages and logs +
+ +
+ + + Temporarily disable the site for maintenance +
+ +
+ +
Cache
+

Clear various types of cached data to improve performance

+ +
+ + + +
+ +
+ +
Database
+ +
+ + +
+ + + +
+ +
Export/Import
+

Export your settings or import from a backup

+ +
+ + +
+ +
+ +
Danger Zone
+

These actions are irreversible. Please be careful.

+ + + +
+
+
+
+
+
+
+
+ {{> layouts/footer }} +
+
+ + {{> layouts/scripts }} + + + + \ No newline at end of file diff --git a/concept-modern/src/pages/tables/data-tables.html b/concept-modern/src/pages/tables/data-tables.html index a2ee749..08c659e 100644 --- a/concept-modern/src/pages/tables/data-tables.html +++ b/concept-modern/src/pages/tables/data-tables.html @@ -6,7 +6,7 @@
{{> layouts/header }} - {{> layouts/sidebar }} + {{> layouts/sidebar activeMenu="tables" activePage="data-tables"}}
diff --git a/concept-modern/src/pages/tables/general-tables.html b/concept-modern/src/pages/tables/general-tables.html index 7c3d8f1..ac4bc32 100644 --- a/concept-modern/src/pages/tables/general-tables.html +++ b/concept-modern/src/pages/tables/general-tables.html @@ -6,7 +6,7 @@
{{> layouts/header }} - {{> layouts/sidebar }} + {{> layouts/sidebar activeMenu="tables" activePage="general-tables"}}
diff --git a/concept-modern/src/pages/timeline.html b/concept-modern/src/pages/timeline.html new file mode 100644 index 0000000..7497356 --- /dev/null +++ b/concept-modern/src/pages/timeline.html @@ -0,0 +1,342 @@ + + + + {{> layouts/head pageTitle="Timeline" }} + + +
+ {{> layouts/header }} + {{> layouts/sidebar activeMenu="timeline" }} + +
+
+ +
+
+ +
+
+ +
+ +
+
+
+
Filters
+
+
+
+ + +
+ +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+ + +
+ + + +
+
+ + +
+
+
Activity Stats
+
+
+
+ Total Activities + 1,234 +
+
+ Today + 47 +
+
+ This Week + 312 +
+
+ Active Users + 89 +
+
+
+
+ + +
+
+
+
+
Recent Activities
+
+ + +
+
+
+
+
+ +
+
Today
+
+ +
+
+
+
+ Avatar +
+
John Doe updated profile
+ 2 hours ago +
+ +
+
+

Changed profile picture and updated bio information.

+
+
+
+ +
+
+
+
+ +
+
System backup completed
+ 3 hours ago +
+
+
+

Daily backup completed successfully.

+
+
+
+ Backup size: 2.4 GB +
+
+
+ +
+
+
+
+ +
+
Security Alert failed login attempts
+ 5 hours ago +
+ High +
+
+

Multiple failed login attempts detected from IP: 192.168.1.100

+
+ + +
+
+
+
+ +
+
+
+
+ Avatar +
+
Jane Smith completed purchase
+ 6 hours ago +
+ +$299.00 +
+
+
+
+

Premium Plan Subscription

+ Order #12345 +
+ +
+
+
+
+ + +
+
Yesterday
+
+ +
+
+ +
+
+
+ +
+
Milestone Achieved 1000 users registered
+ Yesterday at 3:45 PM +
+
+
+
+
+ +

1,000 Users!

+

Congratulations on reaching this milestone!

+
+
+
+
+
+ +
+
+
+
+ Avatar +
+
Mike Johnson commented on Sales Report Q4
+ Yesterday at 2:15 PM +
+
+
+
+
+

"Great work on the Q4 report! The revenue growth is impressive."

+
+
+
+ + +
+
+
+
+ +
+
+
+
+ +
+
Database optimization completed
+ Yesterday at 11:30 AM +
+
+
+
+
+
+
-45%
+ Query Time +
+
+
+
+
+30%
+ Performance +
+
+
+
+
+
+ + +
+ +
+
+
+
+
+
+
+ {{> layouts/footer }} +
+
+ + {{> layouts/scripts }} + + + + \ No newline at end of file diff --git a/concept-modern/src/pages/users.html b/concept-modern/src/pages/users.html new file mode 100644 index 0000000..da32832 --- /dev/null +++ b/concept-modern/src/pages/users.html @@ -0,0 +1,469 @@ + + + + {{> layouts/head pageTitle="User Management" }} + + +
+ {{> layouts/header }} + {{> layouts/sidebar activeMenu="users" }} + +
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
+
Total Users
+

2,543

+

+ 12.5% +

+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
Active Users
+

1,893

+

+ 8.2% +

+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
New Users
+

127

+

+ 0% +

+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
Suspended
+

23

+

+ 4.3% +

+
+
+
+ +
+
+
+
+
+
+
+ + +
+
+
+
+
+
User List
+
+ + +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
UserEmailRoleStatusJoinedLast ActiveActions
+
+ +
+
+
+ Avatar +
+
John Doe
+ @johndoe +
+
+
john.doe@example.comAdminActiveJan 15, 20242 hours ago + +
+
+ +
+
+
+ Avatar +
+
Jane Smith
+ @janesmith +
+
+
jane.smith@example.comManagerActiveFeb 28, 20245 minutes ago + +
+
+ +
+
+
+ Avatar +
+
Mike Johnson
+ @mikej +
+
+
mike.j@example.comUserPendingMar 10, 20241 day ago + +
+
+ +
+
+
+ Avatar +
+
Sarah Davis
+ @sarahd +
+
+
sarah.davis@example.comUserSuspendedDec 20, 20231 week ago + +
+
+ +
+
+
+ Avatar +
+
Tom Wilson
+ @tomw +
+
+
tom.wilson@example.comGuestInactiveNov 5, 20231 month ago + +
+
+ + +
+
+ Showing 1 to 5 of 2,543 entries +
+ +
+ + + +
+
+
+
+
+ {{> layouts/footer }} +
+
+ + + + + {{> layouts/scripts }} + + + + \ No newline at end of file diff --git a/concept-modern/src/partials/layouts/sidebar.hbs b/concept-modern/src/partials/layouts/sidebar.hbs index 9c61f7f..4c5a8df 100644 --- a/concept-modern/src/partials/layouts/sidebar.hbs +++ b/concept-modern/src/partials/layouts/sidebar.hbs @@ -131,7 +131,7 @@ Sign Up
@@ -160,6 +160,31 @@
+ + + + + + + + + + +
diff --git a/concept-modern/src/scss/layouts/_header.scss b/concept-modern/src/scss/layouts/_header.scss index 47fca1d..b6657cf 100644 --- a/concept-modern/src/scss/layouts/_header.scss +++ b/concept-modern/src/scss/layouts/_header.scss @@ -1,7 +1,7 @@ // Header/Navbar Styles .dashboard-header { .navbar { - min-height: 70px; + min-height: 60px; padding: 0 30px; box-shadow: 0 0 28px 0 rgba(82, 63, 105, 0.08); background-color: #fff; diff --git a/concept-modern/src/scss/layouts/_layout.scss b/concept-modern/src/scss/layouts/_layout.scss index 71bef76..f488417 100644 --- a/concept-modern/src/scss/layouts/_layout.scss +++ b/concept-modern/src/scss/layouts/_layout.scss @@ -12,7 +12,7 @@ body { .dashboard-wrapper { margin-left: $sidebar-width; min-height: 100vh; - padding-top: 70px; + padding-top: 60px; background-color: #efeff6; @include media-breakpoint-down(lg) { @@ -22,7 +22,7 @@ body { .dashboard-content { padding: 30px 30px 60px; - min-height: calc(100vh - 70px); + min-height: calc(100vh - 60px); background-color: #efeff6; @include media-breakpoint-down(md) { diff --git a/concept-modern/src/scss/layouts/_sidebar.scss b/concept-modern/src/scss/layouts/_sidebar.scss index 9895cab..7ebd71c 100644 --- a/concept-modern/src/scss/layouts/_sidebar.scss +++ b/concept-modern/src/scss/layouts/_sidebar.scss @@ -2,7 +2,7 @@ .nav-left-sidebar { position: fixed; width: $sidebar-width; - top: 70px; + top: 60px; bottom: 0; left: 0; z-index: 1040; diff --git a/concept-modern/src/scss/main.scss b/concept-modern/src/scss/main.scss index fa798ee..31573a0 100644 --- a/concept-modern/src/scss/main.scss +++ b/concept-modern/src/scss/main.scss @@ -29,6 +29,9 @@ @import "pages/influencer"; @import "pages/calendar"; @import "pages/chat"; +@import "pages/settings"; +@import "pages/users"; +@import "pages/timeline"; // Utilities @import "utilities/scrollbar"; \ No newline at end of file diff --git a/concept-modern/src/scss/pages/_chat.scss b/concept-modern/src/scss/pages/_chat.scss index d26a22a..d4d1902 100644 --- a/concept-modern/src/scss/pages/_chat.scss +++ b/concept-modern/src/scss/pages/_chat.scss @@ -1,7 +1,7 @@ // Chat Page Styles .chat-container { - height: calc(100vh - 180px); + height: calc(100vh - 170px); overflow: hidden; .row { diff --git a/concept-modern/src/scss/pages/_settings.scss b/concept-modern/src/scss/pages/_settings.scss new file mode 100644 index 0000000..9deafc9 --- /dev/null +++ b/concept-modern/src/scss/pages/_settings.scss @@ -0,0 +1,194 @@ +// Settings page styles +.nav-pills { + .nav-link { + color: $gray-700; + border-radius: 0.375rem; + padding: 0.75rem 1rem; + margin-bottom: 0.25rem; + transition: all 0.3s ease; + + &:hover { + background-color: $gray-100; + color: $primary; + } + + &.active { + background-color: $primary; + color: $white; + + i { + color: $white; + } + } + + i { + width: 1.25rem; + text-align: center; + } + } +} + +// Card radio buttons for theme selection +.card-radio { + position: relative; + + .form-check-input { + position: absolute; + opacity: 0; + + &:checked + .form-check-label { + border-color: $primary; + background-color: rgba($primary, 0.1); + + i { + color: $primary; + } + } + } + + .form-check-label { + cursor: pointer; + border: 2px solid $gray-300; + transition: all 0.3s ease; + + &:hover { + border-color: $gray-400; + } + } +} + +// Color scheme buttons +.color-scheme-btn { + position: relative; + + &.active::after { + content: '\f00c'; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: white; + font-size: 0.875rem; + } +} + +// Icon circles for integrations +.icon-circle { + width: 48px; + height: 48px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + font-size: 1.25rem; + + &.bg-primary-light { + background-color: rgba($primary, 0.1); + color: $primary; + } + + &.bg-info-light { + background-color: rgba($info, 0.1); + color: $info; + } + + &.bg-success-light { + background-color: rgba($success, 0.1); + color: $success; + } + + &.bg-warning-light { + background-color: rgba($warning, 0.1); + color: $warning; + } + + &.bg-danger-light { + background-color: rgba($danger, 0.1); + color: $danger; + } +} + +// Settings content spacing +.tab-content { + .card { + .card-header { + background-color: $white; + border-bottom: 2px solid $gray-200; + + h5 { + font-weight: 600; + color: $gray-800; + } + } + + .card-body { + padding: 2rem; + } + } +} + +// Form styling +.form-label { + font-weight: 500; + color: $gray-700; + margin-bottom: 0.5rem; +} + +.form-text { + font-size: 0.875rem; +} + +// Session list items +.list-group-item { + border-left: none; + border-right: none; + + &:first-child { + border-top: none; + } + + &:last-child { + border-bottom: none; + } +} + +// API key input group +.input-group { + .form-control[readonly] { + background-color: $gray-100; + font-family: $font-family-monospace; + font-size: 0.875rem; + } +} + +// Responsive adjustments +@include media-breakpoint-down(lg) { + .nav-pills { + display: flex; + flex-wrap: nowrap; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + margin-bottom: 1rem; + + .nav-link { + white-space: nowrap; + margin-bottom: 0; + margin-right: 0.5rem; + } + } +} + +@include media-breakpoint-down(md) { + .tab-content { + .card-body { + padding: 1.25rem; + } + } + + .color-scheme-btn { + padding: 0.375rem 0.75rem; + font-size: 0.875rem; + } +} \ No newline at end of file diff --git a/concept-modern/src/scss/pages/_timeline.scss b/concept-modern/src/scss/pages/_timeline.scss new file mode 100644 index 0000000..854350e --- /dev/null +++ b/concept-modern/src/scss/pages/_timeline.scss @@ -0,0 +1,245 @@ +// Timeline page styles +.timeline { + position: relative; + padding-left: 2rem; + + &::before { + content: ''; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 2px; + background-color: $gray-300; + } +} + +.timeline-date { + margin: 2rem 0 1rem; + position: relative; + + h6 { + background-color: $white; + display: inline-block; + padding-right: 1rem; + margin-bottom: 0; + margin-left: -2rem; + font-weight: 600; + color: $gray-600; + } +} + +.timeline-item { + position: relative; + display: flex; + margin-bottom: 2rem; + + &.new-item { + opacity: 0; + transform: translateY(20px); + + &.animate-in { + animation: fadeInUp 0.5s ease forwards; + } + } +} + +.timeline-marker { + position: absolute; + left: -2.5rem; + top: 0.5rem; + width: 1rem; + height: 1rem; + border-radius: 50%; + z-index: 1; + + &::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 0.5rem; + height: 0.5rem; + background-color: $white; + border-radius: 50%; + } + + i { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 0.5rem; + } +} + +.timeline-content { + flex: 1; + background-color: $white; + border: 1px solid $gray-200; + border-radius: 0.5rem; + padding: 1.25rem; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); + transition: all 0.3s ease; + + &:hover { + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + transform: translateY(-2px); + } +} + +.timeline-header { + display: flex; + align-items: center; + margin-bottom: 0.75rem; + + img { + object-fit: cover; + } + + h6 { + margin: 0; + font-size: 0.9375rem; + + small { + font-weight: normal; + } + } + + .dropdown { + .btn { + padding: 0.25rem 0.5rem; + border: none; + background-color: transparent; + + &:hover { + background-color: $gray-100; + } + } + } +} + +.timeline-body { + font-size: 0.875rem; + + p { + line-height: 1.6; + } + + .card { + border: none; + margin-top: 0.5rem; + + .card-body { + padding: 1rem; + } + } + + .progress { + margin: 0.5rem 0; + } + + .btn-sm { + font-size: 0.8125rem; + padding: 0.25rem 0.75rem; + } +} + +// Activity type colors +.activity-filters { + .form-check-label { + display: flex; + align-items: center; + font-size: 0.875rem; + + i { + width: 1.25rem; + } + } +} + +// Reply input +.reply-input { + .input-group { + .form-control { + font-size: 0.875rem; + } + + .btn { + font-size: 0.875rem; + } + } +} + +// Animations +@keyframes fadeInUp { + to { + opacity: 1; + transform: translateY(0); + } +} + +// Mobile responsiveness +@include media-breakpoint-down(md) { + .timeline { + padding-left: 1.5rem; + + &::before { + left: 0; + } + } + + .timeline-marker { + left: -1.75rem; + width: 0.875rem; + height: 0.875rem; + + &::after { + width: 0.375rem; + height: 0.375rem; + } + } + + .timeline-content { + padding: 1rem; + } + + .timeline-header { + flex-wrap: wrap; + + img { + width: 28px; + height: 28px; + } + + h6 { + font-size: 0.875rem; + } + + .dropdown { + margin-left: auto; + } + } + + .timeline-date h6 { + margin-left: -1.5rem; + font-size: 0.875rem; + } +} + +@include media-breakpoint-down(sm) { + .timeline { + padding-left: 1rem; + } + + .timeline-marker { + left: -1.25rem; + width: 0.75rem; + height: 0.75rem; + } + + .timeline-date h6 { + margin-left: -1rem; + } +} \ No newline at end of file diff --git a/concept-modern/src/scss/pages/_users.scss b/concept-modern/src/scss/pages/_users.scss new file mode 100644 index 0000000..d2e1b74 --- /dev/null +++ b/concept-modern/src/scss/pages/_users.scss @@ -0,0 +1,136 @@ +// User Management page styles +.icon-circle { + width: 48px; + height: 48px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + font-size: 1.25rem; + + &.bg-primary-light { + background-color: rgba($primary, 0.1); + } + + &.bg-success-light { + background-color: rgba($success, 0.1); + } + + &.bg-info-light { + background-color: rgba($info, 0.1); + } + + &.bg-danger-light { + background-color: rgba($danger, 0.1); + } +} + +// User table styles +#userTable { + tbody tr { + transition: all 0.2s ease; + + &.table-active { + background-color: rgba($primary, 0.05); + } + + &:hover { + background-color: $gray-100; + } + } + + .form-check-input { + cursor: pointer; + } +} + +// Bulk actions +.bulk-actions { + background-color: $light; + padding: 1rem; + border-radius: 0.375rem; + margin-top: 1rem; + animation: slideUp 0.3s ease; +} + +@keyframes slideUp { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +// DataTables customization +.dataTables_wrapper { + .dataTables_length { + label { + font-weight: normal; + color: $text-muted; + } + + select { + @extend .form-select; + width: auto; + display: inline-block; + margin: 0 0.5rem; + } + } + + .dataTables_info { + color: $text-muted; + font-size: 0.875rem; + } + + .dataTables_paginate { + .pagination { + margin: 0; + } + + .page-link { + padding: 0.375rem 0.75rem; + font-size: 0.875rem; + + &:hover { + background-color: $gray-100; + } + } + } +} + +// Responsive adjustments +@include media-breakpoint-down(lg) { + .bulk-actions { + .btn { + font-size: 0.875rem; + padding: 0.375rem 0.75rem; + } + } +} + +@include media-breakpoint-down(md) { + .icon-circle { + width: 40px; + height: 40px; + font-size: 1rem; + } + + .bulk-actions { + .d-flex { + flex-direction: column; + align-items: stretch !important; + + span { + margin-bottom: 0.5rem; + text-align: center; + } + + .btn { + margin: 0.25rem 0 !important; + } + } + } +} \ No newline at end of file diff --git a/concept-modern/vite.config.js b/concept-modern/vite.config.js index 48c928a..4092a9e 100644 --- a/concept-modern/vite.config.js +++ b/concept-modern/vite.config.js @@ -62,6 +62,11 @@ export default defineConfig({ 'calendar': resolve(__dirname, 'src/pages/calendar.html'), 'chat': resolve(__dirname, 'src/pages/chat.html'), 'inbox': resolve(__dirname, 'src/pages/inbox.html'), + // Settings + 'settings': resolve(__dirname, 'src/pages/settings.html'), + // User Management + 'users': resolve(__dirname, 'src/pages/users.html'), + 'timeline': resolve(__dirname, 'src/pages/timeline.html'), // Misc Pages 'blank-page': resolve(__dirname, 'src/pages/misc/blank-page.html'), 'login': resolve(__dirname, 'src/pages/misc/login.html'),