Browse Source

add table fixed

fancl 2 years ago
parent
commit
05d7d8e5a1
3 changed files with 97 additions and 26 deletions
  1. 79 20
      element/table.go
  2. 6 5
      render_test.go
  3. 12 1
      theme/default.go

+ 79 - 20
element/table.go

@@ -1,16 +1,19 @@
 package element
 
 import (
+	"fmt"
 	"git.nspix.com/golang/pgenr/internal/pool"
 	"golang.org/x/net/html/atom"
 )
 
 type (
 	Table struct {
-		Title  Element
-		Header []Element
-		Body   [][]Element
-		Outro  Element
+		Title       Element
+		FixedColumn bool
+		FixedWidth  int
+		Header      []Element
+		Body        [][]Element
+		Outro       Element
 	}
 )
 
@@ -33,28 +36,84 @@ func (table *Table) String() string {
 		br.WriteString(renderTag(atom.Div.String(), Attrs{"class": "table-title"}, table.Title.Html()))
 	}
 	br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "table-wrapper-inner"}))
-	br.WriteString(beginTag(atom.Table.String(), Attrs{"class": "table"}))
-	if len(table.Header) > 0 {
-		br.WriteString(beginTag(atom.Thead.String(), nil))
-		br.WriteString(beginTag(atom.Tr.String(), nil))
-		for _, text := range table.Header {
-			br.WriteString(renderTag(atom.Th.String(), nil, text.Html()))
+	if table.FixedColumn {
+		if table.FixedWidth <= 0 {
+			table.FixedWidth = 100
 		}
-		br.WriteString(endTag(atom.Tr.String()))
-		br.WriteString(endTag(atom.Thead.String()))
-	}
-	if len(table.Body) > 0 {
-		br.WriteString(beginTag(atom.Tbody.String(), nil))
-		for _, cell := range table.Body {
+		br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "table-fixed", "style": fmt.Sprintf("width:%dpx", table.FixedWidth+1)}))
+		br.WriteString(beginTag(atom.Table.String(), Attrs{"class": "table"}))
+		if len(table.Header) > 0 {
+			br.WriteString(beginTag(atom.Thead.String(), nil))
+			br.WriteString(beginTag(atom.Tr.String(), nil))
+			br.WriteString(renderTag(atom.Th.String(), nil, table.Header[0].Html()))
+			br.WriteString(endTag(atom.Tr.String()))
+			br.WriteString(endTag(atom.Thead.String()))
+		}
+		if len(table.Body) > 0 {
+			br.WriteString(beginTag(atom.Tbody.String(), nil))
+			for _, cell := range table.Body {
+				br.WriteString(beginTag(atom.Tr.String(), nil))
+				br.WriteString(renderTag(atom.Td.String(), nil, cell[0].Html()))
+				br.WriteString(endTag(atom.Tr.String()))
+			}
+			br.WriteString(endTag(atom.Tbody.String()))
+		}
+		br.WriteString(endTag(atom.Table.String()))
+		br.WriteString(endTag(atom.Div.String()))
+		br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "table-relative", "style": fmt.Sprintf("padding-left:%dpx", table.FixedWidth)}))
+		br.WriteString(beginTag(atom.Table.String(), Attrs{"class": "table"}))
+		if len(table.Header) > 0 {
+			br.WriteString(beginTag(atom.Thead.String(), nil))
+			br.WriteString(beginTag(atom.Tr.String(), nil))
+			for i, text := range table.Header {
+				if i == 0 {
+					continue
+				}
+				br.WriteString(renderTag(atom.Th.String(), nil, text.Html()))
+			}
+			br.WriteString(endTag(atom.Tr.String()))
+			br.WriteString(endTag(atom.Thead.String()))
+		}
+		if len(table.Body) > 0 {
+			br.WriteString(beginTag(atom.Tbody.String(), nil))
+			for _, cell := range table.Body {
+				br.WriteString(beginTag(atom.Tr.String(), nil))
+				for i, text := range cell {
+					if i == 0 {
+						continue
+					}
+					br.WriteString(renderTag(atom.Td.String(), nil, text.Html()))
+				}
+				br.WriteString(endTag(atom.Tr.String()))
+			}
+			br.WriteString(endTag(atom.Tbody.String()))
+		}
+		br.WriteString(endTag(atom.Table.String()))
+		br.WriteString(endTag(atom.Div.String()))
+	} else {
+		br.WriteString(beginTag(atom.Table.String(), Attrs{"class": "table"}))
+		if len(table.Header) > 0 {
+			br.WriteString(beginTag(atom.Thead.String(), nil))
 			br.WriteString(beginTag(atom.Tr.String(), nil))
-			for _, text := range cell {
-				br.WriteString(renderTag(atom.Td.String(), nil, text.Html()))
+			for _, text := range table.Header {
+				br.WriteString(renderTag(atom.Th.String(), nil, text.Html()))
 			}
 			br.WriteString(endTag(atom.Tr.String()))
+			br.WriteString(endTag(atom.Thead.String()))
+		}
+		if len(table.Body) > 0 {
+			br.WriteString(beginTag(atom.Tbody.String(), nil))
+			for _, cell := range table.Body {
+				br.WriteString(beginTag(atom.Tr.String(), nil))
+				for _, text := range cell {
+					br.WriteString(renderTag(atom.Td.String(), nil, text.Html()))
+				}
+				br.WriteString(endTag(atom.Tr.String()))
+			}
+			br.WriteString(endTag(atom.Tbody.String()))
 		}
-		br.WriteString(endTag(atom.Tbody.String()))
+		br.WriteString(endTag(atom.Table.String()))
 	}
-	br.WriteString(endTag(atom.Table.String()))
 	br.WriteString(endTag(atom.Div.String()))
 	if table.Outro != nil {
 		br.WriteString(table.Outro.Html())

+ 6 - 5
render_test.go

@@ -26,14 +26,15 @@ func TestRender(t *testing.T) {
 	timeline.AddItem(time.Now().Add(-2*time.Minute), element.NewText("Event start"))
 	timeline.AddItem(time.Now().Add(-1*time.Minute), element.NewText("Event end"))
 	timeline.AddItem(time.Now().Add(time.Minute), element.NewText("Event closed"))
-	page.AddTimeline(timeline)
+	//page.AddTimeline(timeline)
 	table := element.NewTable(element.NewText("This year sale table", element.WithTextStyle(map[string]string{"font-size": "1.06rem", "font-weight": "550"})))
-	table.SetHead(element.NewText("Name"), element.NewText("Age"), element.NewText("Price"))
-	table.AddCell(element.NewText("ZhanSan"), element.NewText("31"), element.NewText("185.6"))
-	table.AddCell(element.NewText("Lisi"), element.NewText("35"), element.NewText("102.6"))
+	table.FixedColumn = true
+	table.SetHead(element.NewText("Name"), element.NewText("Age"), element.NewText("Price"), element.NewText("School"), element.NewText("Job"))
+	table.AddCell(element.NewText("ZhanSan"), element.NewText("31"), element.NewText("185.6"), element.NewText("185.6"), element.NewText("185.6"))
+	table.AddCell(element.NewText("Lisi"), element.NewText("35"), element.NewText("102.6"), element.NewText("102.6"), element.NewText("102.6"))
 	page.AddTable(table)
 	//page.AddButtonAction("To get started with Hermes, please click here:", NewButton("Confirm your account", "https://example-hermes.com/"))
-	page.AddInviteCodeAction("To get started with Hermes, please click here:", "950038")
+	//page.AddInviteCodeAction("To get started with Hermes, please click here:", "950038")
 	if str, err := Render(page); err == nil {
 		ioutil.WriteFile("d:\\aaa.html", []byte(str), 0644)
 	} else {

+ 12 - 1
theme/default.go

@@ -39,7 +39,7 @@ func (theme *Default) Template() string {
       margin: 0 auto;
       background-color: white;
     }
-
+	
     .container-inner {
       padding: 1rem;
 	  width: 100%;
@@ -58,6 +58,17 @@ func (theme *Default) Template() string {
 	.table-wrapper-inner{
 		width: 100%;
 		overflow-x: auto;
+		display: flex;
+	}
+
+	.table-fixed{
+		position: absolute;
+		background: white;
+		z-index: 999;
+	}
+	
+	.table-relative{
+		flex: 1 1 auto!important;
 	}
 	
     .text-success {