Skip to content

Commit

Permalink
Add HideContentTypeFieldLinksDefinition reverse handler #78
Browse files Browse the repository at this point in the history
  • Loading branch information
SubPointSupport committed May 12, 2016
1 parent 0ef797c commit e7a1156
Show file tree
Hide file tree
Showing 12 changed files with 363 additions and 47 deletions.
18 changes: 18 additions & 0 deletions M2.Reverse.Coverage.Status.md
Expand Up @@ -4323,6 +4323,24 @@ In case you have unexpected issues or keen to see new features please contact su
</tbody>
</table>
</div>
<div>
<h4>UniqueContentTypeFieldsOrderDefinition</h4>
<table>
<thead>
<td>Property</td>
<td>Support</td>
<td>Comments</td>
</thead>
<tbody>
<tr>
<td>Fields</td>
<td>True</td>
<td>
</td>
</tr>
</tbody>
</table>
</div>
<div>
<h4>URLFieldDefinition</h4>
<table>
Expand Down
1 change: 1 addition & 0 deletions README.md
Expand Up @@ -77,6 +77,7 @@ In case you have unexpected issues or keen to see new features please contact su
* TaxonomyTermStoreDefinition
* TextFieldDefinition
* TopNavigationNodeDefinition
* UniqueContentTypeFieldsOrderDefinition
* URLFieldDefinition
* UserCustomActionDefinition
* UserFieldDefinition
Expand Down
@@ -0,0 +1,98 @@
using SPMeta2.Reverse.CSOM.ReverseHandlers.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.SharePoint.Client;
using SPMeta2.CSOM.Extensions;
using SPMeta2.Definitions;
using SPMeta2.Definitions.ContentTypes;
using SPMeta2.ModelHosts;
using SPMeta2.Models;
using SPMeta2.Reverse.CSOM.ReverseHosts;
using SPMeta2.Reverse.ReverseHosts;
using SPMeta2.Reverse.Services;
using SPMeta2.Syntax.Default;
using SPMeta2.Utils;

namespace SPMeta2.Reverse.CSOM.ReverseHandlers.ContentTypes
{
public class HideContentTypeFieldLinksReverseHandler : CSOMReverseHandlerBase
{
#region properties
public override Type ReverseType
{
get { return typeof(HideContentTypeFieldLinksDefinition); }
}

public override IEnumerable<Type> ReverseParentTypes
{
get
{
return new[]
{
typeof(ContentTypeDefinition)
};
}
}


#endregion

#region methods

public override IEnumerable<ReverseHostBase> ReverseHosts(ReverseHostBase parentHost, ReverseOptions options)
{
var result = new List<ContentTypeReverseHost>();

var typedHost = parentHost.WithAssertAndCast<ContentTypeReverseHost>("reverseHost", value => value.RequireNotNull());

var contentType = typedHost.HostContentType;
var context = typedHost.HostClientContext;

var item = contentType;

context.Load(item);

context.Load(item, i => i.Fields);
context.Load(item, i => i.FieldLinks);

context.ExecuteQueryWithTrace();

result.AddRange(ApplyReverseFilters(new[] { item }, options).ToArray().Select(i =>
{
return ModelHostBase.Inherit<ContentTypeReverseHost>(parentHost, h =>
{
h.HostContentType = i;
});
}));

return result;
}

public override ModelNode ReverseSingleHost(object reverseHost, ReverseOptions options)
{
var item = (reverseHost as ContentTypeReverseHost).HostContentType;

var def = new HideContentTypeFieldLinksDefinition();

foreach (var fieldLink in item.FieldLinks.ToArray()
.Where(l => l.Hidden))
{
def.Fields.Add(new FieldLinkValue
{
Id = fieldLink.Id
});
}

return new HideContentTypeFieldLinksModelNode
{
Options = { RequireSelfProcessing = true },
Value = def
};
}

#endregion
}
}
Expand Up @@ -54,7 +54,7 @@ public override IEnumerable<ReverseHostBase> ReverseHosts(ReverseHostBase parent
var item = contentType;

context.Load(item);

context.Load(item, i => i.Fields);
context.Load(item, i => i.FieldLinks);

Expand Down Expand Up @@ -85,7 +85,7 @@ public override ModelNode ReverseSingleHost(object reverseHost, ReverseOptions o
});
}

