feat: rotated table display

This commit is contained in:
efim 2023-11-18 18:45:21 +00:00
parent 495443e12a
commit 8b23103e8e
6 changed files with 101 additions and 17 deletions

View File

@ -19,7 +19,7 @@ run: tailwindcss
# and then do `go run .` to rebuild all else # and then do `go run .` to rebuild all else
.PHONY: run/live .PHONY: run/live
run/live: run/live:
wgo -verbose -file=.go -file=.gohtml -file=$(TAILWIND_CONF) make run wgo -verbose -file=.go -file=.gohtml -file=.css -file=$(TAILWIND_CONF) make run
# this is alias to concrete task that will build out.css # this is alias to concrete task that will build out.css
.PHONY: tailwindcss .PHONY: tailwindcss

View File

@ -9,3 +9,30 @@
--clarifying-q-color: 216deg 99% 55%; --clarifying-q-color: 216deg 99% 55%;
--meta-color: 312deg 100% 50%; --meta-color: 312deg 100% 50%;
} }
/* https://stackoverflow.com/questions/12813573/position-icons-into-circle */
.circle-container {
--d: 7em; /* image size */
--rel: 1; /* how much extra space we want between images, 1 = one image size */
--r: calc(.5*(1 + var(--rel))*var(--d)/var(--tan)); /* circle radius */
--s: calc(2*var(--r) + var(--d)); /* container size */
position: relative;
width: var(--s);
height: var(--s);
/* background: silver /\* to show images perfectly fit in container *\/ */
}
.circle-container .person-bricks {
position: absolute;
top: 50%; left: 50%;
/* margin: calc(-.5*var(--d)); */
--az: calc(var(--i)*1turn/var(--m));
width: var(--az); height: var(--az);
transform:
translateX(-50%)
translateY(-50%)
rotate(90deg)
rotate(var(--az))
translate(var(--r))
rotate(-90deg)
}

View File

