Add ability to edit devices

This commit is contained in:
2025-03-24 15:01:42 +01:00
parent 5df1e9485a
commit b799ac5aa6
5 changed files with 137 additions and 39 deletions

10
main.go
View File

@@ -43,10 +43,12 @@ func main() {
templates, err := template.New("undefined.gohtml").
Funcs(template.FuncMap{
"statusText": http.StatusText,
"createDeviceLink": createDeviceLink,
"formatMemorySize": formatMemorySize,
"formatType": formatType,
"statusText": http.StatusText,
"createDeviceLink": createDeviceLink,
"formatMemorySize": formatMemorySize,
"formatMemoryPlainSize": formatMemoryPlainSize,
"formatType": formatType,
"isRamType": isRamType,
}).
ParseFS(templateFS, "templates/*.gohtml")

View File

@@ -18,7 +18,7 @@ type CreateDeviceLink struct {
Qr *int
}
func formatMemorySize(size int) string {
func formatMemoryUnit(size int) string {
const (
KB = 1024
MB = KB * 1024
@@ -27,16 +27,66 @@ func formatMemorySize(size int) string {
switch {
case size >= GB:
return fmt.Sprintf("%.2f GB", float64(size)/GB)
return "GB"
case size >= MB:
return fmt.Sprintf("%.2f MB", float64(size)/MB)
return "MB"
case size >= KB:
return fmt.Sprintf("%.2f KB", float64(size)/KB)
return "KB"
default:
return fmt.Sprintf("%d B", size)
return "B"
}
}
func formatMemorySize(size int) string {
const (
KB = 1024
MB = KB * 1024
GB = MB * 1024
)
switch formatMemoryUnit(size) {
case "GB":
return fmt.Sprintf("%.2f GB", float64(size)/GB)
case "MB":
return fmt.Sprintf("%.2f MB", float64(size)/MB)
case "KB":
return fmt.Sprintf("%.2f KB", float64(size)/KB)
case "B":
return fmt.Sprintf("%d B", size)
default:
panic("invalid memory size")
}
}
func formatMemoryPlainSize(size int) int {
const (
KB = 1024
MB = KB * 1024
GB = MB * 1024
)
switch formatMemoryUnit(size) {
case "GB":
return size / GB
case "MB":
return size / MB
case "KB":
return size / KB
case "B":
return size
default:
panic("invalid memory size")
}
}
func isRamType(size int, unit string) bool {
if size == 0 && unit == "MB" {
return true
}
actualUnit := formatMemoryUnit(size)
return unit == actualUnit
}
func formatType(t string) string {
switch t {
case "ram":

View File

@@ -18,23 +18,25 @@
</tr>
<tr>
<td><label for="asset_brand">Brand:</label></td>
<td><select id="asset_brand" name="asset_brand" onchange="newOption('asset_brand', 'Brand')">
<option value="Unknown" selected>Unknown</option>
{{range .Brands}}
{{if ne . "Unknown"}}
<option value="{{.}}">{{.}}</option>
<td>
<select id="asset_brand" name="asset_brand" onchange="newOption('asset_brand', 'Brand')">
<option value="Unknown" {{if eq .AssetBrand "Unknown"}}selected{{end}}>Unknown</option>
{{range .Brands}}
{{if ne . "Unknown"}}
<option value="{{.}}" {{if eq . $.AssetBrand}}selected{{end}}>{{.}}</option>
{{end}}
{{end}}
{{end}}
<option>New...</option>
</select></td>
<option>New...</option>
</select>
</td>
</tr>
<tr>
<td><label for="asset_name">Name:</label></td>
<td><input type="text" id="asset_name" name="asset_name"></td>
<td><input type="text" id="asset_name" name="asset_name" value="{{.AssetName}}"></td>
</tr>
<tr>
<td><label for="asset_description">Description:</label></td>
<td><textarea id="asset_description" name="asset_description"></textarea></td>
<td><textarea id="asset_description" name="asset_description">{{.AssetDescription}}</textarea></td>
</tr>
</table>
@@ -42,32 +44,38 @@
<table>
<tr>
<td><label for="ram_type">Type:</label></td>
<td><select id="ram_type" name="ram_type" onchange="newOption('ram_type', 'Memory Type')">
<option value="Unknown" selected>Unknown</option>
{{range .RamTypes}}
{{if ne . "Unknown"}}
<option value="{{.}}">{{.}}</option>
<td>
<select id="ram_type" name="ram_type" onchange="newOption('ram_type', 'Memory Type')">
<option value="Unknown" {{if eq .RamType "Unknown"}}selected{{end}}>Unknown</option>
{{range .RamTypes}}
{{if ne . "Unknown"}}
<option value="{{.}}" {{if eq . $.RamType}}selected{{end}}>{{.}}</option>
{{end}}
{{end}}
{{end}}
<option>New...</option>
</select></td>
<option>New...</option>
</select>
</td>
</tr>
<tr>
<td><label for="ram_capacity">Capacity:</label></td>
<td>
<input type="number" id="ram_capacity" name="ram_capacity">
<input type="number" id="ram_capacity" name="ram_capacity" value="{{if .RamCapacity}}{{.RamCapacity | formatMemoryPlainSize}}{{end}}">
<select id="ram_capacity_unit" name="ram_capacity_unit">
<option value="B">B</option>
<option value="KB">KB</option>
<option value="MB" selected>MB</option>
<option value="GB">GB</option>
<option value="TB">TB</option>
<option value="B" {{if isRamType .RamCapacity "B"}}selected{{end}}>B</option>
<option value="KB" {{if isRamType .RamCapacity "KB"}}selected{{end}}>KB</option>
<option value="MB" {{if isRamType .RamCapacity "MB"}}selected{{end}} selected>MB</option>
<option value="GB" {{if isRamType .RamCapacity "GB"}}selected{{end}}>GB</option>
<option value="TB" {{if isRamType .RamCapacity "TB"}}selected{{end}}>TB</option>
</select>
</td>
</tr>
</table>
<button type="submit">Create</button>
{{if .IsEdit}}
<button type="submit">Edit</button>
{{else}}
<button type="submit">Create</button>
{{end}}
</form>
{{template "footer"}}
{{end}}

View File

@@ -29,5 +29,6 @@
</tr>
{{end}}
</table>
<a href="/create?id={{.Qr}}&edit=true"><button>Edit</button></a>
{{template "footer"}}
{{end}}

View File

@@ -59,6 +59,7 @@ func (a *App) getIndex(c *gin.Context) {
}
type DeviceVM struct {
Qr int
Name string
Brand string
Type string
@@ -88,7 +89,7 @@ func (a *App) getDevice(c *gin.Context) {
return
}
vm := &DeviceVM{}
vm := &DeviceVM{Qr: qr}
err = a.db.Query("SELECT name, brand, type, description FROM assets WHERE qr = ?").
Bind(qr).
ScanSingle(&vm.Name, &vm.Brand, &vm.Type, &vm.Description)
@@ -111,10 +112,16 @@ func (a *App) getDevice(c *gin.Context) {
}
type CreateDeviceVM struct {
Qr *int
Type string
Brands []string
RamTypes []string
Qr *int
Type string
Brands []string
RamTypes []string
AssetName string
AssetBrand string
AssetDescription string
RamType string
RamCapacity int
IsEdit bool
}
func (a *App) getCreateDevice(c *gin.Context) {
@@ -146,6 +153,26 @@ func (a *App) getCreateDevice(c *gin.Context) {
vm.Brands = brands
vm.RamTypes = types
if c.Query("edit") != "" && vm.Qr != nil {
vm.IsEdit = true
err = a.db.Query("SELECT name, type, brand, description FROM assets WHERE qr = ?").
Bind(*vm.Qr).
ScanSingle(&vm.AssetName, &vm.Type, &vm.AssetBrand, &vm.AssetDescription)
if err != nil {
c.AbortWithError(http.StatusInternalServerError, err)
return
}
if vm.Type == "ram" {
err = a.db.Query("SELECT type, capacity FROM info_ram WHERE asset = ?").
Bind(*vm.Qr).
ScanSingle(&vm.RamType, &vm.RamCapacity)
if err != nil {
c.AbortWithError(http.StatusInternalServerError, err)
return
}
}
}
c.HTML(http.StatusOK, "create_device", vm)
}
@@ -198,6 +225,16 @@ func (a *App) postCreateDeviceRam(c *gin.Context, qr int) error {
return err
}
err = tx.Query("DELETE FROM assets WHERE qr=?").Bind(qr).Exec()
if err != nil {
return err
}
err = tx.Query("DELETE FROM info_ram WHERE asset=?").Bind(qr).Exec()
if err != nil {
return err
}
err = tx.Query("INSERT INTO assets (qr, type, brand, name, description) VALUES (?, ?, ?, ?, ?)").
Bind(qr, c.PostForm("asset_type"), c.PostForm("asset_brand"), c.PostForm("asset_name"), c.PostForm("asset_description")).
Exec()