├── .deployment ├── global.json ├── Source ├── RemoteSupport │ ├── ClientApp │ │ ├── src │ │ │ ├── react-app-env.d.ts │ │ │ ├── models │ │ │ │ └── on-call-support-detail.ts │ │ │ ├── index.tsx │ │ │ ├── router │ │ │ │ └── router.tsx │ │ │ ├── constants │ │ │ │ └── constants.ts │ │ │ ├── app.tsx │ │ │ ├── styles │ │ │ │ └── site.css │ │ │ ├── api │ │ │ │ ├── axios-decorator.ts │ │ │ │ └── remote-support-api.ts │ │ │ └── components │ │ │ │ └── error-page.tsx │ │ ├── tslint.json │ │ ├── public │ │ │ └── index.html │ │ ├── tsconfig.json │ │ └── package.json │ ├── wwwroot │ │ ├── images │ │ │ ├── Urgent.png │ │ │ └── AppIcon.png │ │ └── Artifacts │ │ │ ├── Urgent.png │ │ │ └── AppIcon.png │ ├── Models │ │ ├── AdaptiveChoiceSet.cs │ │ ├── JwtClaims.cs │ │ ├── ErrorResponse.cs │ │ ├── InputChoiceSet.cs │ │ └── AdaptiveCardAction.cs │ ├── Helpers │ │ ├── ITokenHelper.cs │ │ ├── TeamMemberCacheHelper.cs │ │ └── TokenHelper.cs │ ├── Bot │ │ ├── RemoteSupportActivityHandlerOptions.cs │ │ ├── RemoteSupportAdapterWithErrorHandler.cs │ │ ├── BotLocalizationCultureProvider.cs │ │ └── RemoteSupportActivityMiddleWare.cs │ ├── Cards │ │ ├── CardConstants.cs │ │ ├── WithdrawCard.cs │ │ ├── WelcomeTeamCard.cs │ │ └── WelcomeCard.cs │ ├── appsettings.json │ ├── Controllers │ │ ├── BotController.cs │ │ ├── ResourceController.cs │ │ └── BaseRemoteSupportController.cs │ ├── Program.cs │ └── Startup.cs ├── RemoteSupport.Configuration │ ├── ClientApp │ │ ├── src │ │ │ ├── react-app-env.d.ts │ │ │ ├── index.tsx │ │ │ ├── constants.ts │ │ │ ├── router │ │ │ │ └── router.tsx │ │ │ ├── app.tsx │ │ │ ├── adal-config.tsx │ │ │ ├── components │ │ │ │ ├── radiobutton-preview.tsx │ │ │ │ ├── choiceset-preview.tsx │ │ │ │ ├── input-text-preview.tsx │ │ │ │ ├── datepicker-preview.tsx │ │ │ │ ├── checkbox-preview.tsx │ │ │ │ ├── datepicker-form.tsx │ │ │ │ └── input-text-form.tsx │ │ │ ├── styles │ │ │ │ └── theme.css │ │ │ └── api │ │ │ │ ├── axios-decorator.ts │ │ │ │ └── incident-api.ts │ │ ├── tslint.json │ │ ├── tsconfig.json │ │ ├── public │ │ │ └── index.html │ │ └── package.json │ ├── appsettings.Development.json │ ├── Models │ │ └── AzureAdSettings.cs │ ├── appsettings.json │ ├── Program.cs │ ├── Controllers │ │ └── SettingsController.cs │ ├── LocalizationCultureProvider.cs │ └── Microsoft.Teams.Apps.RemoteSupport.Configuration.csproj ├── RemoteSupport.Common │ ├── Models │ │ ├── Configuration │ │ │ ├── TokenOptions.cs │ │ │ ├── StorageOptions.cs │ │ │ └── SearchServiceOptions.cs │ │ ├── TicketSeverity.cs │ │ ├── AzureAdClaimTypes.cs │ │ ├── TicketIdGenerator.cs │ │ ├── TicketStatus.cs │ │ ├── AdaptiveCardPlaceHolderMapper.cs │ │ ├── TicketSearchScope.cs │ │ ├── OnCallSMEDetail.cs │ │ ├── OnCallExpertsDetail.cs │ │ ├── ChangeTicketStatus.cs │ │ ├── CardConfigurationEntity.cs │ │ └── OnCallSupportDetail.cs │ ├── Providers │ │ ├── ITicketIdGeneratorStorageProvider.cs │ │ ├── IOnCallSupportDetailSearchService.cs │ │ ├── ITicketDetailStorageProvider.cs │ │ ├── ITicketSearchService.cs │ │ ├── IOnCallSupportDetailStorageProvider.cs │ │ ├── ICardConfigurationStorageProvider.cs │ │ ├── TicketDetailStorageProvider.cs │ │ ├── StorageBaseProvider.cs │ │ └── OnCallSupportDetailStorageProvider.cs │ ├── Utility │ │ └── Utility.cs │ └── Microsoft.Teams.Apps.RemoteSupport.Common.csproj └── Microsoft.Teams.Apps.RemoteSupport.sln ├── Manifest ├── SME │ ├── color.png │ ├── outline.png │ ├── zh-CN.json │ ├── zh-TW.json │ ├── ko.json │ ├── ja.json │ ├── he.json │ ├── ar.json │ ├── en.json │ ├── ru.json │ ├── es.json │ ├── de.json │ ├── pt-BR.json │ ├── fr.json │ └── manifest.json └── EndUser │ ├── color.png │ ├── outline.png │ ├── zh-CN.json │ ├── zh-TW.json │ ├── ja.json │ ├── ko.json │ ├── he.json │ ├── en.json │ ├── ar.json │ ├── ru.json │ ├── es.json │ ├── de.json │ ├── pt-BR.json │ ├── fr.json │ └── manifest.json ├── Build └── stylecop.json ├── deploy.cmd ├── CODE_OF_CONDUCT.md ├── LICENSE ├── SECURITY.md ├── deploy.bot.cmd └── deploy.configuration.cmd /.deployment: -------------------------------------------------------------------------------- 1 | [config] 2 | command = deploy.cmd -------------------------------------------------------------------------------- /global.json: -------------------------------------------------------------------------------- 1 | { 2 | "sdk": { 3 | "version": "2.1.515" 4 | } 5 | } -------------------------------------------------------------------------------- /Source/RemoteSupport/ClientApp/src/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/src/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /Manifest/SME/color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/microsoft-teams-apps-remotesupport/HEAD/Manifest/SME/color.png -------------------------------------------------------------------------------- /Manifest/SME/outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/microsoft-teams-apps-remotesupport/HEAD/Manifest/SME/outline.png -------------------------------------------------------------------------------- /Manifest/EndUser/color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/microsoft-teams-apps-remotesupport/HEAD/Manifest/EndUser/color.png -------------------------------------------------------------------------------- /Manifest/EndUser/outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/microsoft-teams-apps-remotesupport/HEAD/Manifest/EndUser/outline.png -------------------------------------------------------------------------------- /Source/RemoteSupport/wwwroot/images/Urgent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/microsoft-teams-apps-remotesupport/HEAD/Source/RemoteSupport/wwwroot/images/Urgent.png -------------------------------------------------------------------------------- /Source/RemoteSupport/wwwroot/Artifacts/Urgent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/microsoft-teams-apps-remotesupport/HEAD/Source/RemoteSupport/wwwroot/Artifacts/Urgent.png -------------------------------------------------------------------------------- /Source/RemoteSupport/wwwroot/images/AppIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/microsoft-teams-apps-remotesupport/HEAD/Source/RemoteSupport/wwwroot/images/AppIcon.png -------------------------------------------------------------------------------- /Source/RemoteSupport/wwwroot/Artifacts/AppIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/microsoft-teams-apps-remotesupport/HEAD/Source/RemoteSupport/wwwroot/Artifacts/AppIcon.png -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Build/stylecop.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", 3 | "settings": { 4 | "documentationRules": { 5 | "companyName": "Microsoft" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /deploy.cmd: -------------------------------------------------------------------------------- 1 | @if "%SCM_TRACE_LEVEL%" NEQ "4" @echo off 2 | 3 | IF "%SITE_ROLE%" == "bot" ( 4 | deploy.bot.cmd 5 | ) ELSE ( 6 | IF "%SITE_ROLE%" == "configuration" ( 7 | deploy.configuration.cmd 8 | )ELSE ( 9 | echo You have to set SITE_ROLE setting to "bot" 10 | exit /b 1 11 | ) 12 | ) -------------------------------------------------------------------------------- /Source/RemoteSupport/ClientApp/src/models/on-call-support-detail.ts: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | export class OnCallSupportDetail { 8 | ModifiedByName: string | "" = ""; 9 | ModifiedByObjectId?: string | null = null; 10 | ModifiedOn: Date | null = null; 11 | OnCallSMEs: string | "" = ""; 12 | } -------------------------------------------------------------------------------- /Source/RemoteSupport/ClientApp/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": [ 4 | "tslint-react" 5 | ], 6 | "linterOptions": { 7 | "exclude": [ 8 | "node_modules/**/*.ts" 9 | ] 10 | }, 11 | "rules": { 12 | "jsx-no-lambda": false, 13 | "member-access": false, 14 | "no-console": false, 15 | "ordered-imports": false, 16 | "quotemark": false, 17 | "semicolon": false 18 | }, 19 | "rulesDirectory": [ 20 | ] 21 | } -------------------------------------------------------------------------------- /Source/RemoteSupport/ClientApp/src/index.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | import * as React from "react"; 8 | import * as ReactDOM from "react-dom"; 9 | import { BrowserRouter as Router } from "react-router-dom"; 10 | import App from "./app"; 11 | 12 | 13 | ReactDOM.render( 14 | 15 | 16 | , document.getElementById("root")); -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": [ 4 | "tslint-react" 5 | ], 6 | "linterOptions": { 7 | "exclude": [ 8 | "node_modules/**/*.ts" 9 | ] 10 | }, 11 | "rules": { 12 | "jsx-no-lambda": false, 13 | "member-access": false, 14 | "no-console": false, 15 | "ordered-imports": false, 16 | "quotemark": false, 17 | "semicolon": false 18 | }, 19 | "rulesDirectory": [ 20 | ] 21 | } -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Microsoft Open Source Code of Conduct 2 | 3 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 4 | 5 | Resources: 6 | 7 | - [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) 8 | - [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) 9 | - Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns 10 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/src/index.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | import React from "react"; 8 | import ReactDOM from "react-dom"; 9 | import { BrowserRouter as Router } from "react-router-dom"; 10 | import App from "./app"; 11 | import { getAzureActiveDirectorySettingsAsync } from "./api/incident-api"; 12 | 13 | ReactDOM.render( 14 | 15 | 16 | , document.getElementById("root")); 17 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/src/constants.ts: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | export const DarkTheme: string = "dark"; 6 | export const ContrastTheme: string = "contrast"; 7 | 8 | export const isNullorWhiteSpace = (input: string): boolean => { 9 | return !input || !input.trim(); 10 | } 11 | 12 | export enum userControls { 13 | inputText = 1, 14 | dropDown = 2, 15 | inputDate = 3, 16 | radioButton = 4, 17 | checkBox = 5 18 | } 19 | -------------------------------------------------------------------------------- /Source/RemoteSupport/ClientApp/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Remote Support 8 | 9 | 10 | 11 |
12 | 13 | 14 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Models/Configuration/TokenOptions.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common.Models 6 | { 7 | /// 8 | /// Provides application setting related to JWT token. 9 | /// 10 | public class TokenOptions 11 | { 12 | /// 13 | /// Gets or sets random key to create JWT security key. 14 | /// 15 | public string SecurityKey { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Models/Configuration/StorageOptions.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common.Models 6 | { 7 | /// 8 | /// Provides application setting related to Azure Table Storage. 9 | /// 10 | public class StorageOptions 11 | { 12 | /// 13 | /// Gets or sets Azure Table Storage connection string. 14 | /// 15 | public string ConnectionString { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/src/router/router.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | import * as React from "react"; 8 | import { BrowserRouter, Route, Switch } from "react-router-dom"; 9 | import Home from "../components/home"; 10 | 11 | const AppRoute = () => { 12 | return ( 13 | 14 | 15 | 16 | 17 | 18 | ); 19 | } 20 | export default AppRoute; 21 | -------------------------------------------------------------------------------- /Source/RemoteSupport/Models/AdaptiveChoiceSet.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Models 6 | { 7 | /// 8 | /// AdaptiveChoice 9 | /// 10 | public class AdaptiveChoiceSet 11 | { 12 | /// 13 | /// Gets or sets title 14 | /// 15 | public string Title { get; set; } 16 | 17 | /// 18 | /// Gets or sets value 19 | /// 20 | public string Value { get; set; } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Source/RemoteSupport/Models/JwtClaims.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Models 6 | { 7 | /// 8 | /// Claims which are added in JWT token. 9 | /// 10 | public class JwtClaims 11 | { 12 | /// 13 | /// Gets or sets activity Id. 14 | /// 15 | public string FromId { get; set; } 16 | 17 | /// 18 | /// Gets or sets service URL of bot. 19 | /// 20 | public string ApplicationBasePath { get; set; } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Source/RemoteSupport/ClientApp/src/router/router.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | import * as React from "react"; 8 | import { BrowserRouter, Route, Switch } from "react-router-dom"; 9 | import ManageExperts from '../components/manage-experts'; 10 | import ErrorPage from '../components/error-page'; 11 | 12 | export const AppRoute: React.FunctionComponent<{}> = () => { 13 | return ( 14 | 15 | 16 | 17 | 18 | 19 | 20 | ); 21 | }; -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "allowSyntheticDefaultImports": true, 13 | "strict": true, 14 | "forceConsistentCasingInFileNames": true, 15 | "module": "esnext", 16 | "moduleResolution": "node", 17 | "resolveJsonModule": true, 18 | "isolatedModules": true, 19 | "noImplicitAny": false, 20 | "noEmit": true, 21 | "jsx": "react", 22 | "noFallthroughCasesInSwitch": true 23 | }, 24 | "include": [ 25 | "src" 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /Source/RemoteSupport/ClientApp/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext", 8 | "ES2015" 9 | ], 10 | "allowJs": true, 11 | "skipLibCheck": true, 12 | "esModuleInterop": true, 13 | "allowSyntheticDefaultImports": true, 14 | "strict": true, 15 | "forceConsistentCasingInFileNames": true, 16 | "module": "esnext", 17 | "moduleResolution": "node", 18 | "resolveJsonModule": true, 19 | "isolatedModules": true, 20 | "noImplicitAny": false, 21 | "noEmit": true, 22 | "jsx": "react", 23 | "noFallthroughCasesInSwitch": true 24 | }, 25 | "include": [ 26 | "src" 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Models/TicketSeverity.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common.Models 6 | { 7 | /// 8 | /// Represents the current severity of ticket. 9 | /// 10 | public enum TicketSeverity 11 | { 12 | /// 13 | /// Represents that ticket needs to be addressed on normal priority. 14 | /// 15 | Normal = 0, 16 | 17 | /// 18 | /// Represents that ticket needs to be addressed on high priority. 19 | /// 20 | Urgent = 1, 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Models/AzureAdClaimTypes.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common.Models 6 | { 7 | /// 8 | /// Azure Active Directory Claim Types. 9 | /// 10 | public static class AzureAdClaimTypes 11 | { 12 | /// 13 | /// Object Identifier. 14 | /// 15 | public const string ObjectId = "http://schemas.microsoft.com/identity/claims/objectidentifier"; 16 | 17 | /// 18 | /// Identity Scope. 19 | /// 20 | public const string Scope = "http://schemas.microsoft.com/identity/claims/scope"; 21 | } 22 | } -------------------------------------------------------------------------------- /Source/RemoteSupport/Models/ErrorResponse.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Models 6 | { 7 | using Newtonsoft.Json; 8 | 9 | /// 10 | /// Error response class. 11 | /// 12 | public class ErrorResponse 13 | { 14 | /// 15 | /// Gets or sets error status code. 16 | /// 17 | [JsonProperty("code")] 18 | public string StatusCode { get; set; } 19 | 20 | /// 21 | /// Gets or sets error message. 22 | /// 23 | [JsonProperty("message")] 24 | public string ErrorMessage { get; set; } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Source/RemoteSupport/ClientApp/src/constants/constants.ts: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | export default class Constants { 8 | 9 | //Commands 10 | public static readonly updateExpertListCommand: string = "UPDATE EXPERT LIST"; 11 | 12 | //Themes 13 | public static readonly body: string = "body"; 14 | public static readonly theme: string = "theme"; 15 | public static readonly default: string = "default"; 16 | public static readonly light: string = "light"; 17 | public static readonly dark: string = "dark"; 18 | public static readonly contrast: string = "contrast"; 19 | 20 | //KeyCodes 21 | public static readonly keyCodeEnter: number = 13; 22 | public static readonly keyCodeSpace: number = 32; 23 | 24 | } -------------------------------------------------------------------------------- /Manifest/EndUser/zh-CN.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "远程支持", 4 | "description.short": "帮助请求支持并快速与专家联系", 5 | "description.full": "快速请求远程支持。搜索请求并通过群组聊天对紧急请求上报给呼叫专家。", 6 | "bots[0].commandLists[0].commands[0].title": "新建请求", 7 | "bots[0].commandLists[0].commands[0].description": "向呼叫团队提出请求", 8 | "composeExtensions[0].commands[0].title": "待处理", 9 | "composeExtensions[0].commands[0].description": "搜索活动请求", 10 | "composeExtensions[0].commands[0].parameters[0].title": "搜索", 11 | "composeExtensions[0].commands[0].parameters[0].description": "搜索请求", 12 | "composeExtensions[0].commands[1].title": "已关闭", 13 | "composeExtensions[0].commands[1].description": "搜索已关闭的请求", 14 | "composeExtensions[0].commands[1].parameters[0].title": "搜索", 15 | "composeExtensions[0].commands[1].parameters[0].description": "搜索请求" 16 | } -------------------------------------------------------------------------------- /Manifest/EndUser/zh-TW.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "遠端支援", 4 | "description.short": "協助要求支援並儘快與專家連線", 5 | "description.full": "快速要求遠端支援。搜尋要求,並透過群組聊天進行緊急要求,向待命專家呈報。", 6 | "bots[0].commandLists[0].commands[0].title": "新增要求", 7 | "bots[0].commandLists[0].commands[0].description": "向待命小組提出要求", 8 | "composeExtensions[0].commands[0].title": "使用中", 9 | "composeExtensions[0].commands[0].description": "搜尋使用中的要求", 10 | "composeExtensions[0].commands[0].parameters[0].title": "搜尋", 11 | "composeExtensions[0].commands[0].parameters[0].description": "搜尋要求", 12 | "composeExtensions[0].commands[1].title": "已關閉", 13 | "composeExtensions[0].commands[1].description": "搜尋已關閉的要求", 14 | "composeExtensions[0].commands[1].parameters[0].title": "搜尋", 15 | "composeExtensions[0].commands[1].parameters[0].description": "搜尋要求" 16 | } -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Models/TicketIdGenerator.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common.Models 6 | { 7 | using Microsoft.WindowsAzure.Storage.Table; 8 | 9 | /// 10 | /// Class contains latest ticket Id details. 11 | /// 12 | public class TicketIdGenerator : TableEntity 13 | { 14 | /// 15 | /// Initializes a new instance of the class. 16 | /// 17 | public TicketIdGenerator() 18 | { 19 | this.PartitionKey = Constants.TicketIdGeneratorPartitionKey; 20 | } 21 | 22 | /// 23 | /// Gets or sets ticket id. 24 | /// 25 | public int MaxTicketId { get; set; } 26 | } 27 | } -------------------------------------------------------------------------------- /Source/RemoteSupport/ClientApp/src/app.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | 8 | import * as React from "react"; 9 | import { AppRoute } from "./router/router"; 10 | import { Provider, themes } from "@fluentui/react"; 11 | 12 | export interface IAppState { 13 | theme: string; 14 | themeStyle: any; 15 | } 16 | 17 | export default class App extends React.Component<{}, IAppState> { 18 | 19 | constructor(props: any) { 20 | super(props); 21 | this.state = { 22 | theme: "", 23 | themeStyle: themes.teams, 24 | } 25 | } 26 | 27 | /** 28 | * Renders the component 29 | */ 30 | public render(): JSX.Element { 31 | 32 | return ( 33 | 34 |
35 | 36 |
37 |
38 | ); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /Source/RemoteSupport/Helpers/ITokenHelper.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Helpers 6 | { 7 | /// 8 | /// Helper for custom JWT token generation and retrieval of user access token. 9 | /// 10 | public interface ITokenHelper 11 | { 12 | /// 13 | /// Generate JWT token used by client application to authenticate HTTP calls with API. 14 | /// 15 | /// Service URL from bot. 16 | /// Unique Id from activity. 17 | /// Expiry of token. 18 | /// JWT token. 19 | string GenerateAPIAuthToken(string applicationBasePath, string fromId, int jwtExpiryMinutes); 20 | } 21 | } -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/src/app.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | import * as React from "react"; 8 | import ReactDOM from "react-dom"; 9 | import AppRoute from "./router/router"; 10 | import { runWithAdal } from 'react-adal'; 11 | import { authContext } from './adal-config'; 12 | 13 | export default class App extends React.Component<{}, {}> { 14 | constructor(props: any) { 15 | super(props); 16 | } 17 | 18 | render(): JSX.Element { 19 | return ( 20 |
21 | 22 |
23 | ); 24 | } 25 | } 26 | 27 | /* renders the component */ 28 | const DO_NOT_LOGIN = false; 29 | 30 | runWithAdal(authContext, () => { 31 | ReactDOM.render( 32 | , document.getElementById("container")); 33 | }, DO_NOT_LOGIN); -------------------------------------------------------------------------------- /Manifest/EndUser/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "リモート サポート", 4 | "description.short": "サポート要求をし、すばやくエキスパートに連絡するのに役立ちます", 5 | "description.full": "リモートサポートをすばやく要求します。リクエストを検索し、緊急対応のためにグループ チャットで通話のエキスパートにエスカレートします。", 6 | "bots[0].commandLists[0].commands[0].title": "新しい要求", 7 | "bots[0].commandLists[0].commands[0].description": "通話チームへの要求の作成", 8 | "composeExtensions[0].commands[0].title": "アクティブ", 9 | "composeExtensions[0].commands[0].description": "アクティブな要求の検索", 10 | "composeExtensions[0].commands[0].parameters[0].title": "検索", 11 | "composeExtensions[0].commands[0].parameters[0].description": "要求の検索", 12 | "composeExtensions[0].commands[1].title": "終了", 13 | "composeExtensions[0].commands[1].description": "終了した要求の検索", 14 | "composeExtensions[0].commands[1].parameters[0].title": "検索", 15 | "composeExtensions[0].commands[1].parameters[0].description": "要求の検索" 16 | } -------------------------------------------------------------------------------- /Manifest/EndUser/ko.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "원격 지원", 4 | "description.short": "지원을 요청하고 전문가와 빠르게 연결할 수 있도록 지원", 5 | "description.full": "원격 지원을 빠르게 요청할 수 있하도록 요청합니다. 긴급 요청에 대한 그룹 채팅을 통해 통화 전문가로 검색 요청 및 검색 요청에 에스컬레이션합니다.", 6 | "bots[0].commandLists[0].commands[0].title": "새 요청", 7 | "bots[0].commandLists[0].commands[0].description": "대기 중인 팀에 요청", 8 | "composeExtensions[0].commands[0].title": "활성", 9 | "composeExtensions[0].commands[0].description": "활성 요청 검색", 10 | "composeExtensions[0].commands[0].parameters[0].title": "검색", 11 | "composeExtensions[0].commands[0].parameters[0].description": "검색 요청", 12 | "composeExtensions[0].commands[1].title": "닫힘", 13 | "composeExtensions[0].commands[1].description": "닫힌 요청 검색", 14 | "composeExtensions[0].commands[1].parameters[0].title": "검색", 15 | "composeExtensions[0].commands[1].parameters[0].description": "검색 요청" 16 | } -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/Models/AzureAdSettings.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Configuration.Models 6 | { 7 | /// 8 | /// Azure AD configuration model. 9 | /// 10 | public class AzureAdSettings 11 | { 12 | /// 13 | /// Gets or sets Client Id. 14 | /// 15 | public string ClientId { get; set; } 16 | 17 | /// 18 | /// Gets or sets the Azure AD instance. 19 | /// 20 | public string Instance { get; set; } 21 | 22 | /// 23 | /// Gets or sets Tenant Id. 24 | /// 25 | public string Tenant { get; set; } 26 | 27 | /// 28 | /// Gets or sets User Principal Name. 29 | /// 30 | public string Upn { get; set; } 31 | } 32 | } -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Models/TicketStatus.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common.Models 6 | { 7 | /// 8 | /// Represents the current status of a ticket. 9 | /// 10 | public enum TicketState 11 | { 12 | /// 13 | /// Represents an open ticket which requires further action. 14 | /// 15 | Unassigned = 0, 16 | 17 | /// 18 | /// Represents a ticket which is assigned to SME for further action. 19 | /// 20 | Assigned = 1, 21 | 22 | /// 23 | /// Represents a ticket that requires no further action. 24 | /// 25 | Closed = 2, 26 | 27 | /// 28 | /// Represents a ticket that is canceled by user. 29 | /// 30 | Withdrawn = 3, 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Manifest/EndUser/he.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "תמיכה מרחוק", 4 | "description.short": "עוזר לבקש תמיכה ולהתחבר במהירות למומחים", 5 | "description.full": "בקש תמיכה מרחוק במהירות. חפש בבקשות והפנה את בקשתך למומחים הזמינים באמצעות צ'אט קבוצתי המשמש לבקשות דחופות.", 6 | "bots[0].commandLists[0].commands[0].title": "בקשה חדשה", 7 | "bots[0].commandLists[0].commands[0].description": "צור בקשה לצוות הזמין", 8 | "composeExtensions[0].commands[0].title": "פעיל", 9 | "composeExtensions[0].commands[0].description": "חפש בקשות פעילות", 10 | "composeExtensions[0].commands[0].parameters[0].title": "חפש", 11 | "composeExtensions[0].commands[0].parameters[0].description": "חיפוש בקשות", 12 | "composeExtensions[0].commands[1].title": "סגור", 13 | "composeExtensions[0].commands[1].description": "חיפוש בקשות שנסגרו", 14 | "composeExtensions[0].commands[1].parameters[0].title": "חפש", 15 | "composeExtensions[0].commands[1].parameters[0].description": "חיפוש בקשות" 16 | } -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | Card Configuration 10 | 11 | 12 | 15 |
16 |
17 |
18 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /Manifest/EndUser/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "Remote Support", 4 | "description.short": "Helps request support and connect with experts quickly", 5 | "description.full": "Request remote support quickly. Search requests and escalate to on call experts via group chat for urgent requests.", 6 | "bots[0].commandLists[0].commands[0].title": "New request", 7 | "bots[0].commandLists[0].commands[0].description": "Make a request to the on-call team", 8 | "composeExtensions[0].commands[0].title": "Active", 9 | "composeExtensions[0].commands[0].description": "Search active requests", 10 | "composeExtensions[0].commands[0].parameters[0].title": "Search", 11 | "composeExtensions[0].commands[0].parameters[0].description": "Search requests", 12 | "composeExtensions[0].commands[1].title": "Closed", 13 | "composeExtensions[0].commands[1].description": "Search closed requests", 14 | "composeExtensions[0].commands[1].parameters[0].title": "Search", 15 | "composeExtensions[0].commands[1].parameters[0].description": "Search requests" 16 | } -------------------------------------------------------------------------------- /Manifest/EndUser/ar.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "دعم عن بعد", 4 | "description.short": "يساعد على طلب الدعم والتواصل مع الخبراء سريعاً", 5 | "description.full": "يمكنك طلب دعم عن بعد سريعاً والبحث في الطلبات وتصعيد الطلبات إلى الخبراء المتوفرين عند الطلب عبر الدردشة الجماعية للطلبات العاجلة.", 6 | "bots[0].commandLists[0].commands[0].title": "طلب جديد", 7 | "bots[0].commandLists[0].commands[0].description": "إنشاء طلب وإرساله إلى الفريق المتوفر عند الطلب", 8 | "composeExtensions[0].commands[0].title": "النشطة", 9 | "composeExtensions[0].commands[0].description": "بحث في الطلبات النشطة", 10 | "composeExtensions[0].commands[0].parameters[0].title": "بحث", 11 | "composeExtensions[0].commands[0].parameters[0].description": "بحث في الطلبات", 12 | "composeExtensions[0].commands[1].title": "المغلقة", 13 | "composeExtensions[0].commands[1].description": "بحث في الطلبات المغلقة", 14 | "composeExtensions[0].commands[1].parameters[0].title": "بحث", 15 | "composeExtensions[0].commands[1].parameters[0].description": "بحث في الطلبات" 16 | } -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Models/AdaptiveCardPlaceHolderMapper.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common.Models 6 | { 7 | using Newtonsoft.Json; 8 | 9 | /// 10 | /// Class maps controls from json card file to adaptive card. 11 | /// 12 | public class AdaptiveCardPlaceHolderMapper 13 | { 14 | /// 15 | /// Gets or sets unique identifier of the control. 16 | /// 17 | [JsonProperty("id")] 18 | public string Id { get; set; } 19 | 20 | /// 21 | /// Gets or sets type of control to be shown on adaptive card. 22 | /// 23 | [JsonProperty("type")] 24 | public string InputType { get; set; } 25 | 26 | /// 27 | /// Gets or sets displayName of control to be shown on adaptive card. 28 | /// 29 | [JsonProperty("displayName")] 30 | public string DisplayName { get; set; } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/src/adal-config.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | import { AuthenticationContext, adalFetch, withAdalLogin, AdalConfig } from 'react-adal'; 8 | import { getAzureActiveDirectorySettings } from "./api/incident-api"; 9 | 10 | getAzureActiveDirectorySettings(); 11 | 12 | export const adalConfig: AdalConfig = { 13 | tenant: localStorage.getItem("TenantId")!, 14 | clientId: localStorage.getItem("ClientId")!, 15 | endpoints: { 16 | api: localStorage.getItem("TokenEndpoint")!, 17 | }, 18 | postLogoutRedirectUri: window.location.origin, 19 | cacheLocation: 'localStorage' 20 | }; 21 | 22 | export const authContext = new AuthenticationContext(adalConfig); 23 | export const getToken = () => authContext.getCachedToken(adalConfig.clientId); 24 | export const adalApiFetch = (fetch:any, url:any, options:any) => 25 | adalFetch(authContext, adalConfig!.endpoints!.api, fetch, url, options); 26 | 27 | export const withAdalLoginApi = withAdalLogin(authContext, adalConfig!.endpoints!.api); -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Models/Configuration/SearchServiceOptions.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common.Models 6 | { 7 | /// 8 | /// Provides settings related to SearchService. 9 | /// 10 | public class SearchServiceOptions 11 | { 12 | /// 13 | /// Gets or sets search service name. 14 | /// 15 | public string SearchServiceName { get; set; } 16 | 17 | /// 18 | /// Gets or sets search service query API key. 19 | /// 20 | public string SearchServiceQueryApiKey { get; set; } 21 | 22 | /// 23 | /// Gets or sets search service admin API key. 24 | /// 25 | public string SearchServiceAdminApiKey { get; set; } 26 | 27 | /// 28 | /// Gets or sets search indexing interval in minutes. 29 | /// 30 | public string SearchIndexingIntervalInMinutes { get; set; } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Manifest/EndUser/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "Удаленная поддержка", 4 | "description.short": "Помогает запрашивать поддержку и быстро связываться с экспертами", 5 | "description.full": "Быстро запрашивайте удаленную поддержку. Находите запросы и используйте эскалацию срочных запросов дежурным экспертам посредством группового чата.", 6 | "bots[0].commandLists[0].commands[0].title": "Новый запрос", 7 | "bots[0].commandLists[0].commands[0].description": "Создание запроса дежурной команде", 8 | "composeExtensions[0].commands[0].title": "Активно", 9 | "composeExtensions[0].commands[0].description": "Поиск активных запросов", 10 | "composeExtensions[0].commands[0].parameters[0].title": "Поиск", 11 | "composeExtensions[0].commands[0].parameters[0].description": "Поиск запросов", 12 | "composeExtensions[0].commands[1].title": "Закрыто", 13 | "composeExtensions[0].commands[1].description": "Поиск закрытых запросов", 14 | "composeExtensions[0].commands[1].parameters[0].title": "Поиск", 15 | "composeExtensions[0].commands[1].parameters[0].description": "Поиск запросов" 16 | } -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information" 5 | } 6 | }, 7 | "ApplicationInsights": { 8 | "InstrumentationKey": "", 9 | "LogLevel": { 10 | "Default": "Information", 11 | "Microsoft": "Information" 12 | } 13 | }, 14 | "AllowedHosts": "*", 15 | "Storage": { 16 | "ConnectionString": "" 17 | }, 18 | "Bot": { 19 | "TeamLink": "" 20 | }, 21 | "Card": { 22 | "DefaultCardTemplate": "[{\"type\": \"Input.Date\",\"id\": \"First observed on_IssueOccuredOn\",\"max\":\"_maxDate_\",\"value\": \"_issueDate_\"},{\"type\": \"TextBlock\",\"id\": \"Validation Message_ValidationMessage\",\"text\": \"_dateValidationText_\",\"spacing\": \"None\",\"color\": \"Attention\",\"isVisible\": \"_showDateValidation_\"}]" 23 | }, 24 | "AzureAd": { 25 | "ClientId": "", 26 | "Instance": "", 27 | "Tenant": "", 28 | "Upn": "" 29 | }, 30 | "i18n": { 31 | "DefaultCulture": "en", 32 | "SupportedCultures": "en,ar,de,es,fr,he,ja,ko,pt-BR,ru,zh-CN,zh-TW" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Manifest/SME/zh-CN.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "远程支持 - 专家", 4 | "description.short": "专业团队自动程序,可处理用户请求并安排呼叫专家。", 5 | "description.full": "管理支持请求,并设置团队中的呼叫专家。请专家团队立即搜索紧急、已分配和未分配的请求。", 6 | "bots[0].commandLists[0].commands[0].title": "专家列表", 7 | "bots[0].commandLists[0].commands[0].description": "呼叫专家列表", 8 | "composeExtensions[0].commands[0].title": "紧急", 9 | "composeExtensions[0].commands[0].description": "搜索紧急请求", 10 | "composeExtensions[0].commands[0].parameters[0].title": "搜索", 11 | "composeExtensions[0].commands[0].parameters[0].description": "搜索请求", 12 | "composeExtensions[0].commands[1].title": "已分配", 13 | "composeExtensions[0].commands[1].description": "分配给专家的搜索请求", 14 | "composeExtensions[0].commands[1].parameters[0].title": "搜索", 15 | "composeExtensions[0].commands[1].parameters[0].description": "搜索请求", 16 | "composeExtensions[0].commands[2].title": "未分配", 17 | "composeExtensions[0].commands[2].description": "搜索尚未分配给专家的未分配请求", 18 | "composeExtensions[0].commands[2].parameters[0].title": "搜索", 19 | "composeExtensions[0].commands[2].parameters[0].description": "搜索请求" 20 | } -------------------------------------------------------------------------------- /Manifest/SME/zh-TW.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "遠端支援 - 專家", 4 | "description.short": "可處理使用者要求並設定待命專家的專家小組 Bot。", 5 | "description.full": "管理支援要求,並設定小組中的待命專家。直接從專家小組搜尋緊急、已指派及未指派的要求。", 6 | "bots[0].commandLists[0].commands[0].title": "專家清單", 7 | "bots[0].commandLists[0].commands[0].description": "待命專家清單", 8 | "composeExtensions[0].commands[0].title": "緊急", 9 | "composeExtensions[0].commands[0].description": "搜尋緊急要求", 10 | "composeExtensions[0].commands[0].parameters[0].title": "搜尋", 11 | "composeExtensions[0].commands[0].parameters[0].description": "搜尋要求", 12 | "composeExtensions[0].commands[1].title": "已指派", 13 | "composeExtensions[0].commands[1].description": "搜尋已指派給專家的要求", 14 | "composeExtensions[0].commands[1].parameters[0].title": "搜尋", 15 | "composeExtensions[0].commands[1].parameters[0].description": "搜尋要求", 16 | "composeExtensions[0].commands[2].title": "未指派", 17 | "composeExtensions[0].commands[2].description": "搜尋尚未指派給專家的未指派要求", 18 | "composeExtensions[0].commands[2].parameters[0].title": "搜尋", 19 | "composeExtensions[0].commands[2].parameters[0].description": "搜尋要求" 20 | } -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Models/TicketSearchScope.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common.Models 6 | { 7 | /// 8 | /// Class represents scope on basis of which tickets will be searched in messaging extension. 9 | /// 10 | public enum TicketSearchScope 11 | { 12 | /// 13 | /// Tickets with high priority. 14 | /// 15 | UrgentTickets, 16 | 17 | /// 18 | /// Tickets assigned to a subject-matter expert. 19 | /// 20 | AssignedTickets, 21 | 22 | /// 23 | /// Tickets which are not assigned to subject-matter expert. 24 | /// 25 | UnassignedTickets, 26 | 27 | /// 28 | /// Tickets which are active to subject-matter expert. 29 | /// 30 | ActiveTickets, 31 | 32 | /// 33 | /// Tickets which are not closed to subject-matter expert. 34 | /// 35 | ClosedTickets, 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Providers/ITicketIdGeneratorStorageProvider.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common.Providers 6 | { 7 | using System.Threading.Tasks; 8 | using Microsoft.Teams.Apps.RemoteSupport.Common.Models; 9 | 10 | /// 11 | /// Interface to generate ticket ids from table storage. 12 | /// 13 | public interface ITicketIdGeneratorStorageProvider 14 | { 15 | /// 16 | /// Get a new ticket id from the table storage. 17 | /// 18 | /// Next TicketId generated from table storage. 19 | Task GetTicketIdAsync(); 20 | 21 | /// 22 | /// update the ticket id in the table storage. 23 | /// 24 | /// Entity containing latest ticket Id details. 25 | /// Returns next ticket id generated from table storage. 26 | Task UpdateTicketIdAsync(TicketIdGenerator ticketIdGenerator); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /Manifest/EndUser/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "Soporte remoto", 4 | "description.short": "Ayude a solicitar soporte técnico y a conectarse con los expertos rápidamente", 5 | "description.full": "Solicite asistencia remota rápidamente. Busque solicitudes y escale a expertos en llamadas a través de chat grupal para solicitudes urgentes.", 6 | "bots[0].commandLists[0].commands[0].title": "Nueva solicitud", 7 | "bots[0].commandLists[0].commands[0].description": "Realizar una solicitud al equipo de la llamada", 8 | "composeExtensions[0].commands[0].title": "Activo", 9 | "composeExtensions[0].commands[0].description": "Buscar solicitudes activas", 10 | "composeExtensions[0].commands[0].parameters[0].title": "Buscar", 11 | "composeExtensions[0].commands[0].parameters[0].description": "Solicitudes de búsqueda", 12 | "composeExtensions[0].commands[1].title": "Cerrado", 13 | "composeExtensions[0].commands[1].description": "Búsqueda de solicitudes cerradas", 14 | "composeExtensions[0].commands[1].parameters[0].title": "Buscar", 15 | "composeExtensions[0].commands[1].parameters[0].description": "Solicitudes de búsqueda" 16 | } -------------------------------------------------------------------------------- /Manifest/EndUser/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "Remotesupport", 4 | "description.short": "Hilft, Support anzufordern und sich schnell mit Experten zu verbinden", 5 | "description.full": "Fordern Sie schnell Remotesupport an. Suchen Sie Anfragen und eskalieren Sie bei dringenden Anfragen über den Gruppen-Chat an die Rufbereitschaftsexperten.", 6 | "bots[0].commandLists[0].commands[0].title": "Neue Anforderung", 7 | "bots[0].commandLists[0].commands[0].description": "Eine Anfrage zum Rufbereitschaftsteam tätigen", 8 | "composeExtensions[0].commands[0].title": "Aktiv", 9 | "composeExtensions[0].commands[0].description": "Aktive Anforderungen durchsuchen", 10 | "composeExtensions[0].commands[0].parameters[0].title": "Suchen", 11 | "composeExtensions[0].commands[0].parameters[0].description": "Suchanforderungen", 12 | "composeExtensions[0].commands[1].title": "Geschlossen", 13 | "composeExtensions[0].commands[1].description": "Geschlossene Anforderungen durchsuchen", 14 | "composeExtensions[0].commands[1].parameters[0].title": "Suchen", 15 | "composeExtensions[0].commands[1].parameters[0].description": "Suchanforderungen" 16 | } -------------------------------------------------------------------------------- /Manifest/EndUser/pt-BR.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "Suporte remoto", 4 | "description.short": "Ajuda na solicitação de suporte e se conectar com especialistas rapidamente", 5 | "description.full": "Solicite o suporte remoto rapidamente. Solicitações de pesquisa e escalonar para os especialistas de chamada via chat de grupo para solicitações urgentes.", 6 | "bots[0].commandLists[0].commands[0].title": "Novo pedido", 7 | "bots[0].commandLists[0].commands[0].description": "Faça uma solicitação para a equipe de chamada a pedido", 8 | "composeExtensions[0].commands[0].title": "Ativo", 9 | "composeExtensions[0].commands[0].description": "Pesquisar pedidos ativos", 10 | "composeExtensions[0].commands[0].parameters[0].title": "Pesquisar", 11 | "composeExtensions[0].commands[0].parameters[0].description": "Pedidos de pesquisa", 12 | "composeExtensions[0].commands[1].title": "Fechado", 13 | "composeExtensions[0].commands[1].description": "Pesquisar pedidos fechados", 14 | "composeExtensions[0].commands[1].parameters[0].title": "Pesquisar", 15 | "composeExtensions[0].commands[1].parameters[0].description": "Pedidos de pesquisa" 16 | } -------------------------------------------------------------------------------- /Source/RemoteSupport/Bot/RemoteSupportActivityHandlerOptions.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport 6 | { 7 | /// 8 | /// The RemoteSupportActivityHandlerOptions are the options for the bot. 9 | /// 10 | public sealed class RemoteSupportActivityHandlerOptions 11 | { 12 | /// 13 | /// Gets or sets a value indicating whether the response to a message should be all uppercase. 14 | /// 15 | public bool UpperCaseResponse { get; set; } 16 | 17 | /// 18 | /// Gets or sets unique id of Tenant. 19 | /// 20 | public string TenantId { get; set; } 21 | 22 | /// 23 | /// Gets or sets unique identifier of team in which Bot is installed. 24 | /// 25 | public string TeamId { get; set; } 26 | 27 | /// 28 | /// Gets or sets application base Uri. 29 | /// 30 | public string AppBaseUri { get; set; } 31 | } 32 | } -------------------------------------------------------------------------------- /Source/RemoteSupport/ClientApp/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "remotesupport", 3 | "version": "1.0.0", 4 | "private": true, 5 | "dependencies": { 6 | "@fluentui/react": "^0.43.2", 7 | "@microsoft/applicationinsights-react-js": "^2.5.4", 8 | "@microsoft/teams-js": "^1.10.0", 9 | "axios": "^0.21.1", 10 | "classnames": "^2.3.1", 11 | "react": "^16.14.0", 12 | "react-adal": "^0.5.2", 13 | "react-appinsights": "^3.0.0-rc.6", 14 | "react-dom": "^16.14.0", 15 | "react-router": "^5.2.0", 16 | "react-router-dom": "^5.2.0", 17 | "react-scripts": "^4.0.3", 18 | "typescript": "^3.9.10" 19 | }, 20 | "scripts": { 21 | "start": "react-scripts start", 22 | "build": "react-scripts build", 23 | "test": "react-scripts test", 24 | "eject": "react-scripts eject" 25 | }, 26 | "eslintConfig": { 27 | "extends": "react-app" 28 | }, 29 | "browserslist": { 30 | "production": [ 31 | ">0.2%", 32 | "not dead", 33 | "not op_mini all" 34 | ], 35 | "development": [ 36 | "last 1 chrome version", 37 | "last 1 firefox version", 38 | "last 1 safari version" 39 | ] 40 | }, 41 | "devDependencies": { 42 | "@types/react": "16.9.6", 43 | "@types/react-dom": "16.9.2", 44 | "@types/react-router-dom": "^5.1.7" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Models/OnCallSMEDetail.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common.Models 6 | { 7 | using Newtonsoft.Json; 8 | 9 | /// 10 | /// Class contains details of on call support experts. 11 | /// 12 | public class OnCallSMEDetail 13 | { 14 | /// 15 | /// Gets or sets name of on call expert. 16 | /// 17 | [JsonProperty("name")] 18 | public string Name { get; set; } 19 | 20 | /// 21 | /// Gets or sets Azure Active Directory object Id. 22 | /// 23 | [JsonProperty("objectid")] 24 | public string ObjectId { get; set; } 25 | 26 | /// 27 | /// Gets or sets object Id of on call expert . 28 | /// 29 | [JsonProperty("id")] 30 | public string Id { get; set; } 31 | 32 | /// 33 | /// Gets or sets email Id of on call expert. 34 | /// 35 | [JsonProperty("email")] 36 | public string Email { get; set; } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Providers/IOnCallSupportDetailSearchService.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common.Providers 6 | { 7 | using System.Collections.Generic; 8 | using System.Threading.Tasks; 9 | using Microsoft.Teams.Apps.RemoteSupport.Common.Models; 10 | 11 | /// 12 | /// Interface to provide Search on call support team based on search query. 13 | /// 14 | public interface IOnCallSupportDetailSearchService 15 | { 16 | /// 17 | /// Provide search result for table to be used by SME based on Azure search service. 18 | /// 19 | /// searchQuery to be provided by message extension. 20 | /// Number of search results to return. 21 | /// Number of search results to skip. 22 | /// List of search results. 23 | Task> SearchOnCallSupportTeamAsync(string searchQuery, int? count = null, int? skip = null); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/src/components/radiobutton-preview.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | import React from "react"; 8 | import { Flex, Icon, RadioGroup, Text } from '@fluentui/react'; 9 | import "../styles/theme.css"; 10 | 11 | interface IPreviewProps { 12 | keyVal: number, 13 | displayName: string, 14 | options: Array, 15 | onDeleteComponent: (keyVal: number) => void 16 | } 17 | 18 | export const RadioButtonPreview: React.FunctionComponent = (props) => { 19 | const onDeleteComponent = (keyVal: number) => { 20 | props.onDeleteComponent(keyVal); 21 | } 22 | 23 | return ( 24 | 25 | 26 |
27 | 28 | 29 |
30 |
31 | onDeleteComponent(props.keyVal)} /> 32 |
33 | ); 34 | } -------------------------------------------------------------------------------- /Manifest/SME/ko.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "원격 지원 - 전문가", 4 | "description.short": "팀 봇이 사용자 요청을 처리하고 통화 전문가를 설정합니다.", 5 | "description.full": "지원 요청을 관리하고 팀의 상담 전문가에 대해 설정합니다. 전문가 팀의 긴급, 할당 및 할당되지 않은 요청을 바로 검색합니다.", 6 | "bots[0].commandLists[0].commands[0].title": "전문가 목록", 7 | "bots[0].commandLists[0].commands[0].description": "전화 전문가 목록", 8 | "composeExtensions[0].commands[0].title": "긴급", 9 | "composeExtensions[0].commands[0].description": "긴급 요청 검색", 10 | "composeExtensions[0].commands[0].parameters[0].title": "검색", 11 | "composeExtensions[0].commands[0].parameters[0].description": "검색 요청", 12 | "composeExtensions[0].commands[1].title": "할당됨", 13 | "composeExtensions[0].commands[1].description": "전문가에게 할당된 검색 요청", 14 | "composeExtensions[0].commands[1].parameters[0].title": "검색", 15 | "composeExtensions[0].commands[1].parameters[0].description": "검색 요청", 16 | "composeExtensions[0].commands[2].title": "할당 해제됨", 17 | "composeExtensions[0].commands[2].description": "검색되지 않은 요청이 전문가에 아직 할당되지 않았습니다.", 18 | "composeExtensions[0].commands[2].parameters[0].title": "검색", 19 | "composeExtensions[0].commands[2].parameters[0].description": "검색 요청" 20 | } -------------------------------------------------------------------------------- /Source/RemoteSupport/Cards/CardConstants.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Cards 6 | { 7 | /// 8 | /// Constants used in bot and task module cards 9 | /// 10 | public static class CardConstants 11 | { 12 | /// 13 | /// Text block card id for first observed on text in remote support request card 14 | /// 15 | public const string IssueOccurredOnId = "IssueOccurredOn"; 16 | 17 | /// 18 | /// Text block card id for date time validation message in remote support request card 19 | /// 20 | public const string DateValidationMessageId = "DateValidationMessage"; 21 | 22 | /// 23 | /// Date time format to support adaptive card text feature. 24 | /// 25 | /// 26 | /// refer adaptive card text feature https://docs.microsoft.com/en-us/adaptive-cards/authoring-cards/text-features#datetime-formatting-and-localization. 27 | /// 28 | public const string Rfc3339DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Manifest/SME/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "リモート サポート - エキスパート", 4 | "description.short": "ユーザー要求を処理し、通話のエキスパートを設定するためのエキスパート チーム ボットです。", 5 | "description.full": "サポート要求を管理し、チームの通話のエキスパートを設定します。エキスパート チームから直接、緊急、割り当て済み、未割り当ての要求を検索します。", 6 | "bots[0].commandLists[0].commands[0].title": "エキスパートのリスト", 7 | "bots[0].commandLists[0].commands[0].description": "通話のエキスパートのリスト", 8 | "composeExtensions[0].commands[0].title": "緊急", 9 | "composeExtensions[0].commands[0].description": "緊急の要求の検索", 10 | "composeExtensions[0].commands[0].parameters[0].title": "検索", 11 | "composeExtensions[0].commands[0].parameters[0].description": "要求の検索", 12 | "composeExtensions[0].commands[1].title": "割り当て済み", 13 | "composeExtensions[0].commands[1].description": "エキスパートに割り当てられた要求を検索", 14 | "composeExtensions[0].commands[1].parameters[0].title": "検索", 15 | "composeExtensions[0].commands[1].parameters[0].description": "要求の検索", 16 | "composeExtensions[0].commands[2].title": "未割り当て", 17 | "composeExtensions[0].commands[2].description": "エキスパートにまだ割り当てられていない未割り当ての要求を検索する", 18 | "composeExtensions[0].commands[2].parameters[0].title": "検索", 19 | "composeExtensions[0].commands[2].parameters[0].description": "要求の検索" 20 | } -------------------------------------------------------------------------------- /Source/RemoteSupport/ClientApp/src/styles/site.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | .container-div { 8 | height: 96vh; 9 | padding-left: 3.5rem; 10 | padding-right: 2.5rem; 11 | width: 100vw; 12 | position: fixed; 13 | } 14 | 15 | .container-subdiv { 16 | max-height: 70vh; 17 | overflow-y: auto; 18 | width: auto; 19 | } 20 | 21 | .container-subdiv-main { 22 | max-height: 70vh; 23 | width: auto; 24 | } 25 | 26 | .footer { 27 | position: fixed; 28 | bottom: 0; 29 | right: 0; 30 | width: auto; 31 | padding-bottom: 1.5rem; 32 | padding-left: 2.5rem; 33 | padding-right: 5rem; 34 | align-content: flex-end; 35 | } 36 | 37 | .error { 38 | position: fixed; 39 | bottom: 3.2rem; 40 | width: auto; 41 | padding-bottom: 1.5rem; 42 | padding-right: 5rem; 43 | align-content: flex-end; 44 | } 45 | 46 | 47 | .title { 48 | margin-bottom: 1rem; 49 | margin-top: 1rem; 50 | } 51 | 52 | .margin-button { 53 | margin-left: 3.5rem 54 | } 55 | 56 | .list-title { 57 | margin-bottom: 1rem; 58 | margin-top: 2rem; 59 | } 60 | 61 | .list-width { 62 | width: 38rem 63 | } 64 | 65 | .small-margin-left { 66 | margin-left: 1rem 67 | } 68 | 69 | .error-container { 70 | padding-top: 30vh 71 | } -------------------------------------------------------------------------------- /Manifest/EndUser/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "Support à distance", 4 | "description.short": "Aide à demander un support et à mettre rapidement en relation avec des experts", 5 | "description.full": "Demandez rapidement le support à distance. Recherchez parmi les demandes et faites-les remonter aux experts disponibles via la conversation de groupe en cas de demandes urgentes.", 6 | "bots[0].commandLists[0].commands[0].title": "Nouvelle demande", 7 | "bots[0].commandLists[0].commands[0].description": "Effectuez une demande auprès de l’équipe disponible", 8 | "composeExtensions[0].commands[0].title": "Actives", 9 | "composeExtensions[0].commands[0].description": "Recherchez parmi les demandes actives", 10 | "composeExtensions[0].commands[0].parameters[0].title": "Rechercher", 11 | "composeExtensions[0].commands[0].parameters[0].description": "Recherchez parmi les demandes", 12 | "composeExtensions[0].commands[1].title": "Closes", 13 | "composeExtensions[0].commands[1].description": "Recherchez parmi les demandes closes", 14 | "composeExtensions[0].commands[1].parameters[0].title": "Rechercher", 15 | "composeExtensions[0].commands[1].parameters[0].description": "Recherchez parmi les demandes" 16 | } -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/src/components/choiceset-preview.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | import React from "react"; 8 | import { Flex, Icon, Dropdown, Text } from '@fluentui/react'; 9 | import "../styles/theme.css"; 10 | 11 | interface IPreviewProps { 12 | keyVal: number, 13 | placeholder: string, 14 | displayName : string, 15 | options: Array, 16 | onDeleteComponent: (keyVal: number) => void 17 | } 18 | 19 | export const ChoiceSetPreview: React.FunctionComponent = (props) => { 20 | const onDeleteComponent = (keyVal: number) => { 21 | props.onDeleteComponent(keyVal); 22 | } 23 | 24 | return ( 25 | 26 | 27 |
28 |
29 | 30 |
31 |
32 | onDeleteComponent(props.keyVal)} /> 33 |
34 | ); 35 | } -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/src/components/input-text-preview.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | import React from 'react'; 8 | import { Input, Flex, Icon, Text } from '@fluentui/react'; 9 | import "../styles/theme.css"; 10 | 11 | interface IPreviewProps { 12 | keyVal: number, 13 | placeholder: string, 14 | displayName: string, 15 | onDeleteComponent: (keyVal: number) => void 16 | } 17 | 18 | export const InputTextPreview: React.FunctionComponent = (props) => { 19 | const onDeleteComponent = (keyVal: number) => { 20 | props.onDeleteComponent(keyVal); 21 | } 22 | 23 | return ( 24 | 25 | 26 |
27 |
28 | 29 |
30 |
31 | onDeleteComponent(props.keyVal)} /> 32 |
33 | ); 34 | } -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/src/components/datepicker-preview.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | import React from "react"; 8 | import { Icon, Text, Flex } from '@fluentui/react'; 9 | import "../styles/theme.css"; 10 | 11 | interface IPreviewProps { 12 | keyVal: number, 13 | displayName : string, 14 | onDeleteComponent: (keyVal: number) => void 15 | } 16 | 17 | export const DatePickerPreview: React.FunctionComponent = (props) => { 18 | const onDeleteComponent = (keyVal: number) => { 19 | props.onDeleteComponent(keyVal); 20 | } 21 | 22 | return ( 23 | 24 | 25 |
26 |
27 | 28 | 29 |
30 |
31 | onDeleteComponent(props.keyVal)} /> 32 |
33 | ); 34 | } 35 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "incidentreporter", 3 | "version": "1.0.0", 4 | "private": true, 5 | "dependencies": { 6 | "@fluentui/react": "^0.43.2", 7 | "@microsoft/applicationinsights-react-js": "^2.3.1", 8 | "@microsoft/teams-js": "^1.5.2", 9 | "axios": "^0.21.1", 10 | "classnames": "^2.2.6", 11 | "react": "^16.10.2", 12 | "react-adal": "^0.5.0", 13 | "react-appinsights": "^3.0.0-rc.6", 14 | "react-dom": "^16.10.2", 15 | "react-router": "^5.1.2", 16 | "react-router-dom": "^5.1.2", 17 | "react-scripts": "^4.0.3", 18 | "typescript": "^3.6.4" 19 | }, 20 | "scripts": { 21 | "start": "react-scripts start", 22 | "build": "react-scripts build", 23 | "test": "react-scripts test", 24 | "eject": "react-scripts eject" 25 | }, 26 | "eslintConfig": { 27 | "extends": "react-app" 28 | }, 29 | "browserslist": { 30 | "production": [ 31 | ">0.2%", 32 | "not dead", 33 | "not op_mini all" 34 | ], 35 | "development": [ 36 | "last 1 chrome version", 37 | "last 1 firefox version", 38 | "last 1 safari version" 39 | ] 40 | }, 41 | "devDependencies": { 42 | "@types/react": "16.9.6", 43 | "@types/react-dom": "16.9.2", 44 | "@types/react-router-dom": "^5.1.0" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Manifest/SME/he.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "תמיכה מרוחקת – מומחה", 4 | "description.short": "בוט של צוות מומחים לטיפול בבקשות המשתמשים ולהגדרת מומחים זמינים.", 5 | "description.full": "נהל בקשת תמיכה והגדר מומחים זמינים בצוות. חפש בקשות דחופות, מוקצות ולא מוקצות, ישירות מצוות המומחים.", 6 | "bots[0].commandLists[0].commands[0].title": "רשימת מומחים", 7 | "bots[0].commandLists[0].commands[0].description": "רשימת מומחים זמינים", 8 | "composeExtensions[0].commands[0].title": "דחוף", 9 | "composeExtensions[0].commands[0].description": "חפש בקשות דחופות", 10 | "composeExtensions[0].commands[0].parameters[0].title": "חפש", 11 | "composeExtensions[0].commands[0].parameters[0].description": "חיפוש בקשות", 12 | "composeExtensions[0].commands[1].title": "הוקצה", 13 | "composeExtensions[0].commands[1].description": "חפש בקשות שהוקצו למומחה", 14 | "composeExtensions[0].commands[1].parameters[0].title": "חפש", 15 | "composeExtensions[0].commands[1].parameters[0].description": "חיפוש בקשות", 16 | "composeExtensions[0].commands[2].title": "לא הוקצה", 17 | "composeExtensions[0].commands[2].description": "חפש בקשות שלא הוקצו עדיין לא הוקצו למומחים", 18 | "composeExtensions[0].commands[2].parameters[0].title": "חפש", 19 | "composeExtensions[0].commands[2].parameters[0].description": "חיפוש בקשות" 20 | } -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Providers/ITicketDetailStorageProvider.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common.Providers 6 | { 7 | using System.Threading.Tasks; 8 | using Microsoft.Teams.Apps.RemoteSupport.Common.Models; 9 | 10 | /// 11 | /// Ticket provider helps in fetching and storing information in storage table. 12 | /// 13 | public interface ITicketDetailStorageProvider 14 | { 15 | /// 16 | /// Save or update ticket entity. 17 | /// 18 | /// Ticket received from bot based on which appropriate row will replaced or inserted in table storage. 19 | /// that resolves successfully if the data was saved successfully. 20 | Task UpsertTicketAsync(TicketDetail ticketDetails); 21 | 22 | /// 23 | /// Get already saved entity detail from storage table. 24 | /// 25 | /// ticket id received from bot based on which appropriate row data will be fetched. 26 | /// Already saved entity detail. 27 | Task GetTicketAsync(string ticketId); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Providers/ITicketSearchService.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common.Providers 6 | { 7 | using System.Collections.Generic; 8 | using System.Threading.Tasks; 9 | using Microsoft.Teams.Apps.RemoteSupport.Common.Models; 10 | 11 | /// 12 | /// Interface of search service which will help in creating index, indexer and data source if it doesn't exist. 13 | /// 14 | public interface ITicketSearchService 15 | { 16 | /// 17 | /// Provide search result for table to be used by SME based on Azure search service. 18 | /// 19 | /// Scope of the search. 20 | /// searchQuery to be provided by message extension. 21 | /// Number of search results to return. 22 | /// Number of search results to skip. 23 | /// Requester id of the user to get specific tickets. 24 | /// List of search results. 25 | Task> SearchTicketsAsync(TicketSearchScope searchScope, string searchQuery, int? count = null, int? skip = null, string requestorId = ""); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Source/RemoteSupport/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "MicrosoftAppId": "", 3 | "MicrosoftAppPassword": "", 4 | "Logging": { 5 | "LogLevel": { 6 | "Default": "Information" 7 | } 8 | }, 9 | "ApplicationInsights": { 10 | "InstrumentationKey": "", 11 | "LogLevel": { 12 | "Default": "Information", 13 | "Microsoft": "Information" 14 | } 15 | }, 16 | "AllowedHosts": "*", 17 | "Bot": { 18 | "AppBaseUri": "", 19 | "TenantId": "", 20 | "TeamLink": "" 21 | }, 22 | "Card": { 23 | "DefaultCardTemplate": "[{\"type\": \"Input.Date\",\"id\": \"First observed on_IssueOccuredOn\",\"max\":\"_maxDate_\",\"value\": \"_issueDate_\"},{\"type\": \"TextBlock\",\"id\": \"Validation Message_ValidationMessage\",\"text\": \"_dateValidationText_\",\"spacing\": \"None\",\"color\": \"Attention\",\"isVisible\": \"_showDateValidation_\"}]" 24 | }, 25 | "Storage": { 26 | "ConnectionString": "" 27 | }, 28 | "UppercaseResponse": false, 29 | "i18n": { 30 | "DefaultCulture": "en", 31 | "SupportedCultures": "en,ar,de,es,fr,he,ja,ko,pt-BR,ru,zh-CN,zh-TW" 32 | }, 33 | "Search": { 34 | "SearchServiceName": "", 35 | "SearchServiceAdminApiKey": "", 36 | "SearchServiceQueryApiKey": "", 37 | "SearchIndexingIntervalInMinutes": 10 38 | }, 39 | "Token": { 40 | "SecurityKey": "" 41 | } 42 | } -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Providers/IOnCallSupportDetailStorageProvider.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common.Providers 6 | { 7 | using System.Threading.Tasks; 8 | using Microsoft.Teams.Apps.RemoteSupport.Common.Models; 9 | 10 | /// 11 | /// Interface for on call support detail provider. 12 | /// 13 | public interface IOnCallSupportDetailStorageProvider 14 | { 15 | /// 16 | /// Save on call support details in Azure Table Storage. 17 | /// 18 | /// On call support details to be stored in table storage. 19 | /// Returns OnCallSupportId when on call support data was saved successfully. 20 | Task UpsertOnCallSupportDetailsAsync(OnCallSupportDetail onCallSupportTeamDetails); 21 | 22 | /// 23 | /// Get already saved entity detail from storage table. 24 | /// 25 | /// onCallSMEId received from bot based on which appropriate row data will be fetched. 26 | /// Already saved entity detail. 27 | Task GetOnCallSupportDetailAsync(string onCallSMEId); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/src/components/checkbox-preview.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | import React from "react"; 8 | import { Flex, Icon, Checkbox, Text } from '@fluentui/react'; 9 | import "../styles/theme.css"; 10 | 11 | interface IPreviewProps { 12 | keyVal: number, 13 | displayName: string, 14 | options: Array, 15 | onDeleteComponent: (keyVal: number) => void 16 | } 17 | 18 | export const CheckBoxPreview: React.FunctionComponent = (props) => { 19 | const onDeleteComponent = (keyVal: number) => { 20 | props.onDeleteComponent(keyVal); 21 | } 22 | 23 | return ( 24 | 25 | 26 |
27 |
28 |
29 | {props.options.map(function(option, index){ 30 | return <>
31 | })} 32 |
33 |
34 |
35 | onDeleteComponent(props.keyVal)} /> 36 |
37 | ); 38 | } -------------------------------------------------------------------------------- /Manifest/SME/ar.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "دعم عن بعد - خبير", 4 | "description.short": "روبوت فريق الخبراء يعالج طلبات المستخدمين ويعين خبراء متوفرين عند الطلب.", 5 | "description.full": "يمكنك إدارة طلب الدعم وتعيين الخبراء المتوفرين عند الطلب في الفريق كما يمكنك البحث في الطلبات العاجلة والمعينة وغير المعينة مباشرةً من فريق الخبراء.", 6 | "bots[0].commandLists[0].commands[0].title": "قائمة الخبراء", 7 | "bots[0].commandLists[0].commands[0].description": "قائمة الخبراء المتوفرين عند الطلب", 8 | "composeExtensions[0].commands[0].title": "العاجلة", 9 | "composeExtensions[0].commands[0].description": "بحث في الطلبات العاجلة", 10 | "composeExtensions[0].commands[0].parameters[0].title": "بحث", 11 | "composeExtensions[0].commands[0].parameters[0].description": "بحث في الطلبات", 12 | "composeExtensions[0].commands[1].title": "المعينة", 13 | "composeExtensions[0].commands[1].description": "بحث في الطلبات المعينة إلى خبير", 14 | "composeExtensions[0].commands[1].parameters[0].title": "بحث", 15 | "composeExtensions[0].commands[1].parameters[0].description": "بحث في الطلبات", 16 | "composeExtensions[0].commands[2].title": "غير المعينة", 17 | "composeExtensions[0].commands[2].description": "بحث في الطلبات غير المعينة بعد إلى خبير", 18 | "composeExtensions[0].commands[2].parameters[0].title": "بحث", 19 | "composeExtensions[0].commands[2].parameters[0].description": "بحث في الطلبات" 20 | } -------------------------------------------------------------------------------- /Manifest/SME/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "Remote Support - Expert", 4 | "description.short": "Expert team bot to handle user requests and set on call experts.", 5 | "description.full": "Manage support request and set up on call experts in team. Search urgent, assigned and unassigned requests right from expert team.", 6 | "bots[0].commandLists[0].commands[0].title": "Expert list", 7 | "bots[0].commandLists[0].commands[0].description": "List of on call experts", 8 | "composeExtensions[0].commands[0].title": "Urgent", 9 | "composeExtensions[0].commands[0].description": "Search urgent requests", 10 | "composeExtensions[0].commands[0].parameters[0].title": "Search", 11 | "composeExtensions[0].commands[0].parameters[0].description": "Search requests", 12 | "composeExtensions[0].commands[1].title": "Assigned", 13 | "composeExtensions[0].commands[1].description": "Search requests assigned to an expert", 14 | "composeExtensions[0].commands[1].parameters[0].title": "Search", 15 | "composeExtensions[0].commands[1].parameters[0].description": "Search requests", 16 | "composeExtensions[0].commands[2].title": "Unassigned", 17 | "composeExtensions[0].commands[2].description": "Search unassigned requests not yet assigned to an expert", 18 | "composeExtensions[0].commands[2].parameters[0].title": "Search", 19 | "composeExtensions[0].commands[2].parameters[0].description": "Search requests" 20 | } -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Models/OnCallExpertsDetail.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common.Models 6 | { 7 | using System.Collections.Generic; 8 | using Newtonsoft.Json; 9 | 10 | /// 11 | /// Class contains details of the on call experts. 12 | /// 13 | public class OnCallExpertsDetail 14 | { 15 | /// 16 | /// Gets or sets list of on call experts. 17 | /// 18 | [JsonProperty("oncallexpertslist")] 19 | #pragma warning disable CA2227 // Collection properties should be read only - Need to set this property from json response from client Application. 20 | public List OnCallExperts { get; set; } 21 | #pragma warning restore CA2227 // Collection properties should be read only 22 | 23 | /// 24 | /// Gets or sets unique identifier of the on call support created. 25 | /// 26 | [JsonProperty("oncallsupportid")] 27 | public string OnCallSupportId { get; set; } 28 | 29 | /// 30 | /// Gets or sets card activity id which need to be refreshed in channel with updated details. 31 | /// 32 | [JsonProperty("oncallsupportcardactivityid")] 33 | public string OnCallSupportCardActivityId { get; set; } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/Program.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Configuration 6 | { 7 | using Microsoft.AspNetCore; 8 | using Microsoft.AspNetCore.Hosting; 9 | using Microsoft.Extensions.Logging; 10 | 11 | /// 12 | /// Program main class. 13 | /// 14 | public class Program 15 | { 16 | /// 17 | /// Main method. 18 | /// 19 | /// string of arguments. 20 | public static void Main(string[] args) 21 | { 22 | CreateWebHostBuilder(args).Build().Run(); 23 | } 24 | 25 | /// 26 | /// This method sets up configurations of the application. 27 | /// 28 | /// string of arguments. 29 | /// unit of execution. 30 | public static IWebHostBuilder CreateWebHostBuilder(string[] args) => 31 | WebHost.CreateDefaultBuilder(args) 32 | .ConfigureLogging((hostContext, logging) => 33 | { 34 | var appInsightKey = hostContext.Configuration.GetSection("ApplicationInsights")["InstrumentationKey"]; 35 | logging.AddApplicationInsights(appInsightKey); 36 | }) 37 | .UseStartup(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Source/RemoteSupport.Common/Utility/Utility.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Common 6 | { 7 | using System; 8 | using System.Text.RegularExpressions; 9 | using System.Web; 10 | 11 | /// 12 | /// Utility class for common functionality. 13 | /// 14 | public static class Utility 15 | { 16 | /// 17 | /// Based on deep link URL received find team id and set it. 18 | /// 19 | /// Deep link to get the team id. 20 | /// A team id from the deep link URL. 21 | public static string ParseTeamIdFromDeepLink(string teamIdDeepLink) 22 | { 23 | // team id regex match 24 | // for a pattern like https://teams.microsoft.com/l/team/19%3a64c719819fb1412db8a28fd4a30b581a%40thread.tacv2/conversations?groupId=53b4782c-7c98-4449-993a-441870d10af9&tenantId=72f988bf-86f1-41af-91ab-2d7cd011db47 25 | // regex checks for 19%3a64c719819fb1412db8a28fd4a30b581a%40thread.tacv2 26 | var match = Regex.Match(teamIdDeepLink, @"teams.microsoft.com/l/team/(\S+)/"); 27 | if (!match.Success) 28 | { 29 | throw new ArgumentException($"Invalid team found."); 30 | } 31 | 32 | return HttpUtility.UrlDecode(match.Groups[1].Value); 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /Manifest/SME/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "Удаленная поддержка — эксперт", 4 | "description.short": "Бот команды экспертов для обработки запросов и подготовки дежурных экспертов.", 5 | "description.full": "Управляйте запросом в службу поддержки и подготовьте дежурных экспертов в команде. Находите срочные, назначенные и неназначенные запросы непосредственно с помощью команды экспертов.", 6 | "bots[0].commandLists[0].commands[0].title": "Список экспертов", 7 | "bots[0].commandLists[0].commands[0].description": "Список дежурных экспертов", 8 | "composeExtensions[0].commands[0].title": "Срочно", 9 | "composeExtensions[0].commands[0].description": "Поиск срочных запросов", 10 | "composeExtensions[0].commands[0].parameters[0].title": "Поиск", 11 | "composeExtensions[0].commands[0].parameters[0].description": "Поиск запросов", 12 | "composeExtensions[0].commands[1].title": "Назначено", 13 | "composeExtensions[0].commands[1].description": "Поиск запросов, назначенных эксперту", 14 | "composeExtensions[0].commands[1].parameters[0].title": "Поиск", 15 | "composeExtensions[0].commands[1].parameters[0].description": "Поиск запросов", 16 | "composeExtensions[0].commands[2].title": "Не назначено", 17 | "composeExtensions[0].commands[2].description": "Поиск запросов, не назначенных эксперту", 18 | "composeExtensions[0].commands[2].parameters[0].title": "Поиск", 19 | "composeExtensions[0].commands[2].parameters[0].description": "Поиск запросов" 20 | } -------------------------------------------------------------------------------- /Manifest/SME/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "Soporte remoto: experto", 4 | "description.short": "Bot experto para manejar peticiones usuarios y configurar expertos llamadas.", 5 | "description.full": "Administre la solicitud de soporte técnico y configure a expertos de llamada en equipo. Busque solicitudes urgentes, asignadas y sin asignar directamente desde un equipo experto.", 6 | "bots[0].commandLists[0].commands[0].title": "Lista de expertos", 7 | "bots[0].commandLists[0].commands[0].description": "Lista de expertos en llamada", 8 | "composeExtensions[0].commands[0].title": "Urgente", 9 | "composeExtensions[0].commands[0].description": "Buscar solicitudes urgentes", 10 | "composeExtensions[0].commands[0].parameters[0].title": "Buscar", 11 | "composeExtensions[0].commands[0].parameters[0].description": "Solicitudes de búsqueda", 12 | "composeExtensions[0].commands[1].title": "Asignado", 13 | "composeExtensions[0].commands[1].description": "Buscar solicitudes asignadas a un experto", 14 | "composeExtensions[0].commands[1].parameters[0].title": "Buscar", 15 | "composeExtensions[0].commands[1].parameters[0].description": "Solicitudes de búsqueda", 16 | "composeExtensions[0].commands[2].title": "Sin asignar", 17 | "composeExtensions[0].commands[2].description": "Buscar solicitudes sin asignar aún no asignadas a un experto", 18 | "composeExtensions[0].commands[2].parameters[0].title": "Buscar", 19 | "composeExtensions[0].commands[2].parameters[0].description": "Solicitudes de búsqueda" 20 | } -------------------------------------------------------------------------------- /Manifest/SME/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "Remotesupport – Experte", 4 | "description.short": "Expertenteam-Bot für Benutzeranfragen und zum Setzen von Experten auf Abruf.", 5 | "description.full": "Verwalten Sie Supportanfragen und legen Sie Rufbereitschaftsexperten im Team fest. Suchen Sie dringende, zugewiesene und nicht zugewiesene Anfragen direkt vom Expertenteam.", 6 | "bots[0].commandLists[0].commands[0].title": "Experten-Liste", 7 | "bots[0].commandLists[0].commands[0].description": "Liste der Rufbereitschaftsexperten", 8 | "composeExtensions[0].commands[0].title": "Dringend", 9 | "composeExtensions[0].commands[0].description": "Dringende Anforderungen durchsuchen", 10 | "composeExtensions[0].commands[0].parameters[0].title": "Suchen", 11 | "composeExtensions[0].commands[0].parameters[0].description": "Suchanforderungen", 12 | "composeExtensions[0].commands[1].title": "Zugewiesen", 13 | "composeExtensions[0].commands[1].description": "Einem Experten zugewiesene Suchanforderungen", 14 | "composeExtensions[0].commands[1].parameters[0].title": "Suchen", 15 | "composeExtensions[0].commands[1].parameters[0].description": "Suchanforderungen", 16 | "composeExtensions[0].commands[2].title": "Nicht zugeordnet", 17 | "composeExtensions[0].commands[2].description": "Nicht zugewiesene Suchanforderungen suchen, die noch nicht einem Experten zugewiesen sind", 18 | "composeExtensions[0].commands[2].parameters[0].title": "Suchen", 19 | "composeExtensions[0].commands[2].parameters[0].description": "Suchanforderungen" 20 | } -------------------------------------------------------------------------------- /Source/RemoteSupport/Models/InputChoiceSet.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // 4 | 5 | namespace Microsoft.Teams.Apps.RemoteSupport.Models 6 | { 7 | using System.Collections.Generic; 8 | using AdaptiveCards; 9 | using Newtonsoft.Json; 10 | 11 | /// 12 | /// InputChoiceSet 13 | /// 14 | public class InputChoiceSet 15 | { 16 | /// 17 | /// Gets or Sets type 18 | /// 19 | [JsonProperty("type")] 20 | public string Type { get; set; } 21 | 22 | /// 23 | /// Gets Choices. 24 | /// 25 | [JsonProperty("choices")] 26 | public List Choices { get; } = new List(); 27 | 28 | /// 29 | /// Gets or sets a value indicating whether gets or Sets indicating whether gets or sets check box is enabled or not. 30 | /// 31 | [JsonProperty("isMultiSelect")] 32 | public bool IsMultiSelect { get; set; } 33 | 34 | /// 35 | /// Gets or Sets Input id. 36 | /// 37 | [JsonProperty("id")] 38 | public string Id { get; set; } 39 | 40 | /// 41 | /// Gets or sets style. 42 | /// 43 | public AdaptiveChoiceInputStyle Style { get; set; } 44 | 45 | /// 46 | /// Gets or sets input elemenet value. 47 | /// 48 | public string Value { get; set; } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /Manifest/SME/pt-BR.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "Suporte Remoto - Especialista", 4 | "description.short": "Bot da equipe de esp. para lidar com solicitações e definir os esp. em chamada.", 5 | "description.full": "Gerencie a solicitação de suporte e configure os especialistas em chamada na equipe. Pesquise solicitações urgentes, atribuídas e não atribuídas diretamente da equipe de especialistas.", 6 | "bots[0].commandLists[0].commands[0].title": "Lista de especialistas", 7 | "bots[0].commandLists[0].commands[0].description": "Lista de especialistas em chamada", 8 | "composeExtensions[0].commands[0].title": "Urgente", 9 | "composeExtensions[0].commands[0].description": "Pesquisar pedidos urgentes", 10 | "composeExtensions[0].commands[0].parameters[0].title": "Pesquisar", 11 | "composeExtensions[0].commands[0].parameters[0].description": "Pedidos de pesquisa", 12 | "composeExtensions[0].commands[1].title": "Atribuída", 13 | "composeExtensions[0].commands[1].description": "Solicitações de pesquisa atribuídas a um especialista", 14 | "composeExtensions[0].commands[1].parameters[0].title": "Pesquisar", 15 | "composeExtensions[0].commands[1].parameters[0].description": "Pedidos de pesquisa", 16 | "composeExtensions[0].commands[2].title": "Não atribuída", 17 | "composeExtensions[0].commands[2].description": "Pesquisa solicitações não atribuídas que ainda não foram atribuídas a um especialista", 18 | "composeExtensions[0].commands[2].parameters[0].title": "Pesquisar", 19 | "composeExtensions[0].commands[2].parameters[0].description": "Pedidos de pesquisa" 20 | } -------------------------------------------------------------------------------- /Manifest/SME/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "name.short": "Support à distance – expert", 4 | "description.short": "Bot d’experts traitant les requêtes d’utilisateurs et les experts de garde.", 5 | "description.full": "Gérez la demande de support et établissez les experts disponibles dans l’équipe. Recherchez parmi les demandes urgentes, affectées et non affectées directement à partir de l’équipe d’experts.", 6 | "bots[0].commandLists[0].commands[0].title": "Liste d’experts", 7 | "bots[0].commandLists[0].commands[0].description": "Liste des experts disponibles", 8 | "composeExtensions[0].commands[0].title": "Urgentes", 9 | "composeExtensions[0].commands[0].description": "Recherchez parmi les demandes urgentes", 10 | "composeExtensions[0].commands[0].parameters[0].title": "Rechercher", 11 | "composeExtensions[0].commands[0].parameters[0].description": "Recherchez parmi les demandes", 12 | "composeExtensions[0].commands[1].title": "Affectées", 13 | "composeExtensions[0].commands[1].description": "Recherchez parmi les demandes affectées à un expert", 14 | "composeExtensions[0].commands[1].parameters[0].title": "Rechercher", 15 | "composeExtensions[0].commands[1].parameters[0].description": "Recherchez parmi les demandes", 16 | "composeExtensions[0].commands[2].title": "Non affectées", 17 | "composeExtensions[0].commands[2].description": "Recherchez parmi les demandes qui ne sont pas encore affectées à un expert", 18 | "composeExtensions[0].commands[2].parameters[0].title": "Rechercher", 19 | "composeExtensions[0].commands[2].parameters[0].description": "Recherchez parmi les demandes" 20 | } -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/src/styles/theme.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | .container-div { 8 | height: 100vh; 9 | padding-left: 2.5rem; 10 | padding-right: 2.5rem; 11 | width: auto; 12 | overflow: auto; 13 | } 14 | 15 | .dialog-container-div { 16 | height: 60vh; 17 | padding-left: 2.5rem; 18 | padding-right: 2.5rem; 19 | width: auto; 20 | overflow: auto; 21 | } 22 | 23 | .container-subdiv { 24 | height: 82vh; 25 | overflow-y:auto; 26 | width: auto; 27 | } 28 | 29 | .menu { 30 | border-bottom: 0px; 31 | margin-bottom: 1rem; 32 | margin-top: 0.5rem 33 | } 34 | 35 | .footer { 36 | position: fixed; 37 | bottom: 0; 38 | right: 0; 39 | width: inherit; 40 | padding-bottom: 1.5rem; 41 | padding-left: 2.5rem; 42 | padding-right: 2.5rem; 43 | } 44 | 45 | .div-shadow { 46 | border: 1px solid #E2E2E2; 47 | box-shadow: 0 0 10px 0 rgba(0,0,0,0.15); 48 | border-radius: 3px; 49 | border-radius: 3px; 50 | } 51 | 52 | .add-icon { 53 | padding: 1rem; 54 | } 55 | 56 | .add-icon:hover { 57 | cursor: pointer; 58 | } 59 | 60 | .preview-item{ 61 | padding: .5rem; 62 | } 63 | 64 | .preview-item:hover { 65 | cursor: pointer; 66 | background-color: #8B8CC7; 67 | } 68 | .medium-margin-top{ 69 | margin-top: 1rem; 70 | } 71 | .small-margin-right { 72 | margin-right: 0.5rem; 73 | } 74 | .common-padding{ 75 | padding: 1rem; 76 | } 77 | 78 | .team-link { 79 | margin-left: -18rem; 80 | margin-top: 0.3rem; 81 | } 82 | 83 | .team-textbox-width { 84 | width: 30rem; 85 | } -------------------------------------------------------------------------------- /Source/RemoteSupport.Configuration/ClientApp/src/components/datepicker-form.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) Microsoft. All rights reserved. 4 | 5 | */ 6 | 7 | import React, { useState } from "react"; 8 | import { Button, Icon, Text, Flex, Input } from '@fluentui/react'; 9 | import "../styles/theme.css"; 10 | 11 | interface IPropertiesProps { 12 | onAddComponent: (properties: any) => boolean, 13 | resourceStrings: any, 14 | } 15 | 16 | 17 | const DatePickerForm: React.FunctionComponent = (props) => { 18 | const [properties, setProperties] = useState({ type: 'Input.Date', displayName: '' }); 19 | const onAddComponent = (event: any) => { 20 | let result = props.onAddComponent(properties); 21 | if (result) { 22 | setProperties({ type: 'Input.Date', displayName: '' }); 23 | } 24 | } 25 | 26 | return ( 27 | <> 28 | 29 | <> 30 | 31 | { setProperties({ ...properties, displayName: e.target.value }) }} /> 32 |
33 | 34 | 35 |
36 | 37 |
38 |