Devel #72
14 changed files with 299 additions and 157 deletions
188
assets/package-lock.json
generated
188
assets/package-lock.json
generated
|
@ -32,9 +32,9 @@
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@babel/runtime": {
|
"node_modules/@babel/runtime": {
|
||||||
"version": "7.21.0",
|
"version": "7.21.5",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz",
|
||||||
"integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
|
"integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"regenerator-runtime": "^0.13.11"
|
"regenerator-runtime": "^0.13.11"
|
||||||
},
|
},
|
||||||
|
@ -43,9 +43,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/android-arm": {
|
"node_modules/@esbuild/android-arm": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz",
|
||||||
"integrity": "sha512-E/sgkvwoIfj4aMAPL2e35VnUJspzVYl7+M1B2cqeubdBhADV4uPon0KCc8p2G+LqSJ6i8ocYPCqY3A4GGq0zkQ==",
|
"integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
|
@ -59,9 +59,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/android-arm64": {
|
"node_modules/@esbuild/android-arm64": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz",
|
||||||
"integrity": "sha512-WQ9p5oiXXYJ33F2EkE3r0FRDFVpEdcDiwNX3u7Xaibxfx6vQE0Sb8ytrfQsA5WO6kDn6mDfKLh6KrPBjvkk7xA==",
|
"integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -75,9 +75,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/android-x64": {
|
"node_modules/@esbuild/android-x64": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz",
|
||||||
"integrity": "sha512-m4OsaCr5gT+se25rFPHKQXARMyAehHTQAz4XX1Vk3d27VtqiX0ALMBPoXZsGaB6JYryCLfgGwUslMqTfqeLU0w==",
|
"integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -91,9 +91,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/darwin-arm64": {
|
"node_modules/@esbuild/darwin-arm64": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz",
|
||||||
"integrity": "sha512-O3GCZghRIx+RAN0NDPhyyhRgwa19MoKlzGonIb5hgTj78krqp9XZbYCvFr9N1eUxg0ZQEpiiZ4QvsOQwBpP+lg==",
|
"integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -107,9 +107,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/darwin-x64": {
|
"node_modules/@esbuild/darwin-x64": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz",
|
||||||
"integrity": "sha512-5D48jM3tW27h1qjaD9UNRuN+4v0zvksqZSPZqeSWggfMlsVdAhH3pwSfQIFJwcs9QJ9BRibPS4ViZgs3d2wsCA==",
|
"integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -123,9 +123,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/freebsd-arm64": {
|
"node_modules/@esbuild/freebsd-arm64": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz",
|
||||||
"integrity": "sha512-OWvHzmLNTdF1erSvrfoEBGlN94IE6vCEaGEkEH29uo/VoONqPnoDFfShi41Ew+yKimx4vrmmAJEGNoyyP+OgOQ==",
|
"integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -139,9 +139,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/freebsd-x64": {
|
"node_modules/@esbuild/freebsd-x64": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz",
|
||||||
"integrity": "sha512-A0Xg5CZv8MU9xh4a+7NUpi5VHBKh1RaGJKqjxe4KG87X+mTjDE6ZvlJqpWoeJxgfXHT7IMP9tDFu7IZ03OtJAw==",
|
"integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -155,9 +155,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/linux-arm": {
|
"node_modules/@esbuild/linux-arm": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz",
|
||||||
"integrity": "sha512-WsHyJ7b7vzHdJ1fv67Yf++2dz3D726oO3QCu8iNYik4fb5YuuReOI9OtA+n7Mk0xyQivNTPbl181s+5oZ38gyA==",
|
"integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
|
@ -171,9 +171,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/linux-arm64": {
|
"node_modules/@esbuild/linux-arm64": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz",
|
||||||
"integrity": "sha512-cK3AjkEc+8v8YG02hYLQIQlOznW+v9N+OI9BAFuyqkfQFR+DnDLhEM5N8QRxAUz99cJTo1rLNXqRrvY15gbQUg==",
|
"integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -187,9 +187,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/linux-ia32": {
|
"node_modules/@esbuild/linux-ia32": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz",
|
||||||
"integrity": "sha512-jdOBXJqcgHlah/nYHnj3Hrnl9l63RjtQ4vn9+bohjQPI2QafASB5MtHAoEv0JQHVb/xYQTFOeuHnNYE1zF7tYw==",
|
"integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"ia32"
|
"ia32"
|
||||||
],
|
],
|
||||||
|
@ -203,9 +203,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/linux-loong64": {
|
"node_modules/@esbuild/linux-loong64": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz",
|
||||||
"integrity": "sha512-GTOEtj8h9qPKXCyiBBnHconSCV9LwFyx/gv3Phw0pa25qPYjVuuGZ4Dk14bGCfGX3qKF0+ceeQvwmtI+aYBbVA==",
|
"integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"loong64"
|
"loong64"
|
||||||
],
|
],
|
||||||
|
@ -219,9 +219,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/linux-mips64el": {
|
"node_modules/@esbuild/linux-mips64el": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz",
|
||||||
"integrity": "sha512-o8CIhfBwKcxmEENOH9RwmUejs5jFiNoDw7YgS0EJTF6kgPgcqLFjgoc5kDey5cMHRVCIWc6kK2ShUePOcc7RbA==",
|
"integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"mips64el"
|
"mips64el"
|
||||||
],
|
],
|
||||||
|
@ -235,9 +235,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/linux-ppc64": {
|
"node_modules/@esbuild/linux-ppc64": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz",
|
||||||
"integrity": "sha512-biMLH6NR/GR4z+ap0oJYb877LdBpGac8KfZoEnDiBKd7MD/xt8eaw1SFfYRUeMVx519kVkAOL2GExdFmYnZx3A==",
|
"integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"ppc64"
|
"ppc64"
|
||||||
],
|
],
|
||||||
|
@ -251,9 +251,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/linux-riscv64": {
|
"node_modules/@esbuild/linux-riscv64": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz",
|
||||||
"integrity": "sha512-jkphYUiO38wZGeWlfIBMB72auOllNA2sLfiZPGDtOBb1ELN8lmqBrlMiucgL8awBw1zBXN69PmZM6g4yTX84TA==",
|
"integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"riscv64"
|
"riscv64"
|
||||||
],
|
],
|
||||||
|
@ -267,9 +267,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/linux-s390x": {
|
"node_modules/@esbuild/linux-s390x": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz",
|
||||||
"integrity": "sha512-j3ucLdeY9HBcvODhCY4b+Ds3hWGO8t+SAidtmWu/ukfLLG/oYDMaA+dnugTVAg5fnUOGNbIYL9TOjhWgQB8W5g==",
|
"integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"s390x"
|
"s390x"
|
||||||
],
|
],
|
||||||
|
@ -283,9 +283,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/linux-x64": {
|
"node_modules/@esbuild/linux-x64": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz",
|
||||||
"integrity": "sha512-uo5JL3cgaEGotaqSaJdRfFNSCUJOIliKLnDGWaVCgIKkHxwhYMm95pfMbWZ9l7GeW9kDg0tSxcy9NYdEtjwwmA==",
|
"integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -299,9 +299,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/netbsd-x64": {
|
"node_modules/@esbuild/netbsd-x64": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz",
|
||||||
"integrity": "sha512-DNdoRg8JX+gGsbqt2gPgkgb00mqOgOO27KnrWZtdABl6yWTST30aibGJ6geBq3WM2TIeW6COs5AScnC7GwtGPg==",
|
"integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -315,9 +315,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/openbsd-x64": {
|
"node_modules/@esbuild/openbsd-x64": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz",
|
||||||
"integrity": "sha512-aVsENlr7B64w8I1lhHShND5o8cW6sB9n9MUtLumFlPhG3elhNWtE7M1TFpj3m7lT3sKQUMkGFjTQBrvDDO1YWA==",
|
"integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -331,9 +331,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/sunos-x64": {
|
"node_modules/@esbuild/sunos-x64": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz",
|
||||||
"integrity": "sha512-qbHGVQdKSwi0JQJuZznS4SyY27tYXYF0mrgthbxXrZI3AHKuRvU+Eqbg/F0rmLDpW/jkIZBlCO1XfHUBMNJ1pg==",
|
"integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -347,9 +347,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/win32-arm64": {
|
"node_modules/@esbuild/win32-arm64": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz",
|
||||||
"integrity": "sha512-zsCp8Ql+96xXTVTmm6ffvoTSZSV2B/LzzkUXAY33F/76EajNw1m+jZ9zPfNJlJ3Rh4EzOszNDHsmG/fZOhtqDg==",
|
"integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -363,9 +363,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/win32-ia32": {
|
"node_modules/@esbuild/win32-ia32": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz",
|
||||||
"integrity": "sha512-FfrFjR4id7wcFYOdqbDfDET3tjxCozUgbqdkOABsSFzoZGFC92UK7mg4JKRc/B3NNEf1s2WHxJ7VfTdVDPN3ng==",
|
"integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"ia32"
|
"ia32"
|
||||||
],
|
],
|
||||||
|
@ -379,9 +379,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/win32-x64": {
|
"node_modules/@esbuild/win32-x64": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz",
|
||||||
"integrity": "sha512-JOOxw49BVZx2/5tW3FqkdjSD/5gXYeVGPDcB0lvap0gLQshkh1Nyel1QazC+wNxus3xPlsYAgqU1BUmrmCvWtw==",
|
"integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -459,9 +459,9 @@
|
||||||
"integrity": "sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w=="
|
"integrity": "sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w=="
|
||||||
},
|
},
|
||||||
"node_modules/esbuild": {
|
"node_modules/esbuild": {
|
||||||
"version": "0.17.12",
|
"version": "0.17.18",
|
||||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz",
|
||||||
"integrity": "sha512-bX/zHl7Gn2CpQwcMtRogTTBf9l1nl+H6R8nUbjk+RuKqAE3+8FDulLA+pHvX7aA7Xe07Iwa+CWvy9I8Y2qqPKQ==",
|
"integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
|
@ -471,28 +471,28 @@
|
||||||
"node": ">=12"
|
"node": ">=12"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@esbuild/android-arm": "0.17.12",
|
"@esbuild/android-arm": "0.17.18",
|
||||||
"@esbuild/android-arm64": "0.17.12",
|
"@esbuild/android-arm64": "0.17.18",
|
||||||
"@esbuild/android-x64": "0.17.12",
|
"@esbuild/android-x64": "0.17.18",
|
||||||
"@esbuild/darwin-arm64": "0.17.12",
|
"@esbuild/darwin-arm64": "0.17.18",
|
||||||
"@esbuild/darwin-x64": "0.17.12",
|
"@esbuild/darwin-x64": "0.17.18",
|
||||||
"@esbuild/freebsd-arm64": "0.17.12",
|
"@esbuild/freebsd-arm64": "0.17.18",
|
||||||
"@esbuild/freebsd-x64": "0.17.12",
|
"@esbuild/freebsd-x64": "0.17.18",
|
||||||
"@esbuild/linux-arm": "0.17.12",
|
"@esbuild/linux-arm": "0.17.18",
|
||||||
"@esbuild/linux-arm64": "0.17.12",
|
"@esbuild/linux-arm64": "0.17.18",
|
||||||
"@esbuild/linux-ia32": "0.17.12",
|
"@esbuild/linux-ia32": "0.17.18",
|
||||||
"@esbuild/linux-loong64": "0.17.12",
|
"@esbuild/linux-loong64": "0.17.18",
|
||||||
"@esbuild/linux-mips64el": "0.17.12",
|
"@esbuild/linux-mips64el": "0.17.18",
|
||||||
"@esbuild/linux-ppc64": "0.17.12",
|
"@esbuild/linux-ppc64": "0.17.18",
|
||||||
"@esbuild/linux-riscv64": "0.17.12",
|
"@esbuild/linux-riscv64": "0.17.18",
|
||||||
"@esbuild/linux-s390x": "0.17.12",
|
"@esbuild/linux-s390x": "0.17.18",
|
||||||
"@esbuild/linux-x64": "0.17.12",
|
"@esbuild/linux-x64": "0.17.18",
|
||||||
"@esbuild/netbsd-x64": "0.17.12",
|
"@esbuild/netbsd-x64": "0.17.18",
|
||||||
"@esbuild/openbsd-x64": "0.17.12",
|
"@esbuild/openbsd-x64": "0.17.18",
|
||||||
"@esbuild/sunos-x64": "0.17.12",
|
"@esbuild/sunos-x64": "0.17.18",
|
||||||
"@esbuild/win32-arm64": "0.17.12",
|
"@esbuild/win32-arm64": "0.17.18",
|
||||||
"@esbuild/win32-ia32": "0.17.12",
|
"@esbuild/win32-ia32": "0.17.18",
|
||||||
"@esbuild/win32-x64": "0.17.12"
|
"@esbuild/win32-x64": "0.17.18"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/fast-equals": {
|
"node_modules/fast-equals": {
|
||||||
|
|
|
@ -5,9 +5,22 @@ defmodule Chiya.Notes do
|
||||||
|
|
||||||
import Ecto.Query, warn: false
|
import Ecto.Query, warn: false
|
||||||
alias Chiya.Repo
|
alias Chiya.Repo
|
||||||
alias Chiya.Notes.{Note, NoteImage, NoteNote, NoteTag}
|
alias Chiya.Notes.{Note, NoteImage, NoteNote, NoteTag, NoteComment}
|
||||||
|
|
||||||
@preloads [:channels, :images, :links_from, :links_to, :tags]
|
@preloads [
|
||||||
|
:channels,
|
||||||
|
:images,
|
||||||
|
:links_from,
|
||||||
|
:links_to,
|
||||||
|
:tags,
|
||||||
|
comments:
|
||||||
|
from(c in NoteComment,
|
||||||
|
order_by: [
|
||||||
|
desc: :approved_at,
|
||||||
|
desc: :inserted_at
|
||||||
|
]
|
||||||
|
)
|
||||||
|
]
|
||||||
def note_preloads(), do: @preloads
|
def note_preloads(), do: @preloads
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
|
@ -264,4 +277,18 @@ defmodule Chiya.Notes do
|
||||||
def delete_note_tag(%NoteTag{} = note_tag) do
|
def delete_note_tag(%NoteTag{} = note_tag) do
|
||||||
Repo.delete(note_tag)
|
Repo.delete(note_tag)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def create_note_comment(attrs \\ %{}) do
|
||||||
|
%NoteComment{}
|
||||||
|
|> NoteComment.changeset(attrs)
|
||||||
|
|> Repo.insert()
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_note_comment(%NoteComment{} = note_comment) do
|
||||||
|
Repo.delete(note_comment)
|
||||||
|
end
|
||||||
|
|
||||||
|
def change_note_comment(%NoteComment{} = note_comment, attrs \\ %{}) do
|
||||||
|
NoteComment.changeset(note_comment, attrs)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
defmodule Chiya.Notes.Note do
|
defmodule Chiya.Notes.Note do
|
||||||
use Ecto.Schema
|
use Ecto.Schema
|
||||||
import Ecto.Changeset
|
import Ecto.Changeset
|
||||||
alias Chiya.Notes.NoteSlug
|
alias Chiya.Notes.{Note, NoteSlug, NoteNote, NoteTag}
|
||||||
|
|
||||||
@reserved_slugs []
|
@reserved_slugs ~w(user admin dev api)
|
||||||
|
|
||||||
@derive {Jason.Encoder, only: [:id, :name, :content, :slug, :channels]}
|
@derive {Jason.Encoder, only: [:id, :name, :content, :slug, :channels]}
|
||||||
schema "notes" do
|
schema "notes" do
|
||||||
|
@ -23,19 +23,20 @@ defmodule Chiya.Notes.Note do
|
||||||
join_keys: [note: :id, channel: :id],
|
join_keys: [note: :id, channel: :id],
|
||||||
on_replace: :delete
|
on_replace: :delete
|
||||||
|
|
||||||
many_to_many :links_from, Chiya.Notes.Note,
|
many_to_many :links_from, Note,
|
||||||
join_through: Chiya.Notes.NoteNote,
|
join_through: NoteNote,
|
||||||
join_keys: [source_id: :id, target_id: :id]
|
join_keys: [source_id: :id, target_id: :id]
|
||||||
|
|
||||||
many_to_many :links_to, Chiya.Notes.Note,
|
many_to_many :links_to, Note,
|
||||||
join_through: Chiya.Notes.NoteNote,
|
join_through: NoteNote,
|
||||||
join_keys: [target_id: :id, source_id: :id]
|
join_keys: [target_id: :id, source_id: :id]
|
||||||
|
|
||||||
many_to_many :tags, Chiya.Tags.Tag,
|
many_to_many :tags, Chiya.Tags.Tag,
|
||||||
join_through: Chiya.Notes.NoteTag,
|
join_through: NoteTag,
|
||||||
join_keys: [note_id: :id, tag_id: :id]
|
join_keys: [note_id: :id, tag_id: :id]
|
||||||
|
|
||||||
has_many :images, Chiya.Notes.NoteImage
|
has_many :images, Chiya.Notes.NoteImage
|
||||||
|
has_many :comments, Chiya.Notes.NoteComment
|
||||||
|
|
||||||
field :tags_string, :string,
|
field :tags_string, :string,
|
||||||
virtual: true,
|
virtual: true,
|
||||||
|
|
23
lib/chiya/notes/note_comment.ex
Normal file
23
lib/chiya/notes/note_comment.ex
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
defmodule Chiya.Notes.NoteComment do
|
||||||
|
use Ecto.Schema
|
||||||
|
import Ecto.Changeset
|
||||||
|
|
||||||
|
schema "note_comments" do
|
||||||
|
field :approved_at, :naive_datetime
|
||||||
|
field :author_name, :string
|
||||||
|
field :author_id, :id
|
||||||
|
field :content, :string
|
||||||
|
field :kind, Ecto.Enum, values: [:anon, :fedi], default: :anon
|
||||||
|
|
||||||
|
belongs_to :note, Chiya.Notes.Note
|
||||||
|
|
||||||
|
timestamps()
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc false
|
||||||
|
def changeset(note_comment, attrs) do
|
||||||
|
note_comment
|
||||||
|
|> cast(attrs, [:content, :author_name, :author_id, :kind, :note_id, :approved_at])
|
||||||
|
|> validate_required([:content, :author_name, :kind, :note_id])
|
||||||
|
end
|
||||||
|
end
|
|
@ -124,7 +124,6 @@ defmodule Chiya.Notes.References do
|
||||||
{:error, changelog} ->
|
{:error, changelog} ->
|
||||||
Logger.warn("Reference was not added.")
|
Logger.warn("Reference was not added.")
|
||||||
Logger.error(inspect(changelog))
|
Logger.error(inspect(changelog))
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -85,16 +85,14 @@ defmodule ChiyaWeb.AdminComponents do
|
||||||
<.link
|
<.link
|
||||||
href={~p"/"}
|
href={~p"/"}
|
||||||
class="flex gap-3 text-sm leading-6 font-semibold text-gray-900 dark:text-gray-100 dark:hover:text-gray-300 hover:text-gray-700"
|
class="flex gap-3 text-sm leading-6 font-semibold text-gray-900 dark:text-gray-100 dark:hover:text-gray-300 hover:text-gray-700"
|
||||||
><%= @settings.title %></.link>
|
>
|
||||||
|
<%= @settings.title %>
|
||||||
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
<li class="flex-1"></li>
|
<li class="flex-1"></li>
|
||||||
<%= if @current_user do %>
|
<%= if @current_user do %>
|
||||||
<li>
|
<li>
|
||||||
<.link
|
<.link href="#" id="dark-mode-toggle" class="text-sm leading-6">
|
||||||
href="#"
|
|
||||||
id="dark-mode-toggle"
|
|
||||||
class="text-sm leading-6"
|
|
||||||
>
|
|
||||||
<span class="inline dark:hidden">🌙</span>
|
<span class="inline dark:hidden">🌙</span>
|
||||||
<span class="hidden dark:inline">☀️</span>
|
<span class="hidden dark:inline">☀️</span>
|
||||||
</.link>
|
</.link>
|
||||||
|
@ -103,22 +101,22 @@ defmodule ChiyaWeb.AdminComponents do
|
||||||
<.link
|
<.link
|
||||||
href={~p"/admin"}
|
href={~p"/admin"}
|
||||||
class="text-sm leading-6 text-gray-900 dark:text-gray-100 dark:hover:text-gray-300 hover:text-gray-700"
|
class="text-sm leading-6 text-gray-900 dark:text-gray-100 dark:hover:text-gray-300 hover:text-gray-700"
|
||||||
>Admin</.link>
|
>
|
||||||
|
Admin
|
||||||
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<.link
|
<.link
|
||||||
href={~p"/user/log_out"}
|
href={~p"/user/log_out"}
|
||||||
method="delete"
|
method="delete"
|
||||||
class="text-sm leading-6 text-gray-900 dark:text-gray-100 dark:hover:text-gray-300 hover:text-gray-700"
|
class="text-sm leading-6 text-gray-900 dark:text-gray-100 dark:hover:text-gray-300 hover:text-gray-700"
|
||||||
>Log out</.link>
|
>
|
||||||
|
Log out
|
||||||
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
<% else %>
|
<% else %>
|
||||||
<li>
|
<li>
|
||||||
<.link
|
<.link href="#" id="dark-mode-toggle" class="text-sm leading-6">
|
||||||
href="#"
|
|
||||||
id="dark-mode-toggle"
|
|
||||||
class="text-sm leading-6"
|
|
||||||
>
|
|
||||||
<span class="inline dark:hidden">🌙</span>
|
<span class="inline dark:hidden">🌙</span>
|
||||||
<span class="hidden dark:inline">☀️</span>
|
<span class="hidden dark:inline">☀️</span>
|
||||||
</.link>
|
</.link>
|
||||||
|
|
|
@ -31,9 +31,14 @@ defmodule ChiyaWeb.PublicComponents do
|
||||||
<div>
|
<div>
|
||||||
<h1 class="text-lg font-semibold leading-8 text-gray-800 dark:text-gray-200">
|
<h1 class="text-lg font-semibold leading-8 text-gray-800 dark:text-gray-200">
|
||||||
<%= render_slot(@inner_block) %>
|
<%= render_slot(@inner_block) %>
|
||||||
<span :if={@inline} class="text-sm leading-6 font-normal text-gray-600 dark:text-gray-400"><%= render_slot(@subtitle) %></span>
|
<span :if={@inline} class="text-sm leading-6 font-normal text-gray-600 dark:text-gray-400">
|
||||||
|
<%= render_slot(@subtitle) %>
|
||||||
|
</span>
|
||||||
</h1>
|
</h1>
|
||||||
<p :if={@subtitle != [] && @inline == false} class="mt-2 text-sm leading-6 text-gray-600 dark:text-gray-400">
|
<p
|
||||||
|
:if={@subtitle != [] && @inline == false}
|
||||||
|
class="mt-2 text-sm leading-6 text-gray-600 dark:text-gray-400"
|
||||||
|
>
|
||||||
<%= render_slot(@subtitle) %>
|
<%= render_slot(@subtitle) %>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
17
lib/chiya_web/controllers/comment_controller.ex
Normal file
17
lib/chiya_web/controllers/comment_controller.ex
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
defmodule ChiyaWeb.CommentController do
|
||||||
|
use ChiyaWeb, :controller
|
||||||
|
|
||||||
|
def create(conn, %{"slug" => note_slug, "note_comment" => comment_params}) do
|
||||||
|
note = Chiya.Notes.get_note_by_slug_preloaded!(note_slug)
|
||||||
|
|
||||||
|
IO.inspect(comment_params)
|
||||||
|
|
||||||
|
case Chiya.Notes.create_note_comment(comment_params) do
|
||||||
|
{:ok, _comment} ->
|
||||||
|
redirect(conn, to: ~p"/#{note_slug}?error=0")
|
||||||
|
|
||||||
|
{:error, changeset} ->
|
||||||
|
redirect(conn, to: ~p"/#{note_slug}?error=1")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
5
lib/chiya_web/controllers/comment_html.ex
Normal file
5
lib/chiya_web/controllers/comment_html.ex
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
defmodule ChiyaWeb.CommentHTML do
|
||||||
|
use ChiyaWeb, :html
|
||||||
|
|
||||||
|
embed_templates "comment_html/*"
|
||||||
|
end
|
|
@ -41,14 +41,16 @@ defmodule ChiyaWeb.PageController do
|
||||||
|
|
||||||
def note(conn, %{"slug" => note_slug}) do
|
def note(conn, %{"slug" => note_slug}) do
|
||||||
note = Chiya.Notes.get_note_by_slug_preloaded!(note_slug)
|
note = Chiya.Notes.get_note_by_slug_preloaded!(note_slug)
|
||||||
|
changeset = Chiya.Notes.change_note_comment(%Chiya.Notes.NoteComment{}, %{note_id: note.id})
|
||||||
|
|
||||||
if is_nil(note.published_at) do
|
if is_nil(note.published_at) and is_nil(conn.assigns.current_user) do
|
||||||
render_error(conn, :not_found)
|
render_error(conn, :not_found)
|
||||||
else
|
else
|
||||||
render(conn, :note,
|
render(conn, :note,
|
||||||
layout: {ChiyaWeb.Layouts, "public.html"},
|
layout: {ChiyaWeb.Layouts, "public.html"},
|
||||||
note: note,
|
note: note,
|
||||||
page_title: note.name
|
page_title: note.name,
|
||||||
|
changeset: changeset
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -24,46 +24,54 @@
|
||||||
</div>
|
</div>
|
||||||
<%= if @channel do %>
|
<%= if @channel do %>
|
||||||
<%= if @channel.layout == :default do %>
|
<%= if @channel.layout == :default do %>
|
||||||
<section class="default | mt-6 sm:w-auto flex flex-col gap-1.5">
|
<section class="default | mt-6 sm:w-auto flex flex-col gap-1.5">
|
||||||
<%= for note <- @channel.notes do %>
|
<%= for note <- @channel.notes do %>
|
||||||
<a
|
<a
|
||||||
href={~p"/#{note.slug}"}
|
href={~p"/#{note.slug}"}
|
||||||
class="rounded-lg -mx-2 -my-0.5 px-2 py-0.5 hover:bg-theme-primary/10 transition"
|
class="rounded-lg -mx-2 -my-0.5 px-2 py-0.5 hover:bg-theme-primary/10 transition"
|
||||||
>
|
>
|
||||||
<span class="text-theme-primary text-lg font-semibold leading-8">
|
<span class="text-theme-primary text-lg font-semibold leading-8">
|
||||||
<%= note.name %>
|
<%= note.name %>
|
||||||
</span>
|
</span>
|
||||||
<span class="text-theme-base text-sm"><%= pretty_date(note.published_at) %></span>
|
<span class="text-theme-base text-sm"><%= pretty_date(note.published_at) %></span>
|
||||||
</a>
|
</a>
|
||||||
<% end %>
|
<% end %>
|
||||||
</section>
|
</section>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<%= if @channel.layout == :gallery do %>
|
<%= if @channel.layout == :gallery do %>
|
||||||
<section class="gallery | mt-6">
|
<section class="gallery | mt-6">
|
||||||
<%= for note <- @channel.notes do %>
|
<%= for note <- @channel.notes do %>
|
||||||
<article>
|
<article>
|
||||||
<section class="flex flex-wrap justify-start gap-3">
|
<section class="flex flex-wrap justify-start gap-3">
|
||||||
<%= for image <- note.images do %>
|
<%= for image <- note.images do %>
|
||||||
<a
|
<a
|
||||||
href={ChiyaWeb.Uploaders.NoteImage.url({image.path, image}, :full_dithered)}
|
href={ChiyaWeb.Uploaders.NoteImage.url({image.path, image}, :full_dithered)}
|
||||||
class="lightbox | w-28"
|
class="lightbox | w-28"
|
||||||
data-gallery="note"
|
data-gallery="note"
|
||||||
data-description={ChiyaWeb.Markdown.render(image.content)}
|
data-description={ChiyaWeb.Markdown.render(image.content)}
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
src={ChiyaWeb.Uploaders.NoteImage.url({image.path, image}, :thumb_dithered)}
|
src={ChiyaWeb.Uploaders.NoteImage.url({image.path, image}, :thumb_dithered)}
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
/>
|
/>
|
||||||
</a>
|
</a>
|
||||||
<% end %>
|
<% end %>
|
||||||
</section>
|
</section>
|
||||||
<a href={~p"/#{note.slug}"} class="text-theme-primary text-lg/10 font-semibold rounded-lg -mx-2 -my-0.5 px-2 py-0.5 hover:bg-theme-primary/10 transition"><%= note.name %> <span class="text-theme-muted font-normal text-sm"><%= pretty_date(note.published_at) %></span></a>
|
<a
|
||||||
</article>
|
href={~p"/#{note.slug}"}
|
||||||
|
class="text-theme-primary text-lg/10 font-semibold rounded-lg -mx-2 -my-0.5 px-2 py-0.5 hover:bg-theme-primary/10 transition"
|
||||||
|
>
|
||||||
|
<%= note.name %>
|
||||||
|
<span class="text-theme-muted font-normal text-sm">
|
||||||
|
<%= pretty_date(note.published_at) %>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</article>
|
||||||
|
|
||||||
<.line />
|
<.line />
|
||||||
<% end %>
|
<% end %>
|
||||||
</section>
|
</section>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -4,7 +4,11 @@
|
||||||
<%= @note.name %>
|
<%= @note.name %>
|
||||||
</h1>
|
</h1>
|
||||||
<p class="mt-2 text-sm leading-6 text-theme-base">
|
<p class="mt-2 text-sm leading-6 text-theme-base">
|
||||||
|
<%= if @note.published_at do %>
|
||||||
<span>Published</span>
|
<span>Published</span>
|
||||||
|
<% else %>
|
||||||
|
<span>Unpublished</span>
|
||||||
|
<% end %>
|
||||||
<time class="text-theme-primary font-semibold"><%= pretty_date(@note.published_at) %></time>
|
<time class="text-theme-primary font-semibold"><%= pretty_date(@note.published_at) %></time>
|
||||||
<span>·</span>
|
<span>·</span>
|
||||||
<span>Last Updated</span>
|
<span>Last Updated</span>
|
||||||
|
@ -46,4 +50,37 @@
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<%= if not Enum.empty?(@note.comments) do %>
|
||||||
|
<.line />
|
||||||
|
|
||||||
|
<h2 class="mb-6 text-theme-base"><%= Enum.count(@note.comments) %> Comments</h2>
|
||||||
|
|
||||||
|
<aside id="comments" class="flex flex-col gap-6">
|
||||||
|
<%= for comment <- @note.comments do %>
|
||||||
|
<article class="text-theme-base bg-theme-base/10 p-1">
|
||||||
|
<header class="flex flex-row justify-between">
|
||||||
|
<strong class="text-theme-primary"><%= comment.author_name %></strong>
|
||||||
|
<span class="text-theme-dim"><%= from_now(comment.inserted_at) %></span>
|
||||||
|
</header>
|
||||||
|
<p><%= comment.content %></p>
|
||||||
|
</article>
|
||||||
|
<% end %>
|
||||||
|
</aside>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<.line />
|
||||||
|
|
||||||
|
<.simple_form :let={f} for={@changeset} action={~p"/#{@note.slug}/comment"}>
|
||||||
|
<.error :if={@changeset.action}>
|
||||||
|
Oops, something went wrong! Please check the errors below.
|
||||||
|
</.error>
|
||||||
|
<.input field={f[:author_name]} type="text" placeholder="Name" />
|
||||||
|
<.input field={f[:content]} type="textarea" placeholder="Content" rows="3" />
|
||||||
|
<.input field={f[:note_id]} type="hidden" />
|
||||||
|
<:actions>
|
||||||
|
<.button>Submit Comment</.button>
|
||||||
|
</:actions>
|
||||||
|
</.simple_form>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -119,5 +119,7 @@ defmodule ChiyaWeb.Router do
|
||||||
get "/c/:slug", PageController, :channel
|
get "/c/:slug", PageController, :channel
|
||||||
get "/t/:slug", PageController, :tag
|
get "/t/:slug", PageController, :tag
|
||||||
get "/", PageController, :home
|
get "/", PageController, :home
|
||||||
|
|
||||||
|
post "/:slug/comment", CommentController, :create
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
18
priv/repo/migrations/20230429074000_create_note_comments.exs
Normal file
18
priv/repo/migrations/20230429074000_create_note_comments.exs
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
defmodule Chiya.Repo.Migrations.CreateNoteComments do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
create table(:note_comments) do
|
||||||
|
add :content, :text
|
||||||
|
add :author_name, :string
|
||||||
|
add :author_id, :integer
|
||||||
|
add :kind, :string
|
||||||
|
add :approved_at, :naive_datetime
|
||||||
|
add :note_id, references(:notes, on_delete: :delete_all)
|
||||||
|
|
||||||
|
timestamps()
|
||||||
|
end
|
||||||
|
|
||||||
|
create index(:note_comments, [:note_id])
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue