progress
This commit is contained in:
1 parent
e08a941c62
commit
3d165ee610
12 files changed
+116
-30
No files matched your search
@@ -1,3 +1,3 @@
|
|||||||
#auto generated
|
#auto generated
|
||||||
#Mon Oct 19 00:45:22 CEST 2026
|
#Wed Oct 21 01:06:20 CEST 2026
|
||||||
build.number=633
|
build.number=655
|
||||||
@@ -4,13 +4,13 @@ import net.keinekekse.version.Version
|
|||||||
|
|
||||||
object VERSION: Version {
|
object VERSION: Version {
|
||||||
override val version = "0.2.0-alpha"
|
override val version = "0.2.0-alpha"
|
||||||
override val fullVersion = "0.2.0-alpha+build.633"
|
override val fullVersion = "0.2.0-alpha+build.655"
|
||||||
override val major = 0
|
override val major = 0
|
||||||
override val minor = 2
|
override val minor = 2
|
||||||
override val patch = 0
|
override val patch = 0
|
||||||
override val preRelease = "alpha"
|
override val preRelease = "alpha"
|
||||||
override val buildMetadata = "build.633"
|
override val buildMetadata = "build.655"
|
||||||
override val buildDate = "2026-10-18T22:45:22.165046Z"
|
override val buildDate = "2026-10-20T23:06:20.951648Z"
|
||||||
override val displayName = "Application Server"
|
override val displayName = "Application Server"
|
||||||
override val copyright = "Copyright (c) 2026 Hartmut Bauer"
|
override val copyright = "Copyright (c) 2026 Hartmut Bauer"
|
||||||
override val name = "server"
|
override val name = "server"
|
||||||
@@ -18,13 +18,13 @@ object VERSION: Version {
|
|||||||
}
|
}
|
||||||
object VERSION_books: Version {
|
object VERSION_books: Version {
|
||||||
override val version = "0.2.0-alpha"
|
override val version = "0.2.0-alpha"
|
||||||
override val fullVersion = "0.2.0-alpha+build.633"
|
override val fullVersion = "0.2.0-alpha+build.655"
|
||||||
override val major = 0
|
override val major = 0
|
||||||
override val minor = 2
|
override val minor = 2
|
||||||
override val patch = 0
|
override val patch = 0
|
||||||
override val preRelease = "alpha"
|
override val preRelease = "alpha"
|
||||||
override val buildMetadata = "build.633"
|
override val buildMetadata = "build.655"
|
||||||
override val buildDate = "2026-10-18T22:45:22.165140Z"
|
override val buildDate = "2026-10-20T23:06:20.951769Z"
|
||||||
override val displayName = "Books-DB"
|
override val displayName = "Books-DB"
|
||||||
override val copyright = "Copyright (c) 2026 Hartmut Bauer"
|
override val copyright = "Copyright (c) 2026 Hartmut Bauer"
|
||||||
override val name = "books"
|
override val name = "books"
|
||||||
|
|||||||
@@ -135,6 +135,12 @@ fun Application.configureRouting(
|
|||||||
val receiveParameters = call.receiveParameters()
|
val receiveParameters = call.receiveParameters()
|
||||||
val session =
|
val session =
|
||||||
getSession(receiveParameters["sessionId"], sessions, call.principal.userId)
|
getSession(receiveParameters["sessionId"], sessions, call.principal.userId)
|
||||||
|
// TODO
|
||||||
|
call.application.log.info("## New publisher form OK ")
|
||||||
|
receiveParameters.forEach { param: String, value: List<String> ->
|
||||||
|
call.application.log.info("## param: $param, value: $value")
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
hx.post("${navBooksEdit.second}/addseries") {
|
hx.post("${navBooksEdit.second}/addseries") {
|
||||||
val receiveParameters = call.receiveParameters()
|
val receiveParameters = call.receiveParameters()
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ fun FlowContent.bookEdit(
|
|||||||
}
|
}
|
||||||
select(classes = "$cssTextInput w-74") {
|
select(classes = "$cssTextInput w-74") {
|
||||||
name = "publisher"
|
name = "publisher"
|
||||||
|
id = "publisher"
|
||||||
|
|
||||||
option {
|
option {
|
||||||
value = "0"
|
value = "0"
|
||||||
@@ -294,7 +295,7 @@ fun FlowContent.bookEdit(
|
|||||||
// evtl. switch oder <detail>
|
// evtl. switch oder <detail>
|
||||||
// Teil von Sammelband _____v / enthält (-> Link)
|
// Teil von Sammelband _____v / enthält (-> Link)
|
||||||
|
|
||||||
div(classes = "flex flex-row mb-5 mr-2 justify-end") {
|
div(classes = "flex flex-row mb-5 mr-2 justify-end w-180") {
|
||||||
button(classes = "$cssButtonStd block mt-8 mr-10") {
|
button(classes = "$cssButtonStd block mt-8 mr-10") {
|
||||||
type = ButtonType.button
|
type = ButtonType.button
|
||||||
onClick =
|
onClick =
|
||||||
@@ -316,13 +317,58 @@ fun FlowContent.bookEdit(
|
|||||||
id = "publisherDialog"
|
id = "publisherDialog"
|
||||||
// attributes["popover"] = "true"
|
// attributes["popover"] = "true"
|
||||||
// attributes["closedby"] = "any"
|
// attributes["closedby"] = "any"
|
||||||
div {
|
form {
|
||||||
+"Test-Verlag"
|
id = "publisherDialogForm"
|
||||||
}
|
attributes.hx {
|
||||||
button(classes = cssButtonStd) {
|
post = "${navBooksEdit.second}/addpublisher"
|
||||||
attributes["commandfor"] = "publisherDialog"
|
target = "#publisher"
|
||||||
attributes["command"] = "close"
|
swap = "innerHTML"
|
||||||
+"Close"
|
validate = true
|
||||||
|
on(
|
||||||
|
event = "after-request",
|
||||||
|
script = "this.reset();document.getElementById('publisherDialog').close()"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
input(type = InputType.hidden, name = "sessionId") {
|
||||||
|
value = session.sessionId
|
||||||
|
}
|
||||||
|
input(type = InputType.hidden, name = "bookId") {
|
||||||
|
value = session.data.book.id.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
div(classes = "flex flex-row mb-5 h-9") {
|
||||||
|
div(classes = "content-center pr-6 text-nowrap") {
|
||||||
|
+"Neuer Verlag:"
|
||||||
|
}
|
||||||
|
input(classes = "$cssTextInput w-75") {
|
||||||
|
name = "newpublisher"
|
||||||
|
required = true
|
||||||
|
value = ""
|
||||||
|
onBlur = """
|
||||||
|
const select = document.getElementById('publisher')
|
||||||
|
const optArray = Array.from(select.options)
|
||||||
|
if (optArray.some(opt => opt.text.toLowerCase() === this.value.toLowerCase() )) {
|
||||||
|
this.setCustomValidity('Dieser Verlag existiert bereits.');
|
||||||
|
} else {
|
||||||
|
this.setCustomValidity('');
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
div(classes = "flex flex-row mb-5 mr-2 justify-end") {
|
||||||
|
button(classes = "$cssButtonStd block mt-8 mr-10") {
|
||||||
|
type = ButtonType.button
|
||||||
|
onClick =
|
||||||
|
"document.getElementById('publisherDialogForm').reset()"
|
||||||
|
attributes["commandfor"] = "publisherDialog"
|
||||||
|
attributes["command"] = "close"
|
||||||
|
+"Abbrechen"
|
||||||
|
}
|
||||||
|
button(classes = "$cssButtonPri block mt-8") {
|
||||||
|
type = ButtonType.submit
|
||||||
|
+"Speichern"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
output { }
|
output { }
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package net.keinekekse.app.books.ui
|
package net.keinekekse.app.books.ui
|
||||||
|
|
||||||
import kotlinx.html.HTML
|
import kotlinx.html.HTML
|
||||||
|
import kotlinx.html.div
|
||||||
import net.keinekekse.app.books.db.BookRepository
|
import net.keinekekse.app.books.db.BookRepository
|
||||||
import net.keinekekse.app.books.edit.BooksSessionData
|
import net.keinekekse.app.books.edit.BooksSessionData
|
||||||
import net.keinekekse.app.core.auth.UserSession
|
import net.keinekekse.app.core.auth.UserSession
|
||||||
@@ -14,8 +15,9 @@ fun HTML.bookEditPage(
|
|||||||
navBooksEdit.first,
|
navBooksEdit.first,
|
||||||
mapOf(navBooks, Pair(navBooksEdit.first, ""))
|
mapOf(navBooks, Pair(navBooksEdit.first, ""))
|
||||||
) {
|
) {
|
||||||
|
div(classes = "flex flex-row flex-auto overflow-auto w-0 min-w-1/1") {
|
||||||
bookEdit(booksRepo, session)
|
bookEdit(booksRepo, session)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -33,7 +33,7 @@ fun FlowContent.booksTable(booksRepo: BookRepository) {
|
|||||||
booksRepo.allBooks()
|
booksRepo.allBooks()
|
||||||
}
|
}
|
||||||
|
|
||||||
div(classes = "flex-auto overflow-auto px-1 pb-1") {
|
div(classes = "flex-auto overflow-auto px-1 pb-1 w-0 min-w-1/1") {
|
||||||
table {
|
table {
|
||||||
id = "bookstable"
|
id = "bookstable"
|
||||||
thead(classes = "$cssFixedTHead ") {
|
thead(classes = "$cssFixedTHead ") {
|
||||||
|
|||||||
@@ -7,16 +7,16 @@ import net.keinekekse.app.core.ui.stdHead
|
|||||||
|
|
||||||
fun FlowContent.programName() {
|
fun FlowContent.programName() {
|
||||||
|
|
||||||
a(classes = "flex") {
|
a(classes = "flex flex-nowrap text-nowrap") {
|
||||||
href = navBooks.second
|
href = navBooks.second
|
||||||
title = "v ${VERSION_books.fullVersion}"
|
title = "v ${VERSION_books.fullVersion}"
|
||||||
|
|
||||||
img(classes = "h-14 my-2 $bgHeaderIcon") {
|
img(classes = "h-8 md:h-14 my-2 $bgHeaderIcon") {
|
||||||
src = "/static/books.png"
|
src = "/static/books.png"
|
||||||
}
|
}
|
||||||
div(classes = "self-center text-right ml-3") {
|
div(classes = "self-center text-right ml-3") {
|
||||||
div {
|
div {
|
||||||
div(classes = "text-3xl") {
|
div(classes = "text-xl md:text-3xl") {
|
||||||
+VERSION_books.displayName
|
+VERSION_books.displayName
|
||||||
}
|
}
|
||||||
div(classes = "text-xs") {
|
div(classes = "text-xs") {
|
||||||
|
|||||||
@@ -58,8 +58,8 @@ const val cssFormIcon =
|
|||||||
"cursor-pointer m-0 px-2 pt-1 no-underline "
|
"cursor-pointer m-0 px-2 pt-1 no-underline "
|
||||||
const val cssTextInput =
|
const val cssTextInput =
|
||||||
"rounded-sm border-1 border-slate-400 px-2 py-1 focus:border-orange-400 focus:border-4" +
|
"rounded-sm border-1 border-slate-400 px-2 py-1 focus:border-orange-400 focus:border-4" +
|
||||||
" invalid:focus:bg-red-200 invalid:focus:border-red-500 invalid:focus:border-5" +
|
" invalid:focus:bg-red-200 invalid:focus:border-red-500 invalid:focus:border-4" +
|
||||||
" invalid:bg-red-200 invalid:border-red-500 invalid:border-3 "
|
" invalid:bg-red-200 invalid:border-red-500 invalid:border-2 "
|
||||||
const val _cssTextInput =
|
const val _cssTextInput =
|
||||||
"rounded-sm border-b-1 px-2 py-1 focus:border-b-orange-400 focus:border-b-4" +
|
"rounded-sm border-b-1 px-2 py-1 focus:border-b-orange-400 focus:border-b-4" +
|
||||||
" invalid:focus:bg-red-200 invalid:focus:border-red-500 invalid:focus:border-5" +
|
" invalid:focus:bg-red-200 invalid:focus:border-red-500 invalid:focus:border-5" +
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ fun HTML.importEditPage(
|
|||||||
navBooksScanEdit.first,
|
navBooksScanEdit.first,
|
||||||
mapOf(navBooks, navBooksNew, Pair(navBooksScanEdit.first, ""))
|
mapOf(navBooks, navBooksNew, Pair(navBooksScanEdit.first, ""))
|
||||||
) {
|
) {
|
||||||
div(classes = "flex flex-row flex-auto") {
|
div(classes = "flex flex-row flex-auto overflow-auto w-0 min-w-1/1") {
|
||||||
|
|
||||||
session.data.book = Book(
|
session.data.book = Book(
|
||||||
title = bookInfo?.title ?: "",
|
title = bookInfo?.title ?: "",
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ fun HTML.importPage(books: List<CalibreBookInfo>) {
|
|||||||
|
|
||||||
fun FlowContent.importTable(books: List<CalibreBookInfo>) {
|
fun FlowContent.importTable(books: List<CalibreBookInfo>) {
|
||||||
|
|
||||||
div(classes = "flex-auto overflow-auto px-1 pb-1") {
|
div(classes = "flex-auto overflow-auto px-1 pb-1 w-0 min-w-1/1") {
|
||||||
table {
|
table {
|
||||||
id = "importtable"
|
id = "importtable"
|
||||||
thead(classes = "$cssFixedTHead ") {
|
thead(classes = "$cssFixedTHead ") {
|
||||||
|
|||||||
@@ -234,14 +234,22 @@ fun HTML.testPage(booksDb: Database) {
|
|||||||
//}
|
//}
|
||||||
|
|
||||||
fun FlowContent.testTable() {
|
fun FlowContent.testTable() {
|
||||||
div(classes = "flex-auto overflow-auto px-1 pb-1") {
|
div(classes = "flex-auto overflow-auto px-1 pb-1 w-0 min-w-1/1") {
|
||||||
table {
|
table {
|
||||||
id = "testtable"
|
id = "testtable"
|
||||||
thead(classes = "$cssFixedTHead ") {
|
thead(classes = "$cssFixedTHead ") {
|
||||||
tr {
|
tr {
|
||||||
th(classes = "py-3 px-2") { +"#" }
|
th(classes = "py-3 px-2") { +"#" }
|
||||||
th(classes = "py-3 px-2") { +"Alias" }
|
th(classes = "py-3 px-2") { +"Alias0" }
|
||||||
th(classes = "py-3 px-2") { +"Score" }
|
th(classes = "py-3 px-2") { +"Score0" }
|
||||||
|
th(classes = "py-3 px-2") { +"Alias1" }
|
||||||
|
th(classes = "py-3 px-2") { +"Score1" }
|
||||||
|
th(classes = "py-3 px-2") { +"Alias2" }
|
||||||
|
th(classes = "py-3 px-2") { +"Score2" }
|
||||||
|
th(classes = "py-3 px-2") { +"Alias3" }
|
||||||
|
th(classes = "py-3 px-2") { +"Score3" }
|
||||||
|
th(classes = "py-3 px-2") { +"Alias4" }
|
||||||
|
th(classes = "py-3 px-2") { +"Score4" }
|
||||||
th(classes = "py-3 px-2") {
|
th(classes = "py-3 px-2") {
|
||||||
a {
|
a {
|
||||||
href = navBooksNew.second
|
href = navBooksNew.second
|
||||||
@@ -267,6 +275,30 @@ fun FlowContent.testTable() {
|
|||||||
td(classes = "border-t-1 $borderTable px-2 py-1") {
|
td(classes = "border-t-1 $borderTable px-2 py-1") {
|
||||||
+Random.nextLong().toString()
|
+Random.nextLong().toString()
|
||||||
}
|
}
|
||||||
|
td(classes = "border-t-1 $borderTable px-2 py-1") {
|
||||||
|
+Random.nextLong().toString()
|
||||||
|
}
|
||||||
|
td(classes = "border-t-1 $borderTable px-2 py-1") {
|
||||||
|
+Random.nextLong().toString()
|
||||||
|
}
|
||||||
|
td(classes = "border-t-1 $borderTable px-2 py-1") {
|
||||||
|
+Random.nextLong().toString()
|
||||||
|
}
|
||||||
|
td(classes = "border-t-1 $borderTable px-2 py-1") {
|
||||||
|
+Random.nextLong().toString()
|
||||||
|
}
|
||||||
|
td(classes = "border-t-1 $borderTable px-2 py-1") {
|
||||||
|
+Random.nextLong().toString()
|
||||||
|
}
|
||||||
|
td(classes = "border-t-1 $borderTable px-2 py-1") {
|
||||||
|
+Random.nextLong().toString()
|
||||||
|
}
|
||||||
|
td(classes = "border-t-1 $borderTable px-2 py-1") {
|
||||||
|
+Random.nextLong().toString()
|
||||||
|
}
|
||||||
|
td(classes = "border-t-1 $borderTable px-2 py-1") {
|
||||||
|
+Random.nextLong().toString()
|
||||||
|
}
|
||||||
td(classes = "border-t-1 $borderTable px-2 py-1 text-nowrap") {
|
td(classes = "border-t-1 $borderTable px-2 py-1 text-nowrap") {
|
||||||
materialSymbolButton("Edit")
|
materialSymbolButton("Edit")
|
||||||
materialSymbolButton("Delete")
|
materialSymbolButton("Delete")
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ fun HTML.landingPage(loggedOn: Boolean) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
div(classes = "lg:hidden p-8") {
|
div(classes = "md:hidden p-8") {
|
||||||
a(classes = "inline-flex $cssMainLink") {
|
a(classes = "inline-flex $cssMainLink") {
|
||||||
href = navBooksScan.second
|
href = navBooksScan.second
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user