This commit is contained in:
2026-04-04 00:09:02 +08:00
commit 38e896363e
117 changed files with 119311 additions and 0 deletions

View File

@@ -0,0 +1,533 @@
package main
import (
"fmt"
"strconv"
"strings"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func createLocationTab(platform platformStruct) *fyne.Container {
searchEntry := widget.NewEntry()
searchEntry.SetPlaceHolder("Поиск Локаций ...")
filteredEntries := platform.DciLocations
list := widget.NewList(
func() int {
return len(filteredEntries)
},
func() fyne.CanvasObject {
return container.NewVBox(
widget.NewEntry(),
widget.NewEntry(),
widget.NewEntry(),
widget.NewEntry(),
widget.NewEntry(),
widget.NewEntry(),
)
},
func(id widget.ListItemID, obj fyne.CanvasObject) {
box := obj.(*fyne.Container)
e := filteredEntries[id]
entryOne := box.Objects[0].(*widget.Entry)
entryTwo := box.Objects[1].(*widget.Entry)
entryThree := box.Objects[2].(*widget.Entry)
entryFour := box.Objects[3].(*widget.Entry)
entryFive := box.Objects[4].(*widget.Entry)
entrySix := box.Objects[5].(*widget.Entry)
entryOne.AlwaysShowValidationError = true
entryOne.SetText(fmt.Sprintf("%d Имя: %s Главная локация: %d Статус: %s (%s)", e.Id, e.Name, e.IsMain, e.Status, e.StatusInfo))
entryTwo.SetText(fmt.Sprintf("SSH: %s@%s:%d", e.SshUser, e.SshAddress, e.SshPort))
entryThree.SetText(fmt.Sprintf("%s Userspace: %d", e.SetupInfo, e.Userspace))
entryFour.SetText(fmt.Sprintf("Настройки: %s", e.Settings))
entryFive.SetText(fmt.Sprintf("Патч: %s", e.Patch))
entrySix.SetText(fmt.Sprintf("DHCP: %s Redis: %s Nginx: %s Netflow: %s Proxy: %s", e.ParamsDhcp, e.ParamsRedis, e.ParamsNginx, e.ParamsNetflow, e.ProxyParams))
entryOne.TextStyle.Bold = true
},
)
searchEntry.OnChanged = func(text string) {
if text == "" {
filteredEntries = platform.DciLocations
} else {
filtered := []dciLocation{}
lText := strings.ToLower(text)
for _, elem := range platform.DciLocations {
if strings.Contains(strings.ToLower(elem.Name), lText) || strings.Contains(strings.ToLower(elem.SshAddress), lText) {
filtered = append(filtered, elem)
}
}
filteredEntries = filtered
}
list.Refresh()
}
locationsTab := container.NewBorder(
container.NewVBox(
searchEntry,
widget.NewSeparator(),
), nil, nil, nil,
container.NewScroll(list),
)
return locationsTab
}
// func createLocationComposeTab(platform platformStruct) *fyne.Container {
// // строка поиска
// searchEntry := widget.NewEntry()
// searchEntry.SetPlaceHolder("Поиск ...")
// // переменная с которой будем работать дальше при фильтрации, с пустым условием фильтрации равна всему списку
// filteredEntries := platform.DciLocationDockerComposes
// // создаём список, котрый будет отображаться в табе
// list := widget.NewList(
// // состоит из трёх функций, которые постоянно дургаются, когда скролишь список
// // первая возвращает длину списка, что даёт возможность получить id элемента
// func() int {
// return len(filteredEntries)
// },
// // вторая работает шаблоном показывая из каких элементов список будет состоять
// func() fyne.CanvasObject {
// return container.NewVBox(
// widget.NewLabel("имя"),
// widget.NewMultiLineEntry(),
// )
// },
// // третья функция формирует собственно список с данными
// func(id widget.ListItemID, obj fyne.CanvasObject) {
// box := obj.(*fyne.Container)
// e := filteredEntries[id]
// nameLabel := box.Objects[0].(*widget.Label)
// composeEntry := box.Objects[1].(*widget.Entry)
// nameLabel.SetText(fmt.Sprintf("%d %s", e.Id, e.Name))
// nameLabel.TextStyle.Bold = true
// composeEntry.SetText(e.DockerCompose)
// },
// )
// // дальше формируем поисковую логику, которая вызывается при изменении строки
// searchEntry.OnChanged = func(text string) {
// if text == "" {
// filteredEntries = platform.DciLocationDockerComposes
// } else {
// filtered := []dciLocationDockerCompose{}
// lText := strings.ToLower(text)
// for _, elem := range platform.DciLocationDockerComposes {
// if strings.Contains(strings.ToLower(elem.Name), lText) || strings.Contains(strings.ToLower(elem.DockerCompose), lText) {
// filtered = append(filtered, elem)
// }
// }
// filteredEntries = filtered
// }
// list.Refresh()
// }
// locationsTab := container.NewBorder(
// container.NewVBox(
// searchEntry,
// widget.NewSeparator(),
// ), nil, nil, nil,
// container.NewScroll(list),
// )
// return locationsTab
// }
func createTaskManagerFailedTab(platform platformStruct) *fyne.Container {
searchEntry := widget.NewEntry()
searchEntry.SetPlaceHolder("Поиск задач ...")
filteredEntries := platform.TaskManagerTask
list := widget.NewList(
func() int {
return len(filteredEntries)
},
func() fyne.CanvasObject {
return container.NewVBox(
widget.NewLabel("id name status"),
widget.NewLabel("time"),
widget.NewEntry(),
widget.NewLabel("output"),
)
},
func(id widget.ListItemID, obj fyne.CanvasObject) {
box := obj.(*fyne.Container)
e := filteredEntries[id]
idLabel := box.Objects[0].(*widget.Label)
nameLabel := box.Objects[1].(*widget.Label)
statusLabel := box.Objects[2].(*widget.Entry)
timeLabel := box.Objects[3].(*widget.Label)
idLabel.SetText(fmt.Sprintf("%d %s %s", e.Id, e.Name, e.Status))
idLabel.TextStyle.Bold = true
nameLabel.SetText(e.RegistrationTime)
statusLabel.SetText(e.RequestInfo)
timeLabel.SetText(e.Output)
},
)
searchEntry.OnChanged = func(text string) {
if text == "" {
filteredEntries = platform.TaskManagerTask
} else {
filtered := []taskManagerTask{}
lText := strings.ToLower(text)
for _, elem := range platform.TaskManagerTask {
if strings.Contains(strings.ToLower(elem.Name), lText) || strings.Contains(strings.ToLower(elem.Status), lText) {
filtered = append(filtered, elem)
}
}
filteredEntries = filtered
}
list.Refresh()
}
taskFailedTab := container.NewBorder(
container.NewVBox(
searchEntry,
widget.NewSeparator(),
), nil, nil, nil,
container.NewScroll(list),
)
return taskFailedTab
}
func createHwByLocationsTab(platform platformStruct) *fyne.Container {
searchEntry := widget.NewEntry()
searchEntry.SetPlaceHolder("Поиск по локациям ...")
filteredEntries := platform.HwByLocations
list := widget.NewList(
func() int {
return len(filteredEntries)
},
func() fyne.CanvasObject {
return container.NewHBox(
widget.NewLabel("loc"),
widget.NewLabel("serv"),
widget.NewLabel("switch"),
widget.NewLabel("pdu"),
widget.NewLabel("ups"),
)
},
func(id widget.ListItemID, obj fyne.CanvasObject) {
box := obj.(*fyne.Container)
e := filteredEntries[id]
loc := box.Objects[0].(*widget.Label)
serv := box.Objects[1].(*widget.Label)
sw := box.Objects[2].(*widget.Label)
pdu := box.Objects[3].(*widget.Label)
ups := box.Objects[4].(*widget.Label)
loc.SetText(fmt.Sprintf("Локация: %d", e.Location))
loc.TextStyle.Bold = true
serv.SetText(fmt.Sprintf("Серверов: %d", e.Server))
sw.SetText(fmt.Sprintf("Коммутаторов: %d", e.Switch))
pdu.SetText(fmt.Sprintf("PDU: %d", e.Pdu))
ups.SetText(fmt.Sprintf("UPS: %d", e.Ups))
},
)
searchEntry.OnChanged = func(text string) {
if text == "" {
filteredEntries = platform.HwByLocations
} else {
filtered := []hwByLocation{}
lText := strings.ToLower(text)
for _, elem := range platform.HwByLocations {
if strings.Contains(strconv.Itoa(elem.Location), lText) {
filtered = append(filtered, elem)
}
}
filteredEntries = filtered
}
list.Refresh()
}
tab := container.NewBorder(
container.NewVBox(
searchEntry,
widget.NewSeparator(),
), nil, nil, nil,
container.NewScroll(list),
)
return tab
}
func createInstalledPluginTab(platform platformStruct) *fyne.Container {
list := widget.NewList(
func() int {
return len(platform.InstalledPlugin)
},
func() fyne.CanvasObject {
return container.NewHBox(
widget.NewLabel("name"),
widget.NewLabel("status"),
widget.NewLabel("version"),
widget.NewLabel("Curver"),
)
},
func(id widget.ListItemID, obj fyne.CanvasObject) {
box := obj.(*fyne.Container)
e := platform.InstalledPlugin[id]
nameLabel := box.Objects[0].(*widget.Label)
statLabel := box.Objects[1].(*widget.Label)
verLabel := box.Objects[2].(*widget.Label)
curverLabel := box.Objects[3].(*widget.Label)
nameLabel.SetText(e.Name)
nameLabel.TextStyle.Bold = true
statLabel.SetText(e.Status)
verLabel.SetText(e.Version)
curverLabel.SetText(e.CurrentVersion)
},
)
list.Refresh()
tab := container.NewBorder(
container.NewVBox(
widget.NewSeparator(),
), nil, nil, nil,
container.NewScroll(list),
)
return tab
}
func createLdapTab(platform platformStruct) *fyne.Container {
list := widget.NewList(
func() int {
return len(platform.Ldaps)
},
// Id int `json:"id"`
// Name string `json:"name"`
// LastSync string `json:"last_sync"`
func() fyne.CanvasObject {
return container.NewHBox(
widget.NewLabel("ldap"),
)
},
func(id widget.ListItemID, obj fyne.CanvasObject) {
box := obj.(*fyne.Container)
e := platform.Ldaps[id]
ldapLabel := box.Objects[0].(*widget.Label)
ldapLabel.SetText(fmt.Sprintf("%d %s Синхронизация: %s", e.Id, e.Name, e.LastSync))
},
)
list.Refresh()
tab := container.NewBorder(
container.NewVBox(
widget.NewSeparator(),
), nil, nil, nil,
container.NewScroll(list),
)
return tab
}
func createRepoTab(platform platformStruct) *fyne.Container {
list := widget.NewList(
func() int {
return len(platform.Repos)
},
// Id int `json:"id"`
// Name string `json:"name"`
// Url string `json:"url"`
func() fyne.CanvasObject {
return container.NewHBox(
widget.NewLabel("id"),
widget.NewLabel("name"),
widget.NewLabel("url"),
)
},
func(id widget.ListItemID, obj fyne.CanvasObject) {
box := obj.(*fyne.Container)
e := platform.Repos[id]
idLabel := box.Objects[0].(*widget.Label)
nameLabel := box.Objects[1].(*widget.Label)
urlLabel := box.Objects[2].(*widget.Label)
idLabel.SetText(fmt.Sprintf("%d", e.Id))
nameLabel.SetText(e.Name)
urlLabel.SetText(e.Url)
},
)
list.Refresh()
tab := container.NewBorder(
container.NewVBox(
widget.NewSeparator(),
), nil, nil, nil,
container.NewScroll(list),
)
return tab
}
func createOsTemplateTab(platform platformStruct) *fyne.Container {
searchEntry := widget.NewEntry()
searchEntry.SetPlaceHolder("Поиск ...")
filteredEntries := platform.OsTemplates
list := widget.NewList(
func() int {
return len(filteredEntries)
},
// Id int `json:"id"`
// Name string `json:"name"`
// Filename string `json:"filename"`
// Macro string `json:"macro"`
// Metainfo string `json:"metainfo"`
// DirectoryName string `json:"directory_name"`
// Repository int `json:"repository"`
// Size int `json:"size"`
func() fyne.CanvasObject {
return container.NewVBox(
widget.NewLabel("id-name-filename-directoryname-size"),
widget.NewLabel("macro-metainfo-reposiztory"),
)
},
func(id widget.ListItemID, obj fyne.CanvasObject) {
box := obj.(*fyne.Container)
e := filteredEntries[id]
labelFirst := box.Objects[0].(*widget.Label)
labelSecond := box.Objects[1].(*widget.Label)
labelFirst.SetText(fmt.Sprintf("%d %s %s %s размер: %d", e.Id, e.Name, e.Filename, e.DirectoryName, e.Size))
labelFirst.Selectable = true
labelSecond.SetText(fmt.Sprintf("макросы: %s мета: %s репозиторий: %d", e.Macro, e.Metainfo, e.Repository))
labelSecond.Selectable = true
},
)
searchEntry.OnChanged = func(textRaw string) {
if textRaw == "" {
filteredEntries = platform.OsTemplates
} else {
filtered := []osTemplate{}
text := strings.ToLower(textRaw)
for _, elem := range platform.OsTemplates {
if strings.Contains(strings.ToLower(elem.Name), text) || strings.Contains(strings.ToLower(elem.Filename), text) || strings.Contains(strings.ToLower(elem.Metainfo), text) || strings.Contains(strings.ToLower(elem.DirectoryName), text) {
filtered = append(filtered, elem)
}
}
filteredEntries = filtered
}
list.Refresh()
}
osTemplTab := container.NewBorder(
container.NewVBox(
searchEntry,
widget.NewSeparator(),
), nil, nil, nil,
container.NewScroll(list),
)
return osTemplTab
}
func createBackupTasksTab(platform platformStruct) *fyne.Container {
// Id int `json:"id"`
// Enabled int `json:"enabled"`
// CronExpression string `json:"cron_expression"`
// LimitCount int `json:"limit_count"`
// LimitSizeMib int `json:"limit_size_mib"`
list := widget.NewList(
func() int {
return len(platform.BackupTasks)
},
func() fyne.CanvasObject {
return container.NewHBox(
widget.NewLabel("id"),
widget.NewLabel("enabled"),
widget.NewLabel("cron"),
widget.NewLabel("count"),
widget.NewLabel("size"),
)
},
func(id widget.ListItemID, obj fyne.CanvasObject) {
box := obj.(*fyne.Container)
e := platform.BackupTasks[id]
label0 := box.Objects[0].(*widget.Label)
label1 := box.Objects[1].(*widget.Label)
label2 := box.Objects[2].(*widget.Label)
label3 := box.Objects[3].(*widget.Label)
label4 := box.Objects[4].(*widget.Label)
label0.SetText(strconv.Itoa(e.Id))
label1.SetText(fmt.Sprintf("включено: %d", e.Enabled))
label2.SetText(e.CronExpression)
label3.SetText(fmt.Sprintf("количество копий: %d", e.LimitCount))
label4.SetText(fmt.Sprintf("размер: %d", e.LimitSizeMib))
},
)
list.Refresh()
tab := container.NewBorder(
container.NewVBox(
widget.NewSeparator(),
), nil, nil, nil,
container.NewScroll(list),
)
return tab
}
func createCopiedFileListTab(platform platformStruct) *fyne.Container {
searchEntry := widget.NewEntry()
searchEntry.SetPlaceHolder("Поиск ...")
filteredEntries := platform.CopiedFiles.FileNames
list := widget.NewList(
func() int {
return len(filteredEntries)
},
func() fyne.CanvasObject {
return container.NewVBox(
widget.NewLabel("fileName"),
)
},
func(id widget.ListItemID, obj fyne.CanvasObject) {
box := obj.(*fyne.Container)
e := filteredEntries[id]
fileName := box.Objects[0].(*widget.Label)
fileName.SetText(e)
fileName.Selectable = true
},
)
searchEntry.OnChanged = func(text string) {
if text == "" {
filteredEntries = platform.CopiedFiles.FileNames
} else {
var filtered []string
lText := strings.ToLower(text)
for _, elem := range platform.CopiedFiles.FileNames {
if strings.Contains(strings.ToLower(elem), lText) {
filtered = append(filtered, elem)
}
}
filteredEntries = filtered
}
list.Refresh()
}
tab := container.NewBorder(
container.NewVBox(
searchEntry,
widget.NewSeparator(),
), nil, nil, nil,
container.NewScroll(list),
)
return tab
}
func createLicenseTab(platform platformStruct) *fyne.Container {
licCheck := widget.NewMultiLineEntry()
licCheck.SetText(platform.License.LicenseCheck)
licInfo := widget.NewMultiLineEntry()
licInfo.SetText(platform.License.LicenseInfo)
licInfo.MultiLine = true
licInfo.SetMinRowsVisible(20)
tab := container.NewBorder(
container.NewVBox(
licCheck,
licInfo,
), nil, nil, nil,
)
return tab
}