Something went wrong on our end
-
ko_oler authored79592b42
schema.go 6.43 KiB
package extension
import (
"sort"
"git.perx.ru/perxis/perxis-go/pkg/collections"
"git.perx.ru/perxis/perxis-go/pkg/references"
"git.perx.ru/perxis/perxis-go/pkg/schema"
"git.perx.ru/perxis/perxis-go/pkg/schema/field"
"git.perx.ru/perxis/perxis-go/pkg/schema/validate"
pb "git.perx.ru/perxis/perxis-go/proto/extensions"
)
const (
StatusCollectionID = "space_extensions"
StatusCollectionName = "Настройки/Расширения"
ActionsCollectionID = "space_actions"
ActionsCollectionName = "Настройки/Действия"
)
// NewActionsCollection - создает коллекцию для хранения действий расширений в пространстве
func NewActionsCollection(spaceID, envID string) *collections.Collection {
sch := schema.New(
"extension", field.String().SetTitle("Расширение"),
"action", field.String(validate.Required()).SetTitle("Действия").SetTextSearch(true),
"target", field.Number(
field.NumberFormatInt,
validate.Enum(getEnumOpt(pb.Target_name)...),
).SetTitle("Отображение результата действия").WithUI(&field.UI{Widget: "Select"}),
"parent", field.String().SetTitle("Идентификатор родительского действия"),
"name", field.String().SetTitle("Название").SetTextSearch(true),
"description", field.String().SetTitle("Описание"),
"icon", field.String().SetTitle("Название иконки"),
"image", references.Field([]string{"media"}).SetTitle("Изображение").
WithUI(&field.UI{Widget: "Media"}),
"groups", field.Array(field.String().SetAdditionalValues()).SetTitle("Группы").
SetDescription("Группировка действий в пользовательском интерфейсе").
WithUI(&field.UI{Widget: "SelectList"}),
"kind", field.Number(
field.NumberFormatInt,
validate.Enum(getEnumOpt(pb.Action_Kind_name)...),
).SetTitle("Вид").WithUI(&field.UI{Widget: "Select"}),
"classes", field.Array(field.String().SetAdditionalValues()).SetTitle("Класс").
WithUI(&field.UI{Widget: "SelectList"}).
SetDescription("Классы данных, к которым применимо действие").
SetIndexed(true),
"refs", field.Array(references.Field(nil)).SetTitle("Ссылки").
WithUI(&field.UI{Widget: "BlockList"}),
"params_collection", field.String().SetTitle("Коллекция параметров").
SetDescription("ID коллекции для хранения параметров действия").WithUI(&field.UI{Widget: "Collection"}),
"navigation_action", field.Bool().SetTitle("Навигация").
SetDescription("Выполняется переход пользователя в пользовательском интерфейсе").
WithUI(&field.UI{Widget: "Checkbox"}),
"navigation_route", field.String().SetTitle("Путь в интерфейсе"),
"autorun", field.Bool().SetTitle("Автозапуск").
SetDescription("Действие выполняется автоматически каждый раз при загрузке приложения").
WithUI(&field.UI{Widget: "Checkbox"}),
"confirm", field.Bool().SetTitle("С подтверждением").
SetDescription("Пользователь должен подтвердить запуск действия").
WithUI(&field.UI{Widget: "Checkbox"}),
"view", field.Number(
field.NumberFormatInt,
validate.Enum(getEnumOpt(pb.Action_View_name)...),
).SetTitle("Отображение действия в интерфейсе").WithUI(&field.UI{Widget: "Select"}),
"order", field.Number(field.NumberFormatInt).SetTitle("Порядок отображения").
SetDescription("Порядок отображения действия в интерфейсе (Для пунктов меню)"),
)
// Includes
sch.SetIncludes(
field.Include{Ref: "hoop_item_options", Optional: true},
)
// UI
sch.Field.UI.ListView = &field.View{Options: map[string]interface{}{
"fields": []string{"name", "action", "kind", "target", "updated_at", "updated_by"},
"sort": []string{"name"},
"page_size": 50,
}}
sch.Field.UI.Options["title"] = "name"
sch.Field.UI.Options["subtitle"] = "action"
sch.Field.UI.Options["collection_icon"] = "SettingOutlined/RocketOutlined"
return &collections.Collection{
ID: ActionsCollectionID,
SpaceID: spaceID,
EnvID: envID,
Name: ActionsCollectionName,
Schema: sch,
Hidden: true,
}
}
func getEnumOpt(opts map[int32]string) []validate.EnumOpt {
keys := make([]int32, 0, len(opts))
for k := range opts {
keys = append(keys, k)
}
sort.Slice(keys, func(i, j int) bool {
return keys[i] < keys[j]
})
enum := make([]validate.EnumOpt, len(opts))
for i, n := range keys {
enum[i] = validate.EnumOpt{Name: opts[n], Value: float64(n)}
}
return enum
}
// NewStatusCollection - создает коллекцию для хранения статусов расширений в пространстве
func NewStatusCollection(spaceID, envID string) *collections.Collection {
sch := schema.New(
"id", field.String(validate.Required()).SetUnique(true).SetTitle("Расширение"),
"title", field.String().SetTitle("Название"),
"version", field.String().SetTitle("Установленная версия"),
"status_error", field.String().SetTitle("Ошибка"),
"status_msg", field.String().SetTitle("Сообщение"),
"extension_state", field.Number(
field.NumberFormatInt,
validate.Enum(
validate.EnumOpt{Name: StateInstalled.String(), Value: float64(StateInstalled)},
validate.EnumOpt{Name: StateFail.String(), Value: float64(StateFail)},
validate.EnumOpt{Name: StatePending.String(), Value: float64(StatePending)},
validate.EnumOpt{Name: StateInProgress.String(), Value: float64(StateInProgress)},
),
).SetTitle("Состояние").WithUI(&field.UI{Widget: "Select"}),
)
//UI
sch.Field.UI.ListView = &field.View{Options: map[string]interface{}{
"fields": []string{"id", "title", "updated_at", "updated_by"},
"sort": []string{"title"},
"page_size": 50,
}}
sch.Field.UI.Options["title"] = "title"
sch.Field.UI.Options["subtitle"] = "id"
sch.Field.UI.Options["key"] = "id"
sch.Field.UI.Options["collection_icon"] = "SettingOutlined/ApiOutlined"
return &collections.Collection{
ID: StatusCollectionID,
SpaceID: spaceID,
EnvID: envID,
Name: StatusCollectionName,
Schema: sch,
Hidden: true,
}
}