return new ContentTypeFieldLinkModelNode
return new UniqueContentTypeFieldsOrderModelNode
{
Options = { RequireSelfProcessing = true },
Value = def
Expand Down
Expand Up @@ -92,6 +92,7 @@
<Compile Include="ReverseHandlers\ContentTypeLinkReverseHandler.cs" />
<Compile Include="ReverseHandlers\ContentTypeFieldLinkReverseHandler.cs" />
<Compile Include="ReverseHandlers\ContentTypeReverseHandler.cs" />
<Compile Include="ReverseHandlers\ContentTypes\HideContentTypeFieldLinksReverseHandler.cs" />
<Compile Include="ReverseHandlers\ContentTypes\UniqueContentTypeFieldOrderReverseHandler.cs" />
<Compile Include="ReverseHandlers\FeatureReverseHandler.cs" />
<Compile Include="ReverseHandlers\Fields\OutcomeChoiceFieldReverseHandler.cs" />
Expand Down
Expand Up @@ -60,6 +60,7 @@
<Compile Include="Services\ReverseValidationService.cs" />
<Compile Include="Validation\ContentTypeLinkDefinitionValidator.cs" />
<Compile Include="Validation\ContentTypeFieldLinkDefinitionValidator.cs" />
<Compile Include="Validation\ContentTypes\HideContentTypeFieldLinksDefinitionValidator.cs" />
<Compile Include="Validation\ContentTypes\UniqueContentTypeFieldsOrderDefinitionValidator.cs" />
<Compile Include="Validation\FieldDefinitionValidator.cs" />
<Compile Include="Validation\Fields\SummaryLinkFieldDefinitionValidator.cs" />
Expand Down
@@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SPMeta2.Definitions;
using SPMeta2.Reverse.Regression.Base;
using SPMeta2.Definitions.ContentTypes;
using SPMeta2.Utils;
using SPMeta2.Containers.Assertion;

namespace SPMeta2.Reverse.Regression.Validation.ContentTypes
{
public class HideContentTypeFieldLinksDefinitionValidator :
TypedReverseDefinitionValidatorBase<HideContentTypeFieldLinksDefinition>
{

public override void DeployModel(object modelHost, DefinitionBase model)
{
var typedModelHost = modelHost.WithAssertAndCast<ReverseValidationModeHost>("modelHost", m => m.RequireNotNull());

var originalDefinition = typedModelHost.OriginalModel.Value.WithAssertAndCast<HideContentTypeFieldLinksDefinition>("value", m => m.RequireNotNull());
var reversedDefinition = typedModelHost.ReversedModel.Value.WithAssertAndCast<HideContentTypeFieldLinksDefinition>("value", m => m.RequireNotNull());

var assert = ServiceFactory.AssertService.NewAssert(originalDefinition, reversedDefinition);

assert.ShouldBeEqual((p, s, d) =>
{
var isValid = true;
var srcProp = s.GetExpressionValue(o => o.Fields);
var dstProp = d.GetExpressionValue(o => o.Fields);
// check the reversed order, should be the same
// these aray should be the same in terms of ordering
var srcArray = s.Fields.Select(l => l.Id).ToList();
var dstArray = d.Fields.Where(f => s.Fields.Any(sl => sl.Id == f.Id))
.Select(l => l.Id).ToList();
isValid = srcArray.Count == dstArray.Count;
if (isValid)
{
for (var i = 0; i < srcArray.Count; i++)
{
isValid = dstArray.Contains(srcArray[i]);
if (!isValid)
break;
}
}
return new PropertyValidationResult
{
Tag = p.Tag,
Src = srcProp,
Dst = dstProp,
IsValid = isValid
};
});


}
}
}
@@ -0,0 +1,68 @@
using SPMeta2.Reverse.Tests.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using SPMeta2.Definitions;
using SPMeta2.Definitions.Fields;
using SPMeta2.Syntax.Default;
using SPMeta2.Definitions.ContentTypes;
using SPMeta2.Reverse.Services;

namespace SPMeta2.Reverse.Tests.Impl.Definitions.ContentTypes
{
[TestClass]
public class HideContentTypeFieldLinksDefinitionTests : ReverseTestBase
{
#region tests

[TestMethod]
[TestCategory("ContentTypes.HideContentTypeFieldLinks")]
public void Can_Reverse_HideContentTypeFieldLinks()
{
var options = ReverseOptions.Default
.AddDepthOption<WebDefinition>(0);

var f1 = Def<BooleanFieldDefinition>();
var f2 = Def<BooleanFieldDefinition>();
var f3 = Def<BooleanFieldDefinition>();

var c1 = Def<ContentTypeDefinition>();

options.AddFilterOption<ContentTypeDefinition>(l => l.Name == c1.Name);
options.AddFilterOption<FieldDefinition>(l => l.InternalName == f1.InternalName);

//ContentTypeFieldLinkDefinition

var model = SPMeta2Model.NewSiteModel(site =>
{
site.AddField(f1);
site.AddField(f2);
site.AddField(f3);
site.AddContentType(c1, contentType =>
{
contentType.AddContentTypeFieldLink(f1);
contentType.AddContentTypeFieldLink(f2);
contentType.AddContentTypeFieldLink(f3);
contentType.AddHideContentTypeFieldLinks(new HideContentTypeFieldLinksDefinition
{
Fields = new List<FieldLinkValue>()
{
new FieldLinkValue { Id = f2.Id },
new FieldLinkValue { Id = f3.Id },
new FieldLinkValue { Id = f1.Id }
}
});
});
});

DeployReverseAndTestModel(model, options);
}

#endregion
}
}
Expand Up @@ -88,6 +88,7 @@
<Compile Include="Base\ReverseTestBase.cs" />
<Compile Include="Impl\Definitions\ContentTypeFieldLinkDefinitionTests.cs" />
<Compile Include="Impl\Definitions\ContentTypeDefinitionTests.cs" />
<Compile Include="Impl\Definitions\ContentTypes\HideContentTypeFieldLinksDefinitionTests.cs" />
<Compile Include="Impl\Definitions\ContentTypes\UniqueContentTypeFieldsOrderDefinitionTests.cs" />
<Compile Include="Impl\Definitions\FeatureDefinitionTests.cs" />
<Compile Include="Impl\Definitions\ContentTypeLinkDefinitionTests.cs" />
Expand Down
@@ -0,0 +1,18 @@
<div>
<h4>UniqueContentTypeFieldsOrderDefinition</h4>
<table>
<thead>
<td>Property</td>
<td>Support</td>
<td>Comments</td>
</thead>
<tbody>
<tr>
<td>Fields</td>
<td>True</td>
<td>
</td>
</tr>
</tbody>
</table>
</div>
Expand Up @@ -4311,6 +4311,24 @@ <h4>TopNavigationNodeDefinition</h4>
</tbody>
</table>
</div>
<div>
<h4>UniqueContentTypeFieldsOrderDefinition</h4>
<table>
<thead>
<td>Property</td>
<td>Support</td>
<td>Comments</td>
</thead>
<tbody>
<tr>
<td>Fields</td>
<td>True</td>
<td>
</td>
</tr>
</tbody>
</table>
</div>
<div>
<h4>URLFieldDefinition</h4>
<table>
Expand Down

0 comments on commit e7a1156

Please sign in to comment.