Skip to content

Commit

Permalink
add replicate container
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangshanwen committed Oct 17, 2024
1 parent f8f9ed1 commit d37798c
Show file tree
Hide file tree
Showing 5 changed files with 211 additions and 142 deletions.
12 changes: 9 additions & 3 deletions example/integration/pagebuilder_share_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,12 @@ func TestPageBuilderShareContainer(t *testing.T) {
},
EventResponseMatch: func(t *testing.T, er *TestEventResponse) {
var (
container pagebuilder.Container
m containers.ListContent
container pagebuilder.Container
nextContainer pagebuilder.Container
m containers.ListContent
)
TestDB.Order("id desc").First(&container)
if container.ID <= 11 || container.ModelID == 10 || container.ModelName != "ListContent" || container.Shared {
if container.ID <= 11 || container.ModelID == 10 || container.ModelName != "ListContent" || container.Shared || container.DisplayOrder != 2 {
t.Fatalf("Replicate Container Faield %#+v", container)
return
}
Expand All @@ -89,6 +90,11 @@ func TestPageBuilderShareContainer(t *testing.T) {
t.Fatalf("Replicate Container Model Faield %#+v", m)
return
}
TestDB.First(&nextContainer, 11)
if nextContainer.DisplayOrder != 3 {
t.Fatalf("Replicate Container Faield %#+v", nextContainer)
return
}
return
},
},
Expand Down
12 changes: 9 additions & 3 deletions example/integration/pagebuilder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1014,11 +1014,12 @@ func TestPageBuilder(t *testing.T) {
},
EventResponseMatch: func(t *testing.T, er *TestEventResponse) {
var (
container pagebuilder.Container
m containers.ListContent
container pagebuilder.Container
nextContainer pagebuilder.Container
m containers.ListContent
)
TestDB.Order("id desc").First(&container)
if container.ID <= 11 || container.ModelID == 10 || container.ModelName != "ListContent" {
if container.ID <= 11 || container.ModelID == 10 || container.ModelName != "ListContent" || container.DisplayOrder != 2 {
t.Fatalf("Replicate Container Faield %#+v", container)
return
}
Expand All @@ -1027,6 +1028,11 @@ func TestPageBuilder(t *testing.T) {
t.Fatalf("Replicate Container Model Faield %#+v", m)
return
}
TestDB.First(&nextContainer, 11)
if nextContainer.DisplayOrder != 3 {
t.Fatalf("Replicate Container Faield %#+v", nextContainer)
return
}
return
},
},
Expand Down
8 changes: 8 additions & 0 deletions pagebuilder/messages.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ type Messages struct {
FilterTabNamedVersions string

Rename string
Hide string
Show string
PageOverView string
Others string
Add string
Expand Down Expand Up @@ -117,6 +119,8 @@ var Messages_en_US = &Messages{
PageBuilder: "Page Builder",
PageTemplate: "Page Template",
Rename: "Rename",
Hide: "Hide",
Show: "Show",
PageOverView: "Page Overview",

Others: "Others",
Expand Down Expand Up @@ -201,6 +205,8 @@ var Messages_zh_CN = &Messages{
FilterTabOnlineVersion: "在线版本",
FilterTabNamedVersions: "已命名版本",
Rename: "重命名",
Hide: "隐藏",
Show: "显示",
PageOverView: "页面概览",

Others: "其他",
Expand Down Expand Up @@ -287,6 +293,8 @@ var Messages_ja_JP = &Messages{
FilterTabOnlineVersion: "オンラインバージョン",
FilterTabNamedVersions: "名前付きバージョン",
Rename: "名前の変更",
Hide: "隠す",
Show: "表示",
PageOverView: "ページの概要",
PageBuilder: "ページビルダー",
PageTemplate: "ページテンプレート",
Expand Down
220 changes: 117 additions & 103 deletions pagebuilder/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (

"github.com/qor5/admin/v3/l10n"
"github.com/qor5/admin/v3/presets"
"github.com/qor5/admin/v3/presets/gorm2op"
"github.com/qor5/admin/v3/publish"
"github.com/qor5/admin/v3/utils"
)
Expand Down Expand Up @@ -69,57 +70,60 @@ func (b *ModelBuilder) setName() {

func (b *ModelBuilder) addSharedContainerToPage(pageID int, containerID, pageVersion, locale, modelName string, modelID uint) (newContainerID string, err error) {
var c Container
err = b.db.First(&c, "model_name = ? AND model_id = ? AND shared = true and page_model_name = ? ", modelName, modelID, b.name).Error
if err != nil {
return
}
var (
maxOrder sql.NullFloat64
displayOrder float64
)
err = b.db.Model(&Container{}).Select("MAX(display_order)").
Where("page_id = ? and page_version = ? and locale_code = ? and page_model_name = ?", pageID, pageVersion, locale, b.name).Scan(&maxOrder).Error
if err != nil {
return
}
err = b.db.Model(&Container{}).Select("MAX(display_order)").
Where("page_id = ? and page_version = ? and locale_code = ? and page_model_name = ? ", pageID, pageVersion, locale, b.name).Scan(&maxOrder).Error
if err != nil {
return
}
if containerID != "" {
var lastContainer Container
cs := lastContainer.PrimaryColumnValuesBySlug(containerID)
if dbErr := b.db.Where("id = ? AND locale_code = ? and page_model_name = ? ", cs["id"], locale, b.name).First(&lastContainer).Error; dbErr == nil {
displayOrder = lastContainer.DisplayOrder
if err = b.db.Model(&Container{}).Where("page_id = ? and page_version = ? and locale_code = ? and page_model_name = ? and display_order > ? ", pageID, pageVersion, locale, b.name, displayOrder).
UpdateColumn("display_order", gorm.Expr("display_order + ? ", 1)).Error; err != nil {
return
}

err = b.db.Transaction(func(tx *gorm.DB) (dbErr error) {
if dbErr = tx.First(&c, "model_name = ? AND model_id = ? AND shared = true and page_model_name = ? ", modelName, modelID, b.name).Error; dbErr != nil {
return
}

} else {
displayOrder = maxOrder.Float64
}
container := Container{
PageID: uint(pageID),
PageVersion: pageVersion,
ModelName: modelName,
PageModelName: b.name,
DisplayName: c.DisplayName,
ModelID: modelID,
Shared: true,
DisplayOrder: displayOrder + 1,
Locale: l10n.Locale{
LocaleCode: locale,
},
}
err = b.db.Create(&container).Error
if err != nil {
return
}
containerID = container.PrimarySlug()
var (
maxOrder sql.NullFloat64
displayOrder float64
)
dbErr = tx.Model(&Container{}).Select("MAX(display_order)").
Where("page_id = ? and page_version = ? and locale_code = ? and page_model_name = ?", pageID, pageVersion, locale, b.name).Scan(&maxOrder).Error
if dbErr != nil {
return
}
dbErr = tx.Model(&Container{}).Select("MAX(display_order)").
Where("page_id = ? and page_version = ? and locale_code = ? and page_model_name = ? ", pageID, pageVersion, locale, b.name).Scan(&maxOrder).Error
if dbErr != nil {
return
}
if containerID != "" {
var lastContainer Container
cs := lastContainer.PrimaryColumnValuesBySlug(containerID)
tx.Where("id = ? AND locale_code = ? and page_model_name = ? ", cs["id"], locale, b.name).First(&lastContainer)
if lastContainer.ID > 0 {
displayOrder = lastContainer.DisplayOrder
if dbErr = tx.Model(&Container{}).Where("page_id = ? and page_version = ? and locale_code = ? and page_model_name = ? and display_order > ? ", pageID, pageVersion, locale, b.name, displayOrder).
UpdateColumn("display_order", gorm.Expr("display_order + ? ", 1)).Error; dbErr != nil {
return
}
}

} else {
displayOrder = maxOrder.Float64
}
container := Container{
PageID: uint(pageID),
PageVersion: pageVersion,
ModelName: modelName,
PageModelName: b.name,
DisplayName: c.DisplayName,
ModelID: modelID,
Shared: true,
DisplayOrder: displayOrder + 1,
Locale: l10n.Locale{
LocaleCode: locale,
},
}
if dbErr = tx.Create(&container).Error; dbErr != nil {
return
}
newContainerID = container.PrimarySlug()
return
})
return
}

Expand All @@ -131,68 +135,78 @@ func withLocale(builder *Builder, wh *gorm.DB, locale string) *gorm.DB {
}

func (b *ModelBuilder) addContainerToPage(ctx *web.EventContext, pageID int, containerID, pageVersion, locale, modelName string) (modelID uint, newContainerID string, err error) {
containerMb := b.builder.ContainerByName(modelName)
model := containerMb.NewModel()
var dc DemoContainer
b.db.Where("model_name = ? AND locale_code = ?", modelName, locale).First(&dc)
if dc.ID != 0 && dc.ModelID != 0 {
b.db.Where("id = ?", dc.ModelID).First(model)
reflectutils.Set(model, "ID", uint(0))
}
err = containerMb.Editing().Creating().Saver(model, "", ctx)
if err != nil {
return
}

var (
maxOrder sql.NullFloat64
displayOrder float64
dc DemoContainer
containerMb = b.builder.ContainerByName(modelName)
model = containerMb.NewModel()
)
wh := b.db.Model(&Container{}).Select("MAX(display_order)").
Where("page_id = ? and page_version = ? and page_model_name = ? ", pageID, pageVersion, b.name)

err = withLocale(b.builder, wh, locale).Scan(&maxOrder).Error
if err != nil {
return
}
if containerID != "" {
var lastContainer Container
cs := lastContainer.PrimaryColumnValuesBySlug(containerID)
if dbErr := b.db.Where("id = ? AND locale_code = ? and page_model_name = ?", cs["id"], locale, b.name).First(&lastContainer).Error; dbErr == nil {
displayOrder = lastContainer.DisplayOrder
if err = withLocale(
b.builder,
b.db.Model(&Container{}).
Where("page_id = ? and page_version = ? and page_model_name = ? and display_order > ? ", pageID, pageVersion, b.name, displayOrder),
locale,
).
UpdateColumn("display_order", gorm.Expr("display_order + ? ", 1)).Error; err != nil {
return
err = b.db.Transaction(func(tx *gorm.DB) (dbErr error) {
tx.Where("model_name = ? AND locale_code = ?", modelName, locale).First(&dc)
if dc.ID != 0 && dc.ModelID != 0 {
tx.Where("id = ?", dc.ModelID).First(model)
reflectutils.Set(model, "ID", uint(0))
}
ctx.WithContextValue(gorm2op.CtxKeyDB{}, tx)
defer ctx.WithContextValue(gorm2op.CtxKeyDB{}, nil)
if dbErr = containerMb.Editing().Creating().Saver(model, "", ctx); dbErr != nil {
return
}

var (
maxOrder sql.NullFloat64
displayOrder float64
)
wh := tx.Model(&Container{}).Select("MAX(display_order)").
Where("page_id = ? and page_version = ? and page_model_name = ? ", pageID, pageVersion, b.name)

if dbErr = withLocale(b.builder, wh, locale).Scan(&maxOrder).Error; dbErr != nil {
return
}
if containerID != "" {
var lastContainer Container
cs := lastContainer.PrimaryColumnValuesBySlug(containerID)
tx.Where("id = ? AND locale_code = ? and page_model_name = ?", cs["id"], locale, b.name).First(&lastContainer)
if lastContainer.ID > 0 {
displayOrder = lastContainer.DisplayOrder
if dbErr = withLocale(
b.builder,
tx.Model(&Container{}).
Where("page_id = ? and page_version = ? and page_model_name = ? and display_order > ? ", pageID, pageVersion, b.name, displayOrder),
locale,
).
UpdateColumn("display_order", gorm.Expr("display_order + ? ", 1)).Error; dbErr != nil {
return
}
}

} else {
displayOrder = maxOrder.Float64
}
modelID = reflectutils.MustGet(model, "ID").(uint)
displayName := modelName
if b.builder.ps.GetI18n() != nil {
displayName = i18n.T(ctx.R, presets.ModelsI18nModuleKey, modelName)
}
container := Container{
PageID: uint(pageID),
PageVersion: pageVersion,
ModelName: modelName,
PageModelName: b.name,
DisplayName: displayName,
ModelID: modelID,
DisplayOrder: displayOrder + 1,
Locale: l10n.Locale{
LocaleCode: locale,
},
}
err = tx.Create(&container).Error
newContainerID = container.PrimarySlug()

return
})

} else {
displayOrder = maxOrder.Float64
}
modelID = reflectutils.MustGet(model, "ID").(uint)
displayName := modelName
if b.builder.ps.GetI18n() != nil {
displayName = i18n.T(ctx.R, presets.ModelsI18nModuleKey, modelName)
}
container := Container{
PageID: uint(pageID),
PageVersion: pageVersion,
ModelName: modelName,
PageModelName: b.name,
DisplayName: displayName,
ModelID: modelID,
DisplayOrder: displayOrder + 1,
Locale: l10n.Locale{
LocaleCode: locale,
},
}
err = b.db.Create(&container).Error
newContainerID = container.PrimarySlug()
return
}

Expand Down
Loading

0 comments on commit d37798c

Please sign in to comment.