├── .gitattributes ├── .github ├── FUNDING.yml └── workflows │ └── main.yml ├── .gitignore ├── Assets └── D365Logo.png ├── Build ├── OpenVsixSignTool │ ├── Microsoft.Azure.KeyVault.Core.dll │ ├── Microsoft.Azure.KeyVault.Cryptography.dll │ ├── Microsoft.Azure.KeyVault.WebKey.dll │ ├── Microsoft.Azure.KeyVault.dll │ ├── Microsoft.Extensions.CommandLineUtils.dll │ ├── Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll │ ├── Microsoft.IdentityModel.Clients.ActiveDirectory.dll │ ├── Microsoft.Rest.ClientRuntime.Azure.dll │ ├── Microsoft.Rest.ClientRuntime.dll │ ├── Newtonsoft.Json.dll │ ├── OpenVsixSignTool.Core.dll │ ├── OpenVsixSignTool.exe │ ├── System.ValueTuple.dll │ └── certificate.pfx └── SetVersions.ps1 ├── CrmIntellisense ├── Crm │ └── CrmMetadata.cs ├── CrmCSharpCompletionCommandHandler.cs ├── CrmCSharpCompletionHandlerProvider.cs ├── CrmCSharpCompletionSource.cs ├── CrmCSharpCompletionSourceProvider.cs ├── CrmCompletionHandlerProviderBase.cs ├── CrmIntellisense.csproj ├── CrmJsCompletionCommandHandler.cs ├── CrmJsCompletionHandlerProvider.cs ├── CrmJsCompletionSource.cs ├── CrmJsCompletionSourceProvider.cs ├── D365DevExKey.snk ├── Models │ └── CompletionValue.cs ├── PositionHelper.cs ├── Properties │ └── AssemblyInfo.cs ├── Resources │ ├── Resource.Designer.cs │ └── Resource.resx └── packages.config ├── D365DeveloperExtensions.Core ├── Config │ ├── ConfigFile.cs │ ├── Mapping.cs │ └── Profiles.cs ├── Connection │ ├── ConnectEventArgs.cs │ ├── CrmLoginForm.xaml │ ├── CrmLoginForm.xaml.cs │ ├── ProjectItemAddedEventArgs.cs │ ├── ProjectItemMovedEventArgs.cs │ ├── ProjectItemRemovedEventArgs.cs │ ├── ProjectItemRenamedEventArgs.cs │ ├── SolutionProjectAddedEventArgs.cs │ ├── SolutionProjectRemovedEventArgs.cs │ ├── SolutionProjectRenamedEventArgs.cs │ ├── XrmToolingConnection.xaml │ └── XrmToolingConnection.xaml.cs ├── Controls │ ├── CustomizationButton.xaml │ ├── CustomizationButton.xaml.cs │ ├── DataGridHeaderClearFilterButton.xaml │ ├── DataGridHeaderClearFilterButton.xaml.cs │ ├── DataGridHeaderFilterButton.xaml │ ├── DataGridHeaderFilterButton.xaml.cs │ ├── DataGridHeaderFilterPopup.xaml │ ├── DataGridHeaderFilterPopup.xaml.cs │ ├── LockOverlay.xaml │ ├── LockOverlay.xaml.cs │ ├── PayPalButton.xaml │ ├── PayPalButton.xaml.cs │ ├── ProjectGitHubButton.xaml │ ├── ProjectGitHubButton.xaml.cs │ ├── SolutionsButton.xaml │ ├── SolutionsButton.xaml.cs │ ├── SpklGitHubButton.xaml │ └── SpklGitHubButton.xaml.cs ├── Converters │ ├── InverseConverter.cs │ ├── ToUpperConverter.cs │ ├── WatermarkAdorner.cs │ └── WatermarkService.cs ├── Crm │ ├── Connection.cs │ └── Publish.cs ├── D365DevExKey.snk ├── D365DeveloperExtensions.Core.csproj ├── D365DeveloperExtensions.Core.ruleset ├── DataGrid │ ├── DataGridHelpers.cs │ ├── DetailsRow.cs │ ├── GridFilters.cs │ └── IFilterProperty.cs ├── DateFormatting.cs ├── Enums │ ├── FileExtensionType.cs │ ├── MapTypes.cs │ ├── MetadataType.cs │ ├── OutputLoggerMessageType.cs │ ├── ProjectType.cs │ ├── SolutionPackagerAction.cs │ ├── SolutionType.cs │ ├── TemplatePackageType.cs │ └── ToolWindowType.cs ├── ExceptionHandler.cs ├── ExtensionConstants.cs ├── ExtensionMethods │ ├── CheckBoxExtensions.cs │ └── StringExtensions.cs ├── FileSystem.cs ├── HostWindow.cs ├── Images │ ├── github_20.png │ ├── paypal_20.png │ └── spkl_20.png ├── InfoBar.cs ├── Localization │ ├── LocalizedCategoryAttribute.cs │ ├── LocalizedDescriptionAttribute.cs │ └── LocalizedDisplayNameAttribute.cs ├── Logging │ ├── ExtensionLogger.cs │ ├── OutputLogger.cs │ └── XrmToolingLogging.cs ├── Models │ ├── AssemblyDeploymentType.cs │ ├── InfobarActionItemEventArgs.cs │ ├── MockingFramework.cs │ ├── MockingFrameworkListItem.cs │ ├── MovedProjectItem.cs │ ├── NpmHistory.cs │ ├── NpmPackage.cs │ ├── NuGetPackage.cs │ ├── ProjectListItem.cs │ ├── SpklConfig.cs │ ├── ToolWindow.cs │ ├── UserOptionProperties.cs │ ├── UserOptionProperty.cs │ └── WebResourceType.cs ├── MonikerHelper.cs ├── Properties │ └── AssemblyInfo.cs ├── Resources │ ├── ControlsStyleDictionary.xaml │ ├── DataGridStyleDictionary.xaml │ ├── DialogWindowStyleDictionary.xaml │ ├── Resource.Designer.cs │ ├── Resource.resx │ ├── ToolBarStyleDictionary.xaml │ └── UserControlStyleDictionary.xaml ├── SharedGlobals.cs ├── StatusBar.cs ├── StringFormatting.cs ├── TemplateHandler.cs ├── UserOptions │ ├── UserOptionsGridIntellisense.cs │ ├── UserOptionsGridLogging.cs │ ├── UserOptionsGridTemplates.cs │ ├── UserOptionsGridTools.cs │ ├── UserOptionsGridWebBrowser.cs │ └── UserOptionsHelper.cs ├── Versioning.cs ├── Vs │ ├── ProjectItemWorker.cs │ ├── ProjectWorker.cs │ ├── SolutionWorker.cs │ ├── VsHierarchyEvents.cs │ └── VsSolutionEvents.cs ├── WebBrowser.cs └── packages.config ├── D365DeveloperExtensions.sln ├── D365DeveloperExtensions ├── D365DevExKey.snk ├── D365DeveloperExtensions.cs ├── D365DeveloperExtensions.csproj ├── D365DeveloperExtensions.vsct ├── D365DeveloperExtensionsPackage.cs ├── D365DexEv.pkgdef ├── License.txt ├── MenuHandler.cs ├── Microsoft.Xrm.Tooling.Ui.Styles.dll ├── Newtonsoft.Json.dll ├── Properties │ └── AssemblyInfo.cs ├── Resources │ ├── Resource.Designer.cs │ ├── Resource.resx │ ├── icon.ico │ └── preview.png ├── StartupTasks.cs ├── VSPackage.resx ├── Vs │ └── VsSolutionEvents.cs ├── packages.config └── source.extension.vsixmanifest ├── ItemTemplates ├── CSharp │ ├── CSharpCustom │ │ ├── CSharpCustom.csproj │ │ ├── CSharpCustom.vstemplate │ │ ├── Class.cs │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ └── icon.png │ ├── CSharpPluginClass │ │ ├── CSharpPluginClass.csproj │ │ ├── CSharpPluginClass.vstemplate │ │ ├── PluginClass.cs │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ └── icon.png │ ├── CSharpSdkPluginBaseClass │ │ ├── CSharpSdkPluginBaseClass.csproj │ │ ├── CSharpSdkPluginBaseClass.vstemplate │ │ ├── PluginBase.cs │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ └── icon.png │ ├── CSharpSdkPluginFromBaseClass │ │ ├── CSharpSdkPluginFromBaseClass.csproj │ │ ├── CSharpSdkPluginFromBaseClass.vstemplate │ │ ├── PluginClass.cs │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ └── icon.png │ ├── CSharpSdkWorkflowBaseClass │ │ ├── CSharpSdkWorkflowBaseClass.csproj │ │ ├── CSharpSdkWorkflowBaseClass.vstemplate │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ ├── WorkFlowActivityBase.cs │ │ └── icon.png │ ├── CSharpSdkWorkflowFromBaseClass │ │ ├── CSharpSdkWorkflowFromBaseClass.csproj │ │ ├── CSharpSdkWorkflowFromBaseClass.vstemplate │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ ├── WorkflowClass.cs │ │ └── icon.png │ ├── CSharpSolutionPackagerMap │ │ ├── CSharpSolutionPackagerMap.csproj │ │ ├── CSharpSolutionPackagerMap.vstemplate │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ ├── icon.png │ │ └── mapping.xml │ ├── CSharpSpklConfig │ │ ├── CSharpSpklConfig.csproj │ │ ├── CSharpSpklConfig.vstemplate │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ └── spkl.json │ ├── CSharpSpklRegAttributes │ │ ├── CSharpSpklRegAttributes.csproj │ │ ├── CSharpSpklRegAttributes.vstemplate │ │ ├── CrmPluginRegistrationAttribute.cs │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ └── icon.png │ └── CSharpWorkflowClass │ │ ├── CSharpWorkflowClass.csproj │ │ ├── CSharpWorkflowClass.vstemplate │ │ ├── Properties │ │ └── AssemblyInfo.cs │ │ ├── WorkflowClass.cs │ │ └── icon.png └── Web │ └── CSharp │ └── WebCSharpSolutionPackagerMap │ ├── Properties │ └── AssemblyInfo.cs │ ├── WebCSharpSolutionPackagerMap.csproj │ ├── WebCSharpSolutionPackagerMap.vstemplate │ ├── icon.png │ └── mapping.xml ├── LICENSE ├── NuGetRetriever ├── D365DevExKey.snk ├── NuGetRetriever.csproj ├── PackageLister.cs ├── Properties │ └── AssemblyInfo.cs ├── Resources │ ├── Resource.Designer.cs │ └── Resource.resx └── packages.config ├── PluginDeployer ├── AssemblyValidation.cs ├── Config │ └── Mapping.cs ├── Converters │ ├── EnableGetAttributesButtonConverter.cs │ └── EnablePublishConverter.cs ├── Crm │ ├── Assembly.cs │ └── Solution.cs ├── D365DevExKey.snk ├── IlMerge.cs ├── ModelBuilder.cs ├── Models │ └── PluginData.cs ├── PluginDeployer.csproj ├── PluginDeployerHost.cs ├── PluginDeployerWindow.xaml ├── PluginDeployerWindow.xaml.cs ├── Properties │ └── AssemblyInfo.cs ├── PrtHelper.cs ├── Resources │ ├── Resource.Designer.cs │ └── Resource.resx ├── Spkl │ ├── AssemblyContainer.cs │ ├── CodeParser.cs │ ├── Config │ │ ├── ConfigFile.cs │ │ ├── EarlyBoundTypeConfig.cs │ │ ├── IConfigFileService.cs │ │ ├── MapTypes.cs │ │ ├── PluginDeployConfig.cs │ │ ├── SolutionPackageConfig.cs │ │ ├── SolutionPackageMap.cs │ │ ├── WebResource.cs │ │ └── WebresourceDeployConfig.cs │ ├── CrmPluginRegistrationAttribute.cs │ ├── CustomAttributeDataEx.cs │ ├── DirectoryInfoEx.cs │ ├── EntitiesTrim.cs │ ├── Exceptions.cs │ ├── IDirectoryService.cs │ ├── ITrace.cs │ ├── PluginRegistraton.cs │ ├── Reflection.cs │ ├── ServiceLocator.cs │ ├── TargetTypeEnum.cs │ ├── Tasks │ │ ├── DownloadPluginMetadataTask.cs │ │ ├── IQueries.cs │ │ ├── Queries.cs │ │ └── Task.cs │ ├── TraceLogger.cs │ ├── _Credits_Notice.txt │ └── componenttype.cs ├── SpklHelpers.cs ├── ViewModels │ ├── CrmAssembly.cs │ └── CrmSolution.cs └── packages.config ├── PluginTraceViewer ├── Crm │ └── PluginTrace.cs ├── D365DevExKey.snk ├── DataFilter.cs ├── ModelBuilder.cs ├── Models │ ├── FilterBase.cs │ ├── FilterCriteria.cs │ ├── FilterEntity.cs │ ├── FilterMessage.cs │ ├── FilterMode.cs │ └── FilterTypeName.cs ├── PluginTraceViewer.csproj ├── PluginTraceViewerHost.cs ├── PluginTraceViewerWindow.xaml ├── PluginTraceViewerWindow.xaml.cs ├── Properties │ └── AssemblyInfo.cs ├── Resources │ ├── Resource.Designer.cs │ └── Resource.resx ├── ViewModels │ └── CrmPluginTrace.cs └── packages.config ├── ProjectTemplates ├── CSharp │ ├── CSharpConsole │ │ ├── App.config │ │ ├── AssemblyInfo.cs │ │ ├── CSharpConsole.csproj │ │ ├── CSharpConsole.vstemplate │ │ ├── Program.cs │ │ ├── ProjectTemplate.csproj │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ └── icon.png │ ├── CSharpPluginProject │ │ ├── AssemblyInfo.cs │ │ ├── CSharpPluginProject.csproj │ │ ├── CSharpPluginProject.vstemplate │ │ ├── MyKey.snk │ │ ├── ProjectTemplate.csproj │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ └── icon.png │ ├── CSharpPluginTestProject │ │ ├── AssemblyInfo.cs │ │ ├── CSharpPluginTestProject.csproj │ │ ├── CSharpPluginTestProject.vstemplate │ │ ├── ProjectTemplate.csproj │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ ├── UnitTest1.cs │ │ ├── app.config │ │ └── icon.png │ ├── CSharpSolutionPackage │ │ ├── AssemblyInfo.cs │ │ ├── CSharpSolutionPackage.csproj │ │ ├── CSharpSolutionPackage.vstemplate │ │ ├── ProjectTemplate.csproj │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ └── icon.png │ ├── CSharpTypeScriptProject │ │ ├── CSharpTypeScriptProject.csproj │ │ ├── CSharpTypeScriptProject.vstemplate │ │ ├── ProjectTemplate.webproj │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ ├── icon.png │ │ └── tsconfig.json │ ├── CSharpWebResourceProject │ │ ├── CSharpWebResourceProject.csproj │ │ ├── CSharpWebResourceProject.vstemplate │ │ ├── ProjectTemplate.webproj │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ └── icon.png │ ├── CSharpWorkflowProject │ │ ├── AssemblyInfo.cs │ │ ├── CSharpWorkflowProject.csproj │ │ ├── CSharpWorkflowProject.vstemplate │ │ ├── MyKey.snk │ │ ├── ProjectTemplate.csproj │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ └── icon.png │ └── CSharpWorkflowTestProject │ │ ├── AssemblyInfo.cs │ │ ├── CSharpWorkflowTestProject.csproj │ │ ├── CSharpWorkflowTestProject.vstemplate │ │ ├── ProjectTemplate.csproj │ │ ├── Properties │ │ └── AssemblyInfo.cs │ │ ├── UnitTest1.cs │ │ ├── app.config │ │ └── icon.png └── ProjectTemplateSetup.txt ├── README.md ├── SolutionPackager ├── Config │ └── Mapping.cs ├── Crm │ └── Solution.cs ├── D365DevExKey.snk ├── FileHandler.cs ├── MapFile.cs ├── ModelBuilder.cs ├── Models │ ├── PackSettings.cs │ ├── SolutionPackagerCommand.cs │ └── UnpackSettings.cs ├── Packager.cs ├── ProjectFolderHelper.cs ├── Properties │ └── AssemblyInfo.cs ├── Resources │ ├── Resource.Designer.cs │ └── Resource.resx ├── SolutionPackager.csproj ├── SolutionPackagerHost.cs ├── SolutionPackagerWindow.xaml ├── SolutionPackagerWindow.xaml.cs ├── SolutionXml.cs ├── ViewModels │ └── CrmSolution.cs └── packages.config ├── TemplateWizards ├── CustomTemplateHandler.cs ├── CustomTemplatePicker.xaml ├── CustomTemplatePicker.xaml.cs ├── D365DevExKey.snk ├── Models │ ├── CustomTemplate.cs │ └── CustomTemplateListItem.cs ├── NpmPicker.xaml ├── NpmPicker.xaml.cs ├── NpmProcessor.cs ├── NuGetCliProcessor.cs ├── NuGetPicker.xaml ├── NuGetPicker.xaml.cs ├── NuGetProcessor.cs ├── ProjectDataHandler.cs ├── ProjectTemplateWizard.cs ├── Properties │ └── AssemblyInfo.cs ├── Resources │ ├── Resource.Designer.cs │ └── Resource.resx ├── SdkTools │ └── nuget.exe ├── SdkToolsInstaller.cs ├── SdkVersionPicker.xaml ├── SdkVersionPicker.xaml.cs ├── Signing.cs ├── Template │ └── templates.json ├── TemplateWizards.csproj ├── TestProjectPicker.xaml ├── TestProjectPicker.xaml.cs └── packages.config ├── UnitTestProjects ├── D365DeveloperExtensions.Core.Tests │ ├── Config │ │ └── ConfigFileTests.cs │ ├── CrmDevEx.json │ ├── D365DeveloperExtensions.Core.Tests.csproj │ ├── Model │ │ └── WebResourceTypeTests.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── TestConfigFiles │ │ └── spkl.json │ └── packages.config ├── NuGetRetriever.Tests │ ├── GetCoreAssembliesTests.cs │ ├── GetWorkflowAssembliesTests.cs │ ├── NuGetRetriever.Tests.csproj │ ├── Properties │ │ └── AssemblyInfo.cs │ └── packages.config └── TemplateWizards.Tests │ ├── NuGetProcessorTests.cs │ ├── Properties │ └── AssemblyInfo.cs │ ├── TemplateWizards.Tests.csproj │ └── packages.config ├── WebResourceDeployer ├── Config │ └── Mapping.cs ├── ControlHelper.cs ├── Converters │ ├── AllowCompareConverter.cs │ └── NewWebResourceCreateConverter.cs ├── Crm │ ├── Solution.cs │ └── WebResource.cs ├── D365DevExKey.snk ├── DataFilter.cs ├── ImageEncoding.cs ├── ModelBuilder.cs ├── Models │ ├── FilterCriteria.cs │ ├── FilterState.cs │ ├── FilterTypeName.cs │ ├── MovedWebResourceItem.cs │ └── TsConfig.cs ├── NewWebResource.xaml ├── NewWebResource.xaml.cs ├── Properties │ └── AssemblyInfo.cs ├── Resources │ ├── Resource.Designer.cs │ └── Resource.resx ├── TsHelper.cs ├── ViewModels │ ├── CrmSolution.cs │ ├── NewWebResource.cs │ └── WebResourceItem.cs ├── WebResourceDeployer.csproj ├── WebResourceDeployerHost.cs ├── WebResourceDeployerWindow.xaml ├── WebResourceDeployerWindow.xaml.cs ├── WebResourceItemHandler.cs └── packages.config ├── azure-pipelines.yml └── docs ├── _config.yml └── index.md /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: mrsharp 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: D365DeveloperExtensions.CI 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | # This workflow contains a single job called "build" 11 | build: 12 | # Requires Windows due to .Net Framework Dependency 13 | runs-on: windows-latest 14 | 15 | steps: 16 | #- name: Install 2017 Build Tools 17 | # run: choco install visualstudio2017buildtools --version 15.9.25.0 -y 18 | 19 | # Configure MSBuild ... 20 | - name: Add msbuild to PATH 21 | uses: microsoft/setup-msbuild@v1.0.1 22 | #with: 23 | # vs-version: '15.9.25.0' # '[15.0,15.8)' 24 | 25 | # Setup DotNet Core 26 | - uses: actions/setup-dotnet@v1 27 | with: 28 | dotnet-version: '3.1.x' # SDK Version to use; x will use the latest version of the 3.1 channel 29 | 30 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 31 | - uses: actions/checkout@v2 32 | 33 | # Restore ... 34 | - name: Restore packages 35 | run: nuget restore ./D365DeveloperExtensions.sln 36 | 37 | # Build 38 | - name: Build with MSBuild 39 | run: msbuild ./D365DeveloperExtensions.sln -p:Configuration=Release 40 | -------------------------------------------------------------------------------- /Assets/D365Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/Assets/D365Logo.png -------------------------------------------------------------------------------- /Build/OpenVsixSignTool/Microsoft.Azure.KeyVault.Core.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/Build/OpenVsixSignTool/Microsoft.Azure.KeyVault.Core.dll -------------------------------------------------------------------------------- /Build/OpenVsixSignTool/Microsoft.Azure.KeyVault.Cryptography.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/Build/OpenVsixSignTool/Microsoft.Azure.KeyVault.Cryptography.dll -------------------------------------------------------------------------------- /Build/OpenVsixSignTool/Microsoft.Azure.KeyVault.WebKey.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/Build/OpenVsixSignTool/Microsoft.Azure.KeyVault.WebKey.dll -------------------------------------------------------------------------------- /Build/OpenVsixSignTool/Microsoft.Azure.KeyVault.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/Build/OpenVsixSignTool/Microsoft.Azure.KeyVault.dll -------------------------------------------------------------------------------- /Build/OpenVsixSignTool/Microsoft.Extensions.CommandLineUtils.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/Build/OpenVsixSignTool/Microsoft.Extensions.CommandLineUtils.dll -------------------------------------------------------------------------------- /Build/OpenVsixSignTool/Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/Build/OpenVsixSignTool/Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll -------------------------------------------------------------------------------- /Build/OpenVsixSignTool/Microsoft.IdentityModel.Clients.ActiveDirectory.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/Build/OpenVsixSignTool/Microsoft.IdentityModel.Clients.ActiveDirectory.dll -------------------------------------------------------------------------------- /Build/OpenVsixSignTool/Microsoft.Rest.ClientRuntime.Azure.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/Build/OpenVsixSignTool/Microsoft.Rest.ClientRuntime.Azure.dll -------------------------------------------------------------------------------- /Build/OpenVsixSignTool/Microsoft.Rest.ClientRuntime.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/Build/OpenVsixSignTool/Microsoft.Rest.ClientRuntime.dll -------------------------------------------------------------------------------- /Build/OpenVsixSignTool/Newtonsoft.Json.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/Build/OpenVsixSignTool/Newtonsoft.Json.dll -------------------------------------------------------------------------------- /Build/OpenVsixSignTool/OpenVsixSignTool.Core.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/Build/OpenVsixSignTool/OpenVsixSignTool.Core.dll -------------------------------------------------------------------------------- /Build/OpenVsixSignTool/OpenVsixSignTool.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/Build/OpenVsixSignTool/OpenVsixSignTool.exe -------------------------------------------------------------------------------- /Build/OpenVsixSignTool/System.ValueTuple.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/Build/OpenVsixSignTool/System.ValueTuple.dll -------------------------------------------------------------------------------- /Build/OpenVsixSignTool/certificate.pfx: -------------------------------------------------------------------------------- 1 | template !!! -------------------------------------------------------------------------------- /CrmIntellisense/CrmCSharpCompletionSourceProvider.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.VisualStudio.Language.Intellisense; 2 | using Microsoft.VisualStudio.Text; 3 | using Microsoft.VisualStudio.Text.Operations; 4 | using Microsoft.VisualStudio.Utilities; 5 | using System.ComponentModel.Composition; 6 | 7 | namespace CrmIntellisense 8 | { 9 | [Export(typeof(ICompletionSourceProvider))] 10 | [ContentType("CSharp")] 11 | [Name("CRM CSharp Token Completion")] 12 | internal class CrmCSharpCompletionSourceProvider : ICompletionSourceProvider 13 | { 14 | [Import] 15 | internal ITextStructureNavigatorSelectorService NavigatorService { get; set; } 16 | 17 | public ICompletionSource TryCreateCompletionSource(ITextBuffer textBuffer) 18 | { 19 | return new CrmCSharpCompletionSource(this, textBuffer); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /CrmIntellisense/CrmCompletionHandlerProviderBase.cs: -------------------------------------------------------------------------------- 1 | using CrmIntellisense.Crm; 2 | using CrmIntellisense.Resources; 3 | using D365DeveloperExtensions.Core; 4 | using D365DeveloperExtensions.Core.Models; 5 | using D365DeveloperExtensions.Core.UserOptions; 6 | using EnvDTE; 7 | using Microsoft.VisualStudio.Shell; 8 | using Microsoft.Xrm.Tooling.Connector; 9 | using System.ComponentModel; 10 | 11 | namespace CrmIntellisense 12 | { 13 | public class CrmCompletionHandlerProviderBase 14 | { 15 | public InfoBarModel CreateMetadataInfoBar() 16 | { 17 | var text = new InfoBarTextSpan(Resource.Infobar_RetrievingMetadata); 18 | InfoBarTextSpan[] spans = { text }; 19 | var infoBarModel = new InfoBarModel(spans); 20 | 21 | return infoBarModel; 22 | } 23 | 24 | public bool IsIntellisenseEnabled(DTE dte) 25 | { 26 | var useIntellisense = UserOptionsHelper.GetOption(UserOptionProperties.UseIntellisense); 27 | if (!useIntellisense) 28 | return false; 29 | 30 | var value = SharedGlobals.GetGlobal("UseCrmIntellisense", dte); 31 | if (value == null) 32 | return false; 33 | 34 | var isEnabled = (bool?)value; 35 | return !(bool)!isEnabled; 36 | } 37 | 38 | public void GetData(CrmServiceClient client, InfoBar infoBar) 39 | { 40 | if (CrmMetadata.Metadata != null) 41 | { 42 | infoBar.HideInfoBar(); 43 | return; 44 | } 45 | 46 | var bgw = new BackgroundWorker(); 47 | 48 | bgw.DoWork += (_, __) => CrmMetadata.GetMetadata(client); 49 | 50 | bgw.RunWorkerCompleted += (_, __) => infoBar.HideInfoBar(); 51 | 52 | bgw.RunWorkerAsync(); 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /CrmIntellisense/CrmJsCompletionSourceProvider.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.VisualStudio.Language.Intellisense; 2 | using Microsoft.VisualStudio.Text; 3 | using Microsoft.VisualStudio.Text.Operations; 4 | using Microsoft.VisualStudio.Utilities; 5 | using System.ComponentModel.Composition; 6 | 7 | namespace CrmIntellisense 8 | { 9 | [Export(typeof(ICompletionSourceProvider))] 10 | [ContentType("JavaScript")] 11 | [ContentType("JScript")] 12 | //[ContentType("htmlx")] 13 | [ContentType("TypeScript")] 14 | [Name("CRM JS Token Completion")] 15 | internal class CrmJsCompletionSourceProvider : ICompletionSourceProvider 16 | { 17 | [Import] 18 | internal ITextStructureNavigatorSelectorService NavigatorService { get; set; } 19 | 20 | public ICompletionSource TryCreateCompletionSource(ITextBuffer textBuffer) 21 | { 22 | return new CrmJsCompletionSource(this, textBuffer); 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /CrmIntellisense/D365DevExKey.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/CrmIntellisense/D365DevExKey.snk -------------------------------------------------------------------------------- /CrmIntellisense/Models/CompletionValue.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core.Enums; 2 | 3 | namespace CrmIntellisense.Models 4 | { 5 | public class CompletionValue 6 | { 7 | public string Name { get; set; } 8 | public string Replacement { get; set; } 9 | public string Description { get; set; } 10 | public MetadataType MetadataType { get; set; } 11 | 12 | public CompletionValue(string name, string replacement, string description, MetadataType metadataType) 13 | { 14 | Name = name; 15 | Replacement = replacement; 16 | Description = description; 17 | MetadataType = metadataType; 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /CrmIntellisense/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("CrmIntellisense")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("CrmIntellisense")] 12 | [assembly: AssemblyCopyright("")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // Version information for an assembly consists of the following four values: 22 | // 23 | // Major Version 24 | // Minor Version 25 | // Build Number 26 | // Revision 27 | // 28 | // You can specify all the values or you can default the Build and Revision Numbers 29 | // by using the '*' as shown below: 30 | // [assembly: AssemblyVersion("1.0.*")] 31 | [assembly: AssemblyVersion("1.0.0.0")] 32 | [assembly: AssemblyFileVersion("1.0.0.0")] 33 | -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Config/Mapping.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core.Models; 2 | using EnvDTE; 3 | 4 | namespace D365DeveloperExtensions.Core.Config 5 | { 6 | public static class Mapping 7 | { 8 | /// Gets the existing or creates a new configuration file. 9 | /// The project. 10 | /// Configuration file. 11 | public static SpklConfig GetSpklConfigFile(Project project) 12 | { 13 | var projectPath = Vs.ProjectWorker.GetProjectPath(project); 14 | 15 | if (ConfigFile.SpklConfigFileExists(projectPath)) 16 | return ConfigFile.GetSpklConfigFile(project); 17 | 18 | ConfigFile.CreateSpklConfigFile(project); 19 | return ConfigFile.GetSpklConfigFile(project); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Config/Profiles.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core.Enums; 2 | using EnvDTE; 3 | using System.Collections.Generic; 4 | 5 | namespace D365DeveloperExtensions.Core.Config 6 | { 7 | public static class Profiles 8 | { 9 | /// Gets profiles from the configuration file. 10 | /// The project. 11 | /// Type of the tool window. 12 | /// List of profiles. 13 | public static List GetProfiles(Project project, ToolWindowType toolWindowType) 14 | { 15 | if (toolWindowType == ToolWindowType.PluginTraceViewer) 16 | return null; 17 | 18 | var spklConfig = ConfigFile.GetSpklConfigFile(project); 19 | 20 | switch (toolWindowType) 21 | { 22 | case ToolWindowType.PluginDeployer: 23 | return GetConfigProfiles(spklConfig.plugins); 24 | case ToolWindowType.SolutionPackager: 25 | return GetConfigProfiles(spklConfig.solutions); 26 | case ToolWindowType.WebResourceDeployer: 27 | return GetConfigProfiles(spklConfig.webresources); 28 | default: 29 | return null; 30 | } 31 | } 32 | 33 | private static List GetConfigProfiles(List configs) 34 | { 35 | if (configs == null) 36 | return new List(); 37 | 38 | var profiles = new List(); 39 | 40 | var i = 1; 41 | foreach (dynamic config in configs) 42 | { 43 | profiles.Add(string.IsNullOrEmpty(config.profile) 44 | ? $"{ExtensionConstants.NoProfilesText} {i}" 45 | : config.profile); 46 | i++; 47 | } 48 | 49 | return profiles; 50 | } 51 | } 52 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Connection/ConnectEventArgs.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xrm.Tooling.Connector; 2 | 3 | namespace D365DeveloperExtensions.Core.Connection 4 | { 5 | public class ConnectEventArgs 6 | { 7 | public CrmServiceClient ServiceClient{ get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Connection/CrmLoginForm.xaml: -------------------------------------------------------------------------------- 1 |  14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Connection/ProjectItemAddedEventArgs.cs: -------------------------------------------------------------------------------- 1 | using EnvDTE; 2 | 3 | namespace D365DeveloperExtensions.Core.Connection 4 | { 5 | public class ProjectItemAddedEventArgs 6 | { 7 | public ProjectItem ProjectItem { get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Connection/ProjectItemMovedEventArgs.cs: -------------------------------------------------------------------------------- 1 | using EnvDTE; 2 | 3 | namespace D365DeveloperExtensions.Core.Connection 4 | { 5 | public class ProjectItemMovedEventArgs 6 | { 7 | public string PreMoveName { get; set; } 8 | public ProjectItem PostMoveProjectItem { get; set; } 9 | } 10 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Connection/ProjectItemRemovedEventArgs.cs: -------------------------------------------------------------------------------- 1 | using EnvDTE; 2 | 3 | namespace D365DeveloperExtensions.Core.Connection 4 | { 5 | public class ProjectItemRemovedEventArgs 6 | { 7 | public ProjectItem ProjectItem { get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Connection/ProjectItemRenamedEventArgs.cs: -------------------------------------------------------------------------------- 1 | using EnvDTE; 2 | 3 | namespace D365DeveloperExtensions.Core.Connection 4 | { 5 | public class ProjectItemRenamedEventArgs 6 | { 7 | public ProjectItem ProjectItem { get; set; } 8 | public string OldName { get; set; } 9 | } 10 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Connection/SolutionProjectAddedEventArgs.cs: -------------------------------------------------------------------------------- 1 | using EnvDTE; 2 | 3 | namespace D365DeveloperExtensions.Core.Connection 4 | { 5 | public class SolutionProjectAddedEventArgs 6 | { 7 | public Project Project { get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Connection/SolutionProjectRemovedEventArgs.cs: -------------------------------------------------------------------------------- 1 | using EnvDTE; 2 | 3 | namespace D365DeveloperExtensions.Core.Connection 4 | { 5 | public class SolutionProjectRemovedEventArgs 6 | { 7 | public Project Project { get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Connection/SolutionProjectRenamedEventArgs.cs: -------------------------------------------------------------------------------- 1 | using EnvDTE; 2 | 3 | namespace D365DeveloperExtensions.Core.Connection 4 | { 5 | public class SolutionProjectRenamedEventArgs 6 | { 7 | public Project Project { get; set; } 8 | public string OldName { get; set; } 9 | } 10 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Controls/CustomizationButton.xaml: -------------------------------------------------------------------------------- 1 |  11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Controls/DataGridHeaderClearFilterButton.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | 3 | namespace D365DeveloperExtensions.Core.Controls 4 | { 5 | public partial class DataGridHeaderClearFilterButton 6 | { 7 | public event RoutedEventHandler Click; 8 | 9 | public DataGridHeaderClearFilterButton() 10 | { 11 | InitializeComponent(); 12 | } 13 | 14 | protected virtual void OnClick(RoutedEventArgs e) 15 | { 16 | Click?.Invoke(this, e); 17 | } 18 | 19 | private void Button_Click(object sender, RoutedEventArgs e) 20 | { 21 | OnClick(e); 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Controls/DataGridHeaderFilterButton.xaml: -------------------------------------------------------------------------------- 1 |  10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 20 | -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Controls/DataGridHeaderFilterButton.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | 3 | namespace D365DeveloperExtensions.Core.Controls 4 | { 5 | public partial class DataGridHeaderFilterButton 6 | { 7 | public event RoutedEventHandler Click; 8 | 9 | public DataGridHeaderFilterButton() 10 | { 11 | InitializeComponent(); 12 | } 13 | 14 | protected virtual void OnClick(RoutedEventArgs e) 15 | { 16 | Click?.Invoke(this, e); 17 | } 18 | 19 | private void Button_Click(object sender, RoutedEventArgs e) 20 | { 21 | OnClick(e); 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Controls/DataGridHeaderFilterPopup.xaml: -------------------------------------------------------------------------------- 1 |  8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Controls/DataGridHeaderFilterPopup.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Controls; 2 | using System.Windows.Controls.Primitives; 3 | using System.Windows.Data; 4 | 5 | namespace D365DeveloperExtensions.Core.Controls 6 | { 7 | public partial class DataGridHeaderFilterPopup 8 | { 9 | public string BindingPath { get; set; } 10 | 11 | public DataGridHeaderFilterPopup() 12 | { 13 | InitializeComponent(); 14 | } 15 | 16 | public void OpenFilterList(object sender) 17 | { 18 | TypeNameList.SetBinding(ItemsControl.ItemsSourceProperty, new Binding(BindingPath)); 19 | 20 | var button = (DataGridHeaderFilterButton)sender; 21 | FilterPopup.PlacementTarget = button; 22 | FilterPopup.Placement = PlacementMode.Relative; 23 | FilterPopup.IsOpen = true; 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Controls/LockOverlay.xaml: -------------------------------------------------------------------------------- 1 |  9 | 10 | 13 | -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Controls/LockOverlay.xaml.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core.Resources; 2 | using EnvDTE; 3 | using System; 4 | using System.Windows; 5 | using System.Windows.Threading; 6 | 7 | namespace D365DeveloperExtensions.Core.Controls 8 | { 9 | public partial class LockOverlay 10 | { 11 | public LockOverlay() 12 | { 13 | InitializeComponent(); 14 | } 15 | 16 | private void Show(string message = null) 17 | { 18 | if (string.IsNullOrEmpty(message)) 19 | message = $"{Resource.LockOverlay_LockMessage_Label_DefaultContent}..."; 20 | 21 | Overlay.Visibility = Visibility.Visible; 22 | LockMessage.Content = message; 23 | } 24 | 25 | private void Hide() 26 | { 27 | Overlay.Visibility = Visibility.Hidden; 28 | } 29 | 30 | public void ShowMessage(DTE dte, string message, vsStatusAnimation? animation = null) 31 | { 32 | Dispatcher.Invoke(DispatcherPriority.Normal, 33 | new Action(() => 34 | { 35 | if (animation != null) 36 | StatusBar.SetStatusBarValue($"{Resource.LockOverlay_LockMessage_Label_DefaultContent}...", 37 | (vsStatusAnimation)animation); 38 | Show(message); 39 | } 40 | )); 41 | } 42 | 43 | public void HideMessage(DTE dte, vsStatusAnimation? animation = null) 44 | { 45 | Dispatcher.Invoke(DispatcherPriority.Normal, 46 | new Action(() => 47 | { 48 | if (animation != null) 49 | StatusBar.ClearStatusBarValue((vsStatusAnimation)animation); 50 | Hide(); 51 | } 52 | )); 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Controls/PayPalButton.xaml: -------------------------------------------------------------------------------- 1 |  9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 20 | -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Controls/PayPalButton.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | 3 | namespace D365DeveloperExtensions.Core.Controls 4 | { 5 | public partial class PayPalButton 6 | { 7 | public PayPalButton() 8 | { 9 | InitializeComponent(); 10 | DataContext = this; 11 | } 12 | 13 | private void OpenPayPal_Click(object sender, RoutedEventArgs e) 14 | { 15 | WebBrowser.OpenUrl("https://www.paypal.me/furiousscissors"); 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Controls/ProjectGitHubButton.xaml: -------------------------------------------------------------------------------- 1 |  9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 20 | -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Controls/ProjectGitHubButton.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | 3 | namespace D365DeveloperExtensions.Core.Controls 4 | { 5 | public partial class ProjectGitHubButton 6 | { 7 | public ProjectGitHubButton() 8 | { 9 | InitializeComponent(); 10 | DataContext = this; 11 | } 12 | 13 | private void OpenGitHub_Click(object sender, RoutedEventArgs e) 14 | { 15 | WebBrowser.OpenUrl("https://github.com/tsharp/D365DeveloperExtensions"); 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Controls/SolutionsButton.xaml: -------------------------------------------------------------------------------- 1 |  10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 20 | -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Controls/SpklGitHubButton.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | 3 | namespace D365DeveloperExtensions.Core.Controls 4 | { 5 | public partial class SpklGitHubButton 6 | { 7 | public SpklGitHubButton() 8 | { 9 | InitializeComponent(); 10 | DataContext = this; 11 | } 12 | 13 | private void OpenGitHub_Click(object sender, RoutedEventArgs e) 14 | { 15 | WebBrowser.OpenUrl("https://github.com/scottdurow/SparkleXrm/wiki/spkl"); 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Converters/InverseConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using System.Windows.Data; 4 | 5 | namespace D365DeveloperExtensions.Core.Converters 6 | { 7 | public class InverseConverter : IValueConverter 8 | { 9 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 10 | { 11 | return value != null && !bool.Parse(value.ToString()); 12 | } 13 | 14 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 15 | { 16 | throw new NotImplementedException(); 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Converters/ToUpperConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using System.Windows.Data; 4 | 5 | namespace D365DeveloperExtensions.Core.Converters 6 | { 7 | public class ToUpperConverter : IValueConverter 8 | { 9 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 10 | { 11 | return value?.ToString().ToUpper(); 12 | } 13 | 14 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 15 | { 16 | throw new NotImplementedException(); 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Crm/Connection.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Crm.Sdk.Messages; 2 | using Microsoft.Xrm.Tooling.Connector; 3 | 4 | namespace D365DeveloperExtensions.Core.Crm 5 | { 6 | public static class Connection 7 | { 8 | public static string RetrieveOrganizationId(CrmServiceClient service) 9 | { 10 | var response = (WhoAmIResponse)service.Execute(new WhoAmIRequest()); 11 | 12 | return response.OrganizationId.ToString(); 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Crm/Publish.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core.Enums; 2 | using D365DeveloperExtensions.Core.Logging; 3 | using D365DeveloperExtensions.Core.Resources; 4 | using Microsoft.Crm.Sdk.Messages; 5 | using Microsoft.Xrm.Tooling.Connector; 6 | using NLog; 7 | using System; 8 | using ExLogger = D365DeveloperExtensions.Core.Logging.ExtensionLogger; 9 | using Logger = NLog.Logger; 10 | 11 | namespace D365DeveloperExtensions.Core.Crm 12 | { 13 | public class Publish 14 | { 15 | private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); 16 | 17 | public static bool PublishAllCustomizations(CrmServiceClient client) 18 | { 19 | try 20 | { 21 | ExLogger.LogToFile(Logger, Resource.Message_PublishingAllCustomizations, LogLevel.Info); 22 | OutputLogger.WriteToOutputWindow(Resource.Message_PublishingAllCustomizations, MessageType.Info); 23 | 24 | var request = new PublishAllXmlRequest(); 25 | 26 | client.Execute(request); 27 | 28 | return true; 29 | } 30 | catch (Exception ex) 31 | { 32 | ExceptionHandler.LogException(Logger, Resource.ErrorMessage_ErrorPublishing, ex); 33 | 34 | return false; 35 | } 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/D365DevExKey.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/D365DeveloperExtensions.Core/D365DevExKey.snk -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/DataGrid/DataGridHelpers.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Windows; 3 | using System.Windows.Media; 4 | 5 | namespace D365DeveloperExtensions.Core.DataGrid 6 | { 7 | public static class DataGridHelpers 8 | { 9 | public static IEnumerable FindVisualChildren(DependencyObject depObj) where T : DependencyObject 10 | { 11 | if (depObj == null) yield break; 12 | 13 | for (var i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 14 | { 15 | var child = VisualTreeHelper.GetChild(depObj, i); 16 | if (child != null && child is T) 17 | yield return (T)child; 18 | 19 | foreach (T childOfChild in FindVisualChildren(child)) 20 | yield return childOfChild; 21 | } 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/DataGrid/DetailsRow.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.Windows; 4 | using System.Windows.Controls; 5 | using System.Windows.Media; 6 | 7 | namespace D365DeveloperExtensions.Core.DataGrid 8 | { 9 | public static class DetailsRow 10 | { 11 | public static void ShowHideDetailsRow(object sender) 12 | { 13 | for (var vis = sender as Visual; vis != null; vis = VisualTreeHelper.GetParent(vis) as Visual) 14 | { 15 | if (!(vis is DataGridRow)) 16 | continue; 17 | 18 | var row = (DataGridRow)vis; 19 | row.DetailsVisibility = row.DetailsVisibility == Visibility.Visible 20 | ? Visibility.Collapsed 21 | : Visibility.Visible; 22 | break; 23 | } 24 | } 25 | 26 | public static T GetDataGridRowControl(object sender, string controlName) 27 | { 28 | for (var vis = sender as Visual; vis != null; vis = VisualTreeHelper.GetParent(vis) as Visual) 29 | { 30 | if (!(vis is DataGridRow)) 31 | continue; 32 | 33 | var row = (DataGridRow)vis; 34 | 35 | var control = DataGridHelpers.FindVisualChildren(row).FirstOrDefault(t => t.Name == controlName); 36 | return (T)Convert.ChangeType(control, typeof(T)); 37 | } 38 | 39 | return default(T); 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/DataGrid/GridFilters.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | 3 | namespace D365DeveloperExtensions.Core.DataGrid 4 | { 5 | public class GridFilters 6 | { 7 | public static void SetSelectAll(T1 sender, ObservableCollection list) 8 | { 9 | var changedFilter = (IFilterProperty)sender; 10 | var selectedValue = changedFilter.IsSelected; 11 | 12 | //Set select/unselect all 13 | if (string.IsNullOrEmpty(changedFilter.Value)) 14 | { 15 | var allValue = changedFilter.IsSelected; 16 | if (allValue) 17 | { 18 | for (var i = 1; i < list.Count; i++) 19 | { 20 | var filter = (IFilterProperty)list[i]; 21 | if (filter.IsSelected != true) 22 | filter.IsSelected = true; 23 | } 24 | } 25 | } 26 | else 27 | { 28 | var allFilter = (IFilterProperty)list[0]; 29 | var matchCount = 0; 30 | for (var i = 1; i < list.Count; i++) 31 | { 32 | var filter = (IFilterProperty)list[i]; 33 | if (filter.IsSelected == selectedValue) 34 | matchCount++; 35 | } 36 | 37 | if (matchCount == list.Count - 1) 38 | { 39 | if (allFilter.IsSelected != true) 40 | allFilter.IsSelected = true; 41 | } 42 | else 43 | { 44 | if (allFilter.IsSelected) 45 | allFilter.IsSelected = false; 46 | } 47 | } 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/DataGrid/IFilterProperty.cs: -------------------------------------------------------------------------------- 1 | namespace D365DeveloperExtensions.Core.DataGrid 2 | { 3 | public interface IFilterProperty 4 | { 5 | string Name { get; set; } 6 | string Value { get; set; } 7 | bool IsSelected { get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/DateFormatting.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.Text.RegularExpressions; 4 | 5 | namespace D365DeveloperExtensions.Core 6 | { 7 | public static class DateFormatting 8 | { 9 | public static string MsToReadableTime(int ms) 10 | { 11 | var ts = TimeSpan.FromMilliseconds(ms); 12 | 13 | var parts = $"{ts.Days:D2}d:{ts.Hours:D2}h:{ts.Minutes:D2}m:{ts.Seconds:D2}s:{ts.Milliseconds:D3}ms" 14 | .Split(':') 15 | .SkipWhile(s => Regex.Match(s, @"00\w").Success) 16 | .ToArray(); 17 | var result = string.Join(" ", parts); 18 | 19 | return result; 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Enums/FileExtensionType.cs: -------------------------------------------------------------------------------- 1 | namespace D365DeveloperExtensions.Core.Enums 2 | { 3 | public enum FileExtensionType 4 | { 5 | Html, 6 | Css, 7 | Js, 8 | Xml, 9 | Png, 10 | Jpg, 11 | Gif, 12 | Xap, 13 | Xsl, 14 | Ico, 15 | Svg, 16 | Resx, 17 | Ts, 18 | Map, 19 | None 20 | } 21 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Enums/MapTypes.cs: -------------------------------------------------------------------------------- 1 | namespace D365DeveloperExtensions.Core.Enums 2 | { 3 | public enum MapTypes 4 | { 5 | file, 6 | path, 7 | folder 8 | } 9 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Enums/MetadataType.cs: -------------------------------------------------------------------------------- 1 | namespace D365DeveloperExtensions.Core.Enums 2 | { 3 | public enum MetadataType 4 | { 5 | Entity, 6 | Attribute, 7 | None 8 | } 9 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Enums/OutputLoggerMessageType.cs: -------------------------------------------------------------------------------- 1 | namespace D365DeveloperExtensions.Core.Enums 2 | { 3 | public enum MessageType 4 | { 5 | Error, 6 | Warning, 7 | Info 8 | } 9 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Enums/ProjectType.cs: -------------------------------------------------------------------------------- 1 | namespace D365DeveloperExtensions.Core.Enums 2 | { 3 | public enum ProjectType 4 | { 5 | UnitTest, 6 | Console, 7 | Plugin, 8 | Workflow, 9 | WebResource, 10 | TypeScript, 11 | SolutionPackage, 12 | CustomItem 13 | } 14 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Enums/SolutionPackagerAction.cs: -------------------------------------------------------------------------------- 1 | namespace D365DeveloperExtensions.Core.Enums 2 | { 3 | public enum SolutionPackagerAction 4 | { 5 | Pack, 6 | Extract 7 | } 8 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Enums/SolutionType.cs: -------------------------------------------------------------------------------- 1 | namespace D365DeveloperExtensions.Core.Enums 2 | { 3 | public enum SolutionType 4 | { 5 | Unmanaged, 6 | Managed 7 | } 8 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Enums/TemplatePackageType.cs: -------------------------------------------------------------------------------- 1 | namespace D365DeveloperExtensions.Core.Enums 2 | { 3 | public enum TemplatePackageType 4 | { 5 | None = 0, 6 | Core = 1, 7 | Workflow = 2, 8 | Client = 3 9 | } 10 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Enums/ToolWindowType.cs: -------------------------------------------------------------------------------- 1 | namespace D365DeveloperExtensions.Core.Enums 2 | { 3 | public enum ToolWindowType 4 | { 5 | PluginDeployer, 6 | PluginTraceViewer, 7 | SolutionPackager, 8 | WebResourceDeployer 9 | } 10 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/ExtensionMethods/CheckBoxExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Controls; 2 | 3 | namespace D365DeveloperExtensions.Core.ExtensionMethods 4 | { 5 | public static class CheckBoxExtensions 6 | { 7 | public static bool ReturnValue(this CheckBox checkBox) 8 | { 9 | return checkBox.IsChecked.HasValue && checkBox.IsChecked.Value; 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/ExtensionMethods/StringExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace D365DeveloperExtensions.Core.ExtensionMethods 4 | { 5 | public static class StringExtensions 6 | { 7 | public static bool Contains(this string source, string toCheck, StringComparison comp) 8 | { 9 | return source.IndexOf(toCheck, comp) >= 0; 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Images/github_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/D365DeveloperExtensions.Core/Images/github_20.png -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Images/paypal_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/D365DeveloperExtensions.Core/Images/paypal_20.png -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Images/spkl_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/D365DeveloperExtensions.Core/Images/spkl_20.png -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Localization/LocalizedCategoryAttribute.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel; 3 | using System.Resources; 4 | 5 | namespace D365DeveloperExtensions.Core.Localization 6 | { 7 | public class LocalizedCategoryAttribute : CategoryAttribute 8 | { 9 | private readonly ResourceManager _resourceManager; 10 | private readonly string _resourceKey; 11 | 12 | public LocalizedCategoryAttribute(string resourceKey, Type resourceType) 13 | { 14 | _resourceManager = new ResourceManager(resourceType); 15 | _resourceKey = resourceKey; 16 | } 17 | 18 | protected override string GetLocalizedString(string value) 19 | { 20 | var category = _resourceManager.GetString(_resourceKey); 21 | return string.IsNullOrWhiteSpace(category) ? $"[[{_resourceKey}]]" : category; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Localization/LocalizedDescriptionAttribute.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel; 3 | using System.Resources; 4 | 5 | namespace D365DeveloperExtensions.Core.Localization 6 | { 7 | public class LocalizedDescriptionAttribute : DescriptionAttribute 8 | { 9 | private readonly ResourceManager _resourceManager; 10 | private readonly string _resourceKey; 11 | 12 | public LocalizedDescriptionAttribute(string resourceKey, Type resourceType) 13 | { 14 | _resourceManager = new ResourceManager(resourceType); 15 | _resourceKey = resourceKey; 16 | } 17 | 18 | public override string Description 19 | { 20 | get 21 | { 22 | var description = _resourceManager.GetString(_resourceKey); 23 | return string.IsNullOrWhiteSpace(description) ? $"[[{_resourceKey}]]" : description; 24 | } 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Localization/LocalizedDisplayNameAttribute.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel; 3 | using System.Resources; 4 | 5 | namespace D365DeveloperExtensions.Core.Localization 6 | { 7 | public class LocalizedDisplayNameAttribute : DisplayNameAttribute 8 | { 9 | private readonly ResourceManager _resourceManager; 10 | private readonly string _resourceKey; 11 | 12 | public LocalizedDisplayNameAttribute(string resourceKey, Type resourceType) 13 | { 14 | _resourceManager = new ResourceManager(resourceType); 15 | _resourceKey = resourceKey; 16 | } 17 | 18 | public override string DisplayName 19 | { 20 | get 21 | { 22 | var displayName = _resourceManager.GetString(_resourceKey); 23 | return string.IsNullOrWhiteSpace(displayName) ? $@"[[{_resourceKey}]]" : displayName; 24 | } 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Logging/XrmToolingLogging.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core.Enums; 2 | using D365DeveloperExtensions.Core.Models; 3 | using D365DeveloperExtensions.Core.Resources; 4 | using D365DeveloperExtensions.Core.UserOptions; 5 | using System; 6 | using System.IO; 7 | 8 | namespace D365DeveloperExtensions.Core.Logging 9 | { 10 | public static class XrmToolingLogging 11 | { 12 | public static string GetLogFilePath() 13 | { 14 | var logFilePath = UserOptionsHelper.GetOption(UserOptionProperties.XrmToolingLogFilePath); 15 | 16 | if (!string.IsNullOrEmpty(logFilePath)) 17 | return Path.Combine(logFilePath, "D365DevExXrmToolingLog_" + DateTime.Now.ToString("MMddyyyy") + ".log"); 18 | 19 | logFilePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 20 | OutputLogger.WriteToOutputWindow(Resource.WarningMessage_MissingXrmToolingLogPath, MessageType.Warning); 21 | 22 | return Path.Combine(logFilePath, "D365DevExXrmToolingLog_" + DateTime.Now.ToString("MMddyyyy") + ".log"); 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Models/AssemblyDeploymentType.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace D365DeveloperExtensions.Core.Models 4 | { 5 | public class AssemblyDeploymentType 6 | { 7 | public string Name { get; set; } 8 | public int Value { get; set; } 9 | } 10 | 11 | public static class AssemblyDeploymentTypes 12 | { 13 | public static List Types => new List { 14 | new AssemblyDeploymentType{Name = "Assembly Only", Value = 0}, 15 | new AssemblyDeploymentType{Name = "Spkl", Value = 1} 16 | }; 17 | } 18 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Models/InfobarActionItemEventArgs.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.VisualStudio.Shell.Interop; 2 | 3 | namespace D365DeveloperExtensions.Core.Models 4 | { 5 | public class InfobarActionItemEventArgs 6 | { 7 | public IVsInfoBarUIElement InfoBarElement { get; set; } 8 | public IVsInfoBarActionItem InfobarActionItem { get; set; } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Models/MockingFramework.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | 3 | namespace D365DeveloperExtensions.Core.Models 4 | { 5 | public class MockingFramework 6 | { 7 | public string Name { get; set; } 8 | public string NugetName { get; set; } 9 | public int CrmMajorVersion { get; set; } 10 | } 11 | 12 | public static class MockingFrameworks 13 | { 14 | public static ObservableCollection GetMockingFrameworks() 15 | { 16 | return new ObservableCollection { 17 | new MockingFramework{CrmMajorVersion = 9, Name = "XrmUnitTest", NugetName = "XrmUnitTest.09"}, 18 | new MockingFramework{CrmMajorVersion = 8, Name = "XrmUnitTest", NugetName = "XrmUnitTest.2016"}, 19 | new MockingFramework{CrmMajorVersion = 7, Name = "XrmUnitTest", NugetName = "XrmUnitTest.2015"}, 20 | new MockingFramework{CrmMajorVersion = 6, Name = "XrmUnitTest", NugetName = "XrmUnitTest.2013"}, 21 | new MockingFramework{CrmMajorVersion = 9, Name = "FakeXrmEasy", NugetName = "FakeXrmEasy.9"}, 22 | new MockingFramework{CrmMajorVersion = 8, Name = "FakeXrmEasy", NugetName = "FakeXrmEasy.365"}, 23 | new MockingFramework{CrmMajorVersion = 8, Name = "FakeXrmEasy", NugetName = "FakeXrmEasy.2016"}, 24 | new MockingFramework{CrmMajorVersion = 7, Name = "FakeXrmEasy", NugetName = "FakeXrmEasy.2015"}, 25 | new MockingFramework{CrmMajorVersion = 6, Name = "FakeXrmEasy", NugetName = "FakeXrmEasy.2013"}, 26 | new MockingFramework{CrmMajorVersion = 5, Name = "FakeXrmEasy", NugetName = "FakeXrmEasy"} 27 | }; 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Models/MockingFrameworkListItem.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.Runtime.CompilerServices; 3 | 4 | namespace D365DeveloperExtensions.Core.Models 5 | { 6 | public class MockingFrameworkListItem : INotifyPropertyChanged 7 | { 8 | private string _name; 9 | 10 | public MockingFramework MockingFramework { get; set; } 11 | public string Name 12 | { 13 | get => _name; 14 | set 15 | { 16 | _name = value; 17 | OnPropertyChanged(); 18 | } 19 | } 20 | 21 | public event PropertyChangedEventHandler PropertyChanged; 22 | 23 | protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 24 | { 25 | PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Models/MovedProjectItem.cs: -------------------------------------------------------------------------------- 1 | using EnvDTE; 2 | 3 | namespace D365DeveloperExtensions.Core.Models 4 | { 5 | public class MovedProjectItem 6 | { 7 | public ProjectItem ProjectItem { get; set; } 8 | public string OldName { get; set; } 9 | public uint ProjectItemId { get; set; } 10 | } 11 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Models/NpmHistory.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace D365DeveloperExtensions.Core.Models 4 | { 5 | public class NpmHistory 6 | { 7 | public string name { get; set; } 8 | public string description { get; set; } 9 | public string license { get; set; } 10 | public List versions { get; set; } 11 | } 12 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Models/NpmPackage.cs: -------------------------------------------------------------------------------- 1 | namespace D365DeveloperExtensions.Core.Models 2 | { 3 | public class NpmPackage 4 | { 5 | public string Name { get; set; } 6 | public string Version { get; set; } 7 | } 8 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Models/NuGetPackage.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace D365DeveloperExtensions.Core.Models 4 | { 5 | public class NuGetPackage 6 | { 7 | public string Id { get; set; } 8 | public string Name { get; set; } 9 | public Version Version { get; set; } 10 | public string VersionText { get; set; } 11 | public bool XrmToolingClient { get; set; } 12 | public string LicenseUrl { get; set; } 13 | } 14 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Models/ProjectListItem.cs: -------------------------------------------------------------------------------- 1 | using EnvDTE; 2 | using System.ComponentModel; 3 | using System.Runtime.CompilerServices; 4 | 5 | namespace D365DeveloperExtensions.Core.Models 6 | { 7 | public class ProjectListItem : INotifyPropertyChanged 8 | { 9 | private string _name; 10 | 11 | public Project Project { get; set; } 12 | public string Name 13 | { 14 | get => _name; 15 | set 16 | { 17 | _name = value; 18 | OnPropertyChanged(); 19 | } 20 | } 21 | 22 | public event PropertyChangedEventHandler PropertyChanged; 23 | 24 | protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 25 | { 26 | PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Models/ToolWindow.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using D365DeveloperExtensions.Core.Enums; 3 | 4 | namespace D365DeveloperExtensions.Core.Models 5 | { 6 | public class ToolWindow 7 | { 8 | public Guid ToolWindowsId { get; set; } 9 | public ToolWindowType Type { get; set; } 10 | } 11 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Models/UserOptionProperty.cs: -------------------------------------------------------------------------------- 1 | namespace D365DeveloperExtensions.Core.Models 2 | { 3 | public class UserOptionProperty 4 | { 5 | public string Name { get; set; } 6 | public string Page { get; set; } 7 | } 8 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("D365DeveloperExtensions.Core")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("D365DeveloperExtensions.Core")] 12 | [assembly: AssemblyCopyright("Copyright © 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // Version information for an assembly consists of the following four values: 22 | // 23 | // Major Version 24 | // Minor Version 25 | // Build Number 26 | // Revision 27 | // 28 | // You can specify all the values or you can default the Build and Revision Numbers 29 | // by using the '*' as shown below: 30 | // [assembly: AssemblyVersion("1.0.*")] 31 | [assembly: AssemblyVersion("1.0.0.0")] 32 | [assembly: AssemblyFileVersion("1.0.0.0")] 33 | -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/StringFormatting.cs: -------------------------------------------------------------------------------- 1 | namespace D365DeveloperExtensions.Core 2 | { 3 | public class StringFormatting 4 | { 5 | public static string RemoveBracesToUpper(string value) 6 | { 7 | value = value.Replace("{", string.Empty).Replace("}", string.Empty); 8 | 9 | return value.ToUpper(); 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/TemplateHandler.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core.Enums; 2 | using D365DeveloperExtensions.Core.Logging; 3 | using D365DeveloperExtensions.Core.Resources; 4 | using EnvDTE; 5 | using NLog; 6 | using System; 7 | using System.IO; 8 | using System.Reflection; 9 | using System.Windows; 10 | 11 | namespace D365DeveloperExtensions.Core 12 | { 13 | public class TemplateHandler 14 | { 15 | private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); 16 | 17 | public static void AddFileFromTemplate(Project project, string templatePartialPath, string filename) 18 | { 19 | try 20 | { 21 | var codebase = Assembly.GetExecutingAssembly().CodeBase; 22 | var uri = new Uri(codebase, UriKind.Absolute); 23 | var path = Path.GetDirectoryName(uri.LocalPath); 24 | 25 | if (string.IsNullOrEmpty(path)) 26 | { 27 | OutputLogger.WriteToOutputWindow($"{Resource.ErrorMessage_FindTemplateDirectory}: {path}", MessageType.Error); 28 | return; 29 | } 30 | 31 | //TODO: update path for localization 32 | var templatePath = Path.Combine(path, $@"ItemTemplates\CSharp\D365 DevEx\1033\{templatePartialPath}.vstemplate"); 33 | 34 | project.ProjectItems.AddFromTemplate(templatePath, filename); 35 | } 36 | catch (Exception ex) 37 | { 38 | ExceptionHandler.LogException(Logger, $"{Resource.ErrorMessage_CreateFileFromTemplate}: {filename}", ex); 39 | MessageBox.Show($"{Resource.ErrorMessage_CreateFileFromTemplate}: {filename}"); 40 | } 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/UserOptions/UserOptionsHelper.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core.Models; 2 | 3 | namespace D365DeveloperExtensions.Core.UserOptions 4 | { 5 | public class UserOptionsHelper 6 | { 7 | public static T GetOption(UserOptionProperty userOptionProperty) 8 | { 9 | var option = SharedGlobals.GetGlobal(userOptionProperty.Name); 10 | return (T)option; 11 | } 12 | 13 | public static void SetOption(UserOptionProperty userOptionProperty, T value) 14 | { 15 | SharedGlobals.SetGlobal(userOptionProperty.Name, value); 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions.Core/Versioning.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Text.RegularExpressions; 3 | 4 | namespace D365DeveloperExtensions.Core 5 | { 6 | public static class Versioning 7 | { 8 | public static Version StringToVersion(string version) 9 | { 10 | if (string.IsNullOrEmpty(version)) 11 | return new Version(0, 0, 0, 0); 12 | 13 | var cleanVersion = Regex.Replace(version, "[^0-9.]", string.Empty); 14 | 15 | return Version.Parse(cleanVersion); 16 | } 17 | 18 | public static Version SolutionNameToVersion(string name) 19 | { 20 | name = name.ToLower().Replace(".zip", string.Empty); 21 | var index = name.IndexOf("_", StringComparison.Ordinal); 22 | name = name.Remove(index, 1); 23 | name = name.Replace("_", "."); 24 | name = name.Substring(1); 25 | 26 | return StringToVersion(name); 27 | } 28 | 29 | public static bool DoAssemblyVersionsMatch(Version aVersion, Version bVersion) 30 | { 31 | return aVersion.Major == bVersion.Major && 32 | aVersion.Minor == bVersion.Minor; 33 | } 34 | 35 | public static Version ValidateVersionInput(string majorIn, string minorIn, string buildIn, string revisionIn) 36 | { 37 | var isMajorInt = int.TryParse(majorIn, out var major); 38 | var isMinorInt = int.TryParse(minorIn, out var minor); 39 | var isBuildInt = int.TryParse(buildIn, out var build); 40 | var isRevisionInt = int.TryParse(revisionIn, out var revision); 41 | 42 | if (!isMajorInt || !isMinorInt) 43 | return null; 44 | 45 | var v = string.Concat(major, ".", minor, isBuildInt ? $".{build}" : null, 46 | isRevisionInt ? $".{revision}" : null); 47 | 48 | return new Version(v); 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions/D365DevExKey.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/D365DeveloperExtensions/D365DevExKey.snk -------------------------------------------------------------------------------- /D365DeveloperExtensions/D365DeveloperExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace D365DeveloperExtensions 4 | { 5 | /// 6 | /// Helper class that exposes all GUIDs used across VS Package. 7 | /// 8 | internal sealed class PackageGuids 9 | { 10 | public const string GuidD365DeveloperExtensionsPkgString = "A4FA8F78-98AF-4633-8621-BBDD7792A6AC"; 11 | public const string GuidD365DevExCmdSetString = "95CD7B0B-0592-4683-B42C-A79A41380FFE"; 12 | public static Guid GuidD365DeveloperExtensionsPkg = new Guid(GuidD365DeveloperExtensionsPkgString); 13 | public static Guid GuidD365DevExCmdSet = new Guid(GuidD365DevExCmdSetString); 14 | } 15 | /// 16 | /// Helper class that encapsulates all CommandIDs uses across VS Package. 17 | /// 18 | internal sealed class PackageIds 19 | { 20 | public const int SolutionMenuGroup = 0x1020; 21 | public const int CmdidPluginDeployerWindow = 0x0101; 22 | public const int CmdidWebResourceDeployerWindow = 0x0102; 23 | public const int CmdidPluginTraceViewerWindow = 0x0103; 24 | public const int CmdidSolutionPackagerWindow = 0x0104; 25 | public const int CmdidCrmIntellisenseOn = 0x0108; 26 | public const int CmdidCrmIntellisenseOff = 0x0109; 27 | public const int TopLevelMenu = 0x0100; 28 | public const int TopLevelMenuGroup = 0x0200; 29 | 30 | public const int CmdidNuGetSdkToolsPrt = 0x0106; 31 | public const int CmdidNuGetSdkToolsCore = 0x0107; 32 | public const int NuGetSdkSubMenu = 0x1100; 33 | public const int NuGetSdkSubMenuGroup = 0x0105; 34 | } 35 | } -------------------------------------------------------------------------------- /D365DeveloperExtensions/D365DexEv.pkgdef: -------------------------------------------------------------------------------- 1 | [$RootKey$\BindingPaths\{a4fa8f78-98af-4633-8621-bbdd7792a6ac}] 2 | "$PackageFolder$"="" -------------------------------------------------------------------------------- /D365DeveloperExtensions/License.txt: -------------------------------------------------------------------------------- 1 | Dynamics 365 Developer Extensions - https://github.com/trsharp/D365DeveloperExtensions 2 | 3 | MIT License 4 | 5 | Copyright (c) 2020 Travis Sharp, Original Author Jason Lattimer 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 8 | 9 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 10 | 11 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 12 | 13 | Not produced, endorsed, or affiliated with Microsoft in any way. -------------------------------------------------------------------------------- /D365DeveloperExtensions/Microsoft.Xrm.Tooling.Ui.Styles.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/D365DeveloperExtensions/Microsoft.Xrm.Tooling.Ui.Styles.dll -------------------------------------------------------------------------------- /D365DeveloperExtensions/Newtonsoft.Json.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/D365DeveloperExtensions/Newtonsoft.Json.dll -------------------------------------------------------------------------------- /D365DeveloperExtensions/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | [assembly: AssemblyTitle("D365DeveloperExtensions")] 5 | [assembly: AssemblyDescription("")] 6 | [assembly: AssemblyConfiguration("")] 7 | [assembly: AssemblyCompany("")] 8 | [assembly: AssemblyProduct("D365DeveloperExtensions")] 9 | [assembly: AssemblyCopyright("Copyright © 2021")] 10 | [assembly: AssemblyTrademark("")] 11 | [assembly: AssemblyCulture("")] 12 | [assembly: ComVisible(false)] 13 | [assembly: AssemblyVersion("2.0.21263.0440")] 14 | [assembly: AssemblyFileVersion("2.0.21263.0440")] -------------------------------------------------------------------------------- /D365DeveloperExtensions/Resources/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/D365DeveloperExtensions/Resources/icon.ico -------------------------------------------------------------------------------- /D365DeveloperExtensions/Resources/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/D365DeveloperExtensions/Resources/preview.png -------------------------------------------------------------------------------- /D365DeveloperExtensions/StartupTasks.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core.Logging; 2 | 3 | //These items should run when the extension is first loaded at Visual Studio startup 4 | namespace D365DeveloperExtensions 5 | { 6 | public static class StartupTasks 7 | { 8 | public static void Run() 9 | { 10 | SetupLogging(); 11 | } 12 | 13 | private static void SetupLogging() 14 | { 15 | var logger = new ExtensionLogger(); 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpCustom/CSharpCustom.vstemplate: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | D365 CE/CRM Custom Template 5 | Dynamics 365 CE/CRM Custom Code Template 6 | icon.png 7 | 092ae839-3afe-40f5-8724-4bcbdc2f57f4 8 | CSharp 9 | 4.0 10 | 1 11 | Class.cs 12 | 13 | 14 | Class.cs 15 | 16 | 17 | TemplateWizards, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 18 | TemplateWizards.ProjectTemplateWizard 19 | 20 | 21 | CustomItem 22 | false 23 | false 24 | false 25 | false 26 | false 27 | false 28 | 29 | -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpCustom/Class.cs: -------------------------------------------------------------------------------- 1 | $customtemplate$ -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpCustom/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("CSharpCustom")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("Jason Lattimer")] 11 | [assembly: AssemblyProduct("CSharpCustom")] 12 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("99eac9d1-c05d-4cac-867e-e4862017f488")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpCustom/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ItemTemplates/CSharp/CSharpCustom/icon.png -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpPluginClass/PluginClass.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xrm.Sdk; 2 | using Microsoft.Xrm.Sdk.Query; 3 | using System; 4 | 5 | namespace $rootnamespace$ 6 | { 7 | public class $safeitemname$ : IPlugin 8 | { 9 | #region Secure/Unsecure Configuration Setup 10 | private string _secureConfig = null; 11 | private string _unsecureConfig = null; 12 | 13 | public $safeitemname$(string unsecureConfig, string secureConfig) 14 | { 15 | _secureConfig = secureConfig; 16 | _unsecureConfig = unsecureConfig; 17 | } 18 | #endregion 19 | public void Execute(IServiceProvider serviceProvider) 20 | { 21 | ITracingService tracer = (ITracingService)serviceProvider.GetService(typeof(ITracingService)); 22 | IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); 23 | IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); 24 | IOrganizationService service = factory.CreateOrganizationService(context.UserId); 25 | 26 | try 27 | { 28 | Entity target = (Entity)context.InputParameters["Target"]; 29 | 30 | //TODO: Do stuff 31 | } 32 | catch (Exception e) 33 | { 34 | throw new InvalidPluginExecutionException(e.Message); 35 | } 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpPluginClass/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("CSharpPluginClass")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("Jason Lattimer")] 11 | [assembly: AssemblyProduct("CSharpPluginClass")] 12 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("0b7f7208-b7c4-4c79-bcbd-f5c0a46a5600")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpPluginClass/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ItemTemplates/CSharp/CSharpPluginClass/icon.png -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSdkPluginBaseClass/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("CSharpSdkPluginBaseClass")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("Jason Lattimer")] 11 | [assembly: AssemblyProduct("CSharpSdkPluginBaseClass")] 12 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("0b7f7208-b7c4-4c79-bcbd-f5c0a46a5600")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSdkPluginBaseClass/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ItemTemplates/CSharp/CSharpSdkPluginBaseClass/icon.png -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSdkPluginFromBaseClass/PluginClass.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ServiceModel; 3 | using Microsoft.Xrm.Sdk; 4 | 5 | namespace $rootnamespace$ 6 | { 7 | public class $safeitemname$ : PluginBase 8 | { 9 | #region Constructor/Configuration 10 | private string _secureConfig = null; 11 | private string _unsecureConfig = null; 12 | 13 | public $safeitemname$(string unsecure, string secureConfig) 14 | : base(typeof($safeitemname$)) 15 | { 16 | _secureConfig = secureConfig; 17 | _unsecureConfig = unsecure; 18 | } 19 | #endregion 20 | 21 | protected override void ExecuteCrmPlugin(LocalPluginContext localContext) 22 | { 23 | if (localContext == null) 24 | throw new ArgumentNullException(nameof(localContext)); 25 | 26 | // TODO: Implement your custom code 27 | 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSdkPluginFromBaseClass/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("CSharpSdkPluginFromBaseClass")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("Jason Lattimer")] 11 | [assembly: AssemblyProduct("CSharpSdkPluginFromBaseClass")] 12 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("0b7f7208-b7c4-4c79-bcbd-f5c0a46a5600")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSdkPluginFromBaseClass/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ItemTemplates/CSharp/CSharpSdkPluginFromBaseClass/icon.png -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSdkWorkflowBaseClass/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("CSharpSdkWorkflowBaseClass")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Jason Lattimer")] 12 | [assembly: AssemblyProduct("CSharpSdkWorkflowBaseClass")] 13 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2018")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("de98394e-6fb5-49c2-9f3b-fe0ae1c36bf4")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSdkWorkflowBaseClass/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ItemTemplates/CSharp/CSharpSdkWorkflowBaseClass/icon.png -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSdkWorkflowFromBaseClass/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("CSharpSdkWorkflowFromBaseClass")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Jason Lattimer")] 12 | [assembly: AssemblyProduct("CSharpSdkWorkflowFromBaseClass")] 13 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2018")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("c39d35b0-897d-4bdd-b050-29b7c529a3e1")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSdkWorkflowFromBaseClass/WorkflowClass.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xrm.Sdk; 2 | using Microsoft.Xrm.Sdk.Workflow; 3 | using System; 4 | using System.Activities; 5 | 6 | namespace $rootnamespace$ 7 | { 8 | public class $safeitemname$ : WorkFlowActivityBase 9 | { 10 | protected override void ExecuteCrmWorkFlowActivity(CodeActivityContext context, LocalWorkflowContext localContext) 11 | { 12 | if (context == null) 13 | throw new ArgumentNullException(nameof(context)); 14 | if (localContext == null) 15 | throw new ArgumentNullException(nameof(localContext)); 16 | 17 | // TODO: Implement your custom code 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSdkWorkflowFromBaseClass/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ItemTemplates/CSharp/CSharpSdkWorkflowFromBaseClass/icon.png -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSolutionPackagerMap/CSharpSolutionPackagerMap.vstemplate: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | D365 CE/CRM SolutionPackager Map 5 | Dynamics 365 CE/CRM SolutionPackager Map 6 | icon.png 7 | c98c3ee9-bec1-4e9a-ad8c-da628632027b 8 | CSharp 9 | 4.0 10 | 1 11 | mapping.xml 12 | 13 | 14 | 15 | 16 | System 17 | 18 | 19 | mapping.xml 20 | 21 | -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSolutionPackagerMap/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("CSharpSolutionPackagerMap")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("Jason Lattimer")] 11 | [assembly: AssemblyProduct("CSharpSolutionPackagerMap")] 12 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("e8d7659c-bb6b-4fdf-b0d8-6e6007f4696f")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSolutionPackagerMap/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ItemTemplates/CSharp/CSharpSolutionPackagerMap/icon.png -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSolutionPackagerMap/mapping.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | --> 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSpklConfig/CSharpSpklConfig.vstemplate: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | D365 CE/CRM Spkl configuration file 5 | Creates a default spkl.json file. 6 | 09907b4c-511a-4030-92ab-c5bb200d5527 7 | CSharp 8 | 4.0 9 | 1 10 | spkl.json 11 | true 12 | 13 | 14 | 15 | 16 | System 17 | 18 | 19 | spkl.json 20 | 21 | -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSpklConfig/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("CSharpSpklConfig")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("Jason Lattimer")] 11 | [assembly: AssemblyProduct("CSharpSpklConfig")] 12 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("7aa29dbf-a2e3-4565-a84a-b7694617e15e")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSpklRegAttributes/CSharpSpklRegAttributes.vstemplate: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | D365 CE/CRM Spkl Plug-in Registration Attributes 5 | Required for adding assembly registration details from CRM/365 and deploying - DO NOT RENAME! 6 | icon.png 7 | 2cbd34be-f54c-4cfa-bcd7-5de379c5d074 8 | CSharp 9 | 4.0 10 | 1 11 | CrmPluginRegistrationAttribute.cs 12 | 13 | 14 | 15 | 16 | System 17 | 18 | 19 | CrmPluginRegistrationAttribute.cs 20 | 21 | -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSpklRegAttributes/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("CSharpSpklRegAttributes")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("Jason Lattimer")] 11 | [assembly: AssemblyProduct("CSharpSpklRegAttributes")] 12 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("a441e65d-eb41-4a68-90a4-e511bba05a1a")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpSpklRegAttributes/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ItemTemplates/CSharp/CSharpSpklRegAttributes/icon.png -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpWorkflowClass/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("CSharpWorkflowClass")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("Jason Lattimer")] 11 | [assembly: AssemblyProduct("CSharpWorkflowClass")] 12 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("cd9bbf13-b6a5-4dc0-a698-d1c323a63cc9")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpWorkflowClass/WorkflowClass.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xrm.Sdk; 2 | using Microsoft.Xrm.Sdk.Workflow; 3 | using System; 4 | using System.Activities; 5 | 6 | namespace $rootnamespace$ 7 | { 8 | public class $safeitemname$ : CodeActivity 9 | { 10 | protected override void Execute(CodeActivityContext executionContext) 11 | { 12 | ITracingService tracer = executionContext.GetExtension(); 13 | IWorkflowContext context = executionContext.GetExtension(); 14 | IOrganizationServiceFactory serviceFactory = executionContext.GetExtension(); 15 | IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); 16 | 17 | try 18 | { 19 | Entity target = (Entity) context.InputParameters["Target"]; 20 | 21 | //TODO: Do stuff 22 | } 23 | catch (Exception e) 24 | { 25 | throw new InvalidPluginExecutionException(e.Message); 26 | } 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /ItemTemplates/CSharp/CSharpWorkflowClass/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ItemTemplates/CSharp/CSharpWorkflowClass/icon.png -------------------------------------------------------------------------------- /ItemTemplates/Web/CSharp/WebCSharpSolutionPackagerMap/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("CSharpSolutionPackagerMap")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("Jason Lattimer")] 11 | [assembly: AssemblyProduct("CSharpSolutionPackagerMap")] 12 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("e8d7659c-bb6b-4fdf-b0d8-6e6007f4696f")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /ItemTemplates/Web/CSharp/WebCSharpSolutionPackagerMap/WebCSharpSolutionPackagerMap.vstemplate: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | D365 CE/CRM SolutionPackager Map 5 | Dynamics 365 CE/CRM SolutionPackager Map 6 | icon.png 7 | c98c3ee9-bec1-4e9a-ad8c-da628632027b 8 | Web 9 | CSharp 10 | 4.0 11 | 1 12 | mapping.xml 13 | 14 | 15 | 16 | 17 | System 18 | 19 | 20 | mapping.xml 21 | 22 | -------------------------------------------------------------------------------- /ItemTemplates/Web/CSharp/WebCSharpSolutionPackagerMap/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ItemTemplates/Web/CSharp/WebCSharpSolutionPackagerMap/icon.png -------------------------------------------------------------------------------- /ItemTemplates/Web/CSharp/WebCSharpSolutionPackagerMap/mapping.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | --> 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Jason Lattimer 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | Not produced, endorsed, or affiliated with Microsoft in any way. 24 | -------------------------------------------------------------------------------- /NuGetRetriever/D365DevExKey.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/NuGetRetriever/D365DevExKey.snk -------------------------------------------------------------------------------- /NuGetRetriever/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("NuGetRetriever")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("NuGetRetriever")] 12 | [assembly: AssemblyCopyright("Copyright © 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("bd5abc7e-6459-4cfb-82bd-39643599a285")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /NuGetRetriever/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /PluginDeployer/Config/Mapping.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core; 2 | using D365DeveloperExtensions.Core.Models; 3 | using EnvDTE; 4 | using System.Linq; 5 | 6 | namespace PluginDeployer.Config 7 | { 8 | public static class Mapping 9 | { 10 | public static PluginDeployConfig GetSpklPluginConfig(Project project, string profile) 11 | { 12 | var spklConfig = D365DeveloperExtensions.Core.Config.Mapping.GetSpklConfigFile(project); 13 | 14 | var spklPluginDeployConfigs = spklConfig.plugins; 15 | if (spklPluginDeployConfigs == null) 16 | return null; 17 | 18 | return profile.StartsWith(ExtensionConstants.NoProfilesText) 19 | ? spklPluginDeployConfigs[0] 20 | : spklPluginDeployConfigs.FirstOrDefault(p => p.profile == profile); 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /PluginDeployer/Converters/EnableGetAttributesButtonConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using System.Windows.Data; 4 | 5 | namespace PluginDeployer.Converters 6 | { 7 | public class EnableGetAttributesButtonConverter : IMultiValueConverter 8 | { 9 | public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 10 | { 11 | //Not connected 12 | var hasConnected = bool.TryParse(values[0]?.ToString(), out var isConnected); 13 | if (!hasConnected) 14 | return false; 15 | if (!isConnected) 16 | return false; 17 | 18 | //DeploymentType 19 | var hasDeploymentType = int.TryParse(values[1]?.ToString(), out var deploymentType); 20 | if (!hasDeploymentType) 21 | return false; 22 | 23 | return deploymentType != 0; 24 | } 25 | 26 | public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 27 | { 28 | throw new NotImplementedException(); 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /PluginDeployer/Converters/EnablePublishConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using System.Windows.Data; 4 | 5 | namespace PluginDeployer.Converters 6 | { 7 | public class EnablePublishConverter : IMultiValueConverter 8 | { 9 | public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 10 | { 11 | //Not connected 12 | var hasConnected = bool.TryParse(values[0]?.ToString(), out var isConnected); 13 | if (!hasConnected) 14 | return false; 15 | if (!isConnected) 16 | return false; 17 | 18 | //DeploymentType 19 | var hasDeploymentType = int.TryParse(values[1]?.ToString(), out var deploymentType); 20 | if (!hasDeploymentType) 21 | return false; 22 | 23 | return deploymentType == 1; 24 | } 25 | 26 | public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 27 | { 28 | throw new NotImplementedException(); 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /PluginDeployer/D365DevExKey.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/PluginDeployer/D365DevExKey.snk -------------------------------------------------------------------------------- /PluginDeployer/Models/PluginData.cs: -------------------------------------------------------------------------------- 1 | using PluginDeployer.Spkl; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Reflection; 5 | 6 | namespace PluginDeployer.Models 7 | { 8 | [Serializable] 9 | public class PluginData 10 | { 11 | public string AssemblyFullName { get; set; } 12 | public AssemblyName AssemblyName { get; set; } 13 | public List CrmPluginRegistrationAttributes { get; set; } 14 | } 15 | } -------------------------------------------------------------------------------- /PluginDeployer/PluginDeployerHost.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.VisualStudio.Shell; 2 | using System.Runtime.InteropServices; 3 | 4 | namespace PluginDeployer 5 | { 6 | [Guid("FA0E0759-D337-4C4C-8474-217A6BDC3C06")] //Also located in ExtensionConstants.cs 7 | public sealed class PluginDeployerHost : ToolWindowPane 8 | { 9 | public PluginDeployerHost() : base(null) 10 | { 11 | Caption = Resources.Resource.PluginDeployer_Window_Title; 12 | BitmapResourceID = 301; 13 | BitmapIndex = 1; 14 | Content = new PluginDeployerWindow(); 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /PluginDeployer/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("PluginDeployer")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("PluginDeployer")] 12 | [assembly: AssemblyCopyright("Copyright © 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("64ca2809-abe4-47a5-ab20-086578c1b847")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /PluginDeployer/PrtHelper.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core; 2 | using D365DeveloperExtensions.Core.Models; 3 | using D365DeveloperExtensions.Core.UserOptions; 4 | using NLog; 5 | using PluginDeployer.Resources; 6 | using System; 7 | using System.IO; 8 | using System.Windows; 9 | 10 | namespace PluginDeployer 11 | { 12 | public class PrtHelper 13 | { 14 | private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); 15 | 16 | public static void OpenPrt() 17 | { 18 | var path = UserOptionsHelper.GetOption(UserOptionProperties.PluginRegistrationToolPath); 19 | 20 | if (string.IsNullOrEmpty(path)) 21 | { 22 | MessageBox.Show(Resource.MessageBox_SetPRTOptionsPath); 23 | return; 24 | } 25 | 26 | if (!path.EndsWith("exe", StringComparison.CurrentCultureIgnoreCase)) 27 | path = Path.Combine(path, "PluginRegistration.exe"); 28 | 29 | if (!File.Exists(path)) 30 | { 31 | MessageBox.Show($"{Resource.MessageBox_PRTNotFound}: " + path); 32 | return; 33 | } 34 | 35 | StartPrt(path); 36 | } 37 | 38 | private static void StartPrt(string path) 39 | { 40 | try 41 | { 42 | System.Diagnostics.Process.Start(path); 43 | } 44 | catch (Exception ex) 45 | { 46 | ExceptionHandler.LogException(Logger, Resource.ErrorMessage_ErrorLaunchingPRT, ex); 47 | MessageBox.Show(Resource.ErrorMessage_ErrorLaunchingPRT); 48 | } 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /PluginDeployer/Spkl/Config/EarlyBoundTypeConfig.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace PluginDeployer.Spkl.Config 8 | { 9 | public class EarlyBoundTypeConfig 10 | { 11 | public string profile; 12 | public string entities; 13 | public string actions; 14 | public bool generateOptionsetEnums; 15 | public bool generateGlobalOptionsets; 16 | public bool generateStateEnums; 17 | public string filename; 18 | public string classNamespace; 19 | public string serviceContextName; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /PluginDeployer/Spkl/Config/IConfigFileService.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace PluginDeployer.Spkl.Config 4 | { 5 | public interface IConfigFileService 6 | { 7 | List FindConfig(string folder, bool raiseErrorIfNotFound = true); 8 | } 9 | } -------------------------------------------------------------------------------- /PluginDeployer/Spkl/Config/MapTypes.cs: -------------------------------------------------------------------------------- 1 | namespace PluginDeployer.Spkl.Config 2 | { 3 | 4 | public enum MapTypes 5 | { 6 | file, 7 | path, 8 | folder 9 | } 10 | 11 | } -------------------------------------------------------------------------------- /PluginDeployer/Spkl/Config/PluginDeployConfig.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace PluginDeployer.Spkl.Config 8 | { 9 | public class PluginDeployConfig 10 | { 11 | public string profile; 12 | public string solution; 13 | public string assemblypath; 14 | public string classRegex; 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /PluginDeployer/Spkl/Config/SolutionPackageConfig.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Newtonsoft.Json; 3 | using Newtonsoft.Json.Converters; 4 | 5 | namespace PluginDeployer.Spkl.Config 6 | { 7 | public enum PackageType 8 | { 9 | unmanaged, 10 | managed 11 | } 12 | public class SolutionPackageConfig 13 | { 14 | public string profile; 15 | public string solution_uniquename; // unique name of the solution to pack/unpack 16 | public string packagepath; // Relative folder to unpack the package to 17 | public string solutionpath; // Path and name of the solution - e.g. solution/MySolution_{0}_{1}_{2}_{3}.zip 18 | [JsonConverter(typeof(StringEnumConverter))] 19 | public PackageType packagetype; 20 | public string diffpath; 21 | public bool increment_on_import; // Increment the minor version of the solution after importing from the package folder 22 | public List map; // Map source files to the package folder 23 | } 24 | } -------------------------------------------------------------------------------- /PluginDeployer/Spkl/Config/SolutionPackageMap.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using Newtonsoft.Json.Converters; 3 | 4 | namespace PluginDeployer.Spkl.Config 5 | { 6 | public class SolutionPackageMap 7 | { 8 | [JsonConverter(typeof(StringEnumConverter))] 9 | public MapTypes map; 10 | public string from; 11 | public string to; 12 | } 13 | } -------------------------------------------------------------------------------- /PluginDeployer/Spkl/Config/WebResource.cs: -------------------------------------------------------------------------------- 1 | namespace PluginDeployer.Spkl.Config 2 | { 3 | public class WebResourceFile 4 | { 5 | public string uniquename; 6 | public string displayname; 7 | public string file; 8 | public string description; 9 | } 10 | } -------------------------------------------------------------------------------- /PluginDeployer/Spkl/Config/WebresourceDeployConfig.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using PluginDeployer.Spkl.Config; 7 | 8 | namespace PluginDeployer.Spkl.Config 9 | { 10 | public class WebresourceDeployConfig 11 | { 12 | public string profile; 13 | public string root; 14 | public string solution; 15 | public List files; 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /PluginDeployer/Spkl/Exceptions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace PluginDeployer.Spkl 8 | { 9 | [Serializable] 10 | public class SparkleTaskException : Exception 11 | { 12 | public enum ExceptionTypes { 13 | DUPLICATE_STEP, 14 | DUPLICATE_FILE, 15 | CONFIG_NOTFOUND, 16 | NO_TASK_SUPPLIED, 17 | AUTH_ERROR, 18 | UTILSNOTFOUND, 19 | MISSING_PREFIX, 20 | IMPORT_ERROR, 21 | CRMSVCUTIL_ERROR, 22 | SOLUTIONPACKAGER_ERROR, 23 | NO_WEBRESOURCES_FOUND 24 | } 25 | 26 | public ExceptionTypes ExceptionType { get; protected set; } 27 | public SparkleTaskException(ExceptionTypes exectionType, string message) :base (message) 28 | { 29 | ExceptionType = exectionType; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /PluginDeployer/Spkl/IDirectoryService.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace PluginDeployer.Spkl 4 | { 5 | public interface IDirectoryService 6 | { 7 | string GetApplicationDirectory(); 8 | string SimpleSearch(string path, string search); 9 | List Search(string path, string search); 10 | void SaveFile(string filename, byte[] content, bool overwrite); 11 | } 12 | } -------------------------------------------------------------------------------- /PluginDeployer/Spkl/ITrace.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace PluginDeployer.Spkl 8 | { 9 | public interface ITrace 10 | { 11 | void WriteLine(string format, params object[] args); 12 | void Write(string format, params object[] args); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /PluginDeployer/Spkl/ServiceLocator.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.Design; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | using PluginDeployer.Spkl.Config; 8 | using PluginDeployer.Spkl.Tasks; 9 | 10 | namespace PluginDeployer.Spkl 11 | { 12 | public class ServiceLocator 13 | { 14 | public static ServiceContainer ServiceProvider; 15 | 16 | static ServiceLocator() 17 | { 18 | Init(); 19 | } 20 | public static void Reset() 21 | { 22 | ServiceProvider = new ServiceContainer(); 23 | } 24 | public static void Init() 25 | { 26 | // Add standard services 27 | Reset(); 28 | ServiceProvider.AddService(typeof(IConfigFileService), new ConfigFileService()); 29 | ServiceProvider.AddService(typeof(IDirectoryService), new DirectoryService()); 30 | ServiceProvider.AddService(typeof(IQueries), new Queries()); 31 | } 32 | 33 | public static IConfigFileService ConfigFileFactory 34 | { 35 | get 36 | { 37 | return (IConfigFileService)ServiceProvider.GetService(typeof(IConfigFileService)); 38 | } 39 | } 40 | 41 | public static IQueries Queries 42 | { 43 | get 44 | { 45 | return (IQueries)ServiceProvider.GetService(typeof(IQueries)); 46 | } 47 | } 48 | public static IDirectoryService DirectoryService 49 | { 50 | get 51 | { 52 | return (IDirectoryService)ServiceProvider.GetService(typeof(IDirectoryService)); 53 | } 54 | } 55 | 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /PluginDeployer/Spkl/TargetTypeEnum.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace PluginDeployer.Spkl 8 | { 9 | public enum TargetType 10 | { 11 | Plugin, 12 | WorkflowAcitivty 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /PluginDeployer/Spkl/Tasks/IQueries.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using Microsoft.Xrm.Sdk.Client; 4 | 5 | namespace PluginDeployer.Spkl.Tasks 6 | { 7 | public interface IQueries 8 | { 9 | SdkMessage GetMessage(OrganizationServiceContext ctx, string messageName); 10 | SdkMessageFilter GetMessageFilter(OrganizationServiceContext ctx, Guid MessageFilterId); 11 | SdkMessageFilter GetMessageFilter(OrganizationServiceContext ctx, string entityLogicalName, string messageName); 12 | SdkMessageProcessingStepImage[] GetPluginStepImages(OrganizationServiceContext ctx, SdkMessageProcessingStep step); 13 | List GetPluginSteps(OrganizationServiceContext ctx, string pluginType); 14 | List GetPluginTypes(OrganizationServiceContext ctx, PluginAssembly plugin); 15 | WebResource GetWebResource(OrganizationServiceContext ctx, string uniqueName); 16 | List GetWebresources(OrganizationServiceContext ctx); 17 | List GetWorkflowPluginActivities(OrganizationServiceContext ctx, string pluginType); 18 | List GetWebresourcesInSolution(OrganizationServiceContext ctx, string uniqueName); 19 | } 20 | } -------------------------------------------------------------------------------- /PluginDeployer/Spkl/TraceLogger.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading; 7 | using D365DeveloperExtensions.Core.Enums; 8 | using D365DeveloperExtensions.Core.Logging; 9 | 10 | namespace PluginDeployer.Spkl 11 | { 12 | public class TraceLogger : ITrace 13 | { 14 | public void WriteLine(string format, params object[] args) 15 | { 16 | if (format == null) 17 | return; 18 | 19 | OutputLogger.WriteToOutputWindow(string.Format(format, args), MessageType.Info); 20 | } 21 | 22 | public void Write(string format, params object[] args) 23 | { 24 | 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /PluginDeployer/Spkl/_Credits_Notice.txt: -------------------------------------------------------------------------------- 1 |  2 | Anything under the Spkl folder is taken from or based on work done by Scott Durow 3 | 4 | https://github.com/scottdurow/SparkleXrm/wiki/spkl 5 | 6 | Also trying to minimze edits to these files to make it easier to merge updates as they become available -------------------------------------------------------------------------------- /PluginDeployer/ViewModels/CrmAssembly.cs: -------------------------------------------------------------------------------- 1 | using PluginDeployer.Spkl; 2 | using System; 3 | 4 | namespace PluginDeployer.ViewModels 5 | { 6 | public class CrmAssembly 7 | { 8 | public Guid AssemblyId { get; set; } 9 | public string Name { get; set; } 10 | public string DisplayName { get; set; } 11 | public string Version { get; set; } 12 | public bool IsWorkflow { get; set; } 13 | public Guid SolutionId { get; set; } 14 | public string Culture { get; set; } 15 | public string AssemblyPath { get; set; } 16 | public string PublicKeyToken { get; set; } 17 | public IsolationModeEnum IsolationMode { get; set; } 18 | } 19 | } -------------------------------------------------------------------------------- /PluginDeployer/ViewModels/CrmSolution.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace PluginDeployer.ViewModels 4 | { 5 | public class CrmSolution 6 | { 7 | public Guid SolutionId { get; set; } 8 | public string Name { get; set; } 9 | public string Prefix { get; set; } 10 | public string UniqueName { get; set; } 11 | public string NameVersion { get; set; } 12 | } 13 | } -------------------------------------------------------------------------------- /PluginTraceViewer/D365DevExKey.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/PluginTraceViewer/D365DevExKey.snk -------------------------------------------------------------------------------- /PluginTraceViewer/Models/FilterBase.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core.DataGrid; 2 | using System.ComponentModel; 3 | using System.Runtime.CompilerServices; 4 | 5 | namespace PluginTraceViewer.Models 6 | { 7 | public class FilterBase : INotifyPropertyChanged, IFilterProperty 8 | { 9 | private bool _isSelected; 10 | 11 | public string Name { get; set; } 12 | public string Value { get; set; } 13 | 14 | public bool IsSelected 15 | { 16 | get => _isSelected; 17 | set 18 | { 19 | _isSelected = value; 20 | OnPropertyChanged(); 21 | } 22 | } 23 | 24 | public event PropertyChangedEventHandler PropertyChanged; 25 | 26 | protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 27 | { 28 | PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /PluginTraceViewer/Models/FilterCriteria.cs: -------------------------------------------------------------------------------- 1 | using PluginTraceViewer.ViewModels; 2 | using System.Collections.ObjectModel; 3 | 4 | namespace PluginTraceViewer.Models 5 | { 6 | public class FilterCriteria 7 | { 8 | public CrmPluginTrace CrmPluginTrace { get; set; } 9 | public string SearchText { get; set; } 10 | public ObservableCollection FilterEntities { get; set; } 11 | public ObservableCollection FilterMessages { get; set; } 12 | public ObservableCollection FilterModes { get; set; } 13 | public ObservableCollection FilterTypeNames { get; set; } 14 | } 15 | } -------------------------------------------------------------------------------- /PluginTraceViewer/Models/FilterEntity.cs: -------------------------------------------------------------------------------- 1 | using PluginTraceViewer.Resources; 2 | using PluginTraceViewer.ViewModels; 3 | using System; 4 | using System.Collections.ObjectModel; 5 | using System.Linq; 6 | 7 | namespace PluginTraceViewer.Models 8 | { 9 | public class FilterEntity : FilterBase 10 | { 11 | public static ObservableCollection CreateFilterList(ObservableCollection traces) 12 | { 13 | ObservableCollection filterEntities = new ObservableCollection(traces.GroupBy(t => t.Entity).Select(x => 14 | new FilterEntity 15 | { 16 | Name = x.Key, 17 | Value = x.Key, 18 | IsSelected = true 19 | }).ToList()); 20 | 21 | filterEntities = new ObservableCollection(filterEntities.OrderBy(e => e.Name)); 22 | 23 | filterEntities.Insert(0, new FilterEntity 24 | { 25 | Name = Resource.FilterEntity_Select_All, 26 | Value = string.Empty, 27 | IsSelected = true 28 | }); 29 | 30 | return filterEntities; 31 | } 32 | 33 | public static ObservableCollection ResetFilter(ObservableCollection filterEntities) 34 | { 35 | if (filterEntities[0].IsSelected != true) 36 | filterEntities[0].IsSelected = true; 37 | 38 | return filterEntities; 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /PluginTraceViewer/Models/FilterMessage.cs: -------------------------------------------------------------------------------- 1 | using PluginTraceViewer.Resources; 2 | using PluginTraceViewer.ViewModels; 3 | using System; 4 | using System.Collections.ObjectModel; 5 | using System.Linq; 6 | 7 | namespace PluginTraceViewer.Models 8 | { 9 | public class FilterMessage : FilterBase 10 | { 11 | public static ObservableCollection CreateFilterList(ObservableCollection traces) 12 | { 13 | ObservableCollection filterMessages = new ObservableCollection(traces.GroupBy(t => t.MessageName).Select(x => 14 | new FilterMessage 15 | { 16 | Name = x.Key, 17 | Value = x.Key, 18 | IsSelected = true 19 | }).ToList()); 20 | 21 | filterMessages = new ObservableCollection(filterMessages.OrderBy(e => e.Name)); 22 | 23 | filterMessages.Insert(0, new FilterMessage 24 | { 25 | Name = Resource.FilterEntity_Select_All, 26 | Value = string.Empty, 27 | IsSelected = true 28 | }); 29 | 30 | return filterMessages; 31 | } 32 | 33 | public static ObservableCollection ResetFilter(ObservableCollection filterMessages) 34 | { 35 | if (filterMessages[0].IsSelected != true) 36 | filterMessages[0].IsSelected = true; 37 | 38 | return filterMessages; 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /PluginTraceViewer/Models/FilterMode.cs: -------------------------------------------------------------------------------- 1 | using PluginTraceViewer.Resources; 2 | using PluginTraceViewer.ViewModels; 3 | using System; 4 | using System.Collections.ObjectModel; 5 | using System.Linq; 6 | 7 | namespace PluginTraceViewer.Models 8 | { 9 | public class FilterMode : FilterBase 10 | { 11 | public static ObservableCollection CreateFilterList(ObservableCollection traces) 12 | { 13 | ObservableCollection filterModes = new ObservableCollection(traces.GroupBy(t => t.Mode).Select(x => 14 | new FilterMode 15 | { 16 | Name = x.Key, 17 | Value = x.Key, 18 | IsSelected = true 19 | }).ToList()); 20 | 21 | filterModes = new ObservableCollection(filterModes.OrderBy(e => e.Name)); 22 | 23 | filterModes.Insert(0, new FilterMode 24 | { 25 | Name = Resource.FilterEntity_Select_All, 26 | Value = string.Empty, 27 | IsSelected = true 28 | }); 29 | 30 | return filterModes; 31 | } 32 | 33 | public static ObservableCollection ResetFilter(ObservableCollection filterModes) 34 | { 35 | if (filterModes[0].IsSelected != true) 36 | filterModes[0].IsSelected = true; 37 | 38 | return filterModes; 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /PluginTraceViewer/Models/FilterTypeName.cs: -------------------------------------------------------------------------------- 1 | using PluginTraceViewer.Resources; 2 | using PluginTraceViewer.ViewModels; 3 | using System; 4 | using System.Collections.ObjectModel; 5 | using System.Linq; 6 | 7 | namespace PluginTraceViewer.Models 8 | { 9 | public class FilterTypeName : FilterBase 10 | { 11 | public static ObservableCollection CreateFilterList(ObservableCollection traces) 12 | { 13 | ObservableCollection filterTypeNames = new ObservableCollection(traces.GroupBy(t => t.TypeName).Select(x => 14 | new FilterTypeName 15 | { 16 | Name = x.Key, 17 | Value = x.Key, 18 | IsSelected = true 19 | }).ToList()); 20 | 21 | filterTypeNames = new ObservableCollection(filterTypeNames.OrderBy(e => e.Name)); 22 | 23 | filterTypeNames.Insert(0, new FilterTypeName 24 | { 25 | Name = Resource.FilterEntity_Select_All, 26 | Value = string.Empty, 27 | IsSelected = true 28 | }); 29 | 30 | return filterTypeNames; 31 | } 32 | 33 | public static ObservableCollection ResetFilter(ObservableCollection filterTypeNames) 34 | { 35 | if (filterTypeNames[0].IsSelected != true) 36 | filterTypeNames[0].IsSelected = true; 37 | 38 | return filterTypeNames; 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /PluginTraceViewer/PluginTraceViewerHost.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.VisualStudio.Shell; 2 | using System.Runtime.InteropServices; 3 | 4 | namespace PluginTraceViewer 5 | { 6 | [Guid("E7A15FDA-6C33-48F8-A1E7-D78E49458A7A")] //Also located in ExtensionConstants.cs 7 | public sealed class PluginTraceViewerHost : ToolWindowPane 8 | { 9 | public PluginTraceViewerHost() : base(null) 10 | { 11 | Caption = Resources.Resource.PluginTraceViewerWindow_Window_Title; 12 | BitmapResourceID = 301; 13 | BitmapIndex = 1; 14 | Content = new PluginTraceViewerWindow(); 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /PluginTraceViewer/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("PluginTraceViewer")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("PluginTraceViewer")] 12 | [assembly: AssemblyCopyright("Copyright © 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("97aa7ed6-5020-44e4-88e9-7d63f49fa766")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /PluginTraceViewer/ViewModels/CrmPluginTrace.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace PluginTraceViewer.ViewModels 4 | { 5 | public class CrmPluginTrace 6 | { 7 | public Guid PluginTraceLogidId { get; set; } 8 | public string Entity { get; set; } 9 | public string CorrelationId { get; set; } 10 | public string MessageBlock { get; set; } 11 | public string MessageName { get; set; } 12 | public int Depth { get; set; } 13 | public int ExecutionDurationMs { get; set; } 14 | public string ExecutionDuration { get; set; } 15 | public string ExceptionDetails { get; set; } 16 | public string Mode { get; set; } 17 | public string Details { get; set; } 18 | public string TypeName { get; set; } 19 | public DateTime CreatedOnUtc { get; set; } 20 | public DateTime CreatedOn { get; set; } 21 | public bool PendingDelete { get; set; } 22 | } 23 | } -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpConsole/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("$safeprojectname$")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("$registeredorganization$")] 12 | [assembly: AssemblyProduct("$safeprojectname$")] 13 | [assembly: AssemblyCopyright("Copyright © $registeredorganization$ $year$")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("$guid1$")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpConsole/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("CSharpConsole")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("Jason Lattimer")] 11 | [assembly: AssemblyProduct("CSharpConsole")] 12 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("b34a5217-0f6d-493f-b6dd-bb5cf091ab99")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpConsole/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ProjectTemplates/CSharp/CSharpConsole/icon.png -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpPluginProject/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("$safeprojectname$")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("$registeredorganization$")] 12 | [assembly: AssemblyProduct("$safeprojectname$")] 13 | [assembly: AssemblyCopyright("Copyright © $registeredorganization$ $year$")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("$guid1$")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpPluginProject/CSharpPluginProject.vstemplate: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | D365 CE/CRM Plug-in Project 5 | Dynamics 365 CE/CRM Plug-in Project 6 | icon.png 7 | CSharp 8 | 4.0 9 | 1000 10 | 5d282679-4eda-46bc-a6ea-91a7f64899b8 11 | true 12 | CSharpPluginProject 13 | true 14 | C# 15 | Windows 16 | D365 CE 17 | 18 | 19 | 20 | 21 | AssemblyInfo.cs 22 | 23 | 24 | 25 | TemplateWizards, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 26 | TemplateWizards.ProjectTemplateWizard 27 | 28 | 29 | Plugin 30 | true 31 | false 32 | false 33 | false 34 | false 35 | true 36 | 37 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpPluginProject/MyKey.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ProjectTemplates/CSharp/CSharpPluginProject/MyKey.snk -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpPluginProject/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("CSharpPluginProject")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("Jason Lattimer")] 11 | [assembly: AssemblyProduct("CSharpPluginProject")] 12 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("e982f569-ffa3-49a8-a47d-09ce6c546fab")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpPluginProject/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ProjectTemplates/CSharp/CSharpPluginProject/icon.png -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpPluginTestProject/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("$safeprojectname$")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("$registeredorganization$")] 12 | [assembly: AssemblyProduct("$safeprojectname$")] 13 | [assembly: AssemblyCopyright("Copyright © $registeredorganization$ $year$")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("$guid1$")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpPluginTestProject/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | [assembly: AssemblyTitle("CSharpPluginTestProject")] 5 | [assembly: AssemblyDescription("")] 6 | [assembly: AssemblyConfiguration("")] 7 | [assembly: AssemblyCompany("Jason Lattimer")] 8 | [assembly: AssemblyProduct("CSharpPluginTestProject")] 9 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 10 | [assembly: AssemblyTrademark("")] 11 | [assembly: AssemblyCulture("")] 12 | 13 | [assembly: ComVisible(false)] 14 | 15 | [assembly: Guid("55cb04b5-e053-4504-8773-2e03c594e68a")] 16 | 17 | // [assembly: AssemblyVersion("1.0.*")] 18 | [assembly: AssemblyVersion("1.0.0.0")] 19 | [assembly: AssemblyFileVersion("1.0.0.0")] 20 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpPluginTestProject/UnitTest1.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.VisualStudio.TestTools.UnitTesting; 2 | using Microsoft.Xrm.Sdk; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Configuration; 6 | 7 | namespace $safeprojectname$ 8 | { 9 | [TestClass] 10 | public class $safeitemname$ 11 | { 12 | #region Test Initialization and Cleanup 13 | // Use ClassInitialize to run code before running the first test in the class 14 | [ClassInitialize] 15 | public static void ClassInitialize(TestContext testContext) { } 16 | 17 | // Use ClassCleanup to run code after all tests in a class have run 18 | [ClassCleanup] 19 | public static void ClassCleanup() { } 20 | 21 | // Use TestInitialize to run code before running each test 22 | [TestInitialize] 23 | public void TestMethodInitialize() { } 24 | 25 | // Use TestCleanup to run code after each test has run 26 | [TestCleanup] 27 | public void TestMethodCleanup() { } 28 | #endregion 29 | 30 | [TestMethod] 31 | public void TestMethod1() 32 | { 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpPluginTestProject/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ProjectTemplates/CSharp/CSharpPluginTestProject/icon.png -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpSolutionPackage/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("$safeprojectname$")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("$registeredorganization$")] 12 | [assembly: AssemblyProduct("$safeprojectname$")] 13 | [assembly: AssemblyCopyright("Copyright © $registeredorganization$ $year$")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("$guid1$")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpSolutionPackage/CSharpSolutionPackage.vstemplate: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | D365 CE/CRM Solution Packager Project 5 | Dynamics 365 CE/CRM Solution Packager Project 6 | icon.png 7 | CSharp 8 | 4.6.2 9 | 1000 10 | 084f19e1-039c-453c-aa8b-cd6ca6e9f2d1 11 | true 12 | CSharpSolutionPackage 13 | true 14 | C# 15 | Windows 16 | D365 CE 17 | 18 | 19 | 20 | 21 | AssemblyInfo.cs 22 | 23 | 24 | 25 | TemplateWizards, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 26 | TemplateWizards.ProjectTemplateWizard 27 | 28 | 29 | SolutionPackage 30 | false 31 | false 32 | false 33 | false 34 | false 35 | false 36 | 37 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpSolutionPackage/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("CSharpSolutionPackage")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("Jason Lattimer")] 11 | [assembly: AssemblyProduct("CSharpSolutionPackage")] 12 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("c9ad3de3-3f37-4949-8586-e59672f78922")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpSolutionPackage/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ProjectTemplates/CSharp/CSharpSolutionPackage/icon.png -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpTypeScriptProject/ProjectTemplate.webproj: -------------------------------------------------------------------------------- 1 | C# 2 | $targetframeworkversion$ 3 | Microsoft.Web.CSharp.EmptyWeb -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpTypeScriptProject/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("ProjectTemplate1")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Jason Lattimer")] 12 | [assembly: AssemblyProduct("ProjectTemplate1")] 13 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("1010f340-28a3-44ba-93e7-77cc68a18e23")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpTypeScriptProject/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ProjectTemplates/CSharp/CSharpTypeScriptProject/icon.png -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpTypeScriptProject/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": true, 3 | "compilerOptions": { 4 | "outDir": "js", 5 | "target": "es5", 6 | "sourceMap": true 7 | }, 8 | "include": [ 9 | "./ts/**/*" 10 | ] 11 | } -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpWebResourceProject/CSharpWebResourceProject.vstemplate: -------------------------------------------------------------------------------- 1 |  2 | 3 | D365 CE/CRM Web Resource Project 4 | Dynamics 365 CE/CRM Web Resource Project 5 | icon.png 6 | 4feef2e3-885b-4be6-aff3-dfe832468b7d 7 | CSharp 8 | 1000 9 | 4.5 10 | true 11 | CSharpWebResourceProject 12 | true 13 | C# 14 | Windows 15 | D365 CE 16 | 17 | 18 | 19 | 20 | ProjectTemplate.webproj 21 | 22 | 23 | 24 | 25 | 26 | 27 | TemplateWizards, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 28 | TemplateWizards.ProjectTemplateWizard 29 | 30 | 31 | WebResource 32 | false 33 | false 34 | false 35 | false 36 | false 37 | false 38 | 39 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpWebResourceProject/ProjectTemplate.webproj: -------------------------------------------------------------------------------- 1 | C# 2 | $targetframeworkversion$ 3 | Microsoft.Web.CSharp.EmptyWeb -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpWebResourceProject/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("ProjectTemplate1")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Jason Lattimer")] 12 | [assembly: AssemblyProduct("ProjectTemplate1")] 13 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("1010f340-28a3-44ba-93e7-77cc68a18e23")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpWebResourceProject/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ProjectTemplates/CSharp/CSharpWebResourceProject/icon.png -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpWorkflowProject/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("$projectname$")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("$registeredorganization$")] 12 | [assembly: AssemblyProduct("$projectname$")] 13 | [assembly: AssemblyCopyright("Copyright © $registeredorganization$ $year$")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("$guid1$")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpWorkflowProject/CSharpWorkflowProject.vstemplate: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | D365 CE/CRM Workflow Project 5 | Dynamics 365 CE/CRM Plug-in Project 6 | icon.png 7 | CSharp 8 | 4.0 9 | 1000 10 | 2f9fb6ab-db2b-42a9-acb0-c658e102ddd9 11 | true 12 | CSharpWorkflowProject 13 | true 14 | C# 15 | Windows 16 | D365 CE 17 | 18 | 19 | 20 | 21 | AssemblyInfo.cs 22 | 23 | 24 | 25 | TemplateWizards, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 26 | TemplateWizards.ProjectTemplateWizard 27 | 28 | 29 | Workflow 30 | true 31 | true 32 | false 33 | false 34 | false 35 | true 36 | 37 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpWorkflowProject/MyKey.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ProjectTemplates/CSharp/CSharpWorkflowProject/MyKey.snk -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpWorkflowProject/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("CSharpWorkflowProject")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("Jason Lattimer")] 11 | [assembly: AssemblyProduct("CSharpWorkflowProject")] 12 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("657f7cd2-9a6d-440d-aa39-a629e5190021")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpWorkflowProject/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ProjectTemplates/CSharp/CSharpWorkflowProject/icon.png -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpWorkflowTestProject/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("$safeprojectname$")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("$registeredorganization$")] 12 | [assembly: AssemblyProduct("$safeprojectname$")] 13 | [assembly: AssemblyCopyright("Copyright © $registeredorganization$ $year$")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("$guid1$")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpWorkflowTestProject/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | [assembly: AssemblyTitle("CSharpWorkflowTestProject")] 5 | [assembly: AssemblyDescription("")] 6 | [assembly: AssemblyConfiguration("")] 7 | [assembly: AssemblyCompany("Jason Lattimer")] 8 | [assembly: AssemblyProduct("CSharpWorkflowTestProject")] 9 | [assembly: AssemblyCopyright("Copyright © Jason Lattimer 2017")] 10 | [assembly: AssemblyTrademark("")] 11 | [assembly: AssemblyCulture("")] 12 | 13 | [assembly: ComVisible(false)] 14 | 15 | [assembly: Guid("55cb04b5-e053-4504-8773-2e03c594e68a")] 16 | 17 | // [assembly: AssemblyVersion("1.0.*")] 18 | [assembly: AssemblyVersion("1.0.0.0")] 19 | [assembly: AssemblyFileVersion("1.0.0.0")] 20 | -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpWorkflowTestProject/UnitTest1.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.VisualStudio.TestTools.UnitTesting; 2 | using Microsoft.Xrm.Sdk; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Configuration; 6 | 7 | namespace $safeprojectname$ 8 | { 9 | [TestClass] 10 | public class $safeitemname$ 11 | { 12 | #region Test Initialization and Cleanup 13 | // Use ClassInitialize to run code before running the first test in the class 14 | [ClassInitialize] 15 | public static void ClassInitialize(TestContext testContext) { } 16 | 17 | // Use ClassCleanup to run code after all tests in a class have run 18 | [ClassCleanup] 19 | public static void ClassCleanup() { } 20 | 21 | // Use TestInitialize to run code before running each test 22 | [TestInitialize] 23 | public void TestMethodInitialize() { } 24 | 25 | // Use TestCleanup to run code after each test has run 26 | [TestCleanup] 27 | public void TestMethodCleanup() { } 28 | #endregion 29 | 30 | [TestMethod] 31 | public void TestMethod1() 32 | { 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /ProjectTemplates/CSharp/CSharpWorkflowTestProject/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/ProjectTemplates/CSharp/CSharpWorkflowTestProject/icon.png -------------------------------------------------------------------------------- /ProjectTemplates/ProjectTemplateSetup.txt: -------------------------------------------------------------------------------- 1 | 1. Add project to solution 2 | 2. Unload project 3 | 3. Edit .csproj file 4 | 4. Add D365 DevEx under 5 | 6 | 7 | 8 | Designer 9 | D365 DevEx 10 | 11 | 12 | http://www.dotnetfunda.com/articles/show/1899/creating-a-new-category-for-custom-templates-with-a-new-entry-to-insta -------------------------------------------------------------------------------- /SolutionPackager/D365DevExKey.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/SolutionPackager/D365DevExKey.snk -------------------------------------------------------------------------------- /SolutionPackager/ModelBuilder.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core; 2 | using Microsoft.Xrm.Sdk; 3 | using SolutionPackager.ViewModels; 4 | using System; 5 | using System.Collections.ObjectModel; 6 | using System.Linq; 7 | 8 | namespace SolutionPackager 9 | { 10 | public static class ModelBuilder 11 | { 12 | public static ObservableCollection CreateCrmSolutionView(EntityCollection solutions) 13 | { 14 | var crmSolutions = new ObservableCollection(); 15 | 16 | foreach (var entity in solutions.Entities) 17 | { 18 | var solution = new CrmSolution 19 | { 20 | SolutionId = entity.Id, 21 | Name = entity.GetAttributeValue("friendlyname"), 22 | UniqueName = entity.GetAttributeValue("uniquename"), 23 | Version = Version.Parse(entity.GetAttributeValue("version")), 24 | Prefix = entity.GetAttributeValue("publisher.customizationprefix").Value.ToString(), 25 | NameVersion = $"{entity.GetAttributeValue("friendlyname")} {entity.GetAttributeValue("version")}" 26 | }; 27 | 28 | crmSolutions.Add(solution); 29 | } 30 | 31 | crmSolutions = SortSolutions(crmSolutions); 32 | 33 | return crmSolutions; 34 | } 35 | 36 | private static ObservableCollection SortSolutions(ObservableCollection solutions) 37 | { 38 | //Default on top 39 | var defaultSolution = solutions.FirstOrDefault(s => s.SolutionId == ExtensionConstants.DefaultSolutionId); 40 | solutions.Remove(defaultSolution); 41 | solutions.Insert(0, defaultSolution); 42 | 43 | return solutions; 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /SolutionPackager/Models/PackSettings.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core.Models; 2 | using EnvDTE; 3 | using SolutionPackager.ViewModels; 4 | using System; 5 | 6 | namespace SolutionPackager.Models 7 | { 8 | public class PackSettings 9 | { 10 | public Project Project { get; set; } 11 | public CrmSolution CrmSolution { get; set; } 12 | public SolutionPackageConfig SolutionPackageConfig { get; set; } 13 | public string PackageFolder { get; set; } 14 | public bool EnablePackagerLogging { get; set; } 15 | public bool SaveSolutions { get; set; } 16 | public string SolutionFolder { get; set; } 17 | public string ProjectPath { get; set; } 18 | public string ProjectPackageFolder { get; set; } 19 | public string ProjectSolutionFolder { get; set; } 20 | public string FileName { get; set; } 21 | public string FullFilePath { get; set; } 22 | public Version Version { get; set; } 23 | public bool UseMapFile { get; set; } 24 | } 25 | } -------------------------------------------------------------------------------- /SolutionPackager/Models/SolutionPackagerCommand.cs: -------------------------------------------------------------------------------- 1 | namespace SolutionPackager.Models 2 | { 3 | public class SolutionPackagerCommand 4 | { 5 | public string ToolPath { get; set; } 6 | public string CommandArgs { get; set; } 7 | public string Action { get; set; } 8 | public string SolutionName { get; set; } 9 | } 10 | } -------------------------------------------------------------------------------- /SolutionPackager/Models/UnpackSettings.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core.Models; 2 | using EnvDTE; 3 | using SolutionPackager.ViewModels; 4 | using System.IO; 5 | 6 | namespace SolutionPackager.Models 7 | { 8 | public class UnpackSettings 9 | { 10 | public Project Project { get; set; } 11 | public CrmSolution CrmSolution { get; set; } 12 | public SolutionPackageConfig SolutionPackageConfig { get; set; } 13 | public bool EnablePackagerLogging { get; set; } 14 | public bool SaveSolutions { get; set; } 15 | public string SolutionFolder { get; set; } 16 | public string ProjectPath { get; set; } 17 | public string PackageFolder { get; set; } 18 | public string ProjectPackageFolder { get; set; } 19 | public string ProjectSolutionFolder { get; set; } 20 | public string DownloadedZipPath { get; set; } 21 | public DirectoryInfo ExtractedFolder { get; set; } 22 | public bool UseMapFile { get; set; } 23 | } 24 | } -------------------------------------------------------------------------------- /SolutionPackager/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("SolutionPackager")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("SolutionPackager")] 12 | [assembly: AssemblyCopyright("Copyright © 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("61219409-56ad-43de-83fb-98301e3d785a")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /SolutionPackager/SolutionPackagerHost.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.InteropServices; 2 | using Microsoft.VisualStudio.Shell; 3 | 4 | namespace SolutionPackager 5 | { 6 | [Guid("F8BF1118-57B6-4404-9923-8A98AB710EBA")] //Also located in ExtensionConstants.cs 7 | public sealed class SolutionPackagerHost : ToolWindowPane 8 | { 9 | public SolutionPackagerHost() : base(null) 10 | { 11 | Caption = Resources.Resource.SolutionPackager_Window_Title; 12 | BitmapResourceID = 301; 13 | BitmapIndex = 1; 14 | Content = new SolutionPackagerWindow(); 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /SolutionPackager/ViewModels/CrmSolution.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace SolutionPackager.ViewModels 4 | { 5 | public class CrmSolution 6 | { 7 | public Guid SolutionId { get; set; } 8 | public string Name { get; set; } 9 | public string Prefix { get; set; } 10 | public string UniqueName { get; set; } 11 | public Version Version { get; set; } 12 | public string NameVersion { get; set; } 13 | } 14 | } -------------------------------------------------------------------------------- /TemplateWizards/D365DevExKey.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/TemplateWizards/D365DevExKey.snk -------------------------------------------------------------------------------- /TemplateWizards/Models/CustomTemplate.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace TemplateWizards.Models 4 | { 5 | public class CustomTemplates 6 | { 7 | public List Templates { get; set; } 8 | } 9 | 10 | public class CustomTemplate 11 | { 12 | public string DisplayName { get; set; } 13 | public string Description { get; set; } 14 | public string FileName { get; set; } 15 | public string RelativePath { get; set; } 16 | public bool CoreReplacements { get; set; } 17 | public string Language { get; set; } 18 | public List CustomTemplateReferences { get; set; } 19 | public List CustomTemplateNuGetPackages { get; set; } 20 | } 21 | 22 | public class CustomTemplateReference 23 | { 24 | public string Name { get; set; } 25 | } 26 | 27 | public class CustomTemplateNuGetPackage 28 | { 29 | public string Name { get; set; } 30 | public string Version { get; set; } 31 | } 32 | } -------------------------------------------------------------------------------- /TemplateWizards/Models/CustomTemplateListItem.cs: -------------------------------------------------------------------------------- 1 | namespace TemplateWizards.Models 2 | { 3 | public class CustomTemplateListItem 4 | { 5 | public CustomTemplate Template { get; set; } 6 | public string Name { get; set; } 7 | public string Description { get; set; } 8 | public bool Selected { get; set; } 9 | } 10 | } -------------------------------------------------------------------------------- /TemplateWizards/ProjectDataHandler.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace TemplateWizards 4 | { 5 | public class ProjectDataHandler 6 | { 7 | public static void AddOrUpdateReplacements(string key, string value, ref Dictionary replacementsDictionary) 8 | { 9 | if (replacementsDictionary.ContainsKey(key)) 10 | replacementsDictionary[key] = value; 11 | else 12 | replacementsDictionary.Add(key, value); 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /TemplateWizards/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("TemplateWizards")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("TemplateWizards")] 12 | [assembly: AssemblyCopyright("Copyright © 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("7cc35efb-7335-4ae1-8a54-317d071f9f12")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /TemplateWizards/SdkTools/nuget.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/TemplateWizards/SdkTools/nuget.exe -------------------------------------------------------------------------------- /TemplateWizards/Template/templates.json: -------------------------------------------------------------------------------- 1 | { 2 | "Templates": [ 3 | { 4 | /* Name that will be shown in the template picker */ 5 | "DisplayName": "My Plug-in Base", 6 | /* Description that will be shown in the template picker */ 7 | "Description": "blah, blah, blah", 8 | /* Filename will override the one chosen in the Visual Studio New File dialog */ 9 | "FileName": "PluginBase.cs", 10 | /* Relative path to the file being used for the template from template folder */ 11 | "RelativePath": "PluginBase.cs", 12 | /* Replace template parameters - useful for Namespace & Class names 13 | https://docs.microsoft.com/en-us/visualstudio/ide/template-parameters */ 14 | "CoreReplacements": true, 15 | /*Possible values: CSharp */ 16 | "Language": "CSharp", 17 | /* Array of project references to be included which would normally be added 18 | under Project -> References */ 19 | "CustomTemplateReferences": [ 20 | { 21 | "Name": "System.Net.Http" 22 | } 23 | ], 24 | /* Array of NuGet packages to install - null version will get latest */ 25 | "CustomTemplateNuGetPackages": [ 26 | { 27 | "Name": "Newtonsoft.Json", 28 | "Version": "10.0.2" 29 | } 30 | ] 31 | } 32 | ] 33 | } -------------------------------------------------------------------------------- /UnitTestProjects/D365DeveloperExtensions.Core.Tests/CrmDevEx.json: -------------------------------------------------------------------------------- 1 | { 2 | "CrmDevExConfigOrgMaps": [ 3 | { 4 | "OrganizationId": "00000000-0000-0000-0000-000000000000", 5 | "ProjectUniqueName": "TestProject", 6 | "WebResources": null 7 | } 8 | ] 9 | } -------------------------------------------------------------------------------- /UnitTestProjects/D365DeveloperExtensions.Core.Tests/Model/WebResourceTypeTests.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core.Models; 2 | using Microsoft.VisualStudio.TestTools.UnitTesting; 3 | using System.Collections.ObjectModel; 4 | using System.Linq; 5 | 6 | namespace D365DeveloperExtensions.Core.Tests.Model 7 | { 8 | [TestClass] 9 | public class WebResourceTypeTests 10 | { 11 | [TestMethod] 12 | public void GetCrm5Types() 13 | { 14 | const int majorVersion = 5; 15 | ObservableCollection types = WebResourceTypes.GetTypes(majorVersion, false); 16 | 17 | var min = types.Count(t => t.CrmMinimumMajorVersion > majorVersion); 18 | var max = types.Count(t => t.CrmMaximumMajorVersion < majorVersion); 19 | 20 | Assert.IsTrue(min == 0 && max == 0 && types.Count > 0); 21 | } 22 | 23 | [TestMethod] 24 | public void GetCrm9Types() 25 | { 26 | const int majorVersion = 9; 27 | ObservableCollection types = WebResourceTypes.GetTypes(majorVersion, false); 28 | 29 | var min = types.Count(t => t.CrmMinimumMajorVersion > majorVersion); 30 | var max = types.Count(t => t.CrmMaximumMajorVersion < majorVersion); 31 | 32 | Assert.IsTrue(min == 0 && max == 0 && types.Count > 0); 33 | } 34 | 35 | [TestMethod] 36 | public void NoVersion() 37 | { 38 | const int majorVersion = 0; 39 | ObservableCollection types = WebResourceTypes.GetTypes(majorVersion, false); 40 | 41 | var min = types.Count(t => t.CrmMinimumMajorVersion > majorVersion); 42 | var max = types.Count(t => t.CrmMaximumMajorVersion < majorVersion); 43 | 44 | Assert.IsTrue(min == 0 && max == 0 && types.Count == 0); 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /UnitTestProjects/D365DeveloperExtensions.Core.Tests/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | [assembly: AssemblyTitle("D365DeveloperExtensions.Core.Tests")] 5 | [assembly: AssemblyDescription("")] 6 | [assembly: AssemblyConfiguration("")] 7 | [assembly: AssemblyCompany("")] 8 | [assembly: AssemblyProduct("D365DeveloperExtensions.Core.Tests")] 9 | [assembly: AssemblyCopyright("Copyright © 2017")] 10 | [assembly: AssemblyTrademark("")] 11 | [assembly: AssemblyCulture("")] 12 | 13 | [assembly: ComVisible(false)] 14 | 15 | [assembly: Guid("40cca5af-458a-41c8-9b31-6294261b25e2")] 16 | 17 | // [assembly: AssemblyVersion("1.0.*")] 18 | [assembly: AssemblyVersion("1.0.0.0")] 19 | [assembly: AssemblyFileVersion("1.0.0.0")] 20 | -------------------------------------------------------------------------------- /UnitTestProjects/D365DeveloperExtensions.Core.Tests/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /UnitTestProjects/NuGetRetriever.Tests/GetCoreAssembliesTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using D365DeveloperExtensions.Core.Models; 4 | using Microsoft.VisualStudio.TestTools.UnitTesting; 5 | 6 | namespace NuGetRetriever.Tests 7 | { 8 | [TestClass] 9 | public class GetCoreAssembliesTests 10 | { 11 | private const string PackageId = "Microsoft.CrmSdk.CoreAssemblies"; 12 | private static List _packages; 13 | 14 | [ClassInitialize] 15 | public static void ClassInit(TestContext context) 16 | { 17 | _packages = PackageLister.GetPackagesById(PackageId); 18 | } 19 | 20 | [TestMethod] 21 | public void GetCoreAssembliesCount() 22 | { 23 | Assert.IsTrue(_packages.Count > 0); 24 | } 25 | 26 | [TestMethod] 27 | public void GetCoreAssemblies() 28 | { 29 | Assert.AreEqual(PackageId, _packages[0].Id); 30 | } 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /UnitTestProjects/NuGetRetriever.Tests/GetWorkflowAssembliesTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using D365DeveloperExtensions.Core.Models; 4 | using Microsoft.VisualStudio.TestTools.UnitTesting; 5 | 6 | namespace NuGetRetriever.Tests 7 | { 8 | [TestClass] 9 | public class GetWorkflowAssembliesTests 10 | { 11 | private const string PackageId = "Microsoft.CrmSdk.Workflow"; 12 | private static List _packages; 13 | 14 | [ClassInitialize] 15 | public static void ClassInit(TestContext context) 16 | { 17 | _packages = PackageLister.GetPackagesById(PackageId); 18 | } 19 | 20 | [TestMethod] 21 | public void GetWorkflowAssembliesCount() 22 | { 23 | Assert.IsTrue(_packages.Count > 0); 24 | } 25 | 26 | [TestMethod] 27 | public void GetWorkflowAssemblies() 28 | { 29 | Assert.AreEqual(PackageId, _packages[0].Id); 30 | } 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /UnitTestProjects/NuGetRetriever.Tests/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | [assembly: AssemblyTitle("NuGetRetriever.Tests")] 5 | [assembly: AssemblyDescription("")] 6 | [assembly: AssemblyConfiguration("")] 7 | [assembly: AssemblyCompany("")] 8 | [assembly: AssemblyProduct("NuGetRetriever.Tests")] 9 | [assembly: AssemblyCopyright("Copyright © 2017")] 10 | [assembly: AssemblyTrademark("")] 11 | [assembly: AssemblyCulture("")] 12 | 13 | [assembly: ComVisible(false)] 14 | 15 | [assembly: Guid("899553de-ac30-46df-a1bd-53f64c90e01d")] 16 | 17 | // [assembly: AssemblyVersion("1.0.*")] 18 | [assembly: AssemblyVersion("1.0.0.0")] 19 | [assembly: AssemblyFileVersion("1.0.0.0")] 20 | -------------------------------------------------------------------------------- /UnitTestProjects/NuGetRetriever.Tests/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /UnitTestProjects/TemplateWizards.Tests/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | [assembly: AssemblyTitle("TemplateWizards.Tests")] 5 | [assembly: AssemblyDescription("")] 6 | [assembly: AssemblyConfiguration("")] 7 | [assembly: AssemblyCompany("")] 8 | [assembly: AssemblyProduct("TemplateWizards.Tests")] 9 | [assembly: AssemblyCopyright("Copyright © 2017")] 10 | [assembly: AssemblyTrademark("")] 11 | [assembly: AssemblyCulture("")] 12 | 13 | [assembly: ComVisible(false)] 14 | 15 | [assembly: Guid("d0b3703e-ee5c-4f59-96e4-3b111d8f9279")] 16 | 17 | // [assembly: AssemblyVersion("1.0.*")] 18 | [assembly: AssemblyVersion("1.0.0.0")] 19 | [assembly: AssemblyFileVersion("1.0.0.0")] 20 | -------------------------------------------------------------------------------- /UnitTestProjects/TemplateWizards.Tests/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /WebResourceDeployer/Converters/AllowCompareConverter.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core.Models; 2 | using System; 3 | using System.Globalization; 4 | using System.Linq; 5 | using System.Windows.Data; 6 | 7 | namespace WebResourceDeployer.Converters 8 | { 9 | public class AllowCompareConverter : IMultiValueConverter 10 | { 11 | public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 12 | { 13 | //No bound file - nothing to compare to 14 | if (string.IsNullOrEmpty(values[0]?.ToString())) 15 | return false; 16 | 17 | var hasType = int.TryParse(values[1].ToString(), out var type); 18 | if (!hasType) 19 | return false; 20 | 21 | var webResourceType = WebResourceTypes.Types.FirstOrDefault(t => t.Type == type); 22 | 23 | return webResourceType != null && webResourceType.AllowCompare; 24 | } 25 | 26 | public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 27 | { 28 | throw new NotImplementedException(); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /WebResourceDeployer/Converters/NewWebResourceCreateConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using System.Windows.Data; 4 | 5 | namespace WebResourceDeployer.Converters 6 | { 7 | public class NewWebResourceCreateConverter : IMultiValueConverter 8 | { 9 | public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 10 | { 11 | for (var i = 0; i < values.Length; i++) 12 | { 13 | var o = values[i]; 14 | var isInt = int.TryParse(o.ToString(), out var v); 15 | if (isInt) 16 | { 17 | if ((i == 0 || i == 2) && v == -1) 18 | return false; 19 | if (i == 1 && (v == -1 || v == 0)) 20 | return false; 21 | } 22 | 23 | if (string.IsNullOrEmpty(o.ToString())) 24 | return false; 25 | } 26 | 27 | return true; 28 | } 29 | 30 | public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 31 | { 32 | throw new NotImplementedException(); 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /WebResourceDeployer/D365DevExKey.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsharp/D365DeveloperExtensions/1c6eb96612d2f4efb158eb42526c3c0ed089f140/WebResourceDeployer/D365DevExKey.snk -------------------------------------------------------------------------------- /WebResourceDeployer/Models/FilterCriteria.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.ObjectModel; 3 | using WebResourceDeployer.ViewModels; 4 | 5 | namespace WebResourceDeployer.Models 6 | { 7 | public class FilterCriteria 8 | { 9 | public WebResourceItem WebResourceItem { get; set; } 10 | public string SearchText { get; set; } 11 | public Guid SolutionId { get; set; } 12 | public ObservableCollection FilterStates { get; set; } 13 | public ObservableCollection FilterTypeNames { get; set; } 14 | } 15 | } -------------------------------------------------------------------------------- /WebResourceDeployer/Models/MovedWebResourceItem.cs: -------------------------------------------------------------------------------- 1 | using WebResourceDeployer.ViewModels; 2 | 3 | namespace WebResourceDeployer.Models 4 | { 5 | public class MovedWebResourceItem 6 | { 7 | public WebResourceItem WebResourceItem { get; set; } 8 | public bool Publish { get; set; } 9 | } 10 | } -------------------------------------------------------------------------------- /WebResourceDeployer/Models/TsConfig.cs: -------------------------------------------------------------------------------- 1 | namespace WebResourceDeployer.Models 2 | { 3 | public class TsConfig 4 | { 5 | public bool compileOnSave { get; set; } 6 | public Compileroptions compilerOptions { get; set; } 7 | public string[] include { get; set; } 8 | } 9 | 10 | public class Compileroptions 11 | { 12 | public string outDir { get; set; } 13 | public string target { get; set; } 14 | public bool sourceMap { get; set; } 15 | } 16 | } -------------------------------------------------------------------------------- /WebResourceDeployer/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("WebResourceDeployer")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("WebResourceDeployer")] 12 | [assembly: AssemblyCopyright("Copyright © 2017")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("38094843-6ef7-49ae-b9be-369949d9f673")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /WebResourceDeployer/ViewModels/CrmSolution.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace WebResourceDeployer.ViewModels 4 | { 5 | public class CrmSolution 6 | { 7 | public Guid SolutionId { get; set; } 8 | public string Name { get; set; } 9 | public string Prefix { get; set; } 10 | public string UniqueName { get; set; } 11 | public string NameVersion { get; set; } 12 | } 13 | } -------------------------------------------------------------------------------- /WebResourceDeployer/ViewModels/NewWebResource.cs: -------------------------------------------------------------------------------- 1 | using D365DeveloperExtensions.Core.Models; 2 | using System; 3 | 4 | namespace WebResourceDeployer.ViewModels 5 | { 6 | public class NewWebResource 7 | { 8 | public Guid SolutionId { get; set; } 9 | public string File { get; set; } 10 | public string Name { get; set; } 11 | public string DisplayName { get; set; } 12 | public WebResourceType WebResoruceType { get; set; } 13 | public string Description { get; set; } 14 | } 15 | } -------------------------------------------------------------------------------- /WebResourceDeployer/WebResourceDeployerHost.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.VisualStudio.Shell; 2 | using System.Runtime.InteropServices; 3 | 4 | namespace WebResourceDeployer 5 | { 6 | [Guid("A3479AE0-5F4F-4A14-96F4-46F39000023A")] //Also located in ExtensionConstants.cs 7 | public sealed class WebResourceDeployerHost : ToolWindowPane 8 | { 9 | public WebResourceDeployerHost() : base(null) 10 | { 11 | Caption = Resources.Resource.WebResourceDeployer_Window_Title; 12 | BitmapResourceID = 301; 13 | BitmapIndex = 1; 14 | Content = new WebResourceDeployerWindow(); 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /docs/_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-architect -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | ## Welcome to GitHub Pages 2 | 3 | You can use the [editor on GitHub](https://github.com/tsharp/D365DeveloperExtensions/edit/main/docs/index.md) to maintain and preview the content for your website in Markdown files. 4 | 5 | Whenever you commit to this repository, GitHub Pages will run [Jekyll](https://jekyllrb.com/) to rebuild the pages in your site, from the content in your Markdown files. 6 | 7 | ### Markdown 8 | 9 | Markdown is a lightweight and easy-to-use syntax for styling your writing. It includes conventions for 10 | 11 | ```markdown 12 | Syntax highlighted code block 13 | 14 | # Header 1 15 | ## Header 2 16 | ### Header 3 17 | 18 | - Bulleted 19 | - List 20 | 21 | 1. Numbered 22 | 2. List 23 | 24 | **Bold** and _Italic_ and `Code` text 25 | 26 | [Link](url) and ![Image](src) 27 | ``` 28 | 29 | For more details see [GitHub Flavored Markdown](https://guides.github.com/features/mastering-markdown/). 30 | 31 | ### Jekyll Themes 32 | 33 | Your Pages site will use the layout and styles from the Jekyll theme you have selected in your [repository settings](https://github.com/tsharp/D365DeveloperExtensions/settings/pages). The name of this theme is saved in the Jekyll `_config.yml` configuration file. 34 | 35 | ### Support or Contact 36 | 37 | Having trouble with Pages? Check out our [documentation](https://docs.github.com/categories/github-pages-basics/) or [contact support](https://support.github.com/contact) and we’ll help you sort it out. 38 | --------------------------------------------------------------------------------