1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-09 17:44:59 +09:00

GO-4397 Merge branch 'main' of github.com:anyproto/anytype-heart into go-4397-save-order-of-spaces-in-vault-between-platforms

# Conflicts:
#	pb/commands.pb.go
This commit is contained in:
AnastasiaShemyakinskaya 2024-11-29 15:33:30 +01:00
commit 85cc27d918
No known key found for this signature in database
GPG key ID: CCD60ED83B103281
14 changed files with 1297 additions and 2759 deletions

View file

@ -427,7 +427,7 @@ func (bs *basic) SetLayoutInState(s *state.State, toLayout model.ObjectTypeLayou
fromLayout, _ := s.Layout()
s.SetDetail(bundle.RelationKeyLayout.String(), pbtypes.Int64(int64(toLayout)))
if err = bs.layoutConverter.Convert(bs.Space(), s, fromLayout, toLayout); err != nil {
if err = bs.layoutConverter.Convert(s, fromLayout, toLayout); err != nil {
return fmt.Errorf("convert layout: %w", err)
}
return nil

View file

@ -1,14 +1,12 @@
package converter
import (
"context"
"fmt"
"github.com/anyproto/any-sync/app"
"golang.org/x/exp/slices"
"github.com/anyproto/anytype-heart/core/block/editor/dataview"
"github.com/anyproto/anytype-heart/core/block/editor/smartblock"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/editor/template"
"github.com/anyproto/anytype-heart/core/block/simple"
@ -23,10 +21,8 @@ import (
"github.com/anyproto/anytype-heart/util/slice"
)
const DefaultSetSource = bundle.TypeKeyPage
type LayoutConverter interface {
Convert(space smartblock.Space, st *state.State, fromLayout, toLayout model.ObjectTypeLayout) error
Convert(st *state.State, fromLayout, toLayout model.ObjectTypeLayout) error
app.Component
}
@ -49,7 +45,7 @@ func (c *layoutConverter) Name() string {
return "layout-converter"
}
func (c *layoutConverter) Convert(space smartblock.Space, st *state.State, fromLayout, toLayout model.ObjectTypeLayout) error {
func (c *layoutConverter) Convert(st *state.State, fromLayout, toLayout model.ObjectTypeLayout) error {
if fromLayout == toLayout {
return nil
}
@ -72,10 +68,10 @@ func (c *layoutConverter) Convert(space smartblock.Space, st *state.State, fromL
}
if fromLayout == model.ObjectType_note && toLayout == model.ObjectType_set {
return c.fromNoteToSet(space, st)
return c.fromNoteToSet(st)
}
if toLayout == model.ObjectType_set {
return c.fromAnyToSet(space, st)
return c.fromAnyToSet(st)
}
if toLayout == model.ObjectType_note {
@ -127,7 +123,7 @@ func (c *layoutConverter) fromAnyToTodo(st *state.State) error {
return nil
}
func (c *layoutConverter) fromNoteToSet(space smartblock.Space, st *state.State) error {
func (c *layoutConverter) fromNoteToSet(st *state.State) error {
if err := c.fromNoteToAny(st); err != nil {
return err
}
@ -135,25 +131,14 @@ func (c *layoutConverter) fromNoteToSet(space smartblock.Space, st *state.State)
template.InitTemplate(st,
template.WithTitle,
)
err2 := c.fromAnyToSet(space, st)
if err2 != nil {
return err2
}
return nil
return c.fromAnyToSet(st)
}
func (c *layoutConverter) fromAnyToSet(space smartblock.Space, st *state.State) error {
func (c *layoutConverter) fromAnyToSet(st *state.State) error {
source := pbtypes.GetStringList(st.Details(), bundle.RelationKeySetOf.String())
if len(source) == 0 && space != nil {
defaultTypeID, err := space.GetTypeIdByKey(context.Background(), DefaultSetSource)
if err != nil {
return fmt.Errorf("get default type id: %w", err)
}
source = []string{defaultTypeID}
}
addFeaturedRelationSetOf(st)
dvBlock, err := dataview.BlockBySource(c.objectStore.SpaceIndex(space.Id()), source)
dvBlock, err := dataview.BlockBySource(c.objectStore.SpaceIndex(st.SpaceID()), source)
if err != nil {
return err
}

View file

@ -0,0 +1,68 @@
package converter
import (
"fmt"
"testing"
"github.com/gogo/protobuf/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/editor/template"
"github.com/anyproto/anytype-heart/core/block/simple"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore/spaceindex"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/util/pbtypes"
)
const (
root = "root"
spaceId = "space"
)
func TestLayoutConverter_Convert(t *testing.T) {
store := objectstore.NewStoreFixture(t)
store.AddObjects(t, spaceId, []spaceindex.TestObject{{
bundle.RelationKeyId: pbtypes.String(bundle.TypeKeyTask.URL()),
bundle.RelationKeySpaceId: pbtypes.String(spaceId),
bundle.RelationKeyUniqueKey: pbtypes.String(bundle.TypeKeyTask.URL()),
}})
for _, from := range []model.ObjectTypeLayout{
model.ObjectType_basic,
model.ObjectType_note,
model.ObjectType_todo,
model.ObjectType_collection,
model.ObjectType_tag,
} {
t.Run(fmt.Sprintf("convert from %s to set", from.String()), func(t *testing.T) {
// given
st := state.NewDoc(root, map[string]simple.Block{
root: simple.New(&model.Block{Id: root, ChildrenIds: []string{}}),
}).NewState()
st.SetDetails(&types.Struct{
Fields: map[string]*types.Value{
bundle.RelationKeySpaceId.String(): pbtypes.String(spaceId),
bundle.RelationKeySetOf.String(): pbtypes.StringList([]string{bundle.TypeKeyTask.URL()}),
},
})
lc := layoutConverter{objectStore: store}
// when
err := lc.Convert(st, from, model.ObjectType_set)
// then
assert.NoError(t, err)
dvb := st.Get(template.DataviewBlockId)
assert.NotNil(t, dvb)
dv := dvb.Model().GetDataview()
require.NotNil(t, dv)
assert.NotEmpty(t, dv.Views)
assert.NotEmpty(t, dv.RelationLinks)
})
}
}

View file

@ -339,7 +339,9 @@ func (s *service) createBlankTemplateState(layout model.ObjectTypeLayout) (st *s
template.WithDetail(bundle.RelationKeyTag, pbtypes.StringList(nil)),
template.WithTitle,
)
_ = s.converter.Convert(nil, st, model.ObjectType_basic, layout)
if err := s.converter.Convert(st, model.ObjectType_basic, layout); err != nil {
log.Errorf("failed to set '%s' layout to blank template: %v", layout.String(), err)
}
return
}

View file

@ -23218,10 +23218,6 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er
| ---- | ------ | ----------- |
| NONE | 0 | |
| GET_STARTED | 1 | |
| PERSONAL_PROJECTS | 2 | |
| KNOWLEDGE_BASE | 3 | |
| NOTES_DIARY | 4 | |
| STRATEGIC_WRITING | 5 | |
| EMPTY | 6 | |

File diff suppressed because it is too large Load diff

View file

@ -2817,10 +2817,6 @@ message Rpc {
enum UseCase {
NONE = 0;
GET_STARTED = 1;
PERSONAL_PROJECTS = 2;
KNOWLEDGE_BASE = 3;
NOTES_DIARY = 4;
STRATEGIC_WRITING = 5;
EMPTY = 6;
}
}

View file

@ -52,7 +52,7 @@ func (s dateOnlySort) AppendKey(tuple anyenc.Tuple, v *anyenc.Value) anyenc.Tupl
}
if s.reverse {
return tuple.Append(s.arena.NewNumberFloat64(float64(ts)))
return tuple.AppendInverted(s.arena.NewNumberFloat64(float64(ts)))
} else {
return tuple.Append(s.arena.NewNumberFloat64(float64(ts)))
}

View file

@ -266,6 +266,19 @@ func TestKeyOrder_Compare(t *testing.T) {
assertCompare(t, asc, a, b, 1)
})
t.Run("desc_date", func(t *testing.T) {
a := &types.Struct{Fields: map[string]*types.Value{"k": pbtypes.Int64(date.Unix())}}
b := &types.Struct{Fields: map[string]*types.Value{"k": pbtypes.Int64(time.Now().Unix())}}
asc := &KeyOrder{arena: arena,
Key: "k",
Type: model.BlockContentDataviewSort_Desc,
EmptyPlacement: model.BlockContentDataviewSort_Start,
IncludeTime: false,
relationFormat: model.RelationFormat_date,
}
assertCompare(t, asc, a, b, 1)
})
t.Run("asc_nil_emptylast", func(t *testing.T) {
a := &types.Struct{Fields: map[string]*types.Value{"k": pbtypes.String("a")}}
b := &types.Struct{Fields: map[string]*types.Value{"k": nil}}

View file

@ -64,21 +64,9 @@ type widgetParameters struct {
//go:embed data/get_started.zip
var getStartedZip []byte
//go:embed data/personal_projects.zip
var personalProjectsZip []byte
//go:embed data/knowledge_base.zip
var knowledgeBaseZip []byte
//go:embed data/notes_diary.zip
var notesDiaryZip []byte
//go:embed data/migration_dashboard.zip
var migrationDashboardZip []byte
//go:embed data/strategic_writing.zip
var strategicWritingZip []byte
//go:embed data/empty.zip
var emptyZip []byte
@ -86,12 +74,8 @@ var (
log = logging.Logger("anytype-mw-builtinobjects")
archives = map[pb.RpcObjectImportUseCaseRequestUseCase][]byte{
pb.RpcObjectImportUseCaseRequest_GET_STARTED: getStartedZip,
pb.RpcObjectImportUseCaseRequest_PERSONAL_PROJECTS: personalProjectsZip,
pb.RpcObjectImportUseCaseRequest_KNOWLEDGE_BASE: knowledgeBaseZip,
pb.RpcObjectImportUseCaseRequest_NOTES_DIARY: notesDiaryZip,
pb.RpcObjectImportUseCaseRequest_STRATEGIC_WRITING: strategicWritingZip,
pb.RpcObjectImportUseCaseRequest_EMPTY: emptyZip,
pb.RpcObjectImportUseCaseRequest_GET_STARTED: getStartedZip,
pb.RpcObjectImportUseCaseRequest_EMPTY: emptyZip,
}
// TODO: GO-2009 Now we need to create widgets by hands, widget import is not implemented yet
@ -104,32 +88,6 @@ var (
pb.RpcObjectImportUseCaseRequest_GET_STARTED: {
{model.BlockContentWidget_Link, "bafyreic75ulgm2yz426hjwdjkzqw3kafniknki7qkhufqgrspmxzdppixa", "", true},
},
pb.RpcObjectImportUseCaseRequest_PERSONAL_PROJECTS: {
{model.BlockContentWidget_CompactList, widget.DefaultWidgetFavorite, "", false},
{model.BlockContentWidget_CompactList, widget.DefaultWidgetSet, "", false},
{model.BlockContentWidget_CompactList, "bafyreibdfkwnnj6xndyzazkm2gersm5fk3yg2274d5hqr6drurncxiyeoi", "", true}, // Tasks
{model.BlockContentWidget_CompactList, widget.DefaultWidgetRecent, "", false},
},
pb.RpcObjectImportUseCaseRequest_KNOWLEDGE_BASE: {
{model.BlockContentWidget_Link, "bafyreiaszkibjyfls2og3ztgxfllqlom422y5ic64z7w3k3oio6f3pc2ia", "", true},
{model.BlockContentWidget_CompactList, widget.DefaultWidgetFavorite, "", false},
{model.BlockContentWidget_CompactList, widget.DefaultWidgetSet, "", false},
{model.BlockContentWidget_CompactList, widget.DefaultWidgetRecent, "", false},
},
pb.RpcObjectImportUseCaseRequest_NOTES_DIARY: {
{model.BlockContentWidget_Link, "bafyreiexkrata5ofvswxyisuumukmkyerdwv3xa34qkxpgx6jtl7waah34", "", true},
{model.BlockContentWidget_CompactList, widget.DefaultWidgetFavorite, "", false},
{model.BlockContentWidget_CompactList, widget.DefaultWidgetSet, "", false},
{model.BlockContentWidget_CompactList, widget.DefaultWidgetRecent, "", false},
},
pb.RpcObjectImportUseCaseRequest_STRATEGIC_WRITING: {
{model.BlockContentWidget_List, "bafyreido5lhh4vntmlxh2hwn4b3xfmz53yw5rrfmcl22cdb4phywhjlcdu", "f984ddde-eb13-497e-809a-2b9a96fd3503", true}, // Task tracker
{model.BlockContentWidget_List, widget.DefaultWidgetFavorite, "", false},
{model.BlockContentWidget_Tree, "bafyreicblsgojhhlfduz7ek4g4jh6ejy24fle2q5xjbue5kkcd7ifbc4ki", "", true}, // My Home
{model.BlockContentWidget_CompactList, widget.DefaultWidgetRecent, "", false},
{model.BlockContentWidget_Link, "bafyreiaoeaxv4dkw4xgdcgubetieyuqlf24q2kg5pdysz4prun6qg5v2ru", "", true}, // About Anytype
{model.BlockContentWidget_CompactList, widget.DefaultWidgetSet, "", false},
},
}
)