@ -4,6 +4,7 @@ import (
"embed" "embed"
"html/template" "html/template"
"log" "log"
"math"
"net/http" "net/http"
"slices" "slices"
@ -21,6 +22,7 @@ type personData struct {
IsRaised bool IsRaised bool
Raised rooms.HandGesture Raised rooms.HandGesture
Mark rooms.HandGesture Mark rooms.HandGesture
Index int
} }
var brickColors = map[rooms.HandGesture]template.CSS{ var brickColors = map[rooms.HandGesture]template.CSS{
@ -31,13 +33,29 @@ var brickColors = map[rooms.HandGesture]template.CSS{
rooms.ChangeTopic: "--change-topic-color", rooms.ChangeTopic: "--change-topic-color",
} }
func personsFromRoom(room rooms.Room) []personData { type roomTableData struct {
Persons []personData
Total int
Tangens float64
}
func personsFromRoom(room rooms.Room) roomTableData {
// TODO start from the 'logged in person' // TODO start from the 'logged in person'
result := make([]personData, 0, len(room.Paricipants)) total := len(room.Paricipants)
for _, pId := range room.Paricipants { persons := make([]personData, 0, total)
result = append(result, personDataFromRoom(room, pId)) tangens := math.Tan(math.Pi / float64(total)) // Math.tan(Math.PI/m);
// tangens = math.Round(tangens*100) / 100
for i, pId := range room.Paricipants {
personData := personDataFromRoom(room, pId)
personData.Index = i
// personData.Tan = math.Round(tangens*100)/100
persons = append(persons, personData)
}
return roomTableData{
Persons: persons,
Total: total,
Tangens: tangens,
} }
return result
} }
func personDataFromRoom(room rooms.Room, pId rooms.PersonId) personData { func personDataFromRoom(room rooms.Room, pId rooms.PersonId) personData {
@ -180,7 +198,7 @@ func roomTemplatesPreview(
}, },
}, },
TestPerson: testPersonData, TestPerson: testPersonData,
ARoom: aRoom, ARoom: aRoom,
} }
pageData := pageData{ pageData := pageData{
@ -192,7 +210,7 @@ func roomTemplatesPreview(
tmpl := template.Must(template.New("").Funcs(template.FuncMap{ tmpl := template.Must(template.New("").Funcs(template.FuncMap{
"bricksForPerson": bricksForPerson, "bricksForPerson": bricksForPerson,
"personsFromRoom": personsFromRoom, "personsFromRoom": personsFromRoom,
}).ParseFS(templateFs, baseFile , }).ParseFS(templateFs, baseFile,
"templates/tableTemplates.gohtml", "templates/tableTemplates.gohtml",
"templates/tableTemplatesPreview.gohtml", "templates/tableTemplatesPreview.gohtml",
)) ))

View File

@ -534,6 +534,10 @@ video {
--tw-backdrop-sepia: ; --tw-backdrop-sepia: ;
} }
.relative {
position: relative;
}
.col-span-full { .col-span-full {
grid-column: 1 / -1; grid-column: 1 / -1;
} }
@ -686,11 +690,6 @@ video {
background-color: hsl(var(--brick-color) / 0.5); background-color: hsl(var(--brick-color) / 0.5);
} }
.bg-blue-200 {
--tw-bg-opacity: 1;
background-color: rgb(191 219 254 / var(--tw-bg-opacity));
}
.bg-green-300 { .bg-green-300 {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: rgb(134 239 172 / var(--tw-bg-opacity)); background-color: rgb(134 239 172 / var(--tw-bg-opacity));
@ -769,6 +768,40 @@ video {
--meta-color: 312deg 100% 50%; --meta-color: 312deg 100% 50%;
} }
/* https://stackoverflow.com/questions/12813573/position-icons-into-circle */
.circle-container {
--d: 7em;
/* image size */
--rel: 1;
/* how much extra space we want between images, 1 = one image size */
--r: calc(.5*(1 + var(--rel))*var(--d)/var(--tan));
/* circle radius */
--s: calc(2*var(--r) + var(--d));
/* container size */
position: relative;
width: var(--s);
height: var(--s);
/* background: silver /\* to show images perfectly fit in container *\/ */
}
.circle-container .person-bricks {
position: absolute;
top: 50%;
left: 50%;
/* margin: calc(-.5*var(--d)); */
--az: calc(var(--i)*1turn/var(--m));
width: var(--az);
height: var(--az);
transform:
translateX(-50%)
translateY(-50%)
rotate(90deg)
rotate(var(--az))
translate(var(--r))
rotate(-90deg)
}
.invalid\:bg-red-700:invalid { .invalid\:bg-red-700:invalid {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: rgb(185 28 28 / var(--tw-bg-opacity)); background-color: rgb(185 28 28 / var(--tw-bg-opacity));

View File

@ -35,7 +35,7 @@
<script src="https://unpkg.com/htmx.org/dist/ext/sse.js"></script> <script src="https://unpkg.com/htmx.org/dist/ext/sse.js"></script>
<div <div
id="roomTextContainer" id="roomTextContainer"
class="bg-blue-200 grid place-content-center" class="grid place-content-center"
hx-ext="sse" hx-ext="sse"
sse-connect="/rooms/subscribe?roomName={{ .Room.Name }}" sse-connect="/rooms/subscribe?roomName={{ .Room.Name }}"
> >

View File

@ -67,7 +67,10 @@
<h2>Now for a person</h2> <h2>Now for a person</h2>
{{ define "personBlocks" }} {{ define "personBlocks" }}
<div> <div class="person-bricks "
id="person-{{.Index}}"
style="--i: {{ .Index }}"
>
{{ range (bricksForPerson .) }} {{ range (bricksForPerson .) }}
{{ template "brick" . }} {{ template "brick" . }}
{{ end }} {{ end }}
@ -79,11 +82,14 @@
<h2>And now i'll want to get all persons for a room</h2> <h2>And now i'll want to get all persons for a room</h2>
{{ define "roomPeople" }} {{ define "roomPeople" }}
{{ with (personsFromRoom .)}}
<div <div
class="flex flex-row" class="circle-container relative"
style="--tan: {{ .Tangens }}; --m: {{ .Total }};"
> >
{{ range (personsFromRoom .) }} {{ range .Persons }}
{{ template "personBlocks" . }} {{ template "personBlocks" . }}
{{ end }} {{ end }}
</div> </div>
{{ end }}
{{end}} {{end}}