feat: locales and minor fixes
This commit is contained in:
@@ -6,6 +6,8 @@ import (
|
||||
"fmt"
|
||||
"github.com/kuzgoga/fogg"
|
||||
"github.com/xuri/excelize/v2"
|
||||
"golang.org/x/text/language"
|
||||
"golang.org/x/text/message"
|
||||
"log/slog"
|
||||
"reflect"
|
||||
"slices"
|
||||
@@ -18,6 +20,8 @@ type TableHeaders struct {
|
||||
IgnoredFieldsIndexes []int
|
||||
}
|
||||
|
||||
var p = message.NewPrinter(language.Russian)
|
||||
|
||||
func isPrimitiveType(valueType reflect.Type) bool {
|
||||
switch valueType.Kind() {
|
||||
case reflect.Bool,
|
||||
@@ -48,7 +52,7 @@ func ExportEntitiesToSpreadsheet(filename string, exporters ...ExporterInterface
|
||||
file := excelize.NewFile()
|
||||
defer func() {
|
||||
if err := file.Close(); err != nil {
|
||||
slog.Error("Error while closing excel file: ", err)
|
||||
slog.Error(p.Sprintf("Error while closing excel file: %s", err))
|
||||
}
|
||||
}()
|
||||
|
||||
@@ -125,7 +129,7 @@ func ExportEntityToSpreadsheet[T any](file *excelize.File, sheetName string, ent
|
||||
err = file.SetCellValue(sheetName, cellName, fieldValue)
|
||||
}
|
||||
|
||||
slog.Info(fmt.Sprintf("Field %s value: %v, %s\n", cellName, fieldValue, datatype))
|
||||
slog.Info(p.Sprintf("Field %s value: %v, %s\n", cellName, fieldValue, datatype))
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -176,7 +180,7 @@ func getNestedFieldValue(obj reflect.Value, path string) (any, error) {
|
||||
val = val.FieldByName(field)
|
||||
|
||||
if !val.IsValid() {
|
||||
return nil, fmt.Errorf("field %s not found", field)
|
||||
return nil, errors.New(p.Sprintf("field %s not found", field))
|
||||
}
|
||||
}
|
||||
return val.Interface(), nil
|
||||
@@ -193,7 +197,7 @@ func SerializeNestedField(fieldInfo reflect.StructField, fieldValue reflect.Valu
|
||||
if tag.HasTag("ui") && tag.GetTag("ui").HasParam("field") {
|
||||
uiTag = *tag.GetTag("ui")
|
||||
} else {
|
||||
slog.Error("Fail to extract Field tag")
|
||||
slog.Error(p.Sprintf("Fail to extract Field tag"))
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
@@ -254,7 +258,7 @@ func ExportHeaders(entity any) (TableHeaders, error) {
|
||||
for i := range v.NumField() {
|
||||
tag, err := fogg.Parse(string(v.Field(i).Tag))
|
||||
if err != nil {
|
||||
return headers, errors.New(fmt.Sprintf("Error occured while tag parsing `%s`: %s", err, string(v.Field(i).Tag)))
|
||||
return headers, errors.New(p.Sprintf("Error occurred while tag parsing `%s`: %s", err, string(v.Field(i).Tag)))
|
||||
}
|
||||
|
||||
uiTag := tag.GetTag("ui")
|
||||
@@ -303,7 +307,7 @@ func WriteHeaders(sheetName string, entity any, file *excelize.File) (TableHeade
|
||||
func GetStyleId(f *excelize.File, style *excelize.Style) (int, error) {
|
||||
styleId, err := f.NewStyle(style)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("error occured while creating a style: %w", err)
|
||||
return 0, errors.New(p.Sprintf("error occurred while creating a style: %w", err))
|
||||
}
|
||||
|
||||
return styleId, nil
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package excel
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"errors"
|
||||
"log/slog"
|
||||
|
||||
"github.com/xuri/excelize/v2"
|
||||
@@ -15,7 +15,7 @@ type Importer struct {
|
||||
|
||||
func ImportEntitiesFromSpreadsheet(path string, importers ...Importer) error {
|
||||
for _, importer := range importers {
|
||||
err := ImportEntitiesFromSpreadsheet(path, importer)
|
||||
err := ImportFromSpreadsheet(path, importer)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -28,7 +28,7 @@ func ImportFromSpreadsheet(filepath string, importer Importer) error {
|
||||
defer func() {
|
||||
err := f.Close()
|
||||
if err != nil {
|
||||
slog.Error(fmt.Sprintf("Failed to close file: %s", err))
|
||||
slog.Error(p.Sprintf("Failed to close file: %s", err))
|
||||
}
|
||||
}()
|
||||
|
||||
@@ -36,6 +36,11 @@ func ImportFromSpreadsheet(filepath string, importer Importer) error {
|
||||
return err
|
||||
}
|
||||
|
||||
sheetIndex, err := f.GetSheetIndex("MySheet")
|
||||
if err != nil || sheetIndex == -1 {
|
||||
return errors.New(p.Sprintf("Sheet `%s` not found", importer.SheetName))
|
||||
}
|
||||
|
||||
rows, err := f.GetRows(importer.SheetName)
|
||||
|
||||
if err != nil {
|
||||
|
||||
25
internal/addons/excel/locales.go
Normal file
25
internal/addons/excel/locales.go
Normal file
@@ -0,0 +1,25 @@
|
||||
package excel
|
||||
|
||||
import (
|
||||
"golang.org/x/text/language"
|
||||
"golang.org/x/text/message"
|
||||
)
|
||||
|
||||
func init() {
|
||||
excelAddon()
|
||||
}
|
||||
|
||||
func excelAddon() {
|
||||
message.SetString(language.Russian, "Error while closing excel file: %v", "Ошибка при закрытии файла Excel: %v")
|
||||
message.SetString(language.Russian, "Field %s not found", "Поле %s не найдено")
|
||||
message.SetString(language.Russian, "Error occured while tag parsing `%s`: %s", "Произошла ошибка при разборе тега `%s`: %s")
|
||||
message.SetString(language.Russian, "Fail to extract Field tag", "Не удалось извлечь тег поля")
|
||||
message.SetString(language.Russian, "Error occured while creating a style: %w", "Произошла ошибка при создании стиля: %w")
|
||||
message.SetString(language.Russian, "Error while setting cell value: %v", "Ошибка при установке значения ячейки: %v")
|
||||
message.SetString(language.Russian, "Error while setting cell style: %v", "Ошибка при установке стиля ячейки: %v")
|
||||
message.SetString(language.Russian, "Operation cancelled", "Операция отменена")
|
||||
message.SetString(language.Russian, "error occurred while creating a style: %w", "Ошибка при создании стиля: %w")
|
||||
message.SetString(language.Russian, "Failed to close file: %s", "Не удалось закрыть файл: %s")
|
||||
message.SetString(language.Russian, "Error occurred while tag parsing `%s`: %s", "Ошибка при разборе тэга: `%s`: %s")
|
||||
message.SetString(language.Russian, "Sheet `%s` not found", "Лист `%s` не найден")
|
||||
}
|
||||
@@ -1,8 +1,6 @@
|
||||
package dialogs
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/wailsapp/wails/v3/pkg/application"
|
||||
)
|
||||
|
||||
@@ -27,11 +25,6 @@ func SaveFileDialog(filename string) (string, error) {
|
||||
}
|
||||
|
||||
func OpenFileDialog(title string) (string, error) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
fmt.Println("Recovered in f", r)
|
||||
}
|
||||
}()
|
||||
dialog := application.OpenFileDialog()
|
||||
dialog.SetTitle(title)
|
||||
dialog.CanChooseDirectories(false)
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
|
||||
func main() {
|
||||
g := gen.NewGenerator(gen.Config{
|
||||
OutPath: "../dal", // output directory, default value is ./query
|
||||
OutPath: "../dal",
|
||||
Mode: gen.WithDefaultQuery | gen.WithQueryInterface | gen.WithoutContext,
|
||||
FieldNullable: true,
|
||||
WithUnitTest: true,
|
||||
|
||||
20
internal/utils/locales.go
Normal file
20
internal/utils/locales.go
Normal file
@@ -0,0 +1,20 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"golang.org/x/text/language"
|
||||
"golang.org/x/text/message"
|
||||
)
|
||||
|
||||
func init() {
|
||||
sortingAddon()
|
||||
}
|
||||
|
||||
func sortingAddon() {
|
||||
message.SetString(language.Russian, "Field %s not found", "Поле %s не найдено")
|
||||
message.SetString(language.Russian, "Field `%s` can only be sorted by ASC or DESC", "Поле `%s` может быть отсортировано только по ASC или DESC")
|
||||
message.SetString(language.Russian, "Failed to parse tag for `%s` failed: %s", "Не удалось разобрать тег для `%s`: %s")
|
||||
message.SetString(language.Russian, "Field `%s` doesn't have ui tag", "Поле `%s` не имеет ui тега")
|
||||
message.SetString(language.Russian, "Field `%s` is array and cannot be used for sorting", "Поле `%s` является массивом и не может быть использовано для сортировки")
|
||||
message.SetString(language.Russian, "Too complex fieldPath for structure `%s`", "Слишком сложный путь поля для структуры `%s`")
|
||||
message.SetString(language.Russian, "Invalid field path for `%s` field", "Недопустимый путь поля для поля `%s`")
|
||||
}
|
||||
@@ -5,15 +5,15 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/kuzgoga/fogg"
|
||||
"golang.org/x/text/language"
|
||||
"golang.org/x/text/message"
|
||||
"gorm.io/gorm/clause"
|
||||
"reflect"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// SortByOrder Order items by specified field and a sort type
|
||||
// Example: SortByOrder(map[string]string{"name": "ASC"}, &models.Post{})
|
||||
// ASC - по возрастанию (или от А до Я)
|
||||
// DESC - по убыванию (или от Я до А)
|
||||
var p = message.NewPrinter(language.Russian)
|
||||
|
||||
func SortByOrder[T any](fieldsSortOrder map[string]string, entity T) ([]*T, error) {
|
||||
var (
|
||||
orderQuery []string
|
||||
@@ -26,24 +26,24 @@ func SortByOrder[T any](fieldsSortOrder map[string]string, entity T) ([]*T, erro
|
||||
field, fieldExist := structInfo.FieldByName(name)
|
||||
|
||||
if !fieldExist {
|
||||
return nil, errors.New(fmt.Sprintf("Field `%s` not found", name))
|
||||
return nil, errors.New(p.Sprintf("Field %s not found", name))
|
||||
}
|
||||
|
||||
if strings.ToUpper(order) != "ASC" && strings.ToUpper(order) != "DESC" {
|
||||
return nil, errors.New(fmt.Sprintf("Field `%s` can only be sorted by ASC or DESC", name))
|
||||
return nil, errors.New(p.Sprintf("Field `%s` can only be sorted by ASC or DESC", name))
|
||||
}
|
||||
|
||||
tag, err := fogg.Parse(string(field.Tag))
|
||||
if err != nil {
|
||||
return nil, errors.New(fmt.Sprintf("Failed to parse tag for `%s` failed: %s", name, err))
|
||||
return nil, errors.New(p.Sprintf("Failed to parse tag for `%s` failed: %s", name, err))
|
||||
}
|
||||
|
||||
if !tag.HasTag("ui") {
|
||||
return nil, errors.New(fmt.Sprintf("Field `%s` doesn't have ui tag", name))
|
||||
return nil, errors.New(p.Sprintf("Field `%s` doesn't have ui tag", name))
|
||||
}
|
||||
|
||||
if field.Type.Kind() == reflect.Slice {
|
||||
return nil, errors.New(fmt.Sprintf("Field `%s` is array and cannot be used for sorting", name))
|
||||
return nil, errors.New(p.Sprintf("Field `%s` is array and cannot be used for sorting", name))
|
||||
}
|
||||
|
||||
fieldPath := tag.GetTag("ui").GetParamOr("field", "")
|
||||
@@ -53,11 +53,11 @@ func SortByOrder[T any](fieldsSortOrder map[string]string, entity T) ([]*T, erro
|
||||
fieldsPathParts := strings.Split(fieldPath, ".")
|
||||
|
||||
if len(fieldsPathParts) > 1 {
|
||||
return nil, errors.New(fmt.Sprintf("Too complex fieldPath for structure `%s`", name))
|
||||
return nil, errors.New(p.Sprintf("Too complex fieldPath for structure `%s`", name))
|
||||
}
|
||||
|
||||
if len(fieldsPathParts) == 0 {
|
||||
return nil, errors.New(fmt.Sprintf("Invalid field path for `%s` field", name))
|
||||
return nil, errors.New(p.Sprintf("Invalid field path for `%s` field", name))
|
||||
}
|
||||
|
||||
joinPathParts := append([]string{field.Type.Name()}, fieldsPathParts...)
|
||||
|
||||
Reference in New Issue
Block a user