From 28b8f47f3926e29d55890150b31265a975372b0a Mon Sep 17 00:00:00 2001 From: Mikhail Iudin Date: Mon, 4 Sep 2023 17:26:13 +0200 Subject: [PATCH 1/6] GO-1775 Fix removal of required blocks when pasting text --- core/block/editor/clipboard/clipboard_test.go | 41 ++++++++++++++++++- core/block/editor/clipboard/paste.go | 16 ++++++-- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/core/block/editor/clipboard/clipboard_test.go b/core/block/editor/clipboard/clipboard_test.go index 3f9f037b3..1562ee3dd 100644 --- a/core/block/editor/clipboard/clipboard_test.go +++ b/core/block/editor/clipboard/clipboard_test.go @@ -595,6 +595,16 @@ func TestClipboard_TitleOps(t *testing.T) { } } + requiredBlockReq := func(blockId string) *pb.RpcBlockPasteRequest { + return &pb.RpcBlockPasteRequest{ + SelectedBlockIds: []string{blockId}, + SelectedTextRange: &model.Range{}, + AnySlot: []*model.Block{ + newTextBlock("whatever").Model(), + }, + } + } + multiBlockReq := &pb.RpcBlockPasteRequest{ FocusedBlockId: template.TitleBlockId, SelectedTextRange: &model.Range{}, @@ -612,7 +622,7 @@ func TestClipboard_TitleOps(t *testing.T) { require.NoError(t, err) assert.Equal(t, "single", st.Doc.Pick(template.TitleBlockId).Model().GetText().Text) }) - t.Run("single description to empty description", func(t *testing.T) { + t.Run("single description to empty title", func(t *testing.T) { //given state := withTitle(t, "") addDescription(state, "current description") @@ -632,6 +642,27 @@ func TestClipboard_TitleOps(t *testing.T) { ) assert.True(t, true, find) }) + + for _, blockIdToPasteTo := range []string{ + template.TitleBlockId, + template.HeaderLayoutId, + template.FeaturedRelationsId, + template.DescriptionBlockId, + } { + t.Run("single text to "+blockIdToPasteTo, func(t *testing.T) { + //given + state := withTitle(t, "") + addRelations(state) + cb := NewClipboard(state, nil, nil, nil, nil) + + //when + _, _, _, _, err := cb.Paste(nil, requiredBlockReq(blockIdToPasteTo), "") + + //then + require.NoError(t, err) + assert.NotNil(t, state.Doc.Pick(blockIdToPasteTo)) + }) + } t.Run("single to not empty title", func(t *testing.T) { st := withTitle(t, "title") cb := NewClipboard(st, nil, nil, nil, nil) @@ -815,6 +846,14 @@ func addDescription(st *smarttest.SmartTest, description string) { state.ApplyState(newState, false) } +func addRelations(st *smarttest.SmartTest) { + newState := st.Doc.NewState() + template.InitTemplate(newState, template.RequireHeader) + template.InitTemplate(newState, template.WithFeaturedRelations) + template.InitTemplate(newState, template.WithForcedDescription) + state.ApplyState(newState, false) +} + func TestClipboard_PasteToCodeBock(t *testing.T) { sb := smarttest.New("text") require.NoError(t, smartblock.ObjectApplyTemplate(sb, nil, template.WithTitle)) diff --git a/core/block/editor/clipboard/paste.go b/core/block/editor/clipboard/paste.go index 78a69bbc8..843136c65 100644 --- a/core/block/editor/clipboard/paste.go +++ b/core/block/editor/clipboard/paste.go @@ -194,7 +194,8 @@ func (p *pasteCtrl) singleRange() (err error) { return target.PasteInside(p.s, p.ps, secondBlock) } - isPasteToHeader := targetId == template.TitleBlockId || targetId == template.DescriptionBlockId + isPasteToHeader := isRequiredRelation(targetId) + pos := model.Block_Bottom if isPasteToHeader { targetId = template.HeaderLayoutId @@ -274,7 +275,7 @@ func (p *pasteCtrl) insertUnderSelection() (err error) { ) if len(p.selIds) > 0 { targetId = p.selIds[0] - if targetId == template.TitleBlockId || targetId == template.DescriptionBlockId { + if isRequiredRelation(targetId) { targetId = template.HeaderLayoutId } targetPos = model.Block_Bottom @@ -290,9 +291,18 @@ func (p *pasteCtrl) insertUnderSelection() (err error) { }) } +func isRequiredRelation(targetID string) bool { + return targetID == template.TitleBlockId || + targetID == template.DescriptionBlockId || + targetID == template.FeaturedRelationsId || + targetID == template.HeaderLayoutId +} + func (p *pasteCtrl) removeSelection() { for _, toRemove := range p.selIds { - p.s.Unlink(toRemove) + if !isRequiredRelation(toRemove) { + p.s.Unlink(toRemove) + } } } From 8076fa6dd37ae44f3104718f2b374801f1eac7f1 Mon Sep 17 00:00:00 2001 From: kirillston Date: Thu, 14 Sep 2023 10:52:10 +0200 Subject: [PATCH 2/6] GO-2038 Fix relation links in bundled templates --- .../data/bundled_templates.zip | Bin 23073 -> 15414 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/util/builtintemplate/data/bundled_templates.zip b/util/builtintemplate/data/bundled_templates.zip index d82511a9bccfea4836ad467c1e629c856ed5ec11..345822f7a3b63b7a732306d2c9d55dba481beaaf 100644 GIT binary patch delta 12974 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 delta 20582 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 I@Gm3%3r?iW?EnA( From 82b7a0125d46a2ab362b487de9b15d83e7fb1d32 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Sep 2023 04:27:57 +0000 Subject: [PATCH 3/6] Bump go.uber.org/zap from 1.25.0 to 1.26.0 Bumps [go.uber.org/zap](https://github.com/uber-go/zap) from 1.25.0 to 1.26.0. - [Release notes](https://github.com/uber-go/zap/releases) - [Changelog](https://github.com/uber-go/zap/blob/master/CHANGELOG.md) - [Commits](https://github.com/uber-go/zap/compare/v1.25.0...v1.26.0) --- updated-dependencies: - dependency-name: go.uber.org/zap dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8bd68ae7c..c9b1db986 100644 --- a/go.mod +++ b/go.mod @@ -81,7 +81,7 @@ require ( github.com/yuin/goldmark v1.5.6 go.uber.org/mock v0.2.0 go.uber.org/multierr v1.11.0 - go.uber.org/zap v1.25.0 + go.uber.org/zap v1.26.0 golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 golang.org/x/image v0.12.0 golang.org/x/mobile v0.0.0-20230531173138-3c911d8e3eda diff --git a/go.sum b/go.sum index 63e193be3..9541f4187 100644 --- a/go.sum +++ b/go.sum @@ -1033,8 +1033,8 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= -go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= From 23693c5d7adef219eacb0af584ce3276d0f4f50b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Sep 2023 04:28:13 +0000 Subject: [PATCH 4/6] Bump google.golang.org/grpc from 1.57.0 to 1.58.1 Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.57.0 to 1.58.1. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.57.0...v1.58.1) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 8bd68ae7c..4b5b5e786 100644 --- a/go.mod +++ b/go.mod @@ -88,7 +88,7 @@ require ( golang.org/x/net v0.15.0 golang.org/x/oauth2 v0.12.0 golang.org/x/text v0.13.0 - google.golang.org/grpc v1.57.0 + google.golang.org/grpc v1.58.1 gopkg.in/Graylog2/go-gelf.v2 v2.0.0-20180125164251-1832d8546a9f gopkg.in/yaml.v3 v3.0.1 storj.io/drpc v0.0.33 @@ -139,7 +139,7 @@ require ( github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c // indirect github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349 // indirect github.com/dustin/go-humanize v1.0.0 // indirect - github.com/envoyproxy/protoc-gen-validate v0.10.1 // indirect + github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect github.com/fogleman/gg v1.3.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-errors/errors v1.4.2 // indirect @@ -248,9 +248,9 @@ require ( golang.org/x/term v0.12.0 // indirect golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect + google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 63e193be3..54b216905 100644 --- a/go.sum +++ b/go.sum @@ -266,8 +266,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -1427,12 +1427,12 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1456,8 +1456,8 @@ google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= +google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 6002c9e8f3762f83cf648e92d91f2eae12fd6dce Mon Sep 17 00:00:00 2001 From: Mikhail Iudin Date: Tue, 5 Sep 2023 00:44:27 +0200 Subject: [PATCH 5/6] GO-132 Fix style preserving when copy n paste --- core/block/editor/clipboard/clipboard.go | 5 +- core/block/editor/clipboard/clipboard_test.go | 127 ++++++++++++++++++ core/block/editor/clipboard/paste.go | 9 +- core/block/editor/state/change_test.go | 28 ++-- core/block/simple/text/text.go | 7 +- tests/testutil/state.go | 18 +++ 6 files changed, 170 insertions(+), 24 deletions(-) create mode 100644 tests/testutil/state.go diff --git a/core/block/editor/clipboard/clipboard.go b/core/block/editor/clipboard/clipboard.go index f43d2be9e..099172128 100644 --- a/core/block/editor/clipboard/clipboard.go +++ b/core/block/editor/clipboard/clipboard.go @@ -118,6 +118,7 @@ func (cb *clipboard) Copy(req pb.RpcBlockCopyRequest) (textSlot string, htmlSlot if firstTextBlock != nil && req.SelectedTextRange != nil && !(req.SelectedTextRange.From == 0 && req.SelectedTextRange.To == 0) && + !(req.SelectedTextRange.From == 0 && req.SelectedTextRange.To == int32(textutil.UTF16RuneCountString(firstTextBlock.GetText().Text))) && lastTextBlock == nil { cutBlock, _, err := simple.New(firstTextBlock).(text.Block).RangeCut(req.SelectedTextRange.From, req.SelectedTextRange.To) if err != nil { @@ -179,7 +180,8 @@ func (cb *clipboard) Cut(ctx *session.Context, req pb.RpcBlockCutRequest) (textS if firstTextBlock != nil && lastTextBlock == nil && req.SelectedTextRange != nil && - !(req.SelectedTextRange.From == 0 && req.SelectedTextRange.To == 0) { + !(req.SelectedTextRange.From == 0 && req.SelectedTextRange.To == 0) && + !(req.SelectedTextRange.From == 0 && req.SelectedTextRange.To == int32(textutil.UTF16RuneCountString(firstTextBlock.GetText().Text))) { first := s.Get(firstTextBlock.Id).(text.Block) cutBlock, initialBlock, err := first.RangeCut(req.SelectedTextRange.From, req.SelectedTextRange.To) @@ -196,6 +198,7 @@ func (cb *clipboard) Cut(ctx *session.Context, req pb.RpcBlockCutRequest) (textS } } + cutBlock.GetText().Style = model.BlockContentText_Paragraph textSlot = cutBlock.GetText().Text anySlot = []*model.Block{cutBlock} cbs := cb.blocksToState(req.Blocks) diff --git a/core/block/editor/clipboard/clipboard_test.go b/core/block/editor/clipboard/clipboard_test.go index 1562ee3dd..f56a5a74c 100644 --- a/core/block/editor/clipboard/clipboard_test.go +++ b/core/block/editor/clipboard/clipboard_test.go @@ -4,7 +4,10 @@ import ( "strconv" "testing" + "github.com/anyproto/anytype-heart/tests/blockbuilder" + "github.com/anyproto/anytype-heart/tests/testutil" "github.com/anyproto/anytype-heart/util/pbtypes" + textutil "github.com/anyproto/anytype-heart/util/text" "github.com/gogo/protobuf/types" "github.com/samber/lo" @@ -622,6 +625,68 @@ func TestClipboard_TitleOps(t *testing.T) { require.NoError(t, err) assert.Equal(t, "single", st.Doc.Pick(template.TitleBlockId).Model().GetText().Text) }) + + for _, text := range []string{"", "full"} { + t.Run("paste - when ("+text+")", func(t *testing.T) { + // given + sb := smarttest.New("text") + require.NoError(t, smartblock.ObjectApplyTemplate(sb, nil, template.WithTitle)) + sb.Doc = testutil.BuildStateFromAST(blockbuilder.Root( + blockbuilder.ID("root"), + blockbuilder.Children( + blockbuilder.Text( + text, + blockbuilder.ID("1"), + ), + blockbuilder.Text( + "toggle", + blockbuilder.ID("2"), + blockbuilder.TextStyle(model.BlockContentText_Toggle), + ), + ))) + + // when + cb := NewClipboard(sb, nil, nil, nil, nil) + _, _, _, _, err := cb.Paste(nil, &pb.RpcBlockPasteRequest{ + FocusedBlockId: "1", + SelectedTextRange: &model.Range{From: 0, To: int32(textutil.UTF16RuneCountString(sb.Pick("1").Model().GetText().Text))}, + AnySlot: []*model.Block{sb.Pick("2").Model()}, + }, "") + + // then + require.NoError(t, err) + assert.Equal(t, model.BlockContentText_Toggle, sb.Doc.Pick("1").Model().GetText().Style) + }) + } + t.Run("paste - when insert partially", func(t *testing.T) { + // given + sb := smarttest.New("text") + sb.Doc = testutil.BuildStateFromAST(blockbuilder.Root( + blockbuilder.ID("root"), + blockbuilder.Children( + blockbuilder.Text( + "123", + blockbuilder.ID("1"), + ), + blockbuilder.Text( + "toggle", + blockbuilder.ID("2"), + blockbuilder.TextStyle(model.BlockContentText_Toggle), + ), + ))) + + // when + cb := NewClipboard(sb, nil, nil, nil, nil) + _, _, _, _, err := cb.Paste(nil, &pb.RpcBlockPasteRequest{ + FocusedBlockId: "1", + SelectedTextRange: &model.Range{From: 1, To: 1}, + AnySlot: []*model.Block{sb.Pick("2").Model()}, + }, "") + + // then + require.NoError(t, err) + assert.Equal(t, model.BlockContentText_Paragraph, sb.Pick("1").Model().GetText().Style) + }) t.Run("single description to empty title", func(t *testing.T) { //given state := withTitle(t, "") @@ -955,6 +1020,68 @@ func Test_PasteText(t *testing.T) { func Test_CopyAndCutText(t *testing.T) { + t.Run("copy/cut do not preserve style - when full text copied", func(t *testing.T) { + // given + sb := smarttest.New("text") + sb.Doc = testutil.BuildStateFromAST(blockbuilder.Root( + blockbuilder.ID("root"), + blockbuilder.Children( + blockbuilder.Text( + "toggle", + blockbuilder.ID("2"), + blockbuilder.TextStyle(model.BlockContentText_Toggle), + ), + ))) + + // when + cb := NewClipboard(sb, nil, nil, nil, nil) + _, _, anySlotCopy, err := cb.Copy(pb.RpcBlockCopyRequest{ + Blocks: []*model.Block{sb.Pick("2").Model()}, + SelectedTextRange: &model.Range{From: 1, To: 1}, + }) + _, _, anySlotCut, err := cb.Cut(nil, pb.RpcBlockCutRequest{ + SelectedTextRange: &model.Range{From: 1, To: 1}, + Blocks: []*model.Block{sb.Pick("2").Model()}, + }) + + // then + require.NoError(t, err) + + assert.Equal(t, model.BlockContentText_Paragraph, anySlotCopy[0].GetText().Style) + assert.Equal(t, model.BlockContentText_Paragraph, anySlotCut[0].GetText().Style) + }) + + t.Run("copy/cut preserve style - when full text copied", func(t *testing.T) { + // given + sb := smarttest.New("text") + sb.Doc = testutil.BuildStateFromAST(blockbuilder.Root( + blockbuilder.ID("root"), + blockbuilder.Children( + blockbuilder.Text( + "toggle", + blockbuilder.ID("2"), + blockbuilder.TextStyle(model.BlockContentText_Toggle), + ), + ))) + + // when + cb := NewClipboard(sb, nil, nil, nil, nil) + _, _, anySlotCopy, err := cb.Copy(pb.RpcBlockCopyRequest{ + Blocks: []*model.Block{sb.Pick("2").Model()}, + SelectedTextRange: &model.Range{From: 0, To: int32(textutil.UTF16RuneCountString(sb.Pick("2").Model().GetText().Text))}, + }) + _, _, anySlotCut, err := cb.Cut(nil, pb.RpcBlockCutRequest{ + SelectedTextRange: &model.Range{From: 0, To: int32(textutil.UTF16RuneCountString(sb.Pick("2").Model().GetText().Text))}, + Blocks: []*model.Block{sb.Pick("2").Model()}, + }) + + // then + require.NoError(t, err) + + assert.Equal(t, model.BlockContentText_Toggle, anySlotCopy[0].GetText().Style) + assert.Equal(t, model.BlockContentText_Toggle, anySlotCut[0].GetText().Style) + }) + t.Run("copy/cut - when with children", func(t *testing.T) { //given sb := smarttest.New("text") diff --git a/core/block/editor/clipboard/paste.go b/core/block/editor/clipboard/paste.go index 843136c65..c534c97a6 100644 --- a/core/block/editor/clipboard/paste.go +++ b/core/block/editor/clipboard/paste.go @@ -28,7 +28,7 @@ type pasteCtrl struct { } type pasteMode struct { - toTitle bool + toHeaderChild bool removeSelection bool multiRange bool singleRange bool @@ -116,13 +116,10 @@ func (p *pasteCtrl) configure(req *pb.RpcBlockPasteRequest) (err error) { return } selText := p.getFirstSelectedText() - p.mode.toTitle = selText != nil && p.s.HasParent(selText.Model().Id, template.HeaderLayoutId) - p.mode.intoBlockPasteStyle = p.mode.toTitle + p.mode.toHeaderChild = selText != nil && p.s.HasParent(selText.Model().Id, template.HeaderLayoutId) + p.mode.intoBlockPasteStyle = p.mode.toHeaderChild if selText != nil && textCount == 1 && nonTextCount == 0 && req.IsPartOfBlock { p.mode.intoBlock = true - if selText.GetText() == "" { - p.mode.intoBlockPasteStyle = true - } } else { p.mode.intoBlock = selText != nil && selText.Model().GetText().Style == model.BlockContentText_Code } diff --git a/core/block/editor/state/change_test.go b/core/block/editor/state/change_test.go index 24acbb985..6217fdd74 100644 --- a/core/block/editor/state/change_test.go +++ b/core/block/editor/state/change_test.go @@ -4,15 +4,14 @@ 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/simple" "github.com/anyproto/anytype-heart/core/block/simple/dataview" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/util/pbtypes" + "github.com/gogo/protobuf/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" . "github.com/anyproto/anytype-heart/tests/blockbuilder" ) @@ -347,16 +346,6 @@ func TestState_ChangesCreate_MoveAdd_Side_NewBlock(t *testing.T) { }) } -func buildStateFromAST(root *Block) *State { - st := NewDocFromSnapshot("", &pb.ChangeSnapshot{ - Data: &model.SmartBlockSnapshotBase{ - Blocks: root.Build(), - }, - }).(*State) - ApplyState(st, true) - return st.NewState() -} - func TestState_SetParent(t *testing.T) { orig := NewDoc("root", nil).(*State) orig.Add(simple.New(&model.Block{Id: "root", ChildrenIds: []string{"header"}, Content: &model.BlockContentOfSmartblock{Smartblock: &model.BlockContentSmartblock{}}})) @@ -762,3 +751,14 @@ func newRemoveChange(ids ...string) *pb.ChangeContent { }, } } + +// copy if testutil.BuildStateFromAST because of cyclic import +func buildStateFromAST(root *Block) *State { + st := NewDocFromSnapshot("", &pb.ChangeSnapshot{ + Data: &model.SmartBlockSnapshotBase{ + Blocks: root.Build(), + }, + }).(*State) + ApplyState(st, true) + return st.NewState() +} diff --git a/core/block/simple/text/text.go b/core/block/simple/text/text.go index 0510e4dc4..f9909d407 100644 --- a/core/block/simple/text/text.go +++ b/core/block/simple/text/text.go @@ -303,17 +303,18 @@ func (t *Text) RangeTextPaste(rangeFrom int32, rangeTo int32, copiedBlock *model copyFrom := int32(0) copyTo := int32(textutil.UTF16RuneCountString(copiedText.Text)) - if rangeFrom < 0 || int(rangeFrom) > textutil.UTF16RuneCountString(t.content.Text) { + textLen := textutil.UTF16RuneCountString(t.content.Text) + if rangeFrom < 0 || int(rangeFrom) > textLen { return caretPosition, fmt.Errorf("out of range: range.from is not correct: %d", rangeFrom) } - if rangeTo < 0 || int(rangeTo) > textutil.UTF16RuneCountString(t.content.Text) { + if rangeTo < 0 || int(rangeTo) > textLen { return caretPosition, fmt.Errorf("out of range: range.to is not correct: %d", rangeTo) } if rangeFrom > rangeTo { return caretPosition, fmt.Errorf("out of range: range.from %d > range.to %d", rangeFrom, rangeTo) } - if len(t.content.Text) == 0 || (rangeFrom == 0 && rangeTo == int32(len(t.content.Text))) { + if textLen == 0 || (rangeFrom == 0 && rangeTo == int32(textLen)) { if !isPartOfBlock { t.content.Style = copiedText.Style t.content.Color = copiedText.Color diff --git a/tests/testutil/state.go b/tests/testutil/state.go new file mode 100644 index 000000000..b624fce3c --- /dev/null +++ b/tests/testutil/state.go @@ -0,0 +1,18 @@ +package testutil + +import ( + "github.com/anyproto/anytype-heart/core/block/editor/state" + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/tests/blockbuilder" +) + +func BuildStateFromAST(root *blockbuilder.Block) *state.State { + st := state.NewDocFromSnapshot("", &pb.ChangeSnapshot{ + Data: &model.SmartBlockSnapshotBase{ + Blocks: root.Build(), + }, + }).(*state.State) + state.ApplyState(st, true) + return st.NewState() +} From d75d5eb829668026ddd8190ce5baf1252d93a95a Mon Sep 17 00:00:00 2001 From: Mikhail Iudin Date: Fri, 15 Sep 2023 13:49:57 +0200 Subject: [PATCH 6/6] GO-132 Fix setup go version --- .github/workflows/build.yml | 2 +- .github/workflows/test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 25805e78d..660bb5175 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -193,7 +193,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Install Go - uses: actions/setup-go@v1 + uses: actions/setup-go@v4 with: go-version: '~1.20.8' - name: Setup GO diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2670098bd..0afea7148 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: GOPRIVATE: github.com/anyproto steps: - name: Install Go - uses: actions/setup-go@v1 + uses: actions/setup-go@v4 with: go-version: "~1.20.8"