├── .editorconfig ├── .github ├── ISSUE_TEMPLATE │ ├── BUG_REPORT.md │ └── FEATURE_REQUEST.md └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── Partner-Center-Explorer.sln ├── README.md ├── azuredeploy.json ├── azuredeploy.param.json ├── docs ├── Deployment.md ├── Images │ ├── aad01.png │ ├── aad02.png │ ├── aad03.png │ ├── aad04.png │ ├── appmgmt01.png │ ├── appmgmt02.png │ ├── portal01.png │ ├── portal02.png │ └── portal03.png ├── Preconsent.md └── Terminolgy.md ├── scripts └── Create-AzureADApplication.ps1 └── src └── Explorer ├── App_Start ├── BundleConfig.cs ├── FilterConfig.cs ├── RouteConfig.cs ├── Startup.Auth.cs ├── UnityConfig.cs └── UnityMvcActivator.cs ├── ApplicationInsights.config ├── Cache ├── CacheDatabaseType.cs ├── CacheException.cs └── DistributedTokenCache.cs ├── Content ├── bootstrap-theme.css ├── bootstrap-theme.css.map ├── bootstrap-theme.min.css ├── bootstrap-theme.min.css.map ├── bootstrap.css ├── bootstrap.css.map ├── bootstrap.min.css ├── bootstrap.min.css.map ├── font-awesome.css ├── font-awesome.min.css ├── style.css └── themes │ └── base │ ├── accordion.css │ ├── all.css │ ├── autocomplete.css │ ├── base.css │ ├── button.css │ ├── core.css │ ├── datepicker.css │ ├── dialog.css │ ├── draggable.css │ ├── images │ ├── ui-bg_flat_0_aaaaaa_40x100.png │ ├── ui-bg_flat_75_ffffff_40x100.png │ ├── ui-bg_glass_55_fbf9ee_1x400.png │ ├── ui-bg_glass_65_ffffff_1x400.png │ ├── ui-bg_glass_75_dadada_1x400.png │ ├── ui-bg_glass_75_e6e6e6_1x400.png │ ├── ui-bg_glass_95_fef1ec_1x400.png │ ├── ui-bg_highlight-soft_75_cccccc_1x100.png │ ├── ui-icons_222222_256x240.png │ ├── ui-icons_2e83ff_256x240.png │ ├── ui-icons_444444_256x240.png │ ├── ui-icons_454545_256x240.png │ ├── ui-icons_555555_256x240.png │ ├── ui-icons_777620_256x240.png │ ├── ui-icons_777777_256x240.png │ ├── ui-icons_888888_256x240.png │ ├── ui-icons_cc0000_256x240.png │ ├── ui-icons_cd0a0a_256x240.png │ └── ui-icons_ffffff_256x240.png │ ├── jquery-ui.css │ ├── jquery-ui.min.css │ ├── menu.css │ ├── progressbar.css │ ├── resizable.css │ ├── selectable.css │ ├── selectmenu.css │ ├── slider.css │ ├── sortable.css │ ├── spinner.css │ ├── tabs.css │ ├── theme.css │ └── tooltip.css ├── Controllers ├── AccountController.cs ├── AuditController.cs ├── BaseController.cs ├── CustomersController.cs ├── DomainsController.cs ├── HealthController.cs ├── HomeController.cs ├── InvoicesController.cs ├── ManageController.cs ├── OfferController.cs ├── ServiceRequestsController.cs ├── SubscriptionsController.cs ├── UsageController.cs └── UsersController.cs ├── Explorer.csproj ├── Global.asax ├── Global.asax.cs ├── GlobalSuppressions.cs ├── Logic ├── Azure │ ├── AzureHealthEvent.cs │ ├── AzureManagement.cs │ └── IncidentEvent.cs ├── CommunicationException.cs ├── Extensions.cs ├── GraphClient.cs ├── HealthEventType.cs ├── HttpService.cs ├── IGraphClient.cs ├── IHealthEvent.cs ├── IHttpService.cs ├── IPartnerOperations.cs ├── Office │ ├── OfficeHealthEvent.cs │ ├── Result.cs │ ├── ServiceCommunications.cs │ └── StatusDetails.cs ├── PartnerOperations.cs └── TelemetryHandleErrorAttribute.cs ├── Models ├── ApplicationCredential.cs ├── AuditRecordsModel.cs ├── AuditSearchModel.cs ├── ConfigurationRecordsModel.cs ├── CreatedCustomerModel.cs ├── CustomerModel.cs ├── CustomersModel.cs ├── DeploymentModel.cs ├── DomainModel.cs ├── EditUserModel.cs ├── InvoiceDetailsModel.cs ├── InvoicesModel.cs ├── LicenseModel.cs ├── NewCustomerModel.cs ├── NewDeploymentModel.cs ├── NewSubscriptionModel.cs ├── NewUserModel.cs ├── OfferModel.cs ├── OffersModel.cs ├── PartnerCenterToken.cs ├── RoleModel.cs ├── ServiceRequestModel.cs ├── ServiceRequestsModel.cs ├── SubscriptionHealthModel.cs ├── SubscriptionManageModel.cs ├── SubscriptionModel.cs ├── SubscriptionsModel.cs ├── UsageModel.cs ├── UserModel.cs └── UsersModel.cs ├── Properties └── AssemblyInfo.cs ├── Providers ├── AccessTokenProvider.cs ├── ConfigurationProvider.cs ├── ExplorerProvider.cs ├── IAccessTokenProvider.cs ├── ICacheProvider.cs ├── IConfigurationProvider.cs ├── IExplorerProvider.cs ├── IVaultProvider.cs ├── KeyVaultProvider.cs └── RedisCacheProvider.cs ├── Scripts ├── ai.0.22.9-build00167.js ├── ai.0.22.9-build00167.min.js ├── application.js ├── bootstrap.js ├── bootstrap.min.js ├── jquery-3.3.1.intellisense.js ├── jquery-3.3.1.js ├── jquery-3.3.1.min.js ├── jquery-3.3.1.min.map ├── jquery-3.3.1.slim.js ├── jquery-3.3.1.slim.min.js ├── jquery-3.3.1.slim.min.map ├── jquery-ui-1.12.1.js ├── jquery-ui-1.12.1.min.js ├── jquery.unobtrusive-ajax.js ├── jquery.unobtrusive-ajax.min.js ├── jquery.validate-vsdoc.js ├── jquery.validate.js ├── jquery.validate.min.js ├── jquery.validate.unobtrusive.js ├── jquery.validate.unobtrusive.min.js ├── respond.js ├── respond.matchmedia.addListener.js ├── respond.matchmedia.addListener.min.js └── respond.min.js ├── Security ├── AuthenticationFilterAttribute.cs ├── AuthenticationProvider.cs ├── AuthorizationFilterAttribute.cs ├── CustomerPrincipal.cs └── UserRoles.cs ├── Service References └── Application Insights │ └── ConnectedService.json ├── Startup.cs ├── Subscriptions ├── AzureSubscriptionDetails.cs ├── ISubscriptionDetails.cs └── OfficeSubscriptionDetails.cs ├── Telemetry ├── ApplicationInsightsTelemetryProvider.cs ├── EmptyTelemetryProvider.cs └── ITelemetryProvider.cs ├── Views ├── Account │ └── SignOutCallback.cshtml ├── Audit │ ├── Records.cshtml │ └── Search.cshtml ├── Automation │ ├── Index.cshtml │ ├── Invoke.cshtml │ └── List.cshtml ├── Customers │ ├── Create.cshtml │ ├── CreatedSuccessfully.cshtml │ ├── Index.cshtml │ ├── List.cshtml │ └── Show.cshtml ├── Domains │ └── ConfigurationRecords.cshtml ├── Health │ ├── Azure.cshtml │ └── Office.cshtml ├── Home │ ├── Error.cshtml │ └── Index.cshtml ├── Invoices │ ├── AzureDetails.cshtml │ ├── Details.cshtml │ ├── Index.cshtml │ └── OfficeDetails.cshtml ├── Manage │ ├── Azure.cshtml │ ├── Deployments.cshtml │ ├── NewDeployment.cshtml │ └── Office.cshtml ├── Offer │ └── Offers.cshtml ├── ServiceRequests │ ├── Index.cshtml │ └── List.cshtml ├── Shared │ ├── EditorTemplates │ │ ├── CustomerModel.cshtml │ │ ├── DeploymentModel.cshtml │ │ ├── LicenseModel.cshtml │ │ ├── OfferModel.cshtml │ │ ├── ServiceRequestModel.cshtml │ │ ├── SubscriptionModel.cshtml │ │ └── UserModel.cshtml │ ├── _Layout.cshtml │ └── _LoginPartial.cshtml ├── Subscriptions │ ├── Azure.cshtml │ ├── Create.cshtml │ ├── List.cshtml │ └── Office.cshtml ├── Usage │ └── ViewUsage.cshtml ├── Users │ ├── Create.cshtml │ ├── Edit.cshtml │ └── List.cshtml ├── Web.config └── _ViewStart.cshtml ├── Web.Debug.config ├── Web.Release.config ├── Web.config ├── favicon.ico ├── fonts ├── FontAwesome.otf ├── fontawesome-webfont.eot ├── fontawesome-webfont.svg ├── fontawesome-webfont.ttf ├── fontawesome-webfont.woff ├── fontawesome-webfont.woff2 ├── glyphicons-halflings-regular.eot ├── glyphicons-halflings-regular.svg ├── glyphicons-halflings-regular.ttf ├── glyphicons-halflings-regular.woff └── glyphicons-halflings-regular.woff2 └── packages.config /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome:http://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Don't use tabs for indentation. 7 | [*] 8 | indent_style = space 9 | end_of_line = crlf 10 | # (Please don't specify an indent_size here; that has too many unintended consequences.) 11 | 12 | # Code files 13 | [*.{cs,csx,vb,vbx}] 14 | indent_size = 4 15 | 16 | # Xml project files 17 | [*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}] 18 | indent_size = 2 19 | 20 | # Xml config files 21 | [*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}] 22 | indent_size = 2 23 | 24 | # JSON files 25 | [*.json] 26 | indent_size = 2 27 | 28 | # Dotnet code style settings: 29 | [*.{cs, vb}] 30 | # Sort using and Import directives with System.* appearing first 31 | dotnet_sort_system_directives_first = true 32 | # Avoid "this." and "Me." if not necessary 33 | dotnet_style_qualification_for_field = false:suggestion 34 | dotnet_style_qualification_for_property = false:suggestion 35 | dotnet_style_qualification_for_method = false:suggestion 36 | dotnet_style_qualification_for_event = false:suggestion 37 | 38 | # Use language keywords instead of framework type names for type references 39 | dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion 40 | dotnet_style_predefined_type_for_member_access = true:suggestion 41 | 42 | # Suggest more modern language features when available 43 | dotnet_style_object_initializer = true:suggestion 44 | dotnet_style_collection_initializer = true:suggestion 45 | dotnet_style_coalesce_expression = true:suggestion 46 | dotnet_style_null_propagation = true:suggestion 47 | dotnet_style_explicit_tuple_names = true:suggestion 48 | 49 | # CSharp code style settings: 50 | [*.cs] 51 | # Prefer "var" everywhere 52 | csharp_style_var_for_built_in_types = false:suggestion 53 | csharp_style_var_when_type_is_apparent = false:suggestion 54 | csharp_style_var_elsewhere = false:suggestion 55 | 56 | # Prefer method-like constructs to have a block body 57 | csharp_style_expression_bodied_methods = false:none 58 | csharp_style_expression_bodied_constructors = false:none 59 | csharp_style_expression_bodied_operators = false:none 60 | 61 | # Prefer property-like constructs to have an expression-body 62 | csharp_style_expression_bodied_properties = true:none 63 | csharp_style_expression_bodied_indexers = true:none 64 | csharp_style_expression_bodied_accessors = true:none 65 | 66 | # Suggest more modern language features when available 67 | csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion 68 | csharp_style_pattern_matching_over_as_with_null_check = true:suggestion 69 | csharp_style_inlined_variable_declaration = true:suggestion 70 | csharp_style_throw_expression = true:suggestion 71 | csharp_style_conditional_delegate_call = true:suggestion 72 | 73 | # Newline settings 74 | csharp_new_line_before_open_brace = all 75 | csharp_new_line_before_else = true 76 | csharp_new_line_before_catch = true 77 | csharp_new_line_before_finally = true 78 | csharp_new_line_before_members_in_object_initializers = true 79 | csharp_new_line_before_members_in_anonymous_types = true -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/BUG_REPORT.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | 5 | --- 6 | 7 | # Steps to reproduce 8 | 9 | > What steps can reproduce the defect? 10 | > Please share the setup, commandline for vstest.console, sample project, target 11 | > framework etc. 12 | 13 | ## Expected behavior 14 | 15 | > Share the expected output 16 | 17 | ## Actual behavior 18 | 19 | > What is the behavior observed? 20 | 21 | ## Diagnostic logs 22 | 23 | > Please share test platform diagnostics logs. 24 | > The logs may contain test assembly paths, kindly review and mask those before sharing. 25 | 26 | ## Environment 27 | 28 | > Please share additional details about your environment. 29 | > Version -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | 5 | --- 6 | 7 | # Feature Request 8 | 9 | **Is your feature request related to a problem? Please describe.** 10 | A clear and concise description of what the problem is. Ex. I am always frustrated when [...] 11 | 12 | **Describe the solution you would like** 13 | A clear and concise description of what you want to happen. 14 | 15 | **Describe alternatives you have considered** 16 | A clear and concise description of any alternative solutions or features you have considered. 17 | 18 | **Additional context** 19 | Add any other context or screenshots about the feature request here. -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | # Description 2 | 3 | Please add a meaningful description for this change. Ensure the PR has required unit tests. 4 | 5 | ## Related issue 6 | 7 | Kindly link any related issues (e.g. Fixes #xyz). -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. All rights reserved. 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 -------------------------------------------------------------------------------- /Partner-Center-Explorer.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.26228.9 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{2A457A15-6F26-4ECC-AF7B-978F55D6C9E4}" 7 | EndProject 8 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{7FB59B7D-83BA-40B5-8D34-791CEDE1E00F}" 9 | ProjectSection(SolutionItems) = preProject 10 | azuredeploy.json = azuredeploy.json 11 | azuredeploy.param.json = azuredeploy.param.json 12 | CODE_OF_CONDUCT.md = CODE_OF_CONDUCT.md 13 | CONTRIBUTING.md = CONTRIBUTING.md 14 | LICENSE = LICENSE 15 | README.md = README.md 16 | EndProjectSection 17 | EndProject 18 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Explorer", "src\Explorer\Explorer.csproj", "{36430809-1810-4045-8761-4582CDAF708F}" 19 | EndProject 20 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{AF9B24D9-433D-458B-B254-2946017B4CEA}" 21 | ProjectSection(SolutionItems) = preProject 22 | docs\Deployment.md = docs\Deployment.md 23 | docs\Preconsent.md = docs\Preconsent.md 24 | docs\Terminolgy.md = docs\Terminolgy.md 25 | EndProjectSection 26 | EndProject 27 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{A574A852-591E-4594-96BB-808122581462}" 28 | ProjectSection(SolutionItems) = preProject 29 | scripts\Create-AzureADApplication.ps1 = scripts\Create-AzureADApplication.ps1 30 | EndProjectSection 31 | EndProject 32 | Global 33 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 34 | Debug|Any CPU = Debug|Any CPU 35 | Release|Any CPU = Release|Any CPU 36 | EndGlobalSection 37 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 38 | {36430809-1810-4045-8761-4582CDAF708F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 39 | {36430809-1810-4045-8761-4582CDAF708F}.Debug|Any CPU.Build.0 = Debug|Any CPU 40 | {36430809-1810-4045-8761-4582CDAF708F}.Release|Any CPU.ActiveCfg = Release|Any CPU 41 | {36430809-1810-4045-8761-4582CDAF708F}.Release|Any CPU.Build.0 = Release|Any CPU 42 | EndGlobalSection 43 | GlobalSection(SolutionProperties) = preSolution 44 | HideSolutionNode = FALSE 45 | EndGlobalSection 46 | GlobalSection(NestedProjects) = preSolution 47 | {36430809-1810-4045-8761-4582CDAF708F} = {2A457A15-6F26-4ECC-AF7B-978F55D6C9E4} 48 | EndGlobalSection 49 | GlobalSection(ExtensibilityGlobals) = postSolution 50 | SolutionGuid = {16777B2C-4490-4D63-87D7-BD65EA41116C} 51 | EndGlobalSection 52 | EndGlobal 53 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Partner Center Explorer 2 | [![Build status](https://ci.appveyor.com/api/projects/status/t633j9bj0ivrlaqx?svg=true)](https://ci.appveyor.com/project/isaiahwilliams/partner-center-explorer) 3 | 4 | Partner Center Explorer is an open source project that demonstrates how you can 5 | utilizes various techologies to support Cloud Solution Provider customers. This 6 | project enables you (the partner), customers, and end-users the ability to manage 7 | various resources. The primary purpose of this solution is to educate you on what 8 | is possible and how it can be accomplished. 9 | 10 | This project is being provided with community support only. If you need help please, 11 | log an issue using the [issue tracker](https://github.com/Microsoft/Partner-Center-Explorer/issues). 12 | 13 | ## Deployment 14 | Please see the [deployment guide](docs/Deployment.md) for details on how to deploy this project. 15 | 16 | [![Deploy to Azure](http://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FMicrosoft%2FPartner-Center-Explorer%2Fmaster%2Fazuredeploy.json) 17 | [![Visualize](http://armviz.io/visualizebutton.png)](http://armviz.io/#/?load=https%3A%2F%2Fraw.githubusercontent.com%2FMicrosoft%2FPartner-Center-Explorer%2Fmaster%2Fazuredeploy.json) 18 | 19 | ## Screenshots 20 | The following are various screenshots that should help provide a better 21 | understanding of what this project provides 22 | 23 | ![Customer Management](docs/Images/portal01.png) 24 | 25 | ![Subscription Management](docs/Images/portal02.png) 26 | 27 | ![Subscription Incidents](docs/Images/portal03.png) 28 | 29 | ## Code of Conduct 30 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more 31 | information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact 32 | [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. 33 | 34 | ## License 35 | Copyright (c) Microsoft Corporation. All rights reserved. 36 | 37 | Licensed under the [MIT](LICENSE) License. 38 | -------------------------------------------------------------------------------- /azuredeploy.param.json: -------------------------------------------------------------------------------- 1 | { 2 | "appInsightsLocation": { 3 | "value": "South Central US" 4 | }, 5 | "applicationId": { 6 | "value": "" 7 | }, 8 | "applicationSecret": { 9 | "value": "" 10 | }, 11 | "applicationTenantId": { 12 | "value": "" 13 | }, 14 | "branch": { 15 | "value": "master" 16 | }, 17 | "cacheSKUName": { 18 | "value": "basic" 19 | }, 20 | "cacheSKUFamily": { 21 | "value": "C" 22 | }, 23 | "cacheSKUCapacity": { 24 | "value": 0 25 | }, 26 | "partnerCenterAccountId": { 27 | "value": "" 28 | }, 29 | "partnerCenterApplicationId": { 30 | "value": "" 31 | }, 32 | "partnerCenterApplicationSecret": { 33 | "value": "" 34 | }, 35 | "repoUrl": { 36 | "value": "https://github.com/Microsoft/Partner-Center-Explorer" 37 | }, 38 | "webSiteName": { 39 | "value": "" 40 | }, 41 | "skuName": { 42 | "value": "F1" 43 | }, 44 | "keyVaultName": { 45 | "value": "" 46 | } 47 | } -------------------------------------------------------------------------------- /docs/Images/aad01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/docs/Images/aad01.png -------------------------------------------------------------------------------- /docs/Images/aad02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/docs/Images/aad02.png -------------------------------------------------------------------------------- /docs/Images/aad03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/docs/Images/aad03.png -------------------------------------------------------------------------------- /docs/Images/aad04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/docs/Images/aad04.png -------------------------------------------------------------------------------- /docs/Images/appmgmt01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/docs/Images/appmgmt01.png -------------------------------------------------------------------------------- /docs/Images/appmgmt02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/docs/Images/appmgmt02.png -------------------------------------------------------------------------------- /docs/Images/portal01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/docs/Images/portal01.png -------------------------------------------------------------------------------- /docs/Images/portal02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/docs/Images/portal02.png -------------------------------------------------------------------------------- /docs/Images/portal03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/docs/Images/portal03.png -------------------------------------------------------------------------------- /docs/Preconsent.md: -------------------------------------------------------------------------------- 1 | # Pre-consent 2 | Azure Active Directory utilizes a consent framework that is based on a user or an administrator giving consent to an application 3 | that asks to be registered in their directory, which may involve accessing directory data. This framework presents two primary 4 | problems for Cloud Solution Provider (CSP) partners 5 | 6 | 1. Getting all customers to consent to an application can prove to be difficult task. 7 | 2. There might be a need to perform an operation against a newly provisioned tenant before access has been granted to the customer. 8 | Which means the customer will not be able to consent to the application. 9 | 10 | In order to overcome these issues CSP partners can configure an for pre-consent. This configuration takes advantage of the 11 | delegated administrative permissions that are granted to CSP partner over a customer associated with their reseller. Perform 12 | the following steps to configure the application that will be used to access the Partner Center API for pre-consent 13 | 14 | 1. Install Azure AD PowerShell Module (instruction available [here](https://docs.microsoft.com/en-us/powershell/azuread/)). 15 | 2. Update the _AppId_ and _DisplayName_ variables in the PowerShell script below 16 | 3. Execute the modified PowerShell script. When prompted for authentication specify credentials that belong to the tenant where the application was created and that have global 17 | admin privileges 18 | 19 | ```powershell 20 | Connect-AzureAD 21 | 22 | $AppId = 'INSERT-APPLICATION-ID-HERE' 23 | $DisplayName = 'INSERT-APPLICATION-DISPLAY-NAME-HERE' 24 | 25 | $g = Get-AzureADGroup | ? {$_.DisplayName -eq 'AdminAgents'} 26 | $s = Get-AzureADServicePrincipal | ? {$_.AppId -eq $AppId} 27 | 28 | if ($s -eq $null) { $s = New-AzureADServicePrincipal -AppId $AppId -DisplayName $DisplayName } 29 | Add-AzureADGroupMember -ObjectId $g.ObjectId -RefObjectId $s.ObjectId 30 | ``` -------------------------------------------------------------------------------- /docs/Terminolgy.md: -------------------------------------------------------------------------------- 1 | # Terminology 2 | The following terms are essential to understand when working with this project 3 | 4 | * **Admin on Behalf of (AOBO)** - Where an application created by the partner and registered in the partner’s Azure AD tenant can perform administrative tasks on behalf of 5 | the customer. This concept leverages the app + user authentication flow.​ 6 | * **App only authentication** - An OAuth2 authentication flow where the client identifier and client secret are used to obtain a token from Azure AD for the application itself. 7 | This is possible because the application in Azure AD has a secret, also known as a password, that is used to verify the application’s identity. ​ 8 | * **App + user authentication** - An OAuth2 authentication flow where the client identifier and user credentials are used to obtain a token from Azure AD. This type of 9 | authentication requires user credentials or a user assertion token. ​ 10 | * **Application permissions** - A set of permissions that are available to be assigned to an Azure AD application. Once configured these permissions will be the privileges 11 | that the application has been granted. In order to utilize these permissions the app only authentication flow must be used. 12 | * **Delegated permissions** - A set permissions that are available to be delegated to a user. Once configured these permissions will be the privileges delegated to a user. In 13 | order to utilizes these permissions the app + user authentication flow must be used. 14 | * **Pre-consent** - A configuration for an application in Azure AD that enables the application to take advantage of the existing delegated administrative rights. This 15 | configuration enables an application to bypass the consent framework when accessing resources that belong to customers that have an existing relationship with the partner. 16 | * **Service Principal** - An object that defines the policy and permissions for an application, providing the basis for a security principal to represent the application when 17 | accessing resources at run-time. A service principal object is required in each tenant for which an instance of the application's usage must be represented, enabling secure 18 | access to resources owned by user accounts from that tenant. -------------------------------------------------------------------------------- /src/Explorer/App_Start/BundleConfig.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer 8 | { 9 | using System.Web.Optimization; 10 | 11 | /// 12 | /// Configures the bundles used by the application. 13 | /// 14 | public static class BundleConfig 15 | { 16 | /// 17 | /// Registers the bundles. 18 | /// 19 | /// A collection of bundles. 20 | public static void RegisterBundles(BundleCollection bundles) 21 | { 22 | bundles.Add(new ScriptBundle("~/bundles/jquery").Include( 23 | "~/Scripts/jquery-{version}.js", 24 | "~/Scripts/jquery.unobtrusive-ajax.js")); 25 | 26 | bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include( 27 | "~/Scripts/jquery-ui-{version}.js")); 28 | 29 | bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include( 30 | "~/Scripts/jquery.validate.min.js", 31 | "~/Scripts/jquery.validate.unobtrusive.min.js")); 32 | 33 | bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include( 34 | "~/Scripts/bootstrap.min.js", 35 | "~/Scripts/respond.min.js")); 36 | 37 | bundles.Add(new StyleBundle("~/Content/css").Include( 38 | "~/Content/bootstrap.min.css", 39 | "~/Content/font-awesome.min.css", 40 | "~/Content/style.css")); 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /src/Explorer/App_Start/FilterConfig.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer 8 | { 9 | using System.Web.Mvc; 10 | using Logic; 11 | using Security; 12 | 13 | /// 14 | /// Configures the application filters. 15 | /// 16 | public static class FilterConfig 17 | { 18 | /// 19 | /// Registers the global filters. 20 | /// 21 | /// The global filter collection. 22 | public static void RegisterGlobalFilters(GlobalFilterCollection filters) 23 | { 24 | filters.Add(new AuthenticationFilterAttribute()); 25 | filters.Add(new TelemetryHandleErrorAttribute()); 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /src/Explorer/App_Start/UnityConfig.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer 8 | { 9 | using System; 10 | using Providers; 11 | using Unity; 12 | using Unity.Lifetime; 13 | 14 | /// 15 | /// Specifies the Unity configuration for the main container. 16 | /// 17 | public static class UnityConfig 18 | { 19 | private static Lazy container = 20 | new Lazy(() => 21 | { 22 | UnityContainer container = new UnityContainer(); 23 | RegisterTypes(container); 24 | return container; 25 | }); 26 | 27 | /// 28 | /// Configured Unity Container. 29 | /// 30 | public static IUnityContainer Container => container.Value; 31 | 32 | /// 33 | /// Registers the type mappings with the Unity container. 34 | /// 35 | /// The unity container to configure. 36 | /// 37 | /// There is no need to register concrete types such as controllers or 38 | /// API controllers (unless you want to change the defaults), as Unity 39 | /// allows resolving a concrete type even if it was not previously 40 | /// registered. 41 | /// 42 | public static void RegisterTypes(IUnityContainer container) 43 | { 44 | container.RegisterType(new ContainerControlledLifetimeManager()); 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /src/Explorer/App_Start/UnityMvcActivator.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | [assembly: WebActivatorEx.PreApplicationStartMethod(typeof(Microsoft.Store.PartnerCenter.Explorer.UnityMvcActivator), nameof(Microsoft.Store.PartnerCenter.Explorer.UnityMvcActivator.Start))] 8 | [assembly: WebActivatorEx.ApplicationShutdownMethod(typeof(Microsoft.Store.PartnerCenter.Explorer.UnityMvcActivator), nameof(Microsoft.Store.PartnerCenter.Explorer.UnityMvcActivator.Shutdown))] 9 | 10 | namespace Microsoft.Store.PartnerCenter.Explorer 11 | { 12 | using System.Linq; 13 | using System.Web.Mvc; 14 | using Unity.AspNet.Mvc; 15 | 16 | /// 17 | /// Provides the bootstrapping for integrating Unity with ASP.NET MVC. 18 | /// 19 | public static class UnityMvcActivator 20 | { 21 | /// 22 | /// Integrates Unity when the application starts. 23 | /// 24 | public static void Start() 25 | { 26 | FilterProviders.Providers.Remove(FilterProviders.Providers.OfType().First()); 27 | FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(UnityConfig.Container)); 28 | 29 | DependencyResolver.SetResolver(new UnityDependencyResolver(UnityConfig.Container)); 30 | } 31 | 32 | /// 33 | /// Disposes the Unity container when the application is shut down. 34 | /// 35 | public static void Shutdown() 36 | { 37 | UnityConfig.Container.Dispose(); 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /src/Explorer/Cache/CacheDatabaseType.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Cache 8 | { 9 | /// 10 | /// Defines the different cache databases. 11 | /// 12 | public enum CacheDatabaseType 13 | { 14 | /// 15 | /// Cache database used to store authentication related entities. 16 | /// 17 | Authentication = 0, 18 | 19 | /// 20 | /// Cache database used to store various data structures. 21 | /// 22 | DataStructures = 1 23 | } 24 | } -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/accordion.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Accordion 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/accordion/#theming 10 | */ 11 | .ui-accordion .ui-accordion-header { 12 | display: block; 13 | cursor: pointer; 14 | position: relative; 15 | margin: 2px 0 0 0; 16 | padding: .5em .5em .5em .7em; 17 | min-height: 0; /* support: IE7 */ 18 | font-size: 100%; 19 | } 20 | .ui-accordion .ui-accordion-icons { 21 | padding-left: 2.2em; 22 | } 23 | .ui-accordion .ui-accordion-icons .ui-accordion-icons { 24 | padding-left: 2.2em; 25 | } 26 | .ui-accordion .ui-accordion-header .ui-accordion-header-icon { 27 | position: absolute; 28 | left: .5em; 29 | top: 50%; 30 | margin-top: -8px; 31 | } 32 | .ui-accordion .ui-accordion-content { 33 | padding: 1em 2.2em; 34 | border-top: 0; 35 | overflow: auto; 36 | } 37 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/all.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI CSS Framework 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/category/theming/ 10 | */ 11 | @import "base.css"; 12 | @import "theme.css"; 13 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/autocomplete.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Autocomplete 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/autocomplete/#theming 10 | */ 11 | .ui-autocomplete { 12 | position: absolute; 13 | top: 0; 14 | left: 0; 15 | cursor: default; 16 | } 17 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/base.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI CSS Framework 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/category/theming/ 10 | */ 11 | @import url("core.css"); 12 | 13 | @import url("accordion.css"); 14 | @import url("autocomplete.css"); 15 | @import url("button.css"); 16 | @import url("datepicker.css"); 17 | @import url("dialog.css"); 18 | @import url("draggable.css"); 19 | @import url("menu.css"); 20 | @import url("progressbar.css"); 21 | @import url("resizable.css"); 22 | @import url("selectable.css"); 23 | @import url("selectmenu.css"); 24 | @import url("sortable.css"); 25 | @import url("slider.css"); 26 | @import url("spinner.css"); 27 | @import url("tabs.css"); 28 | @import url("tooltip.css"); 29 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/button.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Button 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/button/#theming 10 | */ 11 | .ui-button { 12 | display: inline-block; 13 | position: relative; 14 | padding: 0; 15 | line-height: normal; 16 | margin-right: .1em; 17 | cursor: pointer; 18 | vertical-align: middle; 19 | text-align: center; 20 | overflow: visible; /* removes extra width in IE */ 21 | } 22 | .ui-button, 23 | .ui-button:link, 24 | .ui-button:visited, 25 | .ui-button:hover, 26 | .ui-button:active { 27 | text-decoration: none; 28 | } 29 | /* to make room for the icon, a width needs to be set here */ 30 | .ui-button-icon-only { 31 | width: 2.2em; 32 | } 33 | /* button elements seem to need a little more width */ 34 | button.ui-button-icon-only { 35 | width: 2.4em; 36 | } 37 | .ui-button-icons-only { 38 | width: 3.4em; 39 | } 40 | button.ui-button-icons-only { 41 | width: 3.7em; 42 | } 43 | 44 | /* button text element */ 45 | .ui-button .ui-button-text { 46 | display: block; 47 | line-height: normal; 48 | } 49 | .ui-button-text-only .ui-button-text { 50 | padding: .4em 1em; 51 | } 52 | .ui-button-icon-only .ui-button-text, 53 | .ui-button-icons-only .ui-button-text { 54 | padding: .4em; 55 | text-indent: -9999999px; 56 | } 57 | .ui-button-text-icon-primary .ui-button-text, 58 | .ui-button-text-icons .ui-button-text { 59 | padding: .4em 1em .4em 2.1em; 60 | } 61 | .ui-button-text-icon-secondary .ui-button-text, 62 | .ui-button-text-icons .ui-button-text { 63 | padding: .4em 2.1em .4em 1em; 64 | } 65 | .ui-button-text-icons .ui-button-text { 66 | padding-left: 2.1em; 67 | padding-right: 2.1em; 68 | } 69 | /* no icon support for input elements, provide padding by default */ 70 | input.ui-button { 71 | padding: .4em 1em; 72 | } 73 | 74 | /* button icon element(s) */ 75 | .ui-button-icon-only .ui-icon, 76 | .ui-button-text-icon-primary .ui-icon, 77 | .ui-button-text-icon-secondary .ui-icon, 78 | .ui-button-text-icons .ui-icon, 79 | .ui-button-icons-only .ui-icon { 80 | position: absolute; 81 | top: 50%; 82 | margin-top: -8px; 83 | } 84 | .ui-button-icon-only .ui-icon { 85 | left: 50%; 86 | margin-left: -8px; 87 | } 88 | .ui-button-text-icon-primary .ui-button-icon-primary, 89 | .ui-button-text-icons .ui-button-icon-primary, 90 | .ui-button-icons-only .ui-button-icon-primary { 91 | left: .5em; 92 | } 93 | .ui-button-text-icon-secondary .ui-button-icon-secondary, 94 | .ui-button-text-icons .ui-button-icon-secondary, 95 | .ui-button-icons-only .ui-button-icon-secondary { 96 | right: .5em; 97 | } 98 | 99 | /* button sets */ 100 | .ui-buttonset { 101 | margin-right: 7px; 102 | } 103 | .ui-buttonset .ui-button { 104 | margin-left: 0; 105 | margin-right: -.3em; 106 | } 107 | 108 | /* workarounds */ 109 | /* reset extra padding in Firefox, see h5bp.com/l */ 110 | input.ui-button::-moz-focus-inner, 111 | button.ui-button::-moz-focus-inner { 112 | border: 0; 113 | padding: 0; 114 | } 115 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/core.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI CSS Framework 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/category/theming/ 10 | */ 11 | 12 | /* Layout helpers 13 | ----------------------------------*/ 14 | .ui-helper-hidden { 15 | display: none; 16 | } 17 | .ui-helper-hidden-accessible { 18 | border: 0; 19 | clip: rect(0 0 0 0); 20 | height: 1px; 21 | margin: -1px; 22 | overflow: hidden; 23 | padding: 0; 24 | position: absolute; 25 | width: 1px; 26 | } 27 | .ui-helper-reset { 28 | margin: 0; 29 | padding: 0; 30 | border: 0; 31 | outline: 0; 32 | line-height: 1.3; 33 | text-decoration: none; 34 | font-size: 100%; 35 | list-style: none; 36 | } 37 | .ui-helper-clearfix:before, 38 | .ui-helper-clearfix:after { 39 | content: ""; 40 | display: table; 41 | border-collapse: collapse; 42 | } 43 | .ui-helper-clearfix:after { 44 | clear: both; 45 | } 46 | .ui-helper-clearfix { 47 | min-height: 0; /* support: IE7 */ 48 | } 49 | .ui-helper-zfix { 50 | width: 100%; 51 | height: 100%; 52 | top: 0; 53 | left: 0; 54 | position: absolute; 55 | opacity: 0; 56 | filter:Alpha(Opacity=0); /* support: IE8 */ 57 | } 58 | 59 | .ui-front { 60 | z-index: 100; 61 | } 62 | 63 | 64 | /* Interaction Cues 65 | ----------------------------------*/ 66 | .ui-state-disabled { 67 | cursor: default !important; 68 | } 69 | 70 | 71 | /* Icons 72 | ----------------------------------*/ 73 | 74 | /* states and images */ 75 | .ui-icon { 76 | display: block; 77 | text-indent: -99999px; 78 | overflow: hidden; 79 | background-repeat: no-repeat; 80 | } 81 | 82 | 83 | /* Misc visuals 84 | ----------------------------------*/ 85 | 86 | /* Overlays */ 87 | .ui-widget-overlay { 88 | position: fixed; 89 | top: 0; 90 | left: 0; 91 | width: 100%; 92 | height: 100%; 93 | } 94 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/dialog.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Dialog 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/dialog/#theming 10 | */ 11 | .ui-dialog { 12 | overflow: hidden; 13 | position: absolute; 14 | top: 0; 15 | left: 0; 16 | padding: .2em; 17 | outline: 0; 18 | } 19 | .ui-dialog .ui-dialog-titlebar { 20 | padding: .4em 1em; 21 | position: relative; 22 | } 23 | .ui-dialog .ui-dialog-title { 24 | float: left; 25 | margin: .1em 0; 26 | white-space: nowrap; 27 | width: 90%; 28 | overflow: hidden; 29 | text-overflow: ellipsis; 30 | } 31 | .ui-dialog .ui-dialog-titlebar-close { 32 | position: absolute; 33 | right: .3em; 34 | top: 50%; 35 | width: 20px; 36 | margin: -10px 0 0 0; 37 | padding: 1px; 38 | height: 20px; 39 | } 40 | .ui-dialog .ui-dialog-content { 41 | position: relative; 42 | border: 0; 43 | padding: .5em 1em; 44 | background: none; 45 | overflow: auto; 46 | } 47 | .ui-dialog .ui-dialog-buttonpane { 48 | text-align: left; 49 | border-width: 1px 0 0 0; 50 | background-image: none; 51 | margin-top: .5em; 52 | padding: .3em 1em .5em .4em; 53 | } 54 | .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { 55 | float: right; 56 | } 57 | .ui-dialog .ui-dialog-buttonpane button { 58 | margin: .5em .4em .5em 0; 59 | cursor: pointer; 60 | } 61 | .ui-dialog .ui-resizable-se { 62 | width: 12px; 63 | height: 12px; 64 | right: -5px; 65 | bottom: -5px; 66 | background-position: 16px 16px; 67 | } 68 | .ui-draggable .ui-dialog-titlebar { 69 | cursor: move; 70 | } 71 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/draggable.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Draggable 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | */ 9 | .ui-draggable-handle { 10 | -ms-touch-action: none; 11 | touch-action: none; 12 | } 13 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-bg_flat_75_ffffff_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-bg_flat_75_ffffff_40x100.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-bg_glass_65_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-bg_glass_65_ffffff_1x400.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-bg_glass_75_dadada_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-bg_glass_75_dadada_1x400.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-icons_2e83ff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-icons_2e83ff_256x240.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-icons_444444_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-icons_444444_256x240.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-icons_454545_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-icons_454545_256x240.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-icons_555555_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-icons_555555_256x240.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-icons_777620_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-icons_777620_256x240.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-icons_777777_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-icons_777777_256x240.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-icons_888888_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-icons_888888_256x240.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-icons_cc0000_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-icons_cc0000_256x240.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-icons_cd0a0a_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-icons_cd0a0a_256x240.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/Content/themes/base/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/menu.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Menu 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/menu/#theming 10 | */ 11 | .ui-menu { 12 | list-style: none; 13 | padding: 0; 14 | margin: 0; 15 | display: block; 16 | outline: none; 17 | } 18 | .ui-menu .ui-menu { 19 | position: absolute; 20 | } 21 | .ui-menu .ui-menu-item { 22 | position: relative; 23 | margin: 0; 24 | padding: 3px 1em 3px .4em; 25 | cursor: pointer; 26 | min-height: 0; /* support: IE7 */ 27 | /* support: IE10, see #8844 */ 28 | list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); 29 | } 30 | .ui-menu .ui-menu-divider { 31 | margin: 5px 0; 32 | height: 0; 33 | font-size: 0; 34 | line-height: 0; 35 | border-width: 1px 0 0 0; 36 | } 37 | .ui-menu .ui-state-focus, 38 | .ui-menu .ui-state-active { 39 | margin: -1px; 40 | } 41 | 42 | /* icon support */ 43 | .ui-menu-icons { 44 | position: relative; 45 | } 46 | .ui-menu-icons .ui-menu-item { 47 | padding-left: 2em; 48 | } 49 | 50 | /* left-aligned */ 51 | .ui-menu .ui-icon { 52 | position: absolute; 53 | top: 0; 54 | bottom: 0; 55 | left: .2em; 56 | margin: auto 0; 57 | } 58 | 59 | /* right-aligned */ 60 | .ui-menu .ui-menu-icon { 61 | left: auto; 62 | right: 0; 63 | } 64 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/progressbar.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Progressbar 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/progressbar/#theming 10 | */ 11 | .ui-progressbar { 12 | height: 2em; 13 | text-align: left; 14 | overflow: hidden; 15 | } 16 | .ui-progressbar .ui-progressbar-value { 17 | margin: -1px; 18 | height: 100%; 19 | } 20 | .ui-progressbar .ui-progressbar-overlay { 21 | background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); 22 | height: 100%; 23 | filter: alpha(opacity=25); /* support: IE8 */ 24 | opacity: 0.25; 25 | } 26 | .ui-progressbar-indeterminate .ui-progressbar-value { 27 | background-image: none; 28 | } 29 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/resizable.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Resizable 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | */ 9 | .ui-resizable { 10 | position: relative; 11 | } 12 | .ui-resizable-handle { 13 | position: absolute; 14 | font-size: 0.1px; 15 | display: block; 16 | -ms-touch-action: none; 17 | touch-action: none; 18 | } 19 | .ui-resizable-disabled .ui-resizable-handle, 20 | .ui-resizable-autohide .ui-resizable-handle { 21 | display: none; 22 | } 23 | .ui-resizable-n { 24 | cursor: n-resize; 25 | height: 7px; 26 | width: 100%; 27 | top: -5px; 28 | left: 0; 29 | } 30 | .ui-resizable-s { 31 | cursor: s-resize; 32 | height: 7px; 33 | width: 100%; 34 | bottom: -5px; 35 | left: 0; 36 | } 37 | .ui-resizable-e { 38 | cursor: e-resize; 39 | width: 7px; 40 | right: -5px; 41 | top: 0; 42 | height: 100%; 43 | } 44 | .ui-resizable-w { 45 | cursor: w-resize; 46 | width: 7px; 47 | left: -5px; 48 | top: 0; 49 | height: 100%; 50 | } 51 | .ui-resizable-se { 52 | cursor: se-resize; 53 | width: 12px; 54 | height: 12px; 55 | right: 1px; 56 | bottom: 1px; 57 | } 58 | .ui-resizable-sw { 59 | cursor: sw-resize; 60 | width: 9px; 61 | height: 9px; 62 | left: -5px; 63 | bottom: -5px; 64 | } 65 | .ui-resizable-nw { 66 | cursor: nw-resize; 67 | width: 9px; 68 | height: 9px; 69 | left: -5px; 70 | top: -5px; 71 | } 72 | .ui-resizable-ne { 73 | cursor: ne-resize; 74 | width: 9px; 75 | height: 9px; 76 | right: -5px; 77 | top: -5px; 78 | } 79 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/selectable.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Selectable 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | */ 9 | .ui-selectable { 10 | -ms-touch-action: none; 11 | touch-action: none; 12 | } 13 | .ui-selectable-helper { 14 | position: absolute; 15 | z-index: 100; 16 | border: 1px dotted black; 17 | } 18 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/selectmenu.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Selectmenu 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/selectmenu/#theming 10 | */ 11 | .ui-selectmenu-menu { 12 | padding: 0; 13 | margin: 0; 14 | position: absolute; 15 | top: 0; 16 | left: 0; 17 | display: none; 18 | } 19 | .ui-selectmenu-menu .ui-menu { 20 | overflow: auto; 21 | /* Support: IE7 */ 22 | overflow-x: hidden; 23 | padding-bottom: 1px; 24 | } 25 | .ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { 26 | font-size: 1em; 27 | font-weight: bold; 28 | line-height: 1.5; 29 | padding: 2px 0.4em; 30 | margin: 0.5em 0 0 0; 31 | height: auto; 32 | border: 0; 33 | } 34 | .ui-selectmenu-open { 35 | display: block; 36 | } 37 | .ui-selectmenu-button { 38 | display: inline-block; 39 | overflow: hidden; 40 | position: relative; 41 | text-decoration: none; 42 | cursor: pointer; 43 | } 44 | .ui-selectmenu-button span.ui-icon { 45 | right: 0.5em; 46 | left: auto; 47 | margin-top: -8px; 48 | position: absolute; 49 | top: 50%; 50 | } 51 | .ui-selectmenu-button span.ui-selectmenu-text { 52 | text-align: left; 53 | padding: 0.4em 2.1em 0.4em 1em; 54 | display: block; 55 | line-height: 1.4; 56 | overflow: hidden; 57 | text-overflow: ellipsis; 58 | white-space: nowrap; 59 | } 60 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/slider.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Slider 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/slider/#theming 10 | */ 11 | .ui-slider { 12 | position: relative; 13 | text-align: left; 14 | } 15 | .ui-slider .ui-slider-handle { 16 | position: absolute; 17 | z-index: 2; 18 | width: 1.2em; 19 | height: 1.2em; 20 | cursor: default; 21 | -ms-touch-action: none; 22 | touch-action: none; 23 | } 24 | .ui-slider .ui-slider-range { 25 | position: absolute; 26 | z-index: 1; 27 | font-size: .7em; 28 | display: block; 29 | border: 0; 30 | background-position: 0 0; 31 | } 32 | 33 | /* support: IE8 - See #6727 */ 34 | .ui-slider.ui-state-disabled .ui-slider-handle, 35 | .ui-slider.ui-state-disabled .ui-slider-range { 36 | filter: inherit; 37 | } 38 | 39 | .ui-slider-horizontal { 40 | height: .8em; 41 | } 42 | .ui-slider-horizontal .ui-slider-handle { 43 | top: -.3em; 44 | margin-left: -.6em; 45 | } 46 | .ui-slider-horizontal .ui-slider-range { 47 | top: 0; 48 | height: 100%; 49 | } 50 | .ui-slider-horizontal .ui-slider-range-min { 51 | left: 0; 52 | } 53 | .ui-slider-horizontal .ui-slider-range-max { 54 | right: 0; 55 | } 56 | 57 | .ui-slider-vertical { 58 | width: .8em; 59 | height: 100px; 60 | } 61 | .ui-slider-vertical .ui-slider-handle { 62 | left: -.3em; 63 | margin-left: 0; 64 | margin-bottom: -.6em; 65 | } 66 | .ui-slider-vertical .ui-slider-range { 67 | left: 0; 68 | width: 100%; 69 | } 70 | .ui-slider-vertical .ui-slider-range-min { 71 | bottom: 0; 72 | } 73 | .ui-slider-vertical .ui-slider-range-max { 74 | top: 0; 75 | } 76 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/sortable.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Sortable 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | */ 9 | .ui-sortable-handle { 10 | -ms-touch-action: none; 11 | touch-action: none; 12 | } 13 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/spinner.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Spinner 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/spinner/#theming 10 | */ 11 | .ui-spinner { 12 | position: relative; 13 | display: inline-block; 14 | overflow: hidden; 15 | padding: 0; 16 | vertical-align: middle; 17 | } 18 | .ui-spinner-input { 19 | border: none; 20 | background: none; 21 | color: inherit; 22 | padding: 0; 23 | margin: .2em 0; 24 | vertical-align: middle; 25 | margin-left: .4em; 26 | margin-right: 22px; 27 | } 28 | .ui-spinner-button { 29 | width: 16px; 30 | height: 50%; 31 | font-size: .5em; 32 | padding: 0; 33 | margin: 0; 34 | text-align: center; 35 | position: absolute; 36 | cursor: default; 37 | display: block; 38 | overflow: hidden; 39 | right: 0; 40 | } 41 | /* more specificity required here to override default borders */ 42 | .ui-spinner a.ui-spinner-button { 43 | border-top: none; 44 | border-bottom: none; 45 | border-right: none; 46 | } 47 | /* vertically center icon */ 48 | .ui-spinner .ui-icon { 49 | position: absolute; 50 | margin-top: -8px; 51 | top: 50%; 52 | left: 0; 53 | } 54 | .ui-spinner-up { 55 | top: 0; 56 | } 57 | .ui-spinner-down { 58 | bottom: 0; 59 | } 60 | 61 | /* TR overrides */ 62 | .ui-spinner .ui-icon-triangle-1-s { 63 | /* need to fix icons sprite */ 64 | background-position: -65px -16px; 65 | } 66 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/tabs.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Tabs 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/tabs/#theming 10 | */ 11 | .ui-tabs { 12 | position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ 13 | padding: .2em; 14 | } 15 | .ui-tabs .ui-tabs-nav { 16 | margin: 0; 17 | padding: .2em .2em 0; 18 | } 19 | .ui-tabs .ui-tabs-nav li { 20 | list-style: none; 21 | float: left; 22 | position: relative; 23 | top: 0; 24 | margin: 1px .2em 0 0; 25 | border-bottom-width: 0; 26 | padding: 0; 27 | white-space: nowrap; 28 | } 29 | .ui-tabs .ui-tabs-nav .ui-tabs-anchor { 30 | float: left; 31 | padding: .5em 1em; 32 | text-decoration: none; 33 | } 34 | .ui-tabs .ui-tabs-nav li.ui-tabs-active { 35 | margin-bottom: -1px; 36 | padding-bottom: 1px; 37 | } 38 | .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, 39 | .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, 40 | .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { 41 | cursor: text; 42 | } 43 | .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { 44 | cursor: pointer; 45 | } 46 | .ui-tabs .ui-tabs-panel { 47 | display: block; 48 | border-width: 0; 49 | padding: 1em 1.4em; 50 | background: none; 51 | } 52 | -------------------------------------------------------------------------------- /src/Explorer/Content/themes/base/tooltip.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Tooltip 1.11.4 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/tooltip/#theming 10 | */ 11 | .ui-tooltip { 12 | padding: 8px; 13 | position: absolute; 14 | z-index: 9999; 15 | max-width: 300px; 16 | -webkit-box-shadow: 0 0 5px #aaa; 17 | box-shadow: 0 0 5px #aaa; 18 | } 19 | body .ui-tooltip { 20 | border-width: 2px; 21 | } 22 | -------------------------------------------------------------------------------- /src/Explorer/Controllers/AccountController.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Controllers 8 | { 9 | using System.Web; 10 | using System.Web.Mvc; 11 | using Microsoft.Owin.Security; 12 | using Microsoft.Owin.Security.Cookies; 13 | using Microsoft.Owin.Security.OpenIdConnect; 14 | 15 | /// 16 | /// Controller to manage authentication operations. 17 | /// 18 | public class AccountController : Controller 19 | { 20 | /// 21 | /// Handles the sign-in request. 22 | /// 23 | public void SignIn() 24 | { 25 | // Send an OpenID Connect sign-in request. 26 | if (!Request.IsAuthenticated) 27 | { 28 | HttpContext.GetOwinContext().Authentication.Challenge( 29 | new AuthenticationProperties { RedirectUri = "/" }, 30 | OpenIdConnectAuthenticationDefaults.AuthenticationType); 31 | } 32 | } 33 | 34 | /// 35 | /// Represents an event that is raised when the sign-out operation is complete. 36 | /// 37 | public void SignOut() 38 | { 39 | string callbackUrl = Url.Action("SignOutCallback", "Account", routeValues: null, protocol: Request.Url.Scheme); 40 | 41 | HttpContext.GetOwinContext().Authentication.SignOut( 42 | new AuthenticationProperties { RedirectUri = callbackUrl }, 43 | OpenIdConnectAuthenticationDefaults.AuthenticationType, 44 | CookieAuthenticationDefaults.AuthenticationType); 45 | } 46 | 47 | /// 48 | /// Handles the callback that happens after the user is signed out from Azure AD. 49 | /// 50 | /// Returns a redirect to the home page. 51 | public ActionResult SignOutCallback() 52 | { 53 | if (Request.IsAuthenticated) 54 | { 55 | return RedirectToAction("Index", "Home"); 56 | } 57 | 58 | return View(); 59 | } 60 | } 61 | } -------------------------------------------------------------------------------- /src/Explorer/Controllers/AuditController.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Controllers 8 | { 9 | using System; 10 | using System.Threading.Tasks; 11 | using System.Web.Mvc; 12 | using Models; 13 | using Providers; 14 | using Security; 15 | 16 | /// 17 | /// Controller for Audit views. 18 | /// 19 | /// 20 | [AuthorizationFilter(Roles = UserRoles.Partner)] 21 | public class AuditController : BaseController 22 | { 23 | /// 24 | /// Initializes a new instance of the class. 25 | /// 26 | /// Provides access to core services. 27 | public AuditController(IExplorerProvider provider) : base(provider) 28 | { 29 | } 30 | 31 | /// 32 | /// Get the audit records for the specified date range using the Partner Center API. 33 | /// 34 | /// The end date of the audit record logs. 35 | /// The start date of the audit record logs. 36 | /// A partial view containing the requested audit record logs. 37 | public async Task GetRecords(DateTime endDate, DateTime startDate) 38 | { 39 | AuditRecordsModel auditRecordsModel = new AuditRecordsModel() 40 | { 41 | Records = await Provider.PartnerOperations.GetAuditRecordsAsync(startDate, endDate).ConfigureAwait(false) 42 | }; 43 | 44 | return PartialView("Records", auditRecordsModel); 45 | } 46 | 47 | /// 48 | /// Handles the request for the Search view. 49 | /// 50 | /// Returns an empty view. 51 | public ActionResult Search() 52 | { 53 | return View(); 54 | } 55 | } 56 | } -------------------------------------------------------------------------------- /src/Explorer/Controllers/BaseController.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Controllers 8 | { 9 | using System.Web.Mvc; 10 | using Providers; 11 | 12 | /// 13 | /// Base controller for controllers. 14 | /// 15 | public class BaseController : Controller 16 | { 17 | /// 18 | /// Provides access to the core application services. 19 | /// 20 | private readonly IExplorerProvider provider; 21 | 22 | /// 23 | /// Initializes a new instance of the class. 24 | /// 25 | protected BaseController(IExplorerProvider provider) 26 | { 27 | this.provider = provider; 28 | } 29 | 30 | /// 31 | /// Provides access to the core application services. 32 | /// 33 | protected IExplorerProvider Provider => provider; 34 | } 35 | } -------------------------------------------------------------------------------- /src/Explorer/Controllers/HomeController.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Controllers 8 | { 9 | using System.Web.Mvc; 10 | using Providers; 11 | using Security; 12 | 13 | /// 14 | /// Controller for all Home views. 15 | /// 16 | public class HomeController : BaseController 17 | { 18 | /// 19 | /// Initializes a new instance of the class. 20 | /// 21 | public HomeController(IExplorerProvider provider) : base(provider) 22 | { 23 | } 24 | 25 | /// 26 | /// Handles the request for the index view. 27 | /// 28 | /// The HTML template for the index page. 29 | [AuthorizationFilter(Roles = UserRoles.Partner)] 30 | public ActionResult Index() 31 | { 32 | return View(); 33 | } 34 | 35 | /// 36 | /// Handles the request for the error view. 37 | /// 38 | /// The HTML template for the error page. 39 | public ActionResult Error(string message) 40 | { 41 | ViewBag.ErrorMessage = message; 42 | return View(); 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /src/Explorer/Controllers/ServiceRequestsController.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Controllers 8 | { 9 | using System.Collections.Generic; 10 | using System.Linq; 11 | using System.Threading.Tasks; 12 | using System.Web.Mvc; 13 | using Models; 14 | using PartnerCenter.Models; 15 | using PartnerCenter.Models.ServiceRequests; 16 | using Providers; 17 | using Security; 18 | 19 | /// 20 | /// Handles all request for Service Requests views. 21 | /// 22 | [AuthorizationFilter(Roles = UserRoles.Partner)] 23 | public class ServiceRequestsController : BaseController 24 | { 25 | /// 26 | /// Initializes a new instance of the class. 27 | /// 28 | /// Provides access to core services. 29 | public ServiceRequestsController(IExplorerProvider provider) : base(provider) 30 | { 31 | } 32 | 33 | /// 34 | /// Serves the HTML template for the index page. 35 | /// 36 | /// 37 | /// The HTML template for the index page. 38 | /// 39 | public ActionResult Index() 40 | { 41 | return View(); 42 | } 43 | 44 | /// 45 | /// Serves the HTML template for the list view. 46 | /// 47 | /// The HTML template for the list view. 48 | public async Task List() 49 | { 50 | ServiceRequestsModel serviceRequestsModel = new ServiceRequestsModel(); 51 | 52 | serviceRequestsModel.ServiceRequests.AddRange(await GetServiceRequestsAsync().ConfigureAwait(false)); 53 | 54 | return PartialView(serviceRequestsModel); 55 | } 56 | 57 | /// 58 | /// Gets a list of service requests. 59 | /// 60 | /// A list of service requests. 61 | private async Task> GetServiceRequestsAsync() 62 | { 63 | ResourceCollection requests; 64 | 65 | try 66 | { 67 | requests = await Provider.PartnerOperations.GetServiceRequestsAsync().ConfigureAwait(false); 68 | 69 | return requests.Items.Select(r => new ServiceRequestModel() 70 | { 71 | CreatedDate = r.CreatedDate, 72 | Id = r.Id, 73 | Organization = r.Organization?.Name, 74 | PrimaryContact = r.PrimaryContact?.Email, 75 | ProductName = r.ProductName, 76 | Status = r.Status.ToString(), 77 | Title = r.Title 78 | }).ToList(); 79 | } 80 | finally 81 | { 82 | requests = null; 83 | } 84 | } 85 | } 86 | } -------------------------------------------------------------------------------- /src/Explorer/Controllers/UsageController.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Controllers 8 | { 9 | using System; 10 | using System.Threading.Tasks; 11 | using System.Web.Mvc; 12 | using Logic; 13 | using Models; 14 | using PartnerCenter.Models.Customers; 15 | using PartnerCenter.Models.Subscriptions; 16 | using Providers; 17 | using Security; 18 | 19 | /// 20 | /// Controller for all Usage views. 21 | /// 22 | [AuthorizationFilter(Roles = UserRoles.Partner)] 23 | public class UsageController : BaseController 24 | { 25 | /// 26 | /// Initializes a new instance of the class. 27 | /// 28 | /// Provides access to core services. 29 | public UsageController(IExplorerProvider provider) : base(provider) 30 | { 31 | } 32 | 33 | /// 34 | /// Views the usage. 35 | /// 36 | /// The customer identifier. 37 | /// The subscription identifier. 38 | /// The HTML template for the view usage page. 39 | /// 40 | /// is empty or null. 41 | /// or 42 | /// is empty or null. 43 | /// 44 | public async Task ViewUsage(string customerId, string subscriptionId) 45 | { 46 | Customer customer; 47 | Subscription subscription; 48 | 49 | customerId.AssertNotEmpty(nameof(customerId)); 50 | subscriptionId.AssertNotEmpty(nameof(subscriptionId)); 51 | 52 | try 53 | { 54 | customer = await Provider.PartnerOperations.GetCustomerAsync(customerId).ConfigureAwait(false); 55 | subscription = await Provider.PartnerOperations.GetSubscriptionAsync(customerId, subscriptionId).ConfigureAwait(false); 56 | 57 | UsageModel usageModel = new UsageModel() 58 | { 59 | CompanyName = customer.CompanyProfile.CompanyName, 60 | CustomerId = customerId, 61 | SubscriptionId = subscriptionId, 62 | SubscriptionFriendlyName = subscription.FriendlyName, 63 | }; 64 | 65 | usageModel.Usage.AddRange(await Provider.PartnerOperations 66 | .GetSubscriptionUsageAsync(customerId, subscriptionId, DateTime.Now.AddMonths(-1), DateTime.Now) 67 | .ConfigureAwait(false)); 68 | 69 | return View(usageModel); 70 | } 71 | finally 72 | { 73 | customer = null; 74 | subscription = null; 75 | } 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /src/Explorer/Global.asax: -------------------------------------------------------------------------------- 1 | <%@ Application Codebehind="Global.asax.cs" Inherits="Microsoft.Store.PartnerCenter.Explorer.MvcApplication" Language="C#" %> 2 | -------------------------------------------------------------------------------- /src/Explorer/Global.asax.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer 8 | { 9 | using System.Threading.Tasks; 10 | using System.Web; 11 | using System.Web.Mvc; 12 | using System.Web.Optimization; 13 | using System.Web.Routing; 14 | using Providers; 15 | using Unity; 16 | 17 | /// 18 | /// Defines the methods and properties that are common to application objects. 19 | /// 20 | /// 21 | public class MvcApplication : HttpApplication 22 | { 23 | /// 24 | /// Called when the application starts. 25 | /// 26 | protected void Application_Start() 27 | { 28 | IExplorerProvider provider; 29 | 30 | try 31 | { 32 | AreaRegistration.RegisterAllAreas(); 33 | 34 | provider = UnityConfig.Container.Resolve(); 35 | 36 | Task.Run(provider.InitializeAsync).Wait(); 37 | 38 | ApplicationInsights.Extensibility.TelemetryConfiguration.Active.InstrumentationKey = 39 | provider.Configuration.InstrumentationKey; 40 | 41 | FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 42 | RouteConfig.RegisterRoutes(RouteTable.Routes); 43 | BundleConfig.RegisterBundles(BundleTable.Bundles); 44 | } 45 | finally 46 | { 47 | provider = null; 48 | } 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /src/Explorer/GlobalSuppressions.cs: -------------------------------------------------------------------------------- 1 |  2 | // This file is used by Code Analysis to maintain SuppressMessage 3 | // attributes that are applied to this project. 4 | // Project-level suppressions either have no target or are given 5 | // a specific target and scoped to a namespace, type, member, etc. 6 | 7 | [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores", Justification = "This is requred function name.", Scope = "member", Target = "~M:Microsoft.Store.PartnerCenter.Explorer.MvcApplication.Application_Start")] 8 | [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "This function is called externally.", Scope = "member", Target = "~M:Microsoft.Store.PartnerCenter.Explorer.MvcApplication.Application_Start")] 9 | 10 | -------------------------------------------------------------------------------- /src/Explorer/Logic/Azure/AzureHealthEvent.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Logic.Azure 8 | { 9 | using System; 10 | 11 | /// 12 | /// A health event returned from Azure Insights. 13 | /// 14 | public class AzureHealthEvent : IHealthEvent 15 | { 16 | /// 17 | /// Gets or sets the description. 18 | /// 19 | /// 20 | /// The description of the . 21 | /// 22 | public string Description { get; set; } 23 | 24 | /// 25 | /// Gets or sets the event timestamp. 26 | /// 27 | /// 28 | /// The event timestamp value. 29 | /// 30 | public DateTime EventTimestamp { get; set; } 31 | 32 | /// 33 | /// Gets the type of the . 34 | /// 35 | /// 36 | /// The type of the event. 37 | /// 38 | public HealthEventType EventType => HealthEventType.Azure; 39 | 40 | /// 41 | /// Gets or sets the resource identifier. 42 | /// 43 | /// 44 | /// The resource identifier value. 45 | /// 46 | public string ResourceId { get; set; } 47 | 48 | /// 49 | /// Gets or sets the name of the resource group. 50 | /// 51 | /// 52 | /// The name of the resource group. 53 | /// 54 | public string ResourceGroupName { get; set; } 55 | 56 | /// 57 | /// Gets or sets the name of the resource provider. 58 | /// 59 | /// 60 | /// The name of the resource provider. 61 | /// 62 | public string ResourceProviderName { get; set; } 63 | 64 | /// 65 | /// Gets or sets the type of the resource. 66 | /// 67 | /// 68 | /// The type of the resource. 69 | /// 70 | public string ResourceType { get; set; } 71 | 72 | /// 73 | /// Gets or sets the status of the . 74 | /// 75 | /// 76 | /// The status of the . 77 | /// 78 | public string Status { get; set; } 79 | } 80 | } -------------------------------------------------------------------------------- /src/Explorer/Logic/Azure/IncidentEvent.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Logic.Azure 8 | { 9 | using System; 10 | 11 | /// 12 | /// Represents an incident event and used exclusively for querying. 13 | /// 14 | public class IncidentEvent 15 | { 16 | /// 17 | /// Gets or sets the timestamp for the event. 18 | /// 19 | public DateTime EventTimestamp { get; set; } 20 | 21 | /// 22 | /// Gets or sets the resource provider for the event. 23 | /// 24 | public string ResourceProvider { get; set; } 25 | } 26 | } -------------------------------------------------------------------------------- /src/Explorer/Logic/HealthEventType.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Logic 8 | { 9 | /// 10 | /// Enumeration description possible health event types. 11 | /// 12 | public enum HealthEventType 13 | { 14 | /// 15 | /// The health event is from Azure Insights. 16 | /// 17 | Azure, 18 | 19 | /// 20 | /// The health event is from Office 365 Service Communications API. 21 | /// 22 | Office 23 | } 24 | } -------------------------------------------------------------------------------- /src/Explorer/Logic/HttpService.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Logic 8 | { 9 | using System; 10 | using System.Net.Http; 11 | using System.Net.Http.Headers; 12 | using System.Threading.Tasks; 13 | using Rest; 14 | 15 | /// 16 | /// Provides the ability to perform HTTP operations. 17 | /// 18 | public class HttpService : IHttpService 19 | { 20 | /// 21 | /// Static instance of the class. 22 | /// 23 | private static HttpClient client = new HttpClient( 24 | new RetryDelegatingHandler 25 | { 26 | InnerHandler = new HttpClientHandler() 27 | }); 28 | 29 | /// 30 | /// Sends a GET request to the specified Uri as an asynchronous operation. 31 | /// 32 | /// The return type. 33 | /// The Uri where the request should be sent. 34 | /// The access token value used to authorize the request. 35 | /// The task object representing the asynchronous operation. 36 | /// 37 | /// is empty or null. 38 | /// or 39 | /// is empty or null. 40 | /// 41 | /// 42 | public async Task GetAsync(Uri requestUri, string token) 43 | { 44 | HttpResponseMessage response; 45 | 46 | requestUri.AssertNotNull(nameof(requestUri)); 47 | token.AssertNotEmpty(nameof(token)); 48 | 49 | try 50 | { 51 | using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUri)) 52 | { 53 | request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); 54 | request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 55 | 56 | response = await client.SendAsync(request).ConfigureAwait(false); 57 | 58 | if (!response.IsSuccessStatusCode) 59 | { 60 | string result = await response.Content.ReadAsStringAsync().ConfigureAwait(false); 61 | 62 | throw new CommunicationException(result, response.StatusCode); 63 | } 64 | 65 | return await response.Content.ReadAsAsync().ConfigureAwait(false); 66 | } 67 | } 68 | finally 69 | { 70 | response = null; 71 | } 72 | } 73 | } 74 | } -------------------------------------------------------------------------------- /src/Explorer/Logic/IGraphClient.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Logic 8 | { 9 | using System.Collections.Generic; 10 | using System.Threading.Tasks; 11 | using Microsoft.Graph; 12 | using Models; 13 | 14 | /// 15 | /// Represents an object that interacts with Microsoft Azure AD Graph API. 16 | /// 17 | public interface IGraphClient 18 | { 19 | /// 20 | /// Gets a list of roles assigned to the specified object identifier. 21 | /// 22 | /// Object identifier for the object to be checked. 23 | /// A list of roles that that are associated with the specified object identifier. 24 | Task> GetDirectoryRolesAsync(string objectId); 25 | 26 | /// 27 | /// Gets the service configuration records for the specified domain. 28 | /// 29 | /// Name of the domain 30 | /// A list of service configuration records for the specified domain. 31 | Task> GetDomainConfigurationRecordsAsync(string domain); 32 | 33 | /// 34 | /// Gets a list of domains configured for the customer. 35 | /// 36 | /// A list of domains configured for the customer. 37 | Task> GetDomainsAsync(); 38 | 39 | /// 40 | /// Gets a list of users for the customer. 41 | /// 42 | /// A list of users that belong to the customer. 43 | Task> GetUsersAsync(); 44 | } 45 | } -------------------------------------------------------------------------------- /src/Explorer/Logic/IHealthEvent.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Logic 8 | { 9 | /// 10 | /// Interface for health events obtained from Azure Insights and Office 365 Service Communications API. 11 | /// 12 | public interface IHealthEvent 13 | { 14 | /// 15 | /// Gets the type of the . 16 | /// 17 | HealthEventType EventType { get; } 18 | 19 | /// 20 | /// Gets or sets the status of the . 21 | /// 22 | string Status { get; set; } 23 | } 24 | } -------------------------------------------------------------------------------- /src/Explorer/Logic/IHttpService.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Logic 8 | { 9 | using System; 10 | using System.Threading.Tasks; 11 | 12 | /// 13 | /// Represent the ability to perform HTTP operations. 14 | /// 15 | public interface IHttpService 16 | { 17 | /// 18 | /// Sends a GET request to the specified Uri as an asynchronous operation. 19 | /// 20 | /// The return type. 21 | /// The Uri where the request should be sent. 22 | /// The access token value used to authorize the request. 23 | /// The task object representing the asynchronous operation. 24 | Task GetAsync(Uri requestUri, string token); 25 | } 26 | } -------------------------------------------------------------------------------- /src/Explorer/Logic/Office/OfficeHealthEvent.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Logic.Office 8 | { 9 | using System; 10 | using System.Collections.Generic; 11 | 12 | /// 13 | /// Health event returned from Office 365 Service Communications API. 14 | /// 15 | public class OfficeHealthEvent : IHealthEvent 16 | { 17 | /// 18 | /// Initializes a new instance of the class. 19 | /// 20 | public OfficeHealthEvent() 21 | { 22 | IncidentIds = new List(); 23 | } 24 | 25 | /// 26 | /// Gets or sets the identifier. 27 | /// 28 | public string Id { get; set; } 29 | 30 | /// 31 | /// Gets the type of the . 32 | /// 33 | public HealthEventType EventType => HealthEventType.Office; 34 | 35 | /// 36 | /// Gets or sets a list of incidents. 37 | /// 38 | public List IncidentIds { get; } 39 | 40 | /// 41 | /// Gets or sets the status of the . 42 | /// 43 | public string Status { get; set; } 44 | 45 | /// 46 | /// Gets or sets the status time. 47 | /// 48 | public DateTime StatusTime { get; set; } 49 | 50 | /// 51 | /// Gets or sets the workload. 52 | /// 53 | public string Workload { get; set; } 54 | 55 | /// 56 | /// Gets or sets the display name of the workload. 57 | /// 58 | public string WorkloadDisplayName { get; set; } 59 | } 60 | } -------------------------------------------------------------------------------- /src/Explorer/Logic/Office/Result.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Logic.Office 8 | { 9 | using System.Collections.Generic; 10 | using Newtonsoft.Json; 11 | 12 | /// 13 | /// Represents a result from the Service Communication API. 14 | /// 15 | /// Type return from the Service Communication API. 16 | public class Result 17 | { 18 | /// 19 | /// Initializes a new instance of the class. 20 | /// 21 | public Result() 22 | { 23 | Value = new List(); 24 | } 25 | 26 | /// 27 | /// Gets or sets the OData context. 28 | /// 29 | [JsonProperty("@odata.context")] 30 | public string ODataContext { get; set; } 31 | 32 | /// 33 | /// Gets or sets the value returned from the API. 34 | /// 35 | public List Value { get; } 36 | } 37 | } -------------------------------------------------------------------------------- /src/Explorer/Logic/Office/StatusDetails.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Logic.Office 8 | { 9 | using System; 10 | using System.Collections.Generic; 11 | 12 | /// 13 | /// Represents status details obtained from the Office 365 Service Communication 14 | /// 15 | public class StatusDetails 16 | { 17 | /// 18 | /// Initializes a new instance of the class. 19 | /// 20 | public StatusDetails() 21 | { 22 | IncidentIds = new List(); 23 | } 24 | 25 | /// 26 | /// Gets or sets the identifier. 27 | /// 28 | public string Id { get; set; } 29 | 30 | /// 31 | /// Gets the incident identifiers associated with this status. 32 | /// 33 | public List IncidentIds { get; } 34 | 35 | /// 36 | /// Gets or sets the status. 37 | /// 38 | public string Status { get; set; } 39 | 40 | /// 41 | /// Gets or sets the status time. 42 | /// 43 | public DateTime StatusTime { get; set; } 44 | 45 | /// 46 | /// Gets or sets the workload. 47 | /// 48 | public string Workload { get; set; } 49 | 50 | /// 51 | /// Gets or sets the display name of the workload. 52 | /// 53 | public string WorkloadDisplayName { get; set; } 54 | } 55 | } -------------------------------------------------------------------------------- /src/Explorer/Logic/TelemetryHandleErrorAttribute.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Logic 8 | { 9 | using System; 10 | using System.Web.Mvc; 11 | using Providers; 12 | using Unity; 13 | 14 | /// 15 | /// Represents custom handle error attribute that logs the exception to the configured telemetry provider. 16 | /// 17 | /// 18 | [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 19 | public sealed class TelemetryHandleErrorAttribute : HandleErrorAttribute 20 | { 21 | /// 22 | /// Called when an exception occurs. 23 | /// 24 | /// The action-filter context. 25 | public override void OnException(ExceptionContext filterContext) 26 | { 27 | IExplorerProvider provider; 28 | 29 | try 30 | { 31 | provider = UnityConfig.Container.Resolve(); 32 | 33 | if (filterContext?.HttpContext != null && filterContext.Exception != null) 34 | { 35 | if (filterContext.HttpContext.IsCustomErrorEnabled) 36 | { 37 | provider.Telemetry.TrackException(filterContext.Exception); 38 | } 39 | } 40 | 41 | base.OnException(filterContext); 42 | } 43 | finally 44 | { 45 | provider = null; 46 | } 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /src/Explorer/Models/ApplicationCredential.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System.Security; 10 | 11 | /// 12 | /// Represents credentials to be used to acquire an access token. 13 | /// 14 | public sealed class ApplicationCredential 15 | { 16 | /// 17 | /// Identifier of the client requesting the token. 18 | /// 19 | public string ApplicationId { get; set; } 20 | 21 | /// 22 | /// Secret of the client requesting the token. 23 | /// 24 | public SecureString ApplicationSecret { get; set; } 25 | 26 | /// 27 | /// Gets or sets a flag indicating whether or not distributed token cache 28 | /// should be utilized for token acquistion. 29 | /// 30 | public bool UseCache { get; set; } 31 | } 32 | } -------------------------------------------------------------------------------- /src/Explorer/Models/AuditRecordsModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using PartnerCenter.Models; 10 | using PartnerCenter.Models.Auditing; 11 | 12 | /// 13 | /// View model for audit log records from Partner Center. 14 | /// 15 | public class AuditRecordsModel 16 | { 17 | /// 18 | /// Gets or sets the collection of audit log records. 19 | /// 20 | public SeekBasedResourceCollection Records { get; set; } 21 | } 22 | } -------------------------------------------------------------------------------- /src/Explorer/Models/AuditSearchModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System; 10 | using System.ComponentModel.DataAnnotations; 11 | 12 | /// 13 | /// Model that represents audit record log search. 14 | /// 15 | public class AuditSearchModel 16 | { 17 | /// 18 | /// Gets or sets the end date. 19 | /// 20 | [DataType(DataType.DateTime)] 21 | public DateTime EndDate { get; set; } 22 | 23 | /// 24 | /// Gets or sets the start date. 25 | /// 26 | [DataType(DataType.DateTime)] 27 | public DateTime StartDate { get; set; } 28 | } 29 | } -------------------------------------------------------------------------------- /src/Explorer/Models/ConfigurationRecordsModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System.Collections.Generic; 10 | using Microsoft.Graph; 11 | 12 | /// 13 | /// Model for domain configuration records obtain from Azure AD Graph API. 14 | /// 15 | public class ConfigurationRecordsModel 16 | { 17 | /// 18 | /// Initializes a new instance of the class. 19 | /// 20 | public ConfigurationRecordsModel() 21 | { 22 | ServiceConfigurationRecords = new List(); 23 | } 24 | 25 | /// 26 | /// Gets the service configuration records. 27 | /// 28 | public List ServiceConfigurationRecords { get; } 29 | } 30 | } -------------------------------------------------------------------------------- /src/Explorer/Models/CreatedCustomerModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | /// 10 | /// Model that represents the newly created customer. 11 | /// 12 | public class CreatedCustomerModel 13 | { 14 | /// 15 | /// Gets or sets the domain for the user. 16 | /// 17 | public string Domain { get; set; } 18 | 19 | /// 20 | /// Gets or sets the password configured the initial user. 21 | /// 22 | public string Password { get; set; } 23 | 24 | /// 25 | /// Gets or sets the username configured for the initial user. 26 | /// 27 | public string Username { get; set; } 28 | } 29 | } -------------------------------------------------------------------------------- /src/Explorer/Models/CustomerModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using PartnerCenter.Models.Customers; 10 | 11 | /// 12 | /// Model that represents a customer from Partner Center. 13 | /// 14 | public class CustomerModel 15 | { 16 | /// 17 | /// Gets or sets the billing profile. 18 | /// 19 | public CustomerBillingProfile BillingProfile { get; set; } 20 | 21 | /// 22 | /// Gets or sets the name of the company. 23 | /// 24 | public string CompanyName { get; set; } 25 | 26 | /// 27 | /// Gets or sets the company profile. 28 | /// 29 | public CustomerCompanyProfile CompanyProfile { get; set; } 30 | 31 | /// 32 | /// Gets or sets the customer identifier. 33 | /// 34 | public string CustomerId { get; set; } 35 | 36 | /// 37 | /// Gets or sets the name of the domain. 38 | /// 39 | public string DomainName { get; set; } 40 | 41 | /// 42 | /// Gets or sets the relationship to partner. 43 | /// 44 | public string RelationshipToPartner { get; set; } 45 | } 46 | } -------------------------------------------------------------------------------- /src/Explorer/Models/CustomersModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System.Collections.Generic; 10 | 11 | /// 12 | /// Model for listing existing customers. 13 | /// 14 | public class CustomersModel 15 | { 16 | /// 17 | /// Initializes a new instance of the class. 18 | /// 19 | public CustomersModel() 20 | { 21 | Customers = new List(); 22 | } 23 | 24 | /// 25 | /// Initializes a new instance of the class. 26 | /// 27 | /// Items to be added to the customers collection. 28 | public CustomersModel(IList items) 29 | { 30 | Customers = new List(items); 31 | } 32 | 33 | 34 | /// 35 | /// Gets a collection of customer that belong to the configured partner. 36 | /// 37 | public List Customers { get; } 38 | 39 | /// 40 | /// Gets or sets a value indicating whether or not the configured tenant is the integration sandbox. 41 | /// 42 | public bool IsSandboxEnvironment { get; set; } 43 | } 44 | } -------------------------------------------------------------------------------- /src/Explorer/Models/DeploymentModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System; 10 | 11 | /// 12 | /// Model for new deployments in Azure using Azure Resource Manager (ARM) templates. 13 | /// 14 | public class DeploymentModel 15 | { 16 | /// 17 | /// Gets or sets the identifier for the deployment. 18 | /// 19 | public string Id { get; set; } 20 | 21 | /// 22 | /// Gets or sets the name for the deployment 23 | /// 24 | public string Name { get; set; } 25 | 26 | /// 27 | /// Gets or sets the state of the provisioning. 28 | /// 29 | public string ProvisioningState { get; set; } 30 | 31 | /// 32 | /// Gets or sets the timestamp. 33 | /// 34 | public DateTime Timestamp { get; set; } 35 | } 36 | } -------------------------------------------------------------------------------- /src/Explorer/Models/DomainModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System.Collections.Generic; 10 | 11 | /// 12 | /// Represents a domain obtained from Microsoft Graph. 13 | /// 14 | public class DomainModel 15 | { 16 | /// 17 | /// Gets or sets a value indicating whether the domain is admin managed. 18 | /// 19 | public bool AdminManaged { get; set; } 20 | 21 | /// 22 | /// Gets or sets the type of the authentication. 23 | /// 24 | public string AuthenticationType { get; set; } 25 | 26 | /// 27 | /// Gets or sets the availability status. 28 | /// 29 | public string AvailabilityStatus { get; set; } 30 | 31 | /// 32 | /// Gets or sets a value indicating whether the domain is default. 33 | /// 34 | public bool IsDefault { get; set; } 35 | 36 | /// 37 | /// Gets or sets a value indicating whether the domain is initial. 38 | /// 39 | public bool IsInitial { get; set; } 40 | 41 | /// 42 | /// Gets or sets a value indicating whether the domain is the root one. 43 | /// 44 | public bool IsRoot { get; set; } 45 | 46 | /// 47 | /// Gets or sets a value indicating whether the domain has been verified. 48 | /// 49 | public bool IsVerified { get; set; } 50 | 51 | /// 52 | /// Gets or sets the name of the domain. 53 | /// 54 | public string Name { get; set; } 55 | 56 | /// 57 | /// Gets or sets the supported services. 58 | /// 59 | public IEnumerable SupportedServices { get; set; } 60 | } 61 | } -------------------------------------------------------------------------------- /src/Explorer/Models/EditUserModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System.Collections.Generic; 10 | using System.ComponentModel.DataAnnotations; 11 | 12 | /// 13 | /// Model for editing a user. 14 | /// 15 | public class EditUserModel 16 | { 17 | /// 18 | /// Initializes a new instance of the class. 19 | /// 20 | public EditUserModel() 21 | { 22 | Licenses = new List(); 23 | } 24 | 25 | /// 26 | /// Gets or sets the customer identifier. 27 | /// 28 | public string CustomerId { get; set; } 29 | 30 | /// 31 | /// Gets or sets the display name. 32 | /// 33 | [Display(Name = "Display Name")] 34 | [Required] 35 | public string DisplayName { get; set; } 36 | 37 | /// 38 | /// Gets or sets the first name. 39 | /// 40 | [Display(Name = "First Name")] 41 | [Required] 42 | public string FirstName { get; set; } 43 | 44 | /// 45 | /// Gets or sets the last name. 46 | /// 47 | [Display(Name = "Last Name")] 48 | [Required] 49 | public string LastName { get; set; } 50 | 51 | /// 52 | /// Gets or sets licenses for the user. 53 | /// 54 | public List Licenses { get; } 55 | 56 | /// 57 | /// Gets or sets the password. 58 | /// 59 | public string Password { get; set; } 60 | 61 | /// 62 | /// Gets or sets the usage location. 63 | /// 64 | public string UsageLocation { get; set; } 65 | 66 | /// 67 | /// Gets or sets the user identifier. 68 | /// 69 | public string UserId { get; set; } 70 | 71 | /// 72 | /// Gets or sets the name of the user principal. 73 | /// 74 | [Display(Name = "User Principal Name")] 75 | [Required] 76 | public string UserPrincipalName { get; set; } 77 | } 78 | } -------------------------------------------------------------------------------- /src/Explorer/Models/InvoiceDetailsModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System.Collections.Generic; 10 | using PartnerCenter.Models.Invoices; 11 | 12 | /// 13 | /// Model for displaying invoice details. 14 | /// 15 | public class InvoiceDetailsModel 16 | { 17 | /// 18 | /// Initializes a new instance of the class. 19 | /// 20 | public InvoiceDetailsModel() 21 | { 22 | Customers = new List(); 23 | InvoiceLineItems = new List(); 24 | } 25 | 26 | /// 27 | /// Gets or sets the customers. 28 | /// 29 | public List Customers { get; } 30 | 31 | /// 32 | /// Gets or sets the invoice identifier. 33 | /// 34 | public string InvoiceId { get; set; } 35 | 36 | /// 37 | /// Gets or sets the invoice line items. 38 | /// 39 | public List InvoiceLineItems { get; } 40 | } 41 | } -------------------------------------------------------------------------------- /src/Explorer/Models/InvoicesModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System.Collections.Generic; 10 | using PartnerCenter.Models.Invoices; 11 | 12 | /// 13 | /// Model for listing all invoices. 14 | /// 15 | public class InvoicesModel 16 | { 17 | /// 18 | /// Initializes a new instance of the class. 19 | /// 20 | public InvoicesModel() 21 | { 22 | Invoices = new List(); 23 | } 24 | 25 | /// 26 | /// Gets or sets the invoices. 27 | /// 28 | public List Invoices { get; } 29 | } 30 | } -------------------------------------------------------------------------------- /src/Explorer/Models/LicenseModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | /// 10 | /// Model for licenses that can be assigned to users. 11 | /// 12 | public class LicenseModel 13 | { 14 | /// 15 | /// Gets or sets the consumed units. 16 | /// 17 | public int ConsumedUnits { get; set; } 18 | 19 | /// 20 | /// Gets or sets the identifier. 21 | /// 22 | public string Id { get; set; } 23 | 24 | /// 25 | /// Gets or sets a value indicating whether this license is assigned. 26 | /// 27 | public bool IsAssigned { get; set; } 28 | 29 | /// 30 | /// Gets or sets the name. 31 | /// 32 | public string Name { get; set; } 33 | 34 | /// 35 | /// Gets or sets the SKU part number. 36 | /// 37 | public string SkuPartNumber { get; set; } 38 | 39 | /// 40 | /// Gets or sets the type of the target. 41 | /// 42 | public string TargetType { get; set; } 43 | 44 | /// 45 | /// Gets or sets the total units that can be allocated. 46 | /// 47 | public int TotalUnits { get; set; } 48 | } 49 | } -------------------------------------------------------------------------------- /src/Explorer/Models/NewDeploymentModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System; 10 | using System.ComponentModel.DataAnnotations; 11 | 12 | /// 13 | /// Model for new Azure Resource Manager (ARM) template deployments. 14 | /// 15 | public class NewDeploymentModel 16 | { 17 | /// 18 | /// Gets or sets the customer identifier. 19 | /// 20 | public string CustomerId { get; set; } 21 | 22 | /// 23 | /// Gets or sets the URI where the parameters JSON is located. 24 | /// 25 | [Display(Name = "Parameters Link")] 26 | [Required] 27 | public Uri ParametersUri { get; set; } 28 | 29 | /// 30 | /// Gets or sets the name of the resource group. 31 | /// 32 | public string ResourceGroupName { get; set; } 33 | 34 | /// 35 | /// Gets or sets the subscription identifier. 36 | /// 37 | public string SubscriptionId { get; set; } 38 | 39 | /// 40 | /// Gets or sets the URI where the template JSON is located. 41 | /// 42 | [Display(Name = "Template Link")] 43 | [Required] 44 | public Uri TemplateUri { get; set; } 45 | } 46 | } -------------------------------------------------------------------------------- /src/Explorer/Models/NewSubscriptionModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System.Collections.Generic; 10 | using PartnerCenter.Models.Orders; 11 | 12 | /// 13 | /// Model for creating new orders for Partner Center. 14 | /// 15 | public class NewSubscriptionModel 16 | { 17 | /// 18 | /// Initializes a new instance of the class. 19 | /// 20 | public NewSubscriptionModel() 21 | { 22 | AvailableOffers = new List(); 23 | LineItems = new List(); 24 | } 25 | 26 | /// 27 | /// Gets or sets the collection available offers. 28 | /// 29 | public List AvailableOffers { get; } 30 | 31 | /// 32 | /// Gets or sets the customer identifier. 33 | /// 34 | public string CustomerId { get; set; } 35 | 36 | /// 37 | /// Gets or sets the order line items. 38 | /// 39 | public List LineItems { get; } 40 | } 41 | } -------------------------------------------------------------------------------- /src/Explorer/Models/NewUserModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System.ComponentModel.DataAnnotations; 10 | 11 | /// 12 | /// Model for creating a new user. 13 | /// 14 | public class NewUserModel 15 | { 16 | /// 17 | /// Gets or sets the customer identifier. 18 | /// 19 | public string CustomerId { get; set; } 20 | 21 | /// 22 | /// Gets or sets the display name. 23 | /// 24 | [Display(Name = "Display Name")] 25 | [Required] 26 | public string DisplayName { get; set; } 27 | 28 | /// 29 | /// Gets or sets the first name. 30 | /// 31 | [Display(Name = "First Name")] 32 | [Required] 33 | public string FirstName { get; set; } 34 | 35 | /// 36 | /// Gets or sets the last name. 37 | /// 38 | [Display(Name = "Last Name")] 39 | [Required] 40 | public string LastName { get; set; } 41 | 42 | /// 43 | /// Gets or sets the password. 44 | /// 45 | [Required] 46 | public string Password { get; set; } 47 | 48 | /// 49 | /// Gets the usage location. 50 | /// 51 | [Required] 52 | public string UsageLocation { get; set; } 53 | 54 | /// 55 | /// Gets or sets the name of the user principal. 56 | /// 57 | [Display(Name = "User Principal Name")] 58 | [Required] 59 | public string UserPrincipalName { get; set; } 60 | } 61 | } -------------------------------------------------------------------------------- /src/Explorer/Models/OfferModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System.Collections.Generic; 10 | using PartnerCenter.Models.Invoices; 11 | 12 | /// 13 | /// Model for offers available for the specific country from Partner Center. 14 | /// 15 | public class OfferModel 16 | { 17 | /// 18 | /// Gets or sets the billing type. 19 | /// 20 | public BillingType Billing { get; set; } 21 | 22 | /// 23 | /// Gets or sets the description. 24 | /// 25 | public string Description { get; set; } 26 | 27 | /// 28 | /// Gets or sets the identifier. 29 | /// 30 | public string Id { get; set; } 31 | 32 | /// 33 | /// Gets or sets a value indicating whether this offer is add on. 34 | /// 35 | public bool IsAddOn { get; set; } 36 | 37 | /// 38 | /// Gets or sets a value indicating whether this offer is available for purchase. 39 | /// 40 | public bool IsAvailableForPurchase { get; set; } 41 | 42 | /// 43 | /// Gets or sets the maximum quantity. 44 | /// 45 | public int MaximumQuantity { get; set; } 46 | 47 | /// 48 | /// Gets or sets the minimum quantity. 49 | /// 50 | public int MinimumQuantity { get; set; } 51 | 52 | /// 53 | /// Gets or sets the name. 54 | /// 55 | public string Name { get; set; } 56 | 57 | /// 58 | /// Gets or sets the prerequisite offers for this offer. 59 | /// 60 | public IEnumerable PrerequisiteOffers { get; set; } 61 | } 62 | } -------------------------------------------------------------------------------- /src/Explorer/Models/OffersModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System.Collections.Generic; 10 | 11 | /// 12 | /// Model for available offers from Partner Center. 13 | /// 14 | public class OffersModel 15 | { 16 | /// 17 | /// Initializes a new instance of the class. 18 | /// 19 | public OffersModel() 20 | { 21 | AvailableOffers = new List(); 22 | } 23 | 24 | /// 25 | /// Gets the available offers from Partner Center. 26 | /// 27 | public List AvailableOffers { get; } 28 | 29 | /// 30 | /// Gets or sets the customer identifier. 31 | /// 32 | public string CustomerId { get; set; } 33 | } 34 | } -------------------------------------------------------------------------------- /src/Explorer/Models/PartnerCenterToken.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System; 10 | 11 | /// 12 | /// Represents an access token used to access Partner Center. 13 | /// 14 | /// 15 | public sealed class PartnerCenterToken : IPartnerCredentials 16 | { 17 | /// 18 | /// Gets the expiry time in UTC for the token. 19 | /// 20 | public DateTimeOffset ExpiresAt { get; private set; } 21 | 22 | /// 23 | /// Gets the token needed to authenticate with the partner API service. 24 | /// 25 | public string PartnerServiceToken { get; private set; } 26 | 27 | /// 28 | /// Indicates whether the partner credentials have expired or not. 29 | /// 30 | /// 31 | /// true if credentials have expired; otherwise false. 32 | /// 33 | /// 34 | /// This function is implemented differently than the built in token types. 35 | /// Since this token is used for serialization purposes it does not have the 36 | /// Azure AD token. That being the case different logic haas to be used in 37 | /// order to verify that the token has not expired. Also, it is important to 38 | /// note that if this token is stored in Redis Cache then the cache is configured 39 | /// to expire based upon the ExpiresAt property value. 40 | /// 41 | public bool IsExpired() 42 | { 43 | return DateTime.UtcNow >= ExpiresAt; 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /src/Explorer/Models/RoleModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | /// 10 | /// Represents a role in the application utilized to grant permissions. 11 | /// 12 | public class RoleModel 13 | { 14 | /// 15 | /// Gets or sets the description for the role. 16 | /// 17 | public string Description { get; set; } 18 | 19 | /// 20 | /// Gets or sets the name associated with the role. 21 | /// 22 | public string DisplayName { get; set; } 23 | } 24 | } -------------------------------------------------------------------------------- /src/Explorer/Models/ServiceRequestModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System; 10 | 11 | /// 12 | /// Represents a service request. 13 | /// 14 | public class ServiceRequestModel 15 | { 16 | /// 17 | /// Gets or sets the created date for the service request. 18 | /// 19 | public DateTime CreatedDate { get; set; } 20 | 21 | /// 22 | /// Gets or sets the identifier for the service request. 23 | /// 24 | public string Id { get; set; } 25 | 26 | /// 27 | /// Gets or sets the organization for the service request. 28 | /// 29 | public string Organization { get; set; } 30 | 31 | /// 32 | /// Gets or sets the primary contact for the service request. 33 | /// 34 | public string PrimaryContact { get; set; } 35 | 36 | /// 37 | /// Gets or sets the product name for the service request. 38 | /// 39 | public string ProductName { get; set; } 40 | 41 | /// 42 | /// Gets or sets the status of the service request. 43 | /// 44 | public string Status { get; set; } 45 | 46 | /// 47 | /// Gets or sets the title of the service request. 48 | /// 49 | public string Title { get; set; } 50 | } 51 | } -------------------------------------------------------------------------------- /src/Explorer/Models/ServiceRequestsModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System.Collections.Generic; 10 | 11 | /// 12 | /// Model for service requests from Partner Center. 13 | /// 14 | public class ServiceRequestsModel 15 | { 16 | /// 17 | /// Initializes a new instance of the class. 18 | /// 19 | public ServiceRequestsModel() 20 | { 21 | ServiceRequests = new List(); 22 | } 23 | 24 | /// 25 | /// Gets the service requests. 26 | /// 27 | public List ServiceRequests { get; } 28 | } 29 | } -------------------------------------------------------------------------------- /src/Explorer/Models/SubscriptionHealthModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System.Collections.Generic; 10 | using Logic; 11 | 12 | /// 13 | /// Model for the subscription health view. 14 | /// 15 | public class SubscriptionHealthModel 16 | { 17 | /// 18 | /// Initializes a new instance of the class. 19 | /// 20 | public SubscriptionHealthModel() 21 | { 22 | HealthEvents = new List(); 23 | } 24 | 25 | /// 26 | /// Gets or sets the name of the company. 27 | /// 28 | public string CompanyName { get; set; } 29 | 30 | /// 31 | /// Gets or sets the customer identifier. 32 | /// 33 | public string CustomerId { get; set; } 34 | 35 | /// 36 | /// Gets or sets the subscription nick name. 37 | /// 38 | public string FriendlyName { get; set; } 39 | 40 | /// 41 | /// Gets or sets the health events. 42 | /// 43 | public List HealthEvents { get; } 44 | 45 | /// 46 | /// Gets or sets the subscription identifier. 47 | /// 48 | public string SubscriptionId { get; set; } 49 | 50 | /// 51 | /// Gets or sets the view model. 52 | /// 53 | public string ViewModel { get; set; } 54 | } 55 | } -------------------------------------------------------------------------------- /src/Explorer/Models/SubscriptionManageModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using Microsoft.Store.PartnerCenter.Explorer.Subscriptions; 10 | 11 | /// 12 | /// Model for managing subscriptions. 13 | /// 14 | public class SubscriptionManageModel 15 | { 16 | /// 17 | /// Gets or sets the name of the company who owns the subscription. 18 | /// 19 | public string CompanyName { get; set; } 20 | 21 | /// 22 | /// Gets or sets the customer identifier assigned to the customer who owns the subscription. 23 | /// 24 | public string CustomerId { get; set; } 25 | 26 | /// 27 | /// Gets or sets the name of the friendly of the subscription. 28 | /// 29 | public string FriendlyName { get; set; } 30 | 31 | /// 32 | /// Gets or sets the subscription details. 33 | /// 34 | public ISubscriptionDetails SubscriptionDetails { get; set; } 35 | 36 | /// 37 | /// Gets or sets the subscription identifier. 38 | /// 39 | public string SubscriptionId { get; set; } 40 | 41 | /// 42 | /// Gets or sets the type of the subscription. 43 | /// 44 | public string ViewName { get; set; } 45 | } 46 | } -------------------------------------------------------------------------------- /src/Explorer/Models/SubscriptionsModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System.Collections.Generic; 10 | 11 | /// 12 | /// Model used to list subscriptions. 13 | /// 14 | public class SubscriptionsModel 15 | { 16 | /// 17 | /// Initializes a new instance of the class. 18 | /// 19 | public SubscriptionsModel() 20 | { 21 | Subscriptions = new List(); 22 | } 23 | 24 | /// 25 | /// Gets the list of subscriptions owned by the customer. 26 | /// 27 | public List Subscriptions { get; } 28 | } 29 | } -------------------------------------------------------------------------------- /src/Explorer/Models/UsageModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System.Collections.Generic; 10 | using PartnerCenter.Models.Utilizations; 11 | 12 | /// 13 | /// Model for Azure subscription usage details. 14 | /// 15 | public class UsageModel 16 | { 17 | /// 18 | /// Initializes a new instance of the class. 19 | /// 20 | public UsageModel() 21 | { 22 | Usage = new List(); 23 | } 24 | 25 | /// 26 | /// Gets or sets the name of the company. 27 | /// 28 | public string CompanyName { get; set; } 29 | 30 | /// 31 | /// Gets or sets the customer identifier. 32 | /// 33 | public string CustomerId { get; set; } 34 | 35 | /// 36 | /// Gets or sets the subscription identifier. 37 | /// 38 | public string SubscriptionId { get; set; } 39 | 40 | /// 41 | /// Gets or sets the subscription nick name. 42 | /// 43 | public string SubscriptionFriendlyName { get; set; } 44 | 45 | /// 46 | /// Gets the utilization records for the subscription. 47 | /// 48 | public List Usage { get; } 49 | } 50 | } -------------------------------------------------------------------------------- /src/Explorer/Models/UserModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System; 10 | 11 | /// 12 | /// Model that represent a user. 13 | /// 14 | public class UserModel 15 | { 16 | /// 17 | /// Gets or sets the customer identifier. 18 | /// 19 | public string CustomerId { get; set; } 20 | 21 | /// 22 | /// Gets or sets the display name. 23 | /// 24 | public string DisplayName { get; set; } 25 | 26 | /// 27 | /// Gets or sets the first name. 28 | /// 29 | public string FirstName { get; set; } 30 | 31 | /// 32 | /// Gets or sets the identifier. 33 | /// 34 | public string Id { get; set; } 35 | 36 | /// 37 | /// Gets or sets the last name. 38 | /// 39 | public string LastName { get; set; } 40 | 41 | /// 42 | /// Gets or sets the last directory synchronization time. 43 | /// 44 | public DateTime? LastDirectorySyncTime { get; set; } 45 | 46 | /// 47 | /// Gets or sets the usage location. 48 | /// 49 | public string UsageLocation { get; set; } 50 | 51 | /// 52 | /// Gets or sets the user principal name. 53 | /// 54 | public string UserPrincipalName { get; set; } 55 | } 56 | } -------------------------------------------------------------------------------- /src/Explorer/Models/UsersModel.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Models 8 | { 9 | using System.Collections.Generic; 10 | 11 | /// 12 | /// Model for listing users. 13 | /// 14 | public class UsersModel 15 | { 16 | /// 17 | /// Initializes a new instance of the class. 18 | /// 19 | public UsersModel() 20 | { 21 | Users = new List(); 22 | } 23 | 24 | /// 25 | /// Gets or sets the customer identifier. 26 | /// 27 | public string CustomerId { get; set; } 28 | 29 | /// 30 | /// Gets a collection of users that belong to a specific customer. 31 | /// 32 | public List Users { get; } 33 | } 34 | } -------------------------------------------------------------------------------- /src/Explorer/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | using System.Reflection; 8 | using System.Runtime.InteropServices; 9 | 10 | // General Information about an assembly is controlled through the following 11 | // set of attributes. Change these attribute values to modify the information 12 | // associated with an assembly. 13 | [assembly: AssemblyTitle("Microsoft.Store.PartnerCenter.Explorer")] 14 | [assembly: AssemblyDescription("")] 15 | [assembly: AssemblyConfiguration("")] 16 | [assembly: AssemblyCompany("Microsoft")] 17 | [assembly: AssemblyProduct("Microsoft.Store.PartnerCenter.Explorer")] 18 | [assembly: AssemblyCopyright("Copyright © 2018")] 19 | [assembly: AssemblyTrademark("")] 20 | [assembly: AssemblyCulture("")] 21 | 22 | // Setting ComVisible to false makes the types in this assembly not visible 23 | // to COM components. If you need to access a type in this assembly from 24 | // COM, set the ComVisible attribute to true on that type. 25 | [assembly: ComVisible(false)] 26 | 27 | // The following GUID is for the ID of the typelib if this project is exposed to COM 28 | [assembly: Guid("10400335-e852-4ea1-b437-372c407ba174")] 29 | 30 | // Version information for an assembly consists of the following four values: 31 | // 32 | // Major Version 33 | // Minor Version 34 | // Build Number 35 | // Revision 36 | // 37 | // You can specify all the values or you can default the Revision and Build Numbers 38 | // by using the '*' as shown below: 39 | [assembly: AssemblyVersion("0.0.1.*")] -------------------------------------------------------------------------------- /src/Explorer/Providers/IAccessTokenProvider.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Providers 8 | { 9 | using System.Threading.Tasks; 10 | using IdentityModel.Clients.ActiveDirectory; 11 | using Models; 12 | 13 | /// 14 | /// Represents the ability to manage access tokens. 15 | /// 16 | public interface IAccessTokenProvider 17 | { 18 | /// 19 | /// Get the user assertion token for the authenticated user. 20 | /// 21 | string UserAssertionToken { get; } 22 | 23 | /// 24 | /// Gets an access token from the authority. 25 | /// 26 | /// Address of the authority to issue the token. 27 | /// Identifier of the target resource that is the recipient of the requested token. 28 | /// The credentials to use for token acquisition. 29 | /// An instance of that represented the access token. 30 | Task GetAccessTokenAsync(string authority, string resource, ApplicationCredential credential); 31 | 32 | /// 33 | /// Gets an access token from the authority. 34 | /// 35 | /// Address of the authority to issue the token. 36 | /// Identifier of the target resource that is the recipient of the requested token. 37 | /// The credentials to use for token acquisition. 38 | /// Assertion token representing the user. 39 | /// An instance of that represented the access token. 40 | Task GetAccessTokenAsync(string authority, string resource, ApplicationCredential credential, string token); 41 | } 42 | } -------------------------------------------------------------------------------- /src/Explorer/Providers/IExplorerProvider.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Providers 8 | { 9 | using System.Threading.Tasks; 10 | using Logic; 11 | using Telemetry; 12 | 13 | /// 14 | /// Represents the core application provider. 15 | /// 16 | public interface IExplorerProvider 17 | { 18 | /// 19 | /// Gets a reference to the token management service. 20 | /// 21 | IAccessTokenProvider AccessToken { get; } 22 | 23 | /// 24 | /// Gets the service that provides caching functionality. 25 | /// 26 | ICacheProvider Cache { get; } 27 | 28 | /// 29 | /// Gets a reference to the available configurations. 30 | /// 31 | IConfigurationProvider Configuration { get; } 32 | 33 | /// 34 | /// Gets a reference to the communication service. 35 | /// 36 | IHttpService Communication { get; } 37 | 38 | /// 39 | /// Gets a reference to the partner operations. 40 | /// 41 | IPartnerOperations PartnerOperations { get; } 42 | 43 | /// 44 | /// Gets the telemetry service reference. 45 | /// 46 | ITelemetryProvider Telemetry { get; } 47 | 48 | /// 49 | /// Gets a reference to the vault provider. 50 | /// 51 | IVaultProvider Vault { get; } 52 | 53 | /// 54 | /// Initializes this instance of the class. 55 | /// 56 | /// An instance of that represents the asynchronous operation. 57 | Task InitializeAsync(); 58 | } 59 | } -------------------------------------------------------------------------------- /src/Explorer/Providers/IVaultProvider.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Providers 8 | { 9 | using System.Security; 10 | using System.Threading.Tasks; 11 | 12 | /// 13 | /// Represents a secure mechanism for retrieving and store information. 14 | /// 15 | public interface IVaultProvider 16 | { 17 | /// 18 | /// Gets the specified entity from the vault. 19 | /// 20 | /// Identifier of the entity to be retrieved. 21 | /// The value retrieved from the vault. 22 | Task GetAsync(string identifier); 23 | 24 | /// 25 | /// Stores the specified value in the vault. 26 | /// 27 | /// Identifier of the entity to be stored. 28 | /// The value to be stored. 29 | /// An instance of that represents the asynchronous operation. 30 | Task StoreAsync(string identifier, SecureString value); 31 | } 32 | } -------------------------------------------------------------------------------- /src/Explorer/Scripts/application.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | $(".navbar-expand-toggle").click(function () { 3 | $(".app-container").toggleClass("expanded"); 4 | // return $(".navbar-expand-toggle").toggleClass("fa-rotate-90"); 5 | }); 6 | return $(".navbar-right-expand-toggle").click(function () { 7 | $(".navbar-right").toggleClass("expanded"); 8 | // return $(".navbar-right-expand-toggle").toggleClass("fa-rotate-90"); 9 | }); 10 | }); -------------------------------------------------------------------------------- /src/Explorer/Security/AuthenticationFilterAttribute.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Security 8 | { 9 | using System; 10 | using System.Security.Claims; 11 | using System.Web; 12 | using System.Web.Mvc; 13 | using System.Web.Mvc.Filters; 14 | 15 | /// 16 | /// Augments MVC authentication by replacing the principal with a more usable customer portal principal object. 17 | /// 18 | [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 19 | public sealed class AuthenticationFilterAttribute : ActionFilterAttribute, IAuthenticationFilter 20 | { 21 | /// 22 | /// Injects a more friendly claims principal of type . 23 | /// 24 | /// The context to use for authentication. 25 | public void OnAuthentication(AuthenticationContext filterContext) 26 | { 27 | filterContext.Principal = new CustomerPrincipal(HttpContext.Current.User as ClaimsPrincipal); 28 | } 29 | 30 | /// 31 | /// Adds an authentication challenge to the current . 32 | /// 33 | /// The context to use for the authentication challenge. 34 | public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext) 35 | { 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /src/Explorer/Security/CustomerPrincipal.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Security 8 | { 9 | using System.Security.Claims; 10 | 11 | /// 12 | /// Encapsulates relevant information about the authenticated user. 13 | /// 14 | public class CustomerPrincipal : ClaimsPrincipal 15 | { 16 | /// 17 | /// Initializes a new instance of the class. 18 | /// 19 | public CustomerPrincipal() 20 | { 21 | } 22 | 23 | /// 24 | /// Initializes a new instance of the class. 25 | /// 26 | /// A user claims principal created by Azure Active Directory. 27 | public CustomerPrincipal(ClaimsPrincipal principal) : base(principal) 28 | { 29 | CustomerId = principal.FindFirst("CustomerId")?.Value; 30 | Email = principal.FindFirst(ClaimTypes.Email)?.Value; 31 | Name = principal.FindFirst(ClaimTypes.Name)?.Value; 32 | } 33 | 34 | /// 35 | /// Gets the customer identifier for the authenticated user. 36 | /// 37 | public string CustomerId { get; } 38 | 39 | /// 40 | /// Gets the email address for the authenticated user. 41 | /// 42 | public string Email { get; } 43 | 44 | /// 45 | /// Gets the name for the authenticated user. 46 | /// 47 | public string Name { get; } 48 | } 49 | } -------------------------------------------------------------------------------- /src/Explorer/Security/UserRoles.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Security 8 | { 9 | using System; 10 | using System.ComponentModel; 11 | 12 | /// 13 | /// Defines the various user roles. 14 | /// 15 | [Flags] 16 | public enum UserRoles 17 | { 18 | /// 19 | /// Partner Center role that provides complete access to Partner Center. 20 | /// 21 | [Description("AdminAgents")] 22 | AdminAgents = 0, 23 | 24 | /// 25 | /// Role that can make purchases, manages subscriptions, manages support tickets, and monitors service health. 26 | /// 27 | BillingAdmin = 1, 28 | 29 | /// 30 | /// Has access to all administrative features at the tenant level. 31 | /// 32 | [Description("Company Administrator")] 33 | GlobalAdmin = 2, 34 | 35 | /// 36 | /// Partner Center role that provides the ability to support customers. 37 | /// 38 | HelpdeskAgent = 4, 39 | 40 | /// 41 | /// Combination of the available partner roles. 42 | /// 43 | Partner = AdminAgents | HelpdeskAgent, 44 | 45 | /// 46 | /// Has access to no administrative features. 47 | /// 48 | User = 8, 49 | 50 | /// 51 | /// Roles that manage support tickets and users at the tenant level. 52 | /// 53 | UserAdministrator = 16 54 | } 55 | } -------------------------------------------------------------------------------- /src/Explorer/Service References/Application Insights/ConnectedService.json: -------------------------------------------------------------------------------- 1 | { 2 | "ProviderId": "Microsoft.ApplicationInsights.ConnectedService.ConnectedServiceProvider", 3 | "Version": "7.0.20622.1", 4 | "GettingStartedDocument": { 5 | "Uri": "https://go.microsoft.com/fwlink/?LinkID=613413" 6 | } 7 | } -------------------------------------------------------------------------------- /src/Explorer/Startup.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer 8 | { 9 | using global::Owin; 10 | 11 | /// 12 | /// Manage the application startup. 13 | /// 14 | public partial class Startup 15 | { 16 | /// 17 | /// Configures the specified application. 18 | /// 19 | /// The application. 20 | public void Configuration(IAppBuilder app) 21 | { 22 | ConfigureAuth(app); 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /src/Explorer/Subscriptions/AzureSubscriptionDetails.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Subscriptions 8 | { 9 | /// 10 | /// Represents status information for an Azure subscription. 11 | /// 12 | public class AzureSubscriptionDetails : ISubscriptionDetails 13 | { 14 | /// 15 | /// Gets or sets the friendly name of the subscription. 16 | /// 17 | public string FriendlyName { get; set; } 18 | 19 | /// 20 | /// Gets or sets the status of the subscription. 21 | /// 22 | public string Status { get; set; } 23 | } 24 | } -------------------------------------------------------------------------------- /src/Explorer/Subscriptions/ISubscriptionDetails.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Subscriptions 8 | { 9 | /// 10 | /// Represents the status of a subscription. 11 | /// 12 | public interface ISubscriptionDetails 13 | { 14 | /// 15 | /// Gets or sets the friendly name of the subscription. 16 | /// 17 | string FriendlyName { get; set; } 18 | 19 | /// 20 | /// Gets or sets the status of the subscription. 21 | /// 22 | string Status { get; set; } 23 | } 24 | } -------------------------------------------------------------------------------- /src/Explorer/Subscriptions/OfficeSubscriptionDetails.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Subscriptions 8 | { 9 | /// 10 | /// Represents subscription details for a license based subscription. 11 | /// 12 | public class OfficeSubscriptionDetails : ISubscriptionDetails 13 | { 14 | /// 15 | /// Gets or sets the friendly name of the subscription. 16 | /// 17 | public string FriendlyName { get; set; } 18 | 19 | /// 20 | /// Gets or sets the quantity for the subscription. 21 | /// 22 | public int Quantity { get; set; } 23 | 24 | /// 25 | /// Gets or sets the status of the subscription. 26 | /// 27 | public string Status { get; set; } 28 | } 29 | } -------------------------------------------------------------------------------- /src/Explorer/Telemetry/ApplicationInsightsTelemetryProvider.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Telemetry 8 | { 9 | using System; 10 | using System.Collections.Generic; 11 | using ApplicationInsights; 12 | 13 | /// 14 | /// Provides the ability to capture telemetry using Application Insights. 15 | /// 16 | public class ApplicationInsightsTelemetryProvider : ITelemetryProvider 17 | { 18 | /// 19 | /// Used to send events, metrics, and other telemetry to Application Insights. 20 | /// 21 | private readonly TelemetryClient telemetry; 22 | 23 | /// 24 | /// Initializes a new instance of the class. 25 | /// 26 | public ApplicationInsightsTelemetryProvider() 27 | { 28 | this.telemetry = new TelemetryClient(); 29 | } 30 | 31 | /// 32 | /// Sends an event for display in the diagnostic search and aggregation in the metrics explorer. 33 | /// 34 | /// A name for the event. 35 | /// Named string values you can use to search and classify events. 36 | /// Measurements associated with this event. 37 | public void TrackEvent(string eventName, IDictionary properties = null, IDictionary metrics = null) 38 | { 39 | this.telemetry.TrackEvent(eventName, properties, metrics); 40 | } 41 | 42 | /// 43 | /// Sends an exception for display the in diagnostic search. 44 | /// 45 | /// The exception to log. 46 | /// Named string values you can use to classify and search for this exception. 47 | /// Additional values associated with this exception. 48 | public void TrackException(Exception exception, IDictionary properties = null, IDictionary metrics = null) 49 | { 50 | this.telemetry.TrackException(exception, properties, metrics); 51 | } 52 | 53 | /// 54 | /// Send a trace message for display in the diagnostic search. 55 | /// 56 | /// The message to display 57 | public void TrackTrace(string message) 58 | { 59 | this.telemetry.TrackTrace(message); 60 | } 61 | } 62 | } -------------------------------------------------------------------------------- /src/Explorer/Telemetry/EmptyTelemetryProvider.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Telemetry 8 | { 9 | using System; 10 | using System.Collections.Generic; 11 | 12 | /// 13 | /// Telemetry provider that does not log any data. This is utilized when 14 | /// Application Insights is not enabled and for testing. 15 | /// 16 | public class EmptyTelemetryProvider : ITelemetryProvider 17 | { 18 | /// 19 | /// Sends an event for display in the diagnostic search and aggregation in the metrics explorer. 20 | /// 21 | /// A name for the event. 22 | /// Named string values you can use to search and classify events. 23 | /// Measurements associated with this event. 24 | public void TrackEvent(string eventName, IDictionary properties = null, IDictionary metrics = null) 25 | { 26 | } 27 | 28 | /// 29 | /// Sends an exception for display the in diagnostic search. 30 | /// 31 | /// The exception to log. 32 | /// Named string values you can use to classify and search for this exception. 33 | /// Additional values associated with this exception. 34 | public void TrackException(Exception exception, IDictionary properties = null, IDictionary metrics = null) 35 | { 36 | } 37 | 38 | /// 39 | /// Send a trace message for display in the diagnostic search. 40 | /// 41 | /// The message to display 42 | public void TrackTrace(string message) 43 | { 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /src/Explorer/Telemetry/ITelemetryProvider.cs: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- 2 | // 3 | // Copyright (c) Microsoft Corporation. All rights reserved. 4 | // 5 | // ----------------------------------------------------------------------- 6 | 7 | namespace Microsoft.Store.PartnerCenter.Explorer.Telemetry 8 | { 9 | using System; 10 | using System.Collections.Generic; 11 | 12 | /// 13 | /// Represents a telemetry provider utilized capturing and logging data. 14 | /// 15 | public interface ITelemetryProvider 16 | { 17 | /// 18 | /// Sends an event for display in the diagnostic search and aggregation in the metrics explorer. 19 | /// 20 | /// A name for the event. 21 | /// Named string values you can use to search and classify events. 22 | /// Measurements associated with this event. 23 | void TrackEvent(string eventName, IDictionary properties = null, IDictionary metrics = null); 24 | 25 | /// 26 | /// Sends an exception for display the in diagnostic search. 27 | /// 28 | /// The exception to log. 29 | /// Named string values you can use to classify and search for this exception. 30 | /// Additional values associated with this exception. 31 | void TrackException(Exception exception, IDictionary properties = null, IDictionary metrics = null); 32 | 33 | /// 34 | /// Send a trace message for display in the diagnostic search. 35 | /// 36 | /// The message to display 37 | void TrackTrace(string message); 38 | } 39 | } -------------------------------------------------------------------------------- /src/Explorer/Views/Account/SignOutCallback.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewBag.Title = "Sign Out"; 3 | } 4 | 5 |
6 |

@ViewBag.Title.

7 |

You have successfully signed out.

8 |
-------------------------------------------------------------------------------- /src/Explorer/Views/Audit/Records.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.AuditRecordsModel 2 | @using Microsoft.Store.PartnerCenter.Models.Auditing; 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | @foreach (AuditRecord record in Model.Records.Items) 19 | { 20 | 21 | 24 | 27 | 30 | 33 | 36 | 39 | 42 | 45 | 48 | 49 | } 50 |
Application IdentifierCustomer IdentifierCustomer NameOperation DataOperation StatusNew ValueOld ValueResource TypeUser Principal Name
22 | @Html.DisplayFor(item => record.ApplicationId) 23 | 25 | @Html.DisplayFor(item => record.CustomerId) 26 | 28 | @Html.DisplayFor(item => record.CustomerName) 29 | 31 | @Html.DisplayFor(item => record.OperationDate) 32 | 34 | @Html.DisplayFor(item => record.OperationStatus) 35 | 37 | @Html.DisplayFor(item => record.ResourceNewValue) 38 | 40 | @Html.DisplayFor(item => record.ResourceOldValue) 41 | 43 | @Html.DisplayFor(item => record.ResourceType) 44 | 46 | @Html.DisplayFor(item => record.UserPrincipalName) 47 |
-------------------------------------------------------------------------------- /src/Explorer/Views/Audit/Search.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.AuditSearchModel 2 | 3 | @{ 4 | ViewBag.Title = "Audit Log"; 5 | Layout = "~/Views/Shared/_Layout.cshtml"; 6 | } 7 | 8 | @section Breadcrumbs{ 9 | 12 | } 13 | 14 | @section Scripts { 15 | 30 | } 31 | 32 |
33 | 34 | 35 | 39 | 43 | 46 | 47 |
36 | from 37 | @Html.TextBoxFor(model => Model.StartDate, new { @class = "form-control datepicker", placeholder = "Enter start date..." }) 38 | 40 | to 41 | @Html.TextBoxFor(item => Model.EndDate, new { @class = "form-control datepicker", placeholder = "Enter end date here..." }) 42 | 44 | Search 45 |
48 |
49 |
50 | 51 |
52 |
-------------------------------------------------------------------------------- /src/Explorer/Views/Automation/Index.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewBag.Title = "Automation"; 3 | Layout = "~/Views/Shared/_Layout.cshtml"; 4 | } 5 | 6 | @section Breadcrumbs{ 7 | 10 | } 11 | 12 |
13 | 17 | 18 |
19 | 20 | @section Scripts { 21 | 34 | } -------------------------------------------------------------------------------- /src/Explorer/Views/Automation/Invoke.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.InvokeRunbookModel 2 | 3 | @{ 4 | Layout = null; 5 | } 6 | 7 |
8 | 12 | @using (Ajax.BeginForm("Invoke", "Automation", new AjaxOptions { HttpMethod = "POST", OnSuccess = "OnSuccessCallback", UpdateTargetId = "runbooks" })) 13 | { 14 |
15 |
16 |   17 |
18 |
19 |
20 | @Html.LabelFor(item => item.ResourceGroupName) 21 |
22 |
23 | @Html.DisplayFor(item => item.ResourceGroupName) 24 |
25 |
26 |
27 |
28 | @Html.LabelFor(item => item.RunbookName) 29 |
30 |
31 | @Html.DisplayFor(item => item.RunbookName) 32 |
33 |
34 |
35 | @Html.HiddenFor(item => item.RunbookName) 36 | @Html.HiddenFor(item => item.ResourceGroupName) 37 |
38 |
39 |
40 | 44 | 48 |
49 |
50 |
51 | } 52 |
53 | 54 | @Scripts.Render("~/bundles/jqueryval") -------------------------------------------------------------------------------- /src/Explorer/Views/Automation/List.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.Store.PartnerCenter.Samples.Common.Models 2 | @model List 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | @foreach (RunbookModel runbook in Model) 16 | { 17 | 18 | 21 | 24 | 27 | 30 | 33 | 36 | 37 | } 38 |
NameDescriptionRunbook TypeProvisioning StateState
19 | @Html.DisplayFor(item => runbook.Name) 20 | 22 | @Html.DisplayFor(item => runbook.Description) 23 | 25 | @Html.DisplayFor(item => runbook.RunbookType) 26 | 28 | @Html.DisplayFor(item => runbook.ProvisioningState) 29 | 31 | @Html.DisplayFor(item => runbook.State) 32 | 34 | Invoke 35 |
39 | 40 | -------------------------------------------------------------------------------- /src/Explorer/Views/Customers/CreatedSuccessfully.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.CreatedCustomerModel 2 | 3 | @{ 4 | Layout = null; 5 | } 6 | 7 | 10 |
11 |   12 |
13 |
14 |
15 | @Html.LabelFor(item => Model.Username) 16 | @($"{Model.Username}@{Model.Domain}") 17 |
18 |
19 |
20 |
21 | @Html.LabelFor(item => Model.Password) 22 | @(Model.Password) 23 |
24 |
-------------------------------------------------------------------------------- /src/Explorer/Views/Customers/Index.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.CustomersModel 2 | 3 | @{ 4 | ViewBag.Title = "Customers"; 5 | Layout = "~/Views/Shared/_Layout.cshtml"; 6 | } 7 | 8 | @section Breadcrumbs{ 9 | 12 | } 13 | 14 |
15 | 16 | 17 | 21 |
22 |
23 | New Customer 24 |
25 |
26 |
27 |
28 | 29 | @section Scripts { 30 | 53 | } -------------------------------------------------------------------------------- /src/Explorer/Views/Customers/List.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.CustomersModel 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | @Html.EditorFor(item => item.Customers) 13 |
NameDomainRelationship
-------------------------------------------------------------------------------- /src/Explorer/Views/Customers/Show.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.CustomerModel 2 | 3 | @{ 4 | ViewBag.Title = "Customers"; 5 | Layout = "~/Views/Shared/_Layout.cshtml"; 6 | } 7 | 8 | @section Breadcrumbs{ 9 | 13 | } 14 | 15 |
16 | 19 | 23 |
24 |
25 |

Billing Profile

26 |
27 | @Html.DisplayFor(item => item.BillingProfile.FirstName) @Html.DisplayFor(item => item.BillingProfile.LastName) 28 |
29 | @Html.DisplayFor(item => item.BillingProfile.Email) 30 |
31 | @Html.DisplayFor(item => item.BillingProfile.DefaultAddress.AddressLine1) 32 |
33 | @Html.DisplayFor(item => item.BillingProfile.DefaultAddress.City), 34 | @Html.DisplayFor(item => item.BillingProfile.DefaultAddress.State) 35 | @Html.DisplayFor(item => item.BillingProfile.DefaultAddress.PostalCode) 36 |
37 |
38 |

Company Profile

39 |
40 | @Html.DisplayFor(item => item.CompanyProfile.CompanyName) 41 |
42 | Domain Name: @Html.DisplayFor(item => item.CompanyProfile.Domain) 43 |
44 | Microsoft ID: @Html.DisplayFor(item => item.CompanyProfile.TenantId) 45 |
46 |
47 |

Subscriptions

48 |
49 |
50 |
51 | New Subscription 52 |
53 |
54 | 55 |
56 | 57 | @section Scripts { 58 | 80 | } -------------------------------------------------------------------------------- /src/Explorer/Views/Domains/ConfigurationRecords.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.ConfigurationRecordsModel 2 | @using Microsoft.Graph 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | @foreach (DomainDnsRecord record in Model.ServiceConfigurationRecords) 15 | { 16 | 17 | 20 | 40 | 43 | 46 | 49 | 50 | } 51 |
RecordValueTypeTTLService
18 | @Html.DisplayFor(item => record.Label) 19 | 21 | @if (record.RecordType.Equals("cname", StringComparison.CurrentCultureIgnoreCase)) 22 | { 23 | @Html.DisplayFor(item => ((DomainDnsCnameRecord)record).CanonicalName) 24 | } 25 | else if (record.RecordType.Equals("mx", StringComparison.CurrentCultureIgnoreCase)) 26 | { 27 | @Html.DisplayFor(item => ((DomainDnsMxRecord)record).MailExchange) 28 | } 29 | else if (record.RecordType.Equals("srv", StringComparison.CurrentCultureIgnoreCase)) 30 | { 31 | DomainDnsSrvRecord s = (DomainDnsSrvRecord)record; 32 | 33 | @($"Port={s.Port} Priority={s.Priority} Protocol={s.Protocol} Service={s.Service} Weight={s.Weight}") 34 | } 35 | else if (record.RecordType.Equals("txt", StringComparison.CurrentCultureIgnoreCase)) 36 | { 37 | @Html.DisplayFor(item => ((DomainDnsTxtRecord)record).Text) 38 | } 39 | 41 | @Html.DisplayFor(item => record.RecordType) 42 | 44 | @Html.DisplayFor(item => record.Ttl) 45 | 47 | @Html.DisplayFor(item => record.SupportedService) 48 |
-------------------------------------------------------------------------------- /src/Explorer/Views/Health/Azure.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.SubscriptionHealthModel 2 | 3 | @{ 4 | ViewBag.Title = "Health"; 5 | Layout = "~/Views/Shared/_Layout.cshtml"; 6 | } 7 | 8 | @section Breadcrumbs{ 9 | 16 | } 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | @foreach (Microsoft.Store.PartnerCenter.Explorer.Logic.Azure.AzureHealthEvent d in Model.HealthEvents) 33 | { 34 | 35 | 38 | 41 | 44 | 47 | 50 | 53 | 56 | 59 | 60 | } 61 |
DescriptionTimeEvent TypeResource Group NameResource IdentifierResource Provider NameResource TypeStaus
36 | @Html.DisplayFor(item => d.Description) 37 | 39 | @Html.DisplayFor(item => d.EventTimestamp) 40 | 42 | @Html.DisplayFor(item => d.EventType) 43 | 45 | @Html.DisplayFor(item => d.ResourceGroupName) 46 | 48 | @Html.DisplayFor(item => d.ResourceId) 49 | 51 | @Html.DisplayFor(item => d.ResourceProviderName) 52 | 54 | @Html.DisplayFor(item => d.ResourceType) 55 | 57 | @Html.DisplayFor(item => d.Status) 58 |
62 |
-------------------------------------------------------------------------------- /src/Explorer/Views/Health/Office.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.SubscriptionHealthModel 2 | 3 | @{ 4 | ViewBag.Title = "Health"; 5 | Layout = "~/Views/Shared/_Layout.cshtml"; 6 | } 7 | 8 | @section Breadcrumbs{ 9 | 16 | } 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | @foreach (Microsoft.Store.PartnerCenter.Explorer.Logic.Office.OfficeHealthEvent d in Model.HealthEvents) 29 | { 30 | 31 | 34 | 37 | 40 | 43 | 44 | } 45 |
IdentifierStatusTimeWorkload
32 | @Html.DisplayFor(item => d.Id) 33 | 35 | @Html.DisplayFor(item => d.Status) 36 | 38 | @Html.DisplayFor(item => d.StatusTime) 39 | 41 | @Html.DisplayFor(item => d.WorkloadDisplayName) 42 |
46 |
-------------------------------------------------------------------------------- /src/Explorer/Views/Home/Error.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = null; 3 | } 4 | 5 | 6 | 7 | 8 | 9 | 10 | @ViewBag.Title 11 | @Styles.Render("~/Content/css") 12 | 13 | 14 |
15 |
16 | 28 | 29 |
30 |

@ViewBag.ErrorMessage

31 |
32 |
33 |
34 |
35 |
36 | © @DateTime.Now.Year - Microsoft 37 |
38 |
39 | 40 | @Scripts.Render("~/bundles/jquery") 41 | @Scripts.Render("~/bundles/jqueryui") 42 | @Scripts.Render("~/bundles/bootstrap") 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/Explorer/Views/Home/Index.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewBag.Title = "Home"; 3 | } 4 | 5 |
6 |
7 |
8 |

Getting started

9 |

10 | This sample project shows how to utilize the Partner Center SDK, and various other Microsoft APIs, to provide details pertaining to the 11 | partner's customers. 12 |

13 |

Learn more »

14 |
15 |
16 |

Partner Center SDK

17 |

The Partner Center SDK is designed for Cloud Solution Provider partners. With it, you can programmatically manage your customer accounts, place orders, manage subscriptions, and find support.

18 |

Learn more »

19 |
20 |
21 |

Training Course

22 |

This course is for Microsoft partners who are in the Cloud Solution Provider (CSP) program and who are interested in the Partner Center SDK and the Partner Center REST API.

23 |

Learn more »

24 |
25 |
26 |
-------------------------------------------------------------------------------- /src/Explorer/Views/Invoices/AzureDetails.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.InvoiceDetailsModel 2 | @using Microsoft.Store.PartnerCenter.Models.Invoices 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | @foreach (InvoiceLineItem lineItem in Model.InvoiceLineItems) 23 | { 24 | UsageBasedLineItem element = (UsageBasedLineItem)lineItem; 25 | 26 | 27 | 30 | 33 | 36 | 39 | 42 | 45 | 48 | 51 | 54 | 57 | 60 | 63 | 66 | 67 | } 68 |
Customer NameCharge Start DateCharge End DateCharge TypeList PriceIncluded QuantityOverage QuantityRegionResource GUIDResource NameService NameService TypeTotal
28 | @Html.DisplayFor(item => element.CustomerCompanyName) 29 | 31 | @Html.DisplayFor(item => element.ChargeStartDate) 32 | 34 | @Html.DisplayFor(item => element.ChargeEndDate) 35 | 37 | @Html.DisplayFor(item => element.ChargeType) 38 | 40 | @Html.DisplayFor(item => element.ListPrice) 41 | 43 | @Html.DisplayFor(item => element.IncludedQuantity) 44 | 46 | @Html.DisplayFor(item => element.OverageQuantity) 47 | 49 | @Html.DisplayFor(item => element.Region) 50 | 52 | @Html.DisplayFor(item => element.ResourceGuid) 53 | 55 | @Html.DisplayFor(item => element.ResourceName) 56 | 58 | @Html.DisplayFor(item => element.ServiceName) 59 | 61 | @Html.DisplayFor(item => element.ServiceType) 62 | 64 | @Html.DisplayFor(item => element.PostTaxTotal) 65 |
-------------------------------------------------------------------------------- /src/Explorer/Views/Invoices/Index.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.InvoicesModel 2 | @using Microsoft.Store.PartnerCenter.Models.Invoices 3 | 4 | @{ 5 | ViewBag.Title = "Invoices"; 6 | Layout = "~/Views/Shared/_Layout.cshtml"; 7 | } 8 | 9 | @section Breadcrumbs{ 10 | 13 | } 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | @foreach (Invoice invoice in Model.Invoices) 26 | { 27 | 28 | 31 | 34 | 37 | 43 | 44 | } 45 |
DateIdentifierTotal Charges
29 | @Html.DisplayFor(item => invoice.InvoiceDate) 30 | 32 | @Html.DisplayFor(item => invoice.Id) 33 | 35 | @Html.DisplayFor(item => invoice.TotalCharges) 36 | 38 | @Html.ActionLink( 39 | "Details", 40 | $"/{invoice.Id}/Details", 41 | "Invoices") 42 |
46 |
-------------------------------------------------------------------------------- /src/Explorer/Views/Invoices/OfficeDetails.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.InvoiceDetailsModel 2 | @using Microsoft.Store.PartnerCenter.Models.Invoices 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | @foreach (InvoiceLineItem lineItem in Model.InvoiceLineItems) 20 | { 21 | LicenseBasedLineItem element = (LicenseBasedLineItem)lineItem; 22 | 23 | 24 | 27 | 30 | 33 | 36 | 39 | 42 | 45 | 48 | 51 | 54 | 55 | } 56 |
Customer NameStart DateEnd DateOffer IdentifierOffer NameQuantityUnit PriceSubtotalTaxTotal
25 | @Html.DisplayFor(item => element.CustomerName) 26 | 28 | @Html.DisplayFor(item => element.ChargeStartDate) 29 | 31 | @Html.DisplayFor(item => element.ChargeEndDate) 32 | 34 | @Html.DisplayFor(item => element.OfferId) 35 | 37 | @Html.DisplayFor(item => element.OfferName) 38 | 40 | @Html.DisplayFor(item => element.Quantity) 41 | 43 | @Html.DisplayFor(item => element.UnitPrice) 44 | 46 | @Html.DisplayFor(item => element.Subtotal) 47 | 49 | @Html.DisplayFor(item => element.Tax) 50 | 52 | @Html.DisplayFor(item => element.TotalForCustomer) 53 |
-------------------------------------------------------------------------------- /src/Explorer/Views/Manage/Deployments.cshtml: -------------------------------------------------------------------------------- 1 | @model IEnumerable 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | @Html.EditorForModel() 13 |
IdentifierNameProvision StateTimestamp
-------------------------------------------------------------------------------- /src/Explorer/Views/Manage/NewDeployment.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.NewDeploymentModel 2 | 3 | @{ 4 | Layout = null; 5 | } 6 | 7 | 11 | @using (Ajax.BeginForm("NewDeployment", "Manage", new AjaxOptions { HttpMethod = "POST", OnSuccess = "OnSuccessCallback", UpdateTargetId = "deployments" })) 12 | { 13 |
14 |
15 |   16 |
17 |
18 |
19 | @Html.LabelFor(item => Model.TemplateUri) 20 |
21 |
22 | @Html.TextBoxFor(item => Model.TemplateUri, new { @class = "form-control" }) 23 |
24 |
25 | @Html.ValidationMessageFor(item => Model.TemplateUri) 26 |
27 |
28 |
29 |
30 | @Html.LabelFor(item => Model.ParametersUri) 31 |
32 |
33 | @Html.TextBoxFor(item => Model.ParametersUri, new { @class = "form-control" }) 34 |
35 |
36 | @Html.ValidationMessageFor(item => item.ParametersUri) 37 |
38 |
39 |
40 | @Html.HiddenFor(item => item.CustomerId) 41 | @Html.HiddenFor(item => item.ResourceGroupName) 42 | @Html.HiddenFor(item => item.SubscriptionId) 43 |
44 |
45 |
46 | 50 | 54 |
55 |
56 |
57 | } 58 | 59 | @Scripts.Render("~/bundles/jqueryval") -------------------------------------------------------------------------------- /src/Explorer/Views/Offer/Offers.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.OffersModel 2 | 3 | @{ 4 | Layout = null; 5 | } 6 | 7 | 11 |
12 |   13 |
14 |
15 |
16 | @Html.DropDownListFor(item => item.AvailableOffers, 17 | Model.AvailableOffers.Select(x => new SelectListItem() { Text = x.Name, Value = x.Id }), 18 | new { @class = "form-control", OnChange = "UpdateDialog()" }) 19 |
20 |
21 | @Html.Label("Description")
22 | 23 |
24 | 28 |
29 | 33 | 37 |
38 |
39 | 40 | -------------------------------------------------------------------------------- /src/Explorer/Views/ServiceRequests/Index.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.ServiceRequestsModel 2 | 3 | @{ 4 | ViewBag.Title = "Service Requests"; 5 | Layout = "~/Views/Shared/_Layout.cshtml"; 6 | } 7 | 8 | @section Breadcrumbs{ 9 | 12 | } 13 | 14 |
15 |
16 |
17 | 18 | @section Scripts { 19 | 26 | } -------------------------------------------------------------------------------- /src/Explorer/Views/ServiceRequests/List.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.ServiceRequestsModel 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | @Html.EditorFor(item => item.ServiceRequests) 15 |
IdentifierCreated DateTitleStatusOrganizationProduct Name
-------------------------------------------------------------------------------- /src/Explorer/Views/Shared/EditorTemplates/CustomerModel.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.CustomerModel 2 | 3 | 4 | 5 | @Html.ActionLink(Model.CompanyProfile.CompanyName, $"{Model.CustomerId}/Show", "Customers") 6 | 7 | 8 | @Html.DisplayFor(item => item.CompanyProfile.Domain) 9 | 10 | 11 | @Html.DisplayFor(item => item.RelationshipToPartner) 12 | 13 | @if (false) 14 | { 15 | 16 | @Ajax.RouteLink("Delete", new { action = "Delete", controller = "Customers", customerId = Model.CustomerId }, 17 | new AjaxOptions() 18 | { 19 | HttpMethod = "Delete", 20 | Confirm = $"Are you sure you want to delete {Model.CompanyProfile.CompanyName}?", 21 | OnComplete = $"OnSuccessCallback('{Model.CustomerId}')" 22 | }) 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/Explorer/Views/Shared/EditorTemplates/DeploymentModel.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.DeploymentModel 2 | 3 | 4 | 5 | @Html.DisplayFor(item => item.Id) 6 | 7 | 8 | @Html.DisplayFor(item => item.Name) 9 | 10 | 11 | @Html.DisplayFor(item => item.ProvisioningState) 12 | 13 | 14 | @Html.DisplayFor(item => item.Timestamp) 15 | 16 | -------------------------------------------------------------------------------- /src/Explorer/Views/Shared/EditorTemplates/LicenseModel.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.LicenseModel 2 | 3 | 4 | 5 | @Html.DisplayFor(item => item.Name) 6 | 7 | 8 | @Html.CheckBoxFor(item => item.IsAssigned) 9 | 10 | 11 | @Html.Label(Model.ConsumedUnits.ToString()) of @Html.Label(Model.TotalUnits.ToString()) 12 | 13 | 14 | @Html.HiddenFor(item => item.Id) 15 | @Html.HiddenFor(item => item.SkuPartNumber) 16 | @Html.HiddenFor(item => item.TargetType) 17 | 18 | -------------------------------------------------------------------------------- /src/Explorer/Views/Shared/EditorTemplates/OfferModel.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.OfferModel 2 | 3 |
4 |
5 | @Html.DisplayFor(item => item.Name) 6 |
7 |
-------------------------------------------------------------------------------- /src/Explorer/Views/Shared/EditorTemplates/ServiceRequestModel.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.ServiceRequestModel 2 | 3 | 4 | 5 | @Html.DisplayFor(item => item.Id) 6 | 7 | 8 | @Html.DisplayFor(item => item.CreatedDate) 9 | 10 | 11 | @Html.DisplayFor(item => item.Title) 12 | 13 | 14 | @Html.DisplayFor(item => item.Status) 15 | 16 | 17 | @Html.DisplayFor(item => item.Organization) 18 | 19 | 20 | @Html.DisplayFor(item => item.PrimaryContact) 21 | 22 | 23 | @Html.DisplayFor(item => item.ProductName) 24 | 25 | -------------------------------------------------------------------------------- /src/Explorer/Views/Shared/EditorTemplates/SubscriptionModel.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.SubscriptionModel 2 | 3 | 4 | 5 | @Html.ActionLink( 6 | Model.FriendlyName, 7 | $"Subscriptions/{Model.Id}/Show", 8 | $"Customers/{Model.CustomerId}") 9 | 10 | 11 | 12 | @Html.DisplayFor(item => item.Id) 13 | 14 | 15 | @Html.DisplayFor(item => item.Status) 16 | 17 | 18 | @Html.ActionLink( 19 | "Health", 20 | $"Health/{Model.Id}/", 21 | $"Customers/{Model.CustomerId}") 22 | 23 | 24 | @Html.ActionLink( 25 | "Manage", 26 | $"Manage/{Model.Id}/", 27 | $"Customers/{Model.CustomerId}") 28 | 29 | @if (Model.BillingType == Microsoft.Store.PartnerCenter.Models.Invoices.BillingType.Usage) 30 | { 31 | 32 | @Html.ActionLink( 33 | "Usage", 34 | $"Usage/{Model.Id}/", 35 | $"Customers/{Model.CustomerId}") 36 | 37 | } 38 | else 39 | { 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/Explorer/Views/Shared/EditorTemplates/UserModel.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.UserModel 2 | 3 | 4 | 5 | @Html.DisplayFor(item => item.DisplayName) 6 | 7 | 8 | @Html.DisplayFor(item => item.FirstName) 9 | 10 | 11 | @Html.DisplayFor(item => item.LastName) 12 | 13 | 14 | @Html.DisplayFor(item => item.LastDirectorySyncTime) 15 | 16 | 17 | @Html.DisplayFor(item => item.UsageLocation) 18 | 19 | 20 | @Html.DisplayFor(item => item.UserPrincipalName) 21 | 22 | 23 | Edit 24 | 25 | 26 | @Ajax.RouteLink("Delete", new { action = "Delete", controller = "Users", customerId = Model.CustomerId, userId = Model.Id }, 27 | new AjaxOptions() 28 | { 29 | HttpMethod = "Delete", 30 | Confirm = $"Are you sure you want to delete the user {Model.DisplayName}?", 31 | OnSuccess = $"OnUserDeleteCallback('{Model.Id}')", 32 | }) 33 | 34 | -------------------------------------------------------------------------------- /src/Explorer/Views/Shared/_LoginPartial.cshtml: -------------------------------------------------------------------------------- 1 | @using System.Security.Claims; 2 | 3 | @if (Request.IsAuthenticated) 4 | { 5 | 6 | string name = ((ClaimsIdentity)User.Identity).FindFirst("Name").Value; 7 | 8 | 19 | } 20 | else 21 | { 22 | 25 | } -------------------------------------------------------------------------------- /src/Explorer/Views/Subscriptions/List.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.SubscriptionsModel 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | @Html.EditorFor(item => item.Subscriptions) 14 |
NameIdentifierStatus
-------------------------------------------------------------------------------- /src/Explorer/Views/Usage/ViewUsage.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.UsageModel 2 | 3 | @{ 4 | ViewBag.Title = "View Usage"; 5 | Layout = "~/Views/Shared/_Layout.cshtml"; 6 | } 7 | 8 | @section Breadcrumbs{ 9 | 16 | } 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | @foreach (Microsoft.Store.PartnerCenter.Models.Utilizations.AzureUtilizationRecord record in Model.Usage) 33 | { 34 | 35 | 38 | 41 | 44 | 47 | 50 | 53 | 56 | 59 | 60 | } 61 |
NameLocationResource URITagsStart TimeEnd TimeQuantityUnit
36 | @Html.DisplayFor(item => record.Resource.Name) 37 | 39 | @Html.DisplayFor(item => record.InstanceData.Location) 40 | 42 | @Html.DisplayFor(item => record.InstanceData.ResourceUri) 43 | 45 | @Html.DisplayFor(item => record.InstanceData.Tags) 46 | 48 | @Html.DisplayFor(item => record.UsageStartTime) 49 | 51 | @Html.DisplayFor(item => record.UsageEndTime) 52 | 54 | @Html.DisplayFor(item => record.Quantity) 55 | 57 | @Html.DisplayFor(item => record.Unit) 58 |
62 |
-------------------------------------------------------------------------------- /src/Explorer/Views/Users/List.cshtml: -------------------------------------------------------------------------------- 1 | @model Microsoft.Store.PartnerCenter.Explorer.Models.UsersModel 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | @Html.EditorFor(item => item.Users) 17 |
Display NameFirst NameLast NameLast Directory Sync TimeUsage LocationUser Principal Name
18 | 19 | -------------------------------------------------------------------------------- /src/Explorer/Views/Web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 |
9 |
12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/Explorer/Views/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "~/Views/Shared/_Layout.cshtml"; 3 | } -------------------------------------------------------------------------------- /src/Explorer/Web.Debug.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 17 | 18 | 29 | 30 | -------------------------------------------------------------------------------- /src/Explorer/Web.Release.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 17 | 18 | 19 | 30 | 31 | -------------------------------------------------------------------------------- /src/Explorer/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/favicon.ico -------------------------------------------------------------------------------- /src/Explorer/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /src/Explorer/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/Explorer/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/Explorer/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/Explorer/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /src/Explorer/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /src/Explorer/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /src/Explorer/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /src/Explorer/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Partner-Center-Explorer/43a7c1c342749a35a83d285e8c2ae93d8b3a5ae8/src/Explorer/fonts/glyphicons-halflings-regular.woff2 --------------------------------------------------------------------------------