Merge pull request 'devel' (#164) from devel into main
Reviewed-on: #164
This commit is contained in:
commit
f61a187bce
13 changed files with 289 additions and 103 deletions
|
@ -23,7 +23,7 @@ import { LiveSocket } from "phoenix_live_view"
|
|||
import topbar from "../vendor/topbar"
|
||||
import lolight from "../vendor/lolight"
|
||||
import React from "react"
|
||||
import { createRoot } from 'react-dom'
|
||||
import { createRoot } from 'react-dom/client'
|
||||
import KBar from "./kbar"
|
||||
|
||||
lolight("pre code")
|
||||
|
|
|
@ -44,7 +44,7 @@ function RenderResults() {
|
|||
items={results}
|
||||
onRender={({ item, active }) =>
|
||||
typeof item === "string" ? (
|
||||
<div style={groupNameStyle} class="dark:text-white">{item}</div>
|
||||
<div style={groupNameStyle} className="dark:text-white">{item}</div>
|
||||
) : (
|
||||
<ResultItem
|
||||
action={item}
|
||||
|
|
190
assets/package-lock.json
generated
190
assets/package-lock.json
generated
|
@ -16,19 +16,19 @@
|
|||
"esbuild": "^0.18.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "^18.0.0",
|
||||
"react-dom": "^18.0.0"
|
||||
"react": "^18.0",
|
||||
"react-dom": "^18.0"
|
||||
}
|
||||
},
|
||||
"../deps/phoenix": {
|
||||
"version": "1.7.3",
|
||||
"version": "1.7.6",
|
||||
"license": "MIT"
|
||||
},
|
||||
"../deps/phoenix_html": {
|
||||
"version": "3.3.1"
|
||||
},
|
||||
"../deps/phoenix_live_view": {
|
||||
"version": "0.19.1",
|
||||
"version": "0.19.3",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@babel/runtime": {
|
||||
|
@ -43,9 +43,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-arm": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.0.tgz",
|
||||
"integrity": "sha512-+uLHSiWK3qOeyDYCf/nuvIgCnQsYjXWNa3TlGYLW1pPG7OYMawllU+VyBgHQPjF2aIUVFpfrvz5aAfxGk/0qNg==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.11.tgz",
|
||||
"integrity": "sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
|
@ -59,9 +59,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-arm64": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.0.tgz",
|
||||
"integrity": "sha512-nAwRCs5+jxi3gBMVkOqmRvsITB/UtfpvkbMwAwJUIbp66NnPbV2KGCFnjNn7IEqabJQXfBLe/QLdjCGpHU+yEw==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz",
|
||||
"integrity": "sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
|
@ -75,9 +75,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-x64": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.0.tgz",
|
||||
"integrity": "sha512-TiOJmHQ8bXCGlYLpBd3Qy7N8dxi4n6q+nOmTzPr5Hb/bUr+PKuP4e5lWaOlpkaKc1Q9wsFt+sHfQpFCrM7SMow==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.11.tgz",
|
||||
"integrity": "sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
|
@ -91,9 +91,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/darwin-arm64": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.0.tgz",
|
||||
"integrity": "sha512-5GsFovtGyjMIXJrcCzmI1hX3TneCrmFncFIlo0WrRvWcVU6H094P854ZaP8qoLgevXhggO2dhlEGYY0Zv6/S9Q==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz",
|
||||
"integrity": "sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
|
@ -107,9 +107,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/darwin-x64": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.0.tgz",
|
||||
"integrity": "sha512-4K/QCksQ8F58rvC1D62Xi4q4E7YWpiyc3zy2H/n1W7y0hjQpOBBxciLn0qycMskP/m/I5h9HNbRlu1aK821sHg==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz",
|
||||
"integrity": "sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
|
@ -123,9 +123,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/freebsd-arm64": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.0.tgz",
|
||||
"integrity": "sha512-DMazN0UGzipD0Fi1O9pRX0xfp+JC3gSnFWxTWq88Dr/odWhZzm8Jqy44LN2veYeipb1fBMxhoEp7eCr902SWqg==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz",
|
||||
"integrity": "sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
|
@ -139,9 +139,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/freebsd-x64": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.0.tgz",
|
||||
"integrity": "sha512-GdkJAB3ZBiYnie9iFO9v/CM4ko0dm5SYkUs97lBKNLHw9mo4H9IXwGNKtUztisEsmUP0IWfEi4YTWOJF3DIO4w==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz",
|
||||
"integrity": "sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
|
@ -155,9 +155,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-arm": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.0.tgz",
|
||||
"integrity": "sha512-A3Ue/oZdb43znNpeY71FrAjZF20MtnBKCGb1vXLIVg5qg8rRM1gRgn6X2ixYwATiw5dE04JnP+aV4OBf8c5ZvQ==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz",
|
||||
"integrity": "sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
|
@ -171,9 +171,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-arm64": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.0.tgz",
|
||||
"integrity": "sha512-Mb3yCN9PXA6G5qf84UF0IEuXP22eyNlquF17Zs2F1vVBM0CtyWLYosC5JaxBxfK6EzWwB2IkPBIjMeK3ek+ItA==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz",
|
||||
"integrity": "sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
|
@ -187,9 +187,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-ia32": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.0.tgz",
|
||||
"integrity": "sha512-WNDXgJdfDhN6ZxHU7HgR2BRDVx9iGN8SpmebUUGdENg4MZJndGcaQuf2kCJjMwoK0+es1g61TeJzAMxfgDcmcA==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz",
|
||||
"integrity": "sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
|
@ -203,9 +203,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-loong64": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.0.tgz",
|
||||
"integrity": "sha512-PBr8Lf+L8amvheTGFVNK/0qionszkOKMq2WyfFlVz8D41v0+uSth6fYYHwtASkMk4xf+oh0vW8NYuav3/3RHuQ==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz",
|
||||
"integrity": "sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==",
|
||||
"cpu": [
|
||||
"loong64"
|
||||
],
|
||||
|
@ -219,9 +219,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-mips64el": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.0.tgz",
|
||||
"integrity": "sha512-Lg4ygah5bwfDDCOMFsBJjSVbD1UzNwWt4f7DhpaSIFOrJqoECX1VTByKw3iSDAVRlwl1cljlfy7wlysrRZcdiQ==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz",
|
||||
"integrity": "sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==",
|
||||
"cpu": [
|
||||
"mips64el"
|
||||
],
|
||||
|
@ -235,9 +235,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-ppc64": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.0.tgz",
|
||||
"integrity": "sha512-obz/firdtou244DIjHzdKmJChwGseqA3tWGa6xPMfuq54Ca4Pp1a4ANMrqy2IZ67rfpRHcJTlb2h3rSfW6tvAA==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz",
|
||||
"integrity": "sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
|
@ -251,9 +251,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-riscv64": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.0.tgz",
|
||||
"integrity": "sha512-UkuBdxQsxi39wWrRLMOkJl//82/hpQw79TD+OBLw3IBYyVQ4Wfvpe56RfEGK/j439sIm79ccnD5RUNQceHvZdQ==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz",
|
||||
"integrity": "sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
|
@ -267,9 +267,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-s390x": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.0.tgz",
|
||||
"integrity": "sha512-MgyuC30oYB465hyAqsb3EH6Y4zTeqqgixRAOpsDNMCelyDiW9ZDPXvMPfBgCZGJlDZFGKDm2I9ou8E3VI+v7pg==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz",
|
||||
"integrity": "sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==",
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
|
@ -283,9 +283,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-x64": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.0.tgz",
|
||||
"integrity": "sha512-oLLKU3F4pKWAsNmfi7Rd4qkj0qvg1S923ZjlcISA2IMgHsODA9xzwerqWayI5nOhLGgKXviDofn9exTeA4EUQQ==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz",
|
||||
"integrity": "sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
|
@ -299,9 +299,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/netbsd-x64": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.0.tgz",
|
||||
"integrity": "sha512-BEfJrZsZ/gMtpS2vC+2YoFGxmfLKiYQvj8lZrBfjKzQrwyMpH53CzQJj9ypOx9ldjM/MVxf9i9wi/rS4BWV7WA==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz",
|
||||
"integrity": "sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
|
@ -315,9 +315,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/openbsd-x64": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.0.tgz",
|
||||
"integrity": "sha512-eDolHeG3REnEIgwl7Lw2S0znUMY4PFVtCAzLKqdRO0HD+iPKJR8n2MEJJyhPdUjcobo8SEQ2AG6gtYfft9VFHg==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz",
|
||||
"integrity": "sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
|
@ -331,9 +331,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/sunos-x64": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.0.tgz",
|
||||
"integrity": "sha512-kl7vONem2wmRQke015rSrknmc6TYXKVNs2quiVTdvkSufscrjegpNqKyP7v6EHqXtvkzrB92ySjpfzazKG627g==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz",
|
||||
"integrity": "sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
|
@ -347,9 +347,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-arm64": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.0.tgz",
|
||||
"integrity": "sha512-WohArFQ3HStBu9MAsx3JUk2wfC2v8QoadnMoNfx3Y26ac54tD/wQhPzw4QOzQbSqOFqzIMLKWbxindTsko+9OA==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz",
|
||||
"integrity": "sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
|
@ -363,9 +363,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-ia32": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.0.tgz",
|
||||
"integrity": "sha512-SdnpSOxpeoewYCurmfLVepLuhOAphWkGTxWHifFjp37DaUHwF1fpGzyxhZoXMt5MKGuAO5aE3c5668YYtno+9Q==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz",
|
||||
"integrity": "sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
|
@ -379,9 +379,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-x64": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.0.tgz",
|
||||
"integrity": "sha512-WJxImv0Pehpbo+pgg7Xrn88/b6ZzSweNHTw/2LW95JjeQUIS6ToJeQmjAdud9H3yiHJmhLOmEAOvUdNLhptD0w==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz",
|
||||
"integrity": "sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
|
@ -491,9 +491,9 @@
|
|||
"integrity": "sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w=="
|
||||
},
|
||||
"node_modules/esbuild": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.0.tgz",
|
||||
"integrity": "sha512-/2sQaWHNX2jkglLu85EjmEAR2ANpKOa1kp2rAE3wjKcuYjEHFlB+D60tn6W9BRgHiAQEKYtl4hEygKWothfDEA==",
|
||||
"version": "0.18.11",
|
||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.11.tgz",
|
||||
"integrity": "sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"bin": {
|
||||
|
@ -503,28 +503,28 @@
|
|||
"node": ">=12"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@esbuild/android-arm": "0.18.0",
|
||||
"@esbuild/android-arm64": "0.18.0",
|
||||
"@esbuild/android-x64": "0.18.0",
|
||||
"@esbuild/darwin-arm64": "0.18.0",
|
||||
"@esbuild/darwin-x64": "0.18.0",
|
||||
"@esbuild/freebsd-arm64": "0.18.0",
|
||||
"@esbuild/freebsd-x64": "0.18.0",
|
||||
"@esbuild/linux-arm": "0.18.0",
|
||||
"@esbuild/linux-arm64": "0.18.0",
|
||||
"@esbuild/linux-ia32": "0.18.0",
|
||||
"@esbuild/linux-loong64": "0.18.0",
|
||||
"@esbuild/linux-mips64el": "0.18.0",
|
||||
"@esbuild/linux-ppc64": "0.18.0",
|
||||
"@esbuild/linux-riscv64": "0.18.0",
|
||||
"@esbuild/linux-s390x": "0.18.0",
|
||||
"@esbuild/linux-x64": "0.18.0",
|
||||
"@esbuild/netbsd-x64": "0.18.0",
|
||||
"@esbuild/openbsd-x64": "0.18.0",
|
||||
"@esbuild/sunos-x64": "0.18.0",
|
||||
"@esbuild/win32-arm64": "0.18.0",
|
||||
"@esbuild/win32-ia32": "0.18.0",
|
||||
"@esbuild/win32-x64": "0.18.0"
|
||||
"@esbuild/android-arm": "0.18.11",
|
||||
"@esbuild/android-arm64": "0.18.11",
|
||||
"@esbuild/android-x64": "0.18.11",
|
||||
"@esbuild/darwin-arm64": "0.18.11",
|
||||
"@esbuild/darwin-x64": "0.18.11",
|
||||
"@esbuild/freebsd-arm64": "0.18.11",
|
||||
"@esbuild/freebsd-x64": "0.18.11",
|
||||
"@esbuild/linux-arm": "0.18.11",
|
||||
"@esbuild/linux-arm64": "0.18.11",
|
||||
"@esbuild/linux-ia32": "0.18.11",
|
||||
"@esbuild/linux-loong64": "0.18.11",
|
||||
"@esbuild/linux-mips64el": "0.18.11",
|
||||
"@esbuild/linux-ppc64": "0.18.11",
|
||||
"@esbuild/linux-riscv64": "0.18.11",
|
||||
"@esbuild/linux-s390x": "0.18.11",
|
||||
"@esbuild/linux-x64": "0.18.11",
|
||||
"@esbuild/netbsd-x64": "0.18.11",
|
||||
"@esbuild/openbsd-x64": "0.18.11",
|
||||
"@esbuild/sunos-x64": "0.18.11",
|
||||
"@esbuild/win32-arm64": "0.18.11",
|
||||
"@esbuild/win32-ia32": "0.18.11",
|
||||
"@esbuild/win32-x64": "0.18.11"
|
||||
}
|
||||
},
|
||||
"node_modules/fast-equals": {
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
"phoenix_live_view": "file:../deps/phoenix_live_view"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "^17.0.0",
|
||||
"react-dom": "^17.0.0"
|
||||
"react": "^18.0",
|
||||
"react-dom": "^18.0"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -116,6 +116,19 @@ defmodule Chiya.Accounts do
|
|||
User.email_changeset(user, attrs, validate_email: false)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Returns an `%Ecto.Changeset{}` for changing the user profile.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> change_user_profile(user)
|
||||
%Ecto.Changeset{data: %User{}}
|
||||
|
||||
"""
|
||||
def change_user_profile(user, attrs \\ %{}) do
|
||||
User.profile_changeset(user, attrs)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Returns an `%Ecto.Changeset{}` for changing the user avatar.
|
||||
|
||||
|
@ -149,6 +162,15 @@ defmodule Chiya.Accounts do
|
|||
|> Ecto.Changeset.apply_action(:update)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Updates the user profile.
|
||||
"""
|
||||
def update_user_profile(user, attrs) do
|
||||
user
|
||||
|> User.profile_changeset(attrs)
|
||||
|> Repo.update()
|
||||
end
|
||||
|
||||
@doc """
|
||||
Updates the user email using the given token.
|
||||
|
||||
|
|
|
@ -4,6 +4,10 @@ defmodule Chiya.Accounts.User do
|
|||
import Ecto.Changeset
|
||||
|
||||
schema "users" do
|
||||
field :name, :string
|
||||
field :handle, :string
|
||||
field :bio, :string
|
||||
|
||||
field :email, :string
|
||||
field :password, :string, virtual: true, redact: true
|
||||
field :hashed_password, :string, redact: true
|
||||
|
@ -116,6 +120,14 @@ defmodule Chiya.Accounts.User do
|
|||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Returns an `%Ecto.Changeset{}` for tracking user profile changes.
|
||||
"""
|
||||
def profile_changeset(user, attrs) do
|
||||
user
|
||||
|> cast(attrs, [:name, :handle, :bio])
|
||||
end
|
||||
|
||||
@doc """
|
||||
A user changeset for changing the password.
|
||||
|
||||
|
|
|
@ -43,7 +43,12 @@ defmodule Chiya.Tags.TagUpdater do
|
|||
end
|
||||
|
||||
def update_tags(%{tags: tags} = schema, new_tags) when is_list(new_tags) do
|
||||
old_tags = Enum.map(tags, fn tag -> tag.name end)
|
||||
old_tags = Enum.map(tags, fn tag -> String.downcase(tag.slug) end)
|
||||
new_tags = Enum.map(new_tags, fn tag ->
|
||||
tag
|
||||
|> String.downcase()
|
||||
|> Slugger.slugify()
|
||||
end)
|
||||
|
||||
Logger.info("Adding tags #{inspect(new_tags -- old_tags)}")
|
||||
Logger.info("Removing tags #{inspect(old_tags -- new_tags)}")
|
||||
|
|
|
@ -55,9 +55,15 @@ defmodule ChiyaWeb.PageController do
|
|||
end
|
||||
end
|
||||
|
||||
### ========= REDIRECTS
|
||||
|
||||
def about(conn, _params) do
|
||||
redirect(conn, to: ~p"/note/about")
|
||||
note = Chiya.Notes.get_note_by_slug_preloaded("about")
|
||||
user = Chiya.Accounts.get_user!(1)
|
||||
|
||||
render(conn, :about,
|
||||
layout: {ChiyaWeb.Layouts, "public.html"},
|
||||
note: note,
|
||||
user: user,
|
||||
page_title: "About"
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
24
lib/chiya_web/controllers/page_html/about.html.heex
Normal file
24
lib/chiya_web/controllers/page_html/about.html.heex
Normal file
|
@ -0,0 +1,24 @@
|
|||
<article class="h-card hcard">
|
||||
<section class="mx-auto max-w-2xl p-10 bg-theme-background1 flex gap-3 items-start">
|
||||
<div>
|
||||
<img
|
||||
class="rounded-lg w-28 | u-photo"
|
||||
src={ChiyaWeb.Uploaders.UserImage.url({@user.user_image, @current_user}, :thumb)}
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<h1 class="text-3xl font-extrabold leading-10 tracking-tight text-theme-primary | p-name">
|
||||
<%= @user.name %>
|
||||
</h1>
|
||||
<section class="mx-auto mt-8 prose prose-gruvbox | p-note">
|
||||
<%= Markdown.render(@user.bio) |> raw() %>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<%= if @note do %>
|
||||
<section class="mx-auto mt-8 prose prose-gruvbox md:prose-lg lg:prose-xl | p-summary e-content">
|
||||
<%= Markdown.render(@note.content) |> raw %>
|
||||
</section>
|
||||
<% end %>
|
||||
</article>
|
|
@ -13,6 +13,9 @@ defmodule ChiyaWeb.UserProfileLive do
|
|||
</.header>
|
||||
|
||||
<.list>
|
||||
<:item title="Name"><%= @current_user.name %></:item>
|
||||
<:item title="Handle"><%= @current_user.handle %></:item>
|
||||
<:item title="Bio"><%= @current_user.bio %></:item>
|
||||
<:item title="Email"><%= @current_user.email %></:item>
|
||||
</.list>
|
||||
"""
|
||||
|
|
|
@ -29,6 +29,25 @@ defmodule ChiyaWeb.UserSettingsLive do
|
|||
|
||||
<.line />
|
||||
|
||||
<.header>Change Profile</.header>
|
||||
|
||||
<.simple_form
|
||||
for={@profile_form}
|
||||
id="profile_form"
|
||||
phx-submit="update_profile"
|
||||
phx-change="validate_profile"
|
||||
>
|
||||
<.input field={@profile_form[:name]} label="Name" required />
|
||||
<.input field={@profile_form[:handle]} label="Handle" required />
|
||||
<.input field={@profile_form[:bio]} type="textarea" label="Bio" required />
|
||||
|
||||
<:actions>
|
||||
<.button phx-disable-with="Changing...">Change Email</.button>
|
||||
</:actions>
|
||||
</.simple_form>
|
||||
|
||||
<.line />
|
||||
|
||||
<.header>Change Email</.header>
|
||||
|
||||
<.simple_form
|
||||
|
@ -107,6 +126,7 @@ defmodule ChiyaWeb.UserSettingsLive do
|
|||
email_changeset = Accounts.change_user_email(user)
|
||||
password_changeset = Accounts.change_user_password(user)
|
||||
image_changeset = Accounts.change_user_image(user)
|
||||
profile_changeset = Accounts.change_user_profile(user)
|
||||
|
||||
socket =
|
||||
socket
|
||||
|
@ -116,6 +136,7 @@ defmodule ChiyaWeb.UserSettingsLive do
|
|||
|> assign(:current_email, user.email)
|
||||
|> assign(:email_form, to_form(email_changeset))
|
||||
|> assign(:password_form, to_form(password_changeset))
|
||||
|> assign(:profile_form, to_form(profile_changeset))
|
||||
|> assign(:image_form, to_form(image_changeset))
|
||||
|> assign(:trigger_submit, false)
|
||||
|> assign(:uploaded_files, [])
|
||||
|
@ -150,6 +171,31 @@ defmodule ChiyaWeb.UserSettingsLive do
|
|||
|> assign(:user, Accounts.get_user!(user.id))}
|
||||
end
|
||||
|
||||
def handle_event("validate_profile", params, socket) do
|
||||
%{"user" => user_params} = params
|
||||
|
||||
profile_form =
|
||||
socket.assigns.current_user
|
||||
|> Accounts.change_user_profile(user_params)
|
||||
|> Map.put(:action, :validate)
|
||||
|> to_form()
|
||||
|
||||
{:noreply, assign(socket, profile_form: profile_form)}
|
||||
end
|
||||
|
||||
def handle_event("update_profile", params, socket) do
|
||||
%{"user" => user_params} = params
|
||||
user = socket.assigns.current_user
|
||||
|
||||
case Accounts.update_user_profile(user, user_params) do
|
||||
{:ok, _updated_user} ->
|
||||
{:noreply, socket |> put_flash(:info, "User updated!")}
|
||||
|
||||
{:error, changeset} ->
|
||||
{:noreply, assign(socket, :profile_form, to_form(Map.put(changeset, :action, :insert)))}
|
||||
end
|
||||
end
|
||||
|
||||
def handle_event("validate_email", params, socket) do
|
||||
%{"current_password" => password, "user" => user_params} = params
|
||||
|
||||
|
|
11
priv/repo/migrations/20230703173933_add_user_fields.exs
Normal file
11
priv/repo/migrations/20230703173933_add_user_fields.exs
Normal file
|
@ -0,0 +1,11 @@
|
|||
defmodule Chiya.Repo.Migrations.AddUserFields do
|
||||
use Ecto.Migration
|
||||
|
||||
def change do
|
||||
alter table(:users) do
|
||||
add :handle, :string
|
||||
add :name, :string
|
||||
add :bio, :text
|
||||
end
|
||||
end
|
||||
end
|
57
test/chiya/tag_updater_test.exs
Normal file
57
test/chiya/tag_updater_test.exs
Normal file
|
@ -0,0 +1,57 @@
|
|||
defmodule Chiya.TagUpdaterTest do
|
||||
use Chiya.DataCase
|
||||
|
||||
import Chiya.NotesFixtures
|
||||
alias Chiya.Tags.TagUpdater
|
||||
|
||||
describe "update_tags/2" do
|
||||
test "with a single tag updates a note with the given tag" do
|
||||
note = note_fixture()
|
||||
|
||||
assert note.tags == []
|
||||
TagUpdater.update_tags(note, "foo")
|
||||
note = Chiya.Notes.get_note_preloaded!(note.id)
|
||||
assert Enum.count(note.tags) == 1
|
||||
end
|
||||
|
||||
test "with a list of new tags replaces exisiting tags"do
|
||||
note = note_fixture()
|
||||
|
||||
assert note.tags == []
|
||||
|
||||
TagUpdater.update_tags(note, "foo")
|
||||
note = Chiya.Notes.get_note_preloaded!(note.id)
|
||||
assert Enum.count(note.tags) == 1
|
||||
|
||||
TagUpdater.update_tags(note, ["bar", "baz"])
|
||||
note = Chiya.Notes.get_note_preloaded!(note.id)
|
||||
assert Enum.count(note.tags) == 2
|
||||
end
|
||||
|
||||
test "with a map representing the attributes replaces existing tags" do
|
||||
note = note_fixture()
|
||||
|
||||
assert note.tags == []
|
||||
|
||||
TagUpdater.update_tags(note, %{tags_string: "foo,bar,baz"})
|
||||
note = Chiya.Notes.get_note_preloaded!(note.id)
|
||||
assert Enum.count(note.tags) == 3
|
||||
end
|
||||
|
||||
test "with the same tags in different capitalization replaces exisiting tags" do
|
||||
note = note_fixture()
|
||||
assert note.tags == []
|
||||
|
||||
TagUpdater.update_tags(note, "foo")
|
||||
note = Chiya.Notes.get_note_preloaded!(note.id)
|
||||
assert Enum.count(note.tags) == 1
|
||||
|
||||
TagUpdater.update_tags(note, ["Foo"])
|
||||
note = Chiya.Notes.get_note_preloaded!(note.id)
|
||||
assert Enum.count(note.tags) == 1
|
||||
|
||||
tag = List.first(note.tags)
|
||||
assert tag.name == "Foo"
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue