Has no functionality yet, but that's next. And not sure how it works when switching connections.
77 lines
2.2 KiB
Go
77 lines
2.2 KiB
Go
package templates
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
)
|
|
|
|
// Tree definition
|
|
const TREE_OPEN string = `<ul hx-swap-oob="outerHTML" id="database-table-tree" class="space-y-2">`
|
|
const TREE_CLOSE string = `</ul>`
|
|
const TREE_BODY_TEMPLATE string = `<li>%s</li>`
|
|
|
|
// Table definition
|
|
const TABLE_TEMPLATE string = `
|
|
<button class="w-full text-left text-gray-700 font-medium hover:bg-gray-100 p-2 rounded flex items-center"
|
|
title="Select this table">
|
|
<svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
|
xmlns="http://www.w3.org/2000/svg">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 9l6 6 6-6"></path>
|
|
</svg>
|
|
%s
|
|
</button>
|
|
`
|
|
|
|
// Fields definition
|
|
const FIELDS_LIST_OPEN string = `<ul class="ml-6 mt-1 space-y-1 text-gray-600">`
|
|
const FIELDS_LIST_CLOSE string = `</ul>`
|
|
const FIELD_TEMPLATE string = `
|
|
<li>
|
|
<button class="flex items-center" title="Select this field">
|
|
<svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
|
xmlns="http://www.w3.org/2000/svg">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16m-7 6h7">
|
|
</path>
|
|
</svg>
|
|
<span>%s</span>
|
|
</button>
|
|
</li>
|
|
`
|
|
|
|
// This is not implemented yet
|
|
const PRIMARY_KEY string = `<span class="h-1.5 w-1.5 bg-yellow-500 rounded-full mx-2" title="Primary Key"></span>`
|
|
|
|
// Generate the tree based on the database tables and columns
|
|
func TableTree(tree map[string][]string) string {
|
|
html := TREE_OPEN
|
|
|
|
var body string
|
|
for _, table := range getSortedKeys(tree) {
|
|
body += fmt.Sprintf(TABLE_TEMPLATE, table)
|
|
body += FIELDS_LIST_OPEN + generateFields(tree[table]) + FIELDS_LIST_CLOSE
|
|
}
|
|
|
|
html += fmt.Sprintf(TREE_BODY_TEMPLATE, body)
|
|
return html + TREE_CLOSE
|
|
}
|
|
|
|
// Using a list of fields, generate the HTML for the fields
|
|
func generateFields(fields []string) string {
|
|
var html string
|
|
for _, field := range fields {
|
|
html += fmt.Sprintf(FIELD_TEMPLATE, field)
|
|
}
|
|
return html
|
|
}
|
|
|
|
// Return a list of the keys in a map, sorted alphabetically
|
|
func getSortedKeys(m map[string][]string) []string {
|
|
keys := make([]string, 0, len(m))
|
|
for k := range m {
|
|
keys = append(keys, k)
|
|
}
|
|
|
|
sort.Strings(keys)
|
|
return keys
|
|
}
|