From 3a329511a4d53bcbcf097fee538402411439f5f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20Jerman?= Date: Mon, 20 Mar 2023 18:29:35 +0100 Subject: [PATCH] Add resource translations for page layouts --- server/compose/page_layout.cue | 14 +++- server/compose/service/locale.gen.go | 37 ++++++++++ server/compose/service/locale.go | 74 ++++++++----------- server/compose/service/page_layout.go | 14 ++-- server/compose/types/locale.gen.go | 28 +++++++ server/compose/types/page_layout.go | 47 ++++++++++++ .../resource/resource_translation.gen.go | 4 +- 7 files changed, 163 insertions(+), 55 deletions(-) diff --git a/server/compose/page_layout.cue b/server/compose/page_layout.cue index 804eb129f..373f3f316 100644 --- a/server/compose/page_layout.cue +++ b/server/compose/page_layout.cue @@ -98,11 +98,19 @@ pageLayout: { } locale: { - skipSvc: true - // extended: true + extended: true keys: { - // @todo + name: { + path: ["meta", "name"] + } + description: { + path: ["meta", "description"] + } + actionLabel: { + path: ["config", "actions", {part: "actionID", var: true}, "label"] + customHandler: true + } } } diff --git a/server/compose/service/locale.gen.go b/server/compose/service/locale.gen.go index 41da37be1..bd4a1d051 100644 --- a/server/compose/service/locale.gen.go +++ b/server/compose/service/locale.gen.go @@ -41,6 +41,7 @@ type ( Module(ctx context.Context, namespaceID uint64, id uint64) (locale.ResourceTranslationSet, error) Namespace(ctx context.Context, id uint64) (locale.ResourceTranslationSet, error) Page(ctx context.Context, namespaceID uint64, id uint64) (locale.ResourceTranslationSet, error) + PageLayout(ctx context.Context, namespaceID uint64, pageID uint64, id uint64) (locale.ResourceTranslationSet, error) Upsert(context.Context, locale.ResourceTranslationSet) error Locale() locale.Resource @@ -272,6 +273,42 @@ func (svc resourceTranslationsManager) Page(ctx context.Context, namespaceID uin return append(out, tmp...), err } +func (svc resourceTranslationsManager) PageLayout(ctx context.Context, namespaceID uint64, pageID uint64, id uint64) (locale.ResourceTranslationSet, error) { + var ( + err error + out locale.ResourceTranslationSet + res *types.PageLayout + ) + + res, err = svc.loadPageLayout(ctx, svc.store, namespaceID, pageID, id) + if err != nil { + return nil, err + } + + var k types.LocaleKey + for _, tag := range svc.locale.Tags() { + k = types.LocaleKeyPageLayoutMetaName + out = append(out, &locale.ResourceTranslation{ + Resource: res.ResourceTranslation(), + Lang: tag.String(), + Key: k.Path, + Msg: svc.locale.TResourceFor(tag, res.ResourceTranslation(), k.Path), + }) + + k = types.LocaleKeyPageLayoutMetaDescription + out = append(out, &locale.ResourceTranslation{ + Resource: res.ResourceTranslation(), + Lang: tag.String(), + Key: k.Path, + Msg: svc.locale.TResourceFor(tag, res.ResourceTranslation(), k.Path), + }) + + } + + tmp, err := svc.pageLayoutExtended(ctx, res) + return append(out, tmp...), err +} + func updateTranslations(ctx context.Context, ac localeAccessControl, lsvc ResourceTranslationsManagerService, tt ...*locale.ResourceTranslation) error { if lsvc == nil || lsvc.Locale() == nil || lsvc.Locale().Default() == nil { // gracefully handle partial initializations diff --git a/server/compose/service/locale.go b/server/compose/service/locale.go index 5f2ad5a5e..16c7d128f 100644 --- a/server/compose/service/locale.go +++ b/server/compose/service/locale.go @@ -180,51 +180,6 @@ func (svc resourceTranslationsManager) pageExtended(ctx context.Context, res *ty ) for _, tag := range svc.locale.Tags() { - // Button translations - // if res.Config.Buttons != nil { - // out = append(out, &locale.ResourceTranslation{ - // Resource: res.ResourceTranslation(), - // Lang: tag.String(), - // Key: types.LocaleKeyPageRecordToolbarNewLabel.Path, - // Msg: svc.locale.TResourceFor(tag, res.ResourceTranslation(), types.LocaleKeyPageRecordToolbarNewLabel.Path), - // }) - - // out = append(out, &locale.ResourceTranslation{ - // Resource: res.ResourceTranslation(), - // Lang: tag.String(), - // Key: types.LocaleKeyPageRecordToolbarEditLabel.Path, - // Msg: svc.locale.TResourceFor(tag, res.ResourceTranslation(), types.LocaleKeyPageRecordToolbarEditLabel.Path), - // }) - - // out = append(out, &locale.ResourceTranslation{ - // Resource: res.ResourceTranslation(), - // Lang: tag.String(), - // Key: types.LocaleKeyPageRecordToolbarSubmitLabel.Path, - // Msg: svc.locale.TResourceFor(tag, res.ResourceTranslation(), types.LocaleKeyPageRecordToolbarSubmitLabel.Path), - // }) - - // out = append(out, &locale.ResourceTranslation{ - // Resource: res.ResourceTranslation(), - // Lang: tag.String(), - // Key: types.LocaleKeyPageRecordToolbarDeleteLabel.Path, - // Msg: svc.locale.TResourceFor(tag, res.ResourceTranslation(), types.LocaleKeyPageRecordToolbarDeleteLabel.Path), - // }) - - // out = append(out, &locale.ResourceTranslation{ - // Resource: res.ResourceTranslation(), - // Lang: tag.String(), - // Key: types.LocaleKeyPageRecordToolbarCloneLabel.Path, - // Msg: svc.locale.TResourceFor(tag, res.ResourceTranslation(), types.LocaleKeyPageRecordToolbarCloneLabel.Path), - // }) - - // out = append(out, &locale.ResourceTranslation{ - // Resource: res.ResourceTranslation(), - // Lang: tag.String(), - // Key: types.LocaleKeyPageRecordToolbarBackLabel.Path, - // Msg: svc.locale.TResourceFor(tag, res.ResourceTranslation(), types.LocaleKeyPageRecordToolbarBackLabel.Path), - // }) - // } - for i, block := range res.Blocks { pbContentID := locale.ContentID(block.BlockID, i) rpl := strings.NewReplacer( @@ -279,6 +234,31 @@ func (svc resourceTranslationsManager) pageExtended(ctx context.Context, res *ty return } +func (svc resourceTranslationsManager) pageLayoutExtended(ctx context.Context, res *types.PageLayout) (out locale.ResourceTranslationSet, err error) { + var ( + k types.LocaleKey + ) + + for _, tag := range svc.locale.Tags() { + for i, action := range res.Config.Actions { + acContentID := locale.ContentID(action.ActionID, i) + rpl := strings.NewReplacer( + "{{actionID}}", strconv.FormatUint(acContentID, 10), + ) + + k = types.LocaleKeyPageLayoutConfigActionsActionIDLabel + out = append(out, &locale.ResourceTranslation{ + Resource: res.ResourceTranslation(), + Lang: tag.String(), + Key: rpl.Replace(k.Path), + Msg: svc.locale.TResourceFor(tag, res.ResourceTranslation(), rpl.Replace(k.Path)), + }) + } + } + + return +} + func (svc resourceTranslationsManager) chartExtended(_ context.Context, res *types.Chart) (out locale.ResourceTranslationSet, err error) { var ( yAxisLabelK = types.LocaleKeyChartYAxisLabel @@ -393,6 +373,10 @@ func (svc resourceTranslationsManager) loadPage(ctx context.Context, s store.Sto return loadPage(ctx, s, namespaceID, pageID) } +func (svc resourceTranslationsManager) loadPageLayout(ctx context.Context, s store.Storer, namespaceID, pageID, pageLayoutID uint64) (res *types.PageLayout, err error) { + return loadPageLayout(ctx, s, namespaceID, pageID, pageLayoutID) +} + func (svc resourceTranslationsManager) loadChart(ctx context.Context, s store.Storer, namespaceID, chartID uint64) (*types.Chart, error) { return loadChart(ctx, s, namespaceID, chartID) } diff --git a/server/compose/service/page_layout.go b/server/compose/service/page_layout.go index 88722d10b..ccdb887e5 100644 --- a/server/compose/service/page_layout.go +++ b/server/compose/service/page_layout.go @@ -37,6 +37,8 @@ type ( } pageLayoutAccessController interface { + CanManageResourceTranslations(ctx context.Context) bool + // @todo... } @@ -215,9 +217,9 @@ func (svc pageLayout) Create(ctx context.Context, new *types.PageLayout) (*types return err } - // if err = updateTranslations(ctx, svc.ac, svc.locale, new.EncodeTranslations()...); err != nil { - // return - // } + if err = updateTranslations(ctx, svc.ac, svc.locale, new.EncodeTranslations()...); err != nil { + return + } if err = label.Create(ctx, s, new); err != nil { return @@ -346,9 +348,9 @@ func (svc pageLayout) updater(ctx context.Context, s store.Storer, ns *types.Nam } } - // if err = updateTranslations(ctx, svc.ac, svc.locale, res.EncodeTranslations()...); err != nil { - // return - // } + if err = updateTranslations(ctx, svc.ac, svc.locale, res.EncodeTranslations()...); err != nil { + return + } if changes&pageLayoutLabelsChanged > 0 { if err = label.Update(ctx, s, res); err != nil { diff --git a/server/compose/types/locale.gen.go b/server/compose/types/locale.gen.go index e39dfab27..496b82d69 100644 --- a/server/compose/types/locale.gen.go +++ b/server/compose/types/locale.gen.go @@ -60,6 +60,9 @@ var ( LocaleKeyPagePageBlockBlockIDDescription = LocaleKey{Path: "pageBlock.{{blockID}}.description"} LocaleKeyPagePageBlockBlockIDButtonButtonIDLabel = LocaleKey{Path: "pageBlock.{{blockID}}.button.{{buttonID}}.label"} LocaleKeyPagePageBlockBlockIDContentBody = LocaleKey{Path: "pageBlock.{{blockID}}.content.body"} + LocaleKeyPageLayoutMetaName = LocaleKey{Path: "meta.name"} + LocaleKeyPageLayoutMetaDescription = LocaleKey{Path: "meta.description"} + LocaleKeyPageLayoutConfigActionsActionIDLabel = LocaleKey{Path: "config.actions.{{actionID}}.label"} ) // ResourceTranslation returns string representation of Locale resource for Chart by calling ChartResourceTranslation fn @@ -390,10 +393,35 @@ func PageLayoutResourceTranslationTpl() string { } func (r *PageLayout) DecodeTranslations(tt locale.ResourceTranslationIndex) { + var aux *locale.ResourceTranslation + + if aux = tt.FindByKey(LocaleKeyPageLayoutMetaName.Path); aux != nil { + r.Meta.Name = aux.Msg + } + + if aux = tt.FindByKey(LocaleKeyPageLayoutMetaDescription.Path); aux != nil { + r.Meta.Description = aux.Msg + } + + r.decodeTranslations(tt) } func (r *PageLayout) EncodeTranslations() (out locale.ResourceTranslationSet) { out = locale.ResourceTranslationSet{} + out = append(out, &locale.ResourceTranslation{ + Resource: r.ResourceTranslation(), + Key: LocaleKeyPageLayoutMetaName.Path, + Msg: locale.SanitizeMessage(r.Meta.Name), + }) + + out = append(out, &locale.ResourceTranslation{ + Resource: r.ResourceTranslation(), + Key: LocaleKeyPageLayoutMetaDescription.Path, + Msg: locale.SanitizeMessage(r.Meta.Description), + }) + + out = append(out, r.encodeTranslations()...) + return out } diff --git a/server/compose/types/page_layout.go b/server/compose/types/page_layout.go index 5be49988a..625082d50 100644 --- a/server/compose/types/page_layout.go +++ b/server/compose/types/page_layout.go @@ -3,8 +3,11 @@ package types import ( "database/sql/driver" "encoding/json" + "strconv" + "strings" "time" + "github.com/cortezaproject/corteza/server/pkg/locale" "github.com/cortezaproject/corteza/server/pkg/sql" "github.com/cortezaproject/corteza/server/pkg/filter" @@ -67,6 +70,11 @@ type ( Placement string Meta any + // Warning: value of this field is now handled via resource-translation facility + // struct field is kept for the convenience for now since it allows us + // easy encoding/decoding of the outgoing/incoming values + Label string `json:"label"` + // Kind and Params specify the action's behavior and the parameters it // can use for execution Kind string @@ -103,6 +111,45 @@ func (m PageLayout) Clone() *PageLayout { return c } +func (p *PageLayout) decodeTranslations(tt locale.ResourceTranslationIndex) { + var aux *locale.ResourceTranslation + + // @note not doing blocks because they are simply copied from the page's index + + for i, action := range p.Config.Actions { + actionID := locale.ContentID(action.ActionID, i) + rpl := strings.NewReplacer( + "{{actionID}}", strconv.FormatUint(actionID, 10), + ) + + if aux = tt.FindByKey(rpl.Replace(LocaleKeyPagePageBlockBlockIDTitle.Path)); aux != nil { + p.Config.Actions[i].Label = aux.Msg + } + } +} + +func (p *PageLayout) encodeTranslations() (out locale.ResourceTranslationSet) { + out = make(locale.ResourceTranslationSet, 0, 8) + + // @note not doing blocks because they are simply copied from the page's index + + // Actions + for i, action := range p.Config.Actions { + actionID := locale.ContentID(action.ActionID, i) + rpl := strings.NewReplacer( + "{{actionID}}", strconv.FormatUint(actionID, 10), + ) + + out = append(out, &locale.ResourceTranslation{ + Resource: p.ResourceTranslation(), + Key: rpl.Replace(LocaleKeyPageLayoutConfigActionsActionIDLabel.Path), + Msg: action.Label, + }) + } + + return +} + // FindByHandle finds pageLayout by it's handle func (set PageLayoutSet) FindByHandle(handle string) *PageLayout { for i := range set { diff --git a/server/pkg/envoy/resource/resource_translation.gen.go b/server/pkg/envoy/resource/resource_translation.gen.go index 0b4929572..68e5f76cc 100644 --- a/server/pkg/envoy/resource/resource_translation.gen.go +++ b/server/pkg/envoy/resource/resource_translation.gen.go @@ -74,5 +74,7 @@ func (r *ComposePageLayout) EncodeTranslations() ([]*ResourceTranslation, error) res, ref, pp := r.ResourceTranslationParts() out = append(out, NewResourceTranslation(systemTypes.FromLocale(rr), res, ref, pp...)) - return out, nil + tmp, err := r.encodeTranslations() + return append(out, tmp...), err + }