Commit 9d6b0d78 authored by Viet Hoang's avatar Viet Hoang

Merge branch 'experience-analytics-site-filter-restriction' into 'master'

Experience analytics site filter restriction

See merge request viet.hoang/vhs!15
parents 492e3997 8c0da25f
......@@ -77,11 +77,11 @@
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Sitecore.Client, Version=10.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Sitecore.Client.NoReferences.8.2.170407\lib\NET452\Sitecore.Client.dll</HintPath>
<HintPath>..\packages\Sitecore.Client.NoReferences.8.2.170728\lib\NET452\Sitecore.Client.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Sitecore.Kernel, Version=10.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Sitecore.Kernel.NoReferences.8.2.170407\lib\NET452\Sitecore.Kernel.dll</HintPath>
<HintPath>..\packages\Sitecore.Kernel.NoReferences.8.2.170728\lib\NET452\Sitecore.Kernel.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Web.DynamicData" />
......
......@@ -9,6 +9,6 @@
<package id="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel" version="2.2.0" targetFramework="net46" />
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net46" />
<package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Client.NoReferences" version="8.2.170407" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170407" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Client.NoReferences" version="8.2.170728" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170728" targetFramework="net46" developmentDependency="true" />
</packages>
\ No newline at end of file
......@@ -57,7 +57,7 @@
<HintPath>..\lib\Microsoft Sync Framework\Microsoft.Synchronization.Files.dll</HintPath>
</Reference>
<Reference Include="Sitecore.Kernel, Version=10.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Sitecore.Kernel.NoReferences.8.2.170407\lib\NET452\Sitecore.Kernel.dll</HintPath>
<HintPath>..\packages\Sitecore.Kernel.NoReferences.8.2.170728\lib\NET452\Sitecore.Kernel.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Web.DynamicData" />
......
......@@ -6,5 +6,5 @@
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net46" />
<package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net46" developmentDependency="true" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net46" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170407" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170728" targetFramework="net46" developmentDependency="true" />
</packages>
\ No newline at end of file
......@@ -49,7 +49,7 @@
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Sitecore.Kernel, Version=10.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Sitecore.Kernel.NoReferences.8.2.170407\lib\NET452\Sitecore.Kernel.dll</HintPath>
<HintPath>..\packages\Sitecore.Kernel.NoReferences.8.2.170728\lib\NET452\Sitecore.Kernel.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Web.DynamicData" />
......
......@@ -2,5 +2,5 @@
<packages>
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net46" />
<package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170407" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170728" targetFramework="net46" developmentDependency="true" />
</packages>
\ No newline at end of file
......@@ -49,7 +49,7 @@
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Sitecore.Kernel, Version=10.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Sitecore.Kernel.NoReferences.8.2.170407\lib\NET452\Sitecore.Kernel.dll</HintPath>
<HintPath>..\packages\Sitecore.Kernel.NoReferences.8.2.170728\lib\NET452\Sitecore.Kernel.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Web.DynamicData" />
......
......@@ -2,5 +2,5 @@
<packages>
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net46" />
<package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170407" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170728" targetFramework="net46" developmentDependency="true" />
</packages>
\ No newline at end of file
......@@ -49,7 +49,7 @@
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Sitecore.Kernel, Version=10.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Sitecore.Kernel.NoReferences.8.2.170407\lib\NET452\Sitecore.Kernel.dll</HintPath>
<HintPath>..\packages\Sitecore.Kernel.NoReferences.8.2.170728\lib\NET452\Sitecore.Kernel.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Web.DynamicData" />
......
......@@ -6,5 +6,5 @@
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net46" />
<package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net46" developmentDependency="true" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net46" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170407" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170728" targetFramework="net46" developmentDependency="true" />
</packages>
\ No newline at end of file
......@@ -49,7 +49,7 @@
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Sitecore.Kernel, Version=10.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Sitecore.Kernel.NoReferences.8.2.170407\lib\NET452\Sitecore.Kernel.dll</HintPath>
<HintPath>..\packages\Sitecore.Kernel.NoReferences.8.2.170728\lib\NET452\Sitecore.Kernel.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Web.DynamicData" />
......
......@@ -2,5 +2,5 @@
<packages>
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net46" />
<package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170407" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170728" targetFramework="net46" developmentDependency="true" />
</packages>
\ No newline at end of file
......@@ -49,7 +49,7 @@
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Sitecore.Kernel, Version=10.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Sitecore.Kernel.NoReferences.8.2.170407\lib\NET452\Sitecore.Kernel.dll</HintPath>
<HintPath>..\packages\Sitecore.Kernel.NoReferences.8.2.170728\lib\NET452\Sitecore.Kernel.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Web.DynamicData" />
......
......@@ -6,5 +6,5 @@
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net46" />
<package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net46" developmentDependency="true" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net46" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170407" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170728" targetFramework="net46" developmentDependency="true" />
</packages>
\ No newline at end of file
......@@ -57,7 +57,7 @@
<HintPath>..\lib\Microsoft Sync Framework\Microsoft.Synchronization.Files.dll</HintPath>
</Reference>
<Reference Include="Sitecore.Kernel, Version=10.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Sitecore.Kernel.NoReferences.8.2.170407\lib\NET452\Sitecore.Kernel.dll</HintPath>
<HintPath>..\packages\Sitecore.Kernel.NoReferences.8.2.170728\lib\NET452\Sitecore.Kernel.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Web.DynamicData" />
......
......@@ -6,5 +6,5 @@
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net46" />
<package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net46" developmentDependency="true" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net46" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170407" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170728" targetFramework="net46" developmentDependency="true" />
</packages>
\ No newline at end of file
<?xml version="1.0"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<vhsXAnalyticsReportViewerRestriction enabled="true">
<superReportViewerRoles>sitecore\Super Report Viewer,sitecore\Master Report</superReportViewerRoles>
<sitesAndReportViewerRoles>
<sites>
<site1>sitecore\site1 Report Viewer,site1\Report Viewer</site1>
<Site2>sitecore\Site2 Report Viewer,site2\Report Viewer</Site2>
</sites>
</sitesAndReportViewerRoles>
</vhsXAnalyticsReportViewerRestriction>
</sitecore>
</configuration>
\ No newline at end of file
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Vhs.XAnalyticsReportViewerRestriction")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Vhs.XAnalyticsReportViewerRestriction")]
[assembly: AssemblyCopyright("Copyright © viet.hoang.sitecore@gmail.com 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("e246265b-04e5-44a6-b542-ad92bb768aa1")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
using SC = Sitecore;
namespace Vhs.XAnalyticsReportViewerRestriction.Services
{
public static class ConfigurationService
{
public static bool Enabled
{
get
{
var xmlAttributes = SC.Configuration.Factory.GetConfigNode("vhsXAnalyticsReportViewerRestriction")
?.Attributes;
if (xmlAttributes == null) return false;
bool enabled;
return bool.TryParse(xmlAttributes["enabled"]?.Value, out enabled);
}
}
public static string SuperReportViewerRoles => SC.Configuration.Factory.GetConfigNode("vhsXAnalyticsReportViewerRestriction/superReportViewerRoles")
?.InnerXml;
public static string SitesAndReportViewerRoleList => SC.Configuration.Factory.GetConfigNode("vhsXAnalyticsReportViewerRestriction/sitesAndReportViewerRoles")
?.InnerXml;
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
In the example below, the "SetAttributes" transform will change the value of
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
finds an attribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<!--
In the example below, the "Replace" transform will replace the entire
<customErrors> section of your web.config file.
Note that because there is only one customErrors section under the
<system.web> node, there is no need to use the "xdt:Locator" attribute.
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
In the example below, the "SetAttributes" transform will change the value of
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
finds an attribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
<!--
In the example below, the "Replace" transform will replace the entire
<customErrors> section of your web.config file.
Note that because there is only one customErrors section under the
<system.web> node, there is no need to use the "xdt:Locator" attribute.
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=301880
-->
<configuration>
<appSettings>
<add key="webpages:Version" value="3.0.0.0"/>
<add key="webpages:Enabled" value="false"/>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.6"/>
<httpRuntime targetFramework="4.6"/>
</system.web>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs"
type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
</compilers>
</system.codedom>
</configuration>
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net46" />
<package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net46" />
<package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net46" />
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net46" />
<package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net46" developmentDependency="true" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net46" />
<package id="Newtonsoft.Json" version="6.0.8" targetFramework="net46" />
<package id="Sitecore.ExperienceAnalytics.Client.NoReferences" version="8.2.170728" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Kernel.NoReferences" version="8.2.170728" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Mvc.NoReferences" version="8.2.170728" targetFramework="net46" developmentDependency="true" />
<package id="Sitecore.Speak.Client.NoReferences" version="8.2.170728" targetFramework="net46" developmentDependency="true" />
</packages>
\ No newline at end of file
@using System.Xml
@using Newtonsoft.Json
@using Sitecore.Exceptions
@using Sitecore.ExperienceAnalytics.Client
@using Sitecore.Mvc
@using Sitecore.Web.UI.Controls.Common.Renderings
@using Sitecore.Web.UI.Controls.Common.Texts
@using Sitecore.Web.UI.Controls.Common.UserControls
@using Sitecore
@using Sitecore.Configuration
@using Vhs.XAnalyticsReportViewerRestriction.Services
@using Globals = Sitecore.ExperienceAnalytics.Client.Globals
@using UserControl = Sitecore.Web.UI.Controls.Common.UserControls.UserControl
@model Sitecore.Mvc.Presentation.RenderingModel
@{
var rendering = Html.Sitecore().Controls().GetUserControl(Model.Rendering);
rendering.Class = "sc-SubsiteFilter";
rendering.Requires.Script("client", "SubsiteFilter.js");
rendering.Attributes.Add("data-bind", "visible: isVisible");
rendering.HasNestedComponents = true;
var errorMessages = new
{
InvalidSubsite = Helper.GetTextValue(Globals.System.Texts.ErrorMessages.InvalidSubsite),
ConfigurationError = Helper.GetTextValue(Globals.System.Texts.ErrorMessages.ConfigurationError)
};
rendering.Attributes.Add("data-sc-errortexts", JsonConvert.SerializeObject(errorMessages));
}
@EmbedSubsiteFilter(rendering)
@helper EmbedSubsiteFilter(UserControl rendering)
{
var renderingId = rendering.ControlId;
var helper = new RenderingHelper(Html, renderingId);
var sites = helper.GetSiteComboBoxItems();
if (ConfigurationService.Enabled)
{
sites = GetSiteListByRoles(sites);
}
helper.MakeBorder("ContentWrapper", renderingId + "DropDownWrapper", contentWrapper =>
{
helper.MakeRow("TextBorder", contentWrapper, true, textBorder => helper.MakeText("Text", textBorder, Globals.System.Texts.DefineCustomFilter, TextType.Title));
helper.MakeRow("ControlsRow", contentWrapper, true, controlsRow =>
{
helper.MakeComboBox("SubsiteComboBox", controlsRow, sites);
helper.MakeButton("SubmitButton", controlsRow, Globals.System.Texts.Apply.Guid.ToString(), "Primary");
helper.MakeButton("ResetButton", controlsRow, Globals.System.Texts.RevertFiltersToStandard.Guid.ToString());
});
});
// Rendering
<div @rendering.HtmlAttributes>
@Html.Sitecore().Controls().Rendering(Html, Globals.Bcl.Renderings.Containers.Border, renderingId + "DropDownWrapper", "", new { UsePadding = true })
</div>
}
@functions{
private static List<ComboBoxItem> GetSiteListByRoles(List<ComboBoxItem> sites)
{
const char Separator = ',';
var user = Sitecore.Context.User;
if (sites == null || !sites.Any() || user.IsAdministrator)
{
return sites;
}
var userRoles = Sitecore.Context.User.Roles;
var superReportViewerRoles = ConfigurationService.SuperReportViewerRoles?.Split(Separator).ToList();
if (superReportViewerRoles != null && userRoles.Any(x => superReportViewerRoles.Any(y => y.Equals(x.Name, StringComparison.OrdinalIgnoreCase))))
{
return sites;
}
var allowedSites = new List<ComboBoxItem>();
var sitesAndReportViewerRoleList = ConfigurationService.SitesAndReportViewerRoleList;
if (string.IsNullOrWhiteSpace(sitesAndReportViewerRoleList)) return allowedSites;
var sitesXmlDoc = new XmlDocument();
sitesXmlDoc.LoadXml(sitesAndReportViewerRoleList);
foreach (var site in sites)
{
var siteXPath = string.Format("sites/{0}", site.ItemId);
var allowedReportViewerRoles = sitesXmlDoc.SelectSingleNode(siteXPath)?.InnerText.Split(Separator).ToList();
if (allowedReportViewerRoles == null || !allowedReportViewerRoles.Any()) continue;
foreach (var userRole in userRoles)
{
var isAllowed = allowedReportViewerRoles.FirstOrDefault(x => x.Equals(userRole.Name, StringComparison.OrdinalIgnoreCase)) != null;
if (isAllowed)
{
allowedSites.Add(site);
break;
}
}
}
return allowedSites;
}
}
......@@ -19,6 +19,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vhs.MediaPublicUrlPickerFie
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vhs.ImageCoordinatePickerField2", "Vhs.ImageCoordinatePickerField2\Vhs.ImageCoordinatePickerField2.csproj", "{0A07630E-0F8F-4D90-92CF-8DEF370ABA43}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vhs.XAnalyticsReportViewerRestriction", "Vhs.XAnalyticsSiteFilterRestriction\Vhs.XAnalyticsReportViewerRestriction.csproj", "{4FA8BCEE-AA68-48E8-8FB0-6CB3E7A7D131}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
......@@ -57,6 +59,10 @@ Global
{0A07630E-0F8F-4D90-92CF-8DEF370ABA43}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0A07630E-0F8F-4D90-92CF-8DEF370ABA43}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0A07630E-0F8F-4D90-92CF-8DEF370ABA43}.Release|Any CPU.Build.0 = Release|Any CPU
{4FA8BCEE-AA68-48E8-8FB0-6CB3E7A7D131}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4FA8BCEE-AA68-48E8-8FB0-6CB3E7A7D131}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4FA8BCEE-AA68-48E8-8FB0-6CB3E7A7D131}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4FA8BCEE-AA68-48E8-8FB0-6CB3E7A7D131}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment