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:
commit
85cc27d918
14 changed files with 1297 additions and 2759 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
68
core/block/editor/converter/layout_test.go
Normal file
68
core/block/editor/converter/layout_test.go
Normal 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)
|
||||
})
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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 | |
|
||||
|
||||
|
||||
|
|
3882
pb/commands.pb.go
3882
pb/commands.pb.go
File diff suppressed because it is too large
Load diff
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)))
|
||||
}
|
||||
|
|
|
@ -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}}
|
||||
|
|
|
@ -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},
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue