From d37798c8db2db9734bc884c6de5d9fac4d023168 Mon Sep 17 00:00:00 2001 From: Ethan Date: Thu, 17 Oct 2024 10:50:49 +0800 Subject: [PATCH 1/2] add replicate container --- example/integration/pagebuilder_share_test.go | 12 +- example/integration/pagebuilder_test.go | 12 +- pagebuilder/messages.go | 8 + pagebuilder/model.go | 220 ++++++++++-------- pagebuilder/model_events.go | 101 +++++--- 5 files changed, 211 insertions(+), 142 deletions(-) diff --git a/example/integration/pagebuilder_share_test.go b/example/integration/pagebuilder_share_test.go index 3118c3fbc..bf1820895 100644 --- a/example/integration/pagebuilder_share_test.go +++ b/example/integration/pagebuilder_share_test.go @@ -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 } @@ -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 }, }, diff --git a/example/integration/pagebuilder_test.go b/example/integration/pagebuilder_test.go index 360d77802..6b9e36425 100644 --- a/example/integration/pagebuilder_test.go +++ b/example/integration/pagebuilder_test.go @@ -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 } @@ -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 }, }, diff --git a/pagebuilder/messages.go b/pagebuilder/messages.go index 1c4068481..cd8144f0f 100644 --- a/pagebuilder/messages.go +++ b/pagebuilder/messages.go @@ -32,6 +32,8 @@ type Messages struct { FilterTabNamedVersions string Rename string + Hide string + Show string PageOverView string Others string Add string @@ -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", @@ -201,6 +205,8 @@ var Messages_zh_CN = &Messages{ FilterTabOnlineVersion: "在线版本", FilterTabNamedVersions: "已命名版本", Rename: "重命名", + Hide: "隐藏", + Show: "显示", PageOverView: "页面概览", Others: "其他", @@ -287,6 +293,8 @@ var Messages_ja_JP = &Messages{ FilterTabOnlineVersion: "オンラインバージョン", FilterTabNamedVersions: "名前付きバージョン", Rename: "名前の変更", + Hide: "隠す", + Show: "表示", PageOverView: "ページの概要", PageBuilder: "ページビルダー", PageTemplate: "ページテンプレート", diff --git a/pagebuilder/model.go b/pagebuilder/model.go index ecaad9c28..bbc4d33cc 100644 --- a/pagebuilder/model.go +++ b/pagebuilder/model.go @@ -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" ) @@ -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 } @@ -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 } diff --git a/pagebuilder/model_events.go b/pagebuilder/model_events.go index 06c78a0ed..fc26e1588 100644 --- a/pagebuilder/model_events.go +++ b/pagebuilder/model_events.go @@ -11,13 +11,12 @@ import ( "github.com/iancoleman/strcase" "github.com/jinzhu/inflection" "github.com/qor5/web/v3" - "github.com/sunfmin/reflectutils" - h "github.com/theplant/htmlgo" - "gorm.io/gorm" - "github.com/qor5/x/v3/i18n" . "github.com/qor5/x/v3/ui/vuetify" vx "github.com/qor5/x/v3/ui/vuetifyx" + "github.com/sunfmin/reflectutils" + h "github.com/theplant/htmlgo" + "gorm.io/gorm" "github.com/qor5/admin/v3/l10n" "github.com/qor5/admin/v3/presets" @@ -60,6 +59,7 @@ func (b *ModelBuilder) renderContainersSortedList(ctx *web.EventContext) (r h.HT isReadonly = status != publish.StatusDraft && b.tb == nil pageID, pageVersion, locale = b.getPrimaryColumnValuesBySlug(ctx) msgr = i18n.MustGetModuleMessages(ctx.R, I18nPageBuilderKey, Messages_en_US).(*Messages) + pMsgr = i18n.MustGetModuleMessages(ctx.R, presets.CoreI18nModuleKey, Messages_en_US).(*presets.Messages) ) wc := map[string]interface{}{ "page_model_name": b.name, @@ -76,6 +76,7 @@ func (b *ModelBuilder) renderContainersSortedList(ctx *web.EventContext) (r h.HT var sorterData ContainerSorter sorterData.Items = []ContainerSorterItem{} + for i, c := range cons { vicon := "mdi-eye" if c.Hidden { @@ -118,6 +119,43 @@ func (b *ModelBuilder) renderContainersSortedList(ctx *web.EventContext) (r h.HT renameEvent := web.Plaid(). URL(b.editorURL()). EventFunc(RenameContainerEvent).Query(paramStatus, status).Query(paramContainerID, web.Var("element.param_id")).Go() + + // container functions + containerOperations := + h.Div( + VBtn("").Variant(VariantText).Icon("mdi-content-copy").Size(SizeSmall).Attr("@click", + web.Plaid(). + EventFunc(ReplicateContainerEvent). + Query(paramContainerID, web.Var("element.param_id")). + Go(), + ).Attr("v-show", "isHovering"), + VMenu( + web.Slot( + VBtn("").Children( + VIcon("mdi-dots-horizontal"), + ).Attr("v-bind", "props").Variant(VariantText).Size(SizeSmall), + ).Name("activator").Scope("{ props }"), + VList( + VListItem(h.Text(msgr.Rename)).PrependIcon("mdi-pencil").Attr("@click", + "element.editShow=!element.editShow", + ), + VListItem(h.Text(fmt.Sprintf("{{element.hidden?%q:%q}}", msgr.Show, msgr.Hide))).Attr(":prepend-icon", "element.visibility_icon").Attr("@click", + web.Plaid(). + EventFunc(ToggleContainerVisibilityEvent). + Query(paramContainerID, web.Var("element.param_id")). + Query(paramStatus, status). + Go(), + ), + VListItem(h.Text(pMsgr.Delete)).PrependIcon("mdi-delete").Attr("@click", + web.Plaid(). + URL(ctx.R.URL.Path). + EventFunc(DeleteContainerConfirmationEvent). + Query(paramContainerID, web.Var("element.param_id")). + Query(paramContainerName, web.Var("element.display_name")). + Go(), + )), + ), + ).Attr("v-show", "!element.editShow") r = web.Scope( VSheet( VList( @@ -153,26 +191,7 @@ func (b *ModelBuilder) renderContainersSortedList(ctx *web.EventContext) (r h.HT ), web.Slot( h.If(!isReadonly, - h.Div( - VBtn("").Variant(VariantText).Icon("mdi-pencil").Attr("@click", - "element.editShow=!element.editShow", - ).Attr("v-show", "!element.editShow && !element.hidden && isHovering"), - VBtn("").Variant(VariantText).Attr(":icon", "element.visibility_icon").Size(SizeSmall).Attr("@click", - web.Plaid(). - EventFunc(ToggleContainerVisibilityEvent). - Query(paramContainerID, web.Var("element.param_id")). - Query(paramStatus, status). - Go(), - ).Attr("v-show", "!element.editShow && (element.hidden || isHovering)"), - VBtn("").Variant(VariantText).Icon("mdi-delete").Attr("@click", - web.Plaid(). - URL(ctx.R.URL.Path). - EventFunc(DeleteContainerConfirmationEvent). - Query(paramContainerID, web.Var("element.param_id")). - Query(paramContainerName, web.Var("element.display_name")). - Go(), - ).Attr("v-show", "!element.editShow && !element.hidden && isHovering"), - ), + containerOperations, ), ).Name("append"), ).Attr(":variant", fmt.Sprintf(` element.hidden &&!isHovering && !element.editShow?%q:%q`, VariantPlain, VariantText)). @@ -373,8 +392,8 @@ func (b *ModelBuilder) renameContainerDialog(ctx *web.EventContext) (r web.Event msgr = i18n.MustGetModuleMessages(ctx.R, I18nPageBuilderKey, Messages_en_US).(*Messages) pMsgr = presets.MustGetMessages(ctx.R) okAction = web.Plaid(). - URL(b.editorURL()). - EventFunc(RenameContainerEvent).Query(paramContainerID, paramID).Go() + URL(b.editorURL()). + EventFunc(RenameContainerEvent).Query(paramContainerID, paramID).Go() portalName = dialogPortalName ) @@ -645,18 +664,21 @@ func (b *ModelBuilder) containerPreview(ctx *web.EventContext) (r web.EventRespo func (b *ModelBuilder) replicateContainer(ctx *web.EventContext) (r web.EventResponse, err error) { var ( - container Container - cs = container.PrimaryColumnValuesBySlug(ctx.Param(paramContainerID)) - containerID = cs[presets.ParamID] - locale = cs[l10n.SlugLocaleCode] + container Container + cs = container.PrimaryColumnValuesBySlug(ctx.Param(paramContainerID)) + containerID = cs[presets.ParamID] + locale = cs[l10n.SlugLocaleCode] + containerMb *ContainerBuilder + modelID int + newContainerID string ) if err = b.db.Transaction(func(tx *gorm.DB) (dbErr error) { if dbErr = tx.Where("id = ? AND locale_code = ?", containerID, locale).First(&container).Error; dbErr != nil { return } + containerMb = b.builder.ContainerByName(container.ModelName) var ( - containerMb = b.builder.ContainerByName(container.ModelName) - model = containerMb.NewModel() + model = containerMb.NewModel() ) if container.Shared { container.Shared = false @@ -674,14 +696,27 @@ func (b *ModelBuilder) replicateContainer(ctx *web.EventContext) (r web.EventRes if dbErr = containerMb.Editing().Creating().Saver(model, "", ctx); dbErr != nil { return } + if dbErr = withLocale( + b.builder, + tx.Model(&Container{}). + Where("page_id = ? and page_version = ? and page_model_name = ? and display_order > ? ", container.PageID, container.PageVersion, container.PageModelName, container.DisplayOrder), + locale, + ). + UpdateColumn("display_order", gorm.Expr("display_order + ? ", 1)).Error; dbErr != nil { + return + } + container.DisplayOrder += 1 container.ModelID = reflectutils.MustGet(model, "ID").(uint) + modelID = int(container.ModelID) + container.Hidden = false if dbErr = tx.Save(&container).Error; dbErr != nil { return } + newContainerID = container.PrimarySlug() return }); err != nil { return } - r.RunScript = web.Plaid().PushState(true).Go() + r.RunScript = web.Plaid().Query(paramContainerDataID, containerMb.getContainerDataID(modelID)).Query(paramContainerID, newContainerID).PushState(true).Go() return } From 4a44b6d5a0c8524b8105f8e0747e5736b417722e Mon Sep 17 00:00:00 2001 From: "deepsource-autofix[bot]" <62050782+deepsource-autofix[bot]@users.noreply.github.com> Date: Thu, 17 Oct 2024 02:52:17 +0000 Subject: [PATCH 2/2] style: format code with Gofumpt This commit fixes the style issues introduced in d37798c according to the output from Gofumpt. Details: https://github.com/qor5/admin/pull/659 --- pagebuilder/model.go | 1 - pagebuilder/model_events.go | 77 ++++++++++++++++++------------------- 2 files changed, 37 insertions(+), 41 deletions(-) diff --git a/pagebuilder/model.go b/pagebuilder/model.go index bbc4d33cc..1b793d805 100644 --- a/pagebuilder/model.go +++ b/pagebuilder/model.go @@ -135,7 +135,6 @@ 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) { - var ( dc DemoContainer containerMb = b.builder.ContainerByName(modelName) diff --git a/pagebuilder/model_events.go b/pagebuilder/model_events.go index fc26e1588..4b0b589d8 100644 --- a/pagebuilder/model_events.go +++ b/pagebuilder/model_events.go @@ -121,41 +121,40 @@ func (b *ModelBuilder) renderContainersSortedList(ctx *web.EventContext) (r h.HT EventFunc(RenameContainerEvent).Query(paramStatus, status).Query(paramContainerID, web.Var("element.param_id")).Go() // container functions - containerOperations := - h.Div( - VBtn("").Variant(VariantText).Icon("mdi-content-copy").Size(SizeSmall).Attr("@click", - web.Plaid(). - EventFunc(ReplicateContainerEvent). - Query(paramContainerID, web.Var("element.param_id")). - Go(), - ).Attr("v-show", "isHovering"), - VMenu( - web.Slot( - VBtn("").Children( - VIcon("mdi-dots-horizontal"), - ).Attr("v-bind", "props").Variant(VariantText).Size(SizeSmall), - ).Name("activator").Scope("{ props }"), - VList( - VListItem(h.Text(msgr.Rename)).PrependIcon("mdi-pencil").Attr("@click", - "element.editShow=!element.editShow", - ), - VListItem(h.Text(fmt.Sprintf("{{element.hidden?%q:%q}}", msgr.Show, msgr.Hide))).Attr(":prepend-icon", "element.visibility_icon").Attr("@click", - web.Plaid(). - EventFunc(ToggleContainerVisibilityEvent). - Query(paramContainerID, web.Var("element.param_id")). - Query(paramStatus, status). - Go(), - ), - VListItem(h.Text(pMsgr.Delete)).PrependIcon("mdi-delete").Attr("@click", - web.Plaid(). - URL(ctx.R.URL.Path). - EventFunc(DeleteContainerConfirmationEvent). - Query(paramContainerID, web.Var("element.param_id")). - Query(paramContainerName, web.Var("element.display_name")). - Go(), - )), - ), - ).Attr("v-show", "!element.editShow") + containerOperations := h.Div( + VBtn("").Variant(VariantText).Icon("mdi-content-copy").Size(SizeSmall).Attr("@click", + web.Plaid(). + EventFunc(ReplicateContainerEvent). + Query(paramContainerID, web.Var("element.param_id")). + Go(), + ).Attr("v-show", "isHovering"), + VMenu( + web.Slot( + VBtn("").Children( + VIcon("mdi-dots-horizontal"), + ).Attr("v-bind", "props").Variant(VariantText).Size(SizeSmall), + ).Name("activator").Scope("{ props }"), + VList( + VListItem(h.Text(msgr.Rename)).PrependIcon("mdi-pencil").Attr("@click", + "element.editShow=!element.editShow", + ), + VListItem(h.Text(fmt.Sprintf("{{element.hidden?%q:%q}}", msgr.Show, msgr.Hide))).Attr(":prepend-icon", "element.visibility_icon").Attr("@click", + web.Plaid(). + EventFunc(ToggleContainerVisibilityEvent). + Query(paramContainerID, web.Var("element.param_id")). + Query(paramStatus, status). + Go(), + ), + VListItem(h.Text(pMsgr.Delete)).PrependIcon("mdi-delete").Attr("@click", + web.Plaid(). + URL(ctx.R.URL.Path). + EventFunc(DeleteContainerConfirmationEvent). + Query(paramContainerID, web.Var("element.param_id")). + Query(paramContainerName, web.Var("element.display_name")). + Go(), + )), + ), + ).Attr("v-show", "!element.editShow") r = web.Scope( VSheet( VList( @@ -392,8 +391,8 @@ func (b *ModelBuilder) renameContainerDialog(ctx *web.EventContext) (r web.Event msgr = i18n.MustGetModuleMessages(ctx.R, I18nPageBuilderKey, Messages_en_US).(*Messages) pMsgr = presets.MustGetMessages(ctx.R) okAction = web.Plaid(). - URL(b.editorURL()). - EventFunc(RenameContainerEvent).Query(paramContainerID, paramID).Go() + URL(b.editorURL()). + EventFunc(RenameContainerEvent).Query(paramContainerID, paramID).Go() portalName = dialogPortalName ) @@ -677,9 +676,7 @@ func (b *ModelBuilder) replicateContainer(ctx *web.EventContext) (r web.EventRes return } containerMb = b.builder.ContainerByName(container.ModelName) - var ( - model = containerMb.NewModel() - ) + model := containerMb.NewModel() if container.Shared { container.Shared = false // presets.ShowMessage(&r, "", ColorWarning)