├── .github └── workflows │ └── azure-static-web-apps-build.yml.example ├── .gitignore ├── .hintrc ├── .mono └── registry │ └── CurrentUser │ └── software │ └── microsoft │ └── csdevkit │ └── v1 │ └── pids │ └── 2176_133593215564764766 │ └── values.xml ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── SECURITY.md ├── SUPPORT.md ├── files └── Copilot_Excel_Training_Data.zip ├── package-lock.json ├── package.json ├── public ├── css │ └── styles.css ├── data │ ├── previousFeatures.txt │ ├── siteContent-schema.json │ └── siteContent.json ├── favicon.ico ├── images │ ├── acs-to-teams-tutorial.png │ ├── build-collaborative-apps.png │ ├── microsoft-cloud.png │ ├── microsoft-logo.svg │ ├── productivity-hub.jpg │ ├── real-time-presence.png │ └── teams-app-camp.png ├── index.html ├── logo192.png ├── logo512.png ├── manifest.json ├── robots.txt └── tutorials │ ├── .nojekyll │ ├── 404.html │ ├── assets │ ├── css │ │ └── styles.df96a41c.css │ ├── images │ │ ├── architecture-no-title-b6b426985cb7bcbb342ef51b7e46f15c.png │ │ ├── authentication-e0989c8f889eb42a20e5ff799ec906e9.gif │ │ ├── build-scheduled-flow-dialog-d84a0efdafb3315d1abc2f9f6fd6ce42.png │ │ ├── create-function-app-in-azure-4e952497f29bff9ea0de11309d88910f.png │ │ ├── create-function-dialog-ce82b4d8a33d14671da0cae4f2216bb4.png │ │ ├── enhance-skills-fe2a033d4d547e02e48cfb543808e505.png │ │ ├── excel-online-connector-ecb555187cbdfc288eac177fa5808479.png │ │ ├── excel-online-connector-values-1c6f37b998d4be2bfb5b146cc97efb27.png │ │ ├── functions-sign-into-azure-347d91e0ce25a767b99148e1a53ca242.png │ │ ├── gif-01-d9a5d0eaed3bbc5ea9c45272ae3e51d8.gif │ │ ├── hands-on-learning-3fa647654838c2970ecb54018ea9aaa2.png │ │ ├── image-01-5455e7e99bc3c79be78b0674d9aadf89.png │ │ ├── image-02-c285321d2cb56b5c2fa6c329ac222d28.png │ │ ├── image-03-530bc02cdc0ea0fd222664447a17456d.png │ │ ├── image-04-c043fa343dc196745879187dcd62faab.png │ │ ├── image-05-8c369fb374b9825a0c0f9377bfc8b74b.png │ │ ├── image-06-ed5531907156f493b6eee972f725344d.png │ │ ├── image-07-db5c1f42b2d3079590e350fa8ba4ccbb.png │ │ ├── image-08-3000815597d278da230882b600fd2100.png │ │ ├── image-09-3679e41b5533b13798a9958eff85f902.png │ │ ├── image-11-d43060060c4ddf2c0b90e179971676c8.png │ │ ├── image-111-845126e9d97392fc17dd60985515f73e.png │ │ ├── image-12-9f36310ccf9ea25e87c59575ea049925.png │ │ ├── image-13-9a3de33d2d873badd53cf1008678f940.png │ │ ├── image-14-a5ca1363f60ae225f921dd8325b91298.png │ │ ├── image-15-c0a0c843769de56bd2d040d6fa1950e0.png │ │ ├── image-16-816651cff52d83b75c017cbeda1cf2cd.jpg │ │ ├── image-17-e55b05375e37f8fa47195255ccf41a65.jpg │ │ ├── oneproductivityhub-overview-7cca59cb7e40eb84d0a6ee66843700dc.gif │ │ ├── parse-json-action-6d77f5f62124d269cedbb1dad0016f42.png │ │ ├── power-automate-flow-final-a8c08171679b94f3b2a348d0b7c7949e.png │ │ ├── reminder-862328564c1bd3d3f6a3c10553c0448d.gif │ │ ├── scenario-overview-d540c31e34fab4c7d60b6468d93fc19d.png │ │ ├── select-http-action-b22edace8e6e1551cdb461ac9ece815b.png │ │ └── step-by-step-683a9957454faee5e2f6da5a86ac5eb8.png │ └── js │ │ ├── 055dfaa7.cf071c5b.js │ │ ├── 07710bc0.96effe33.js │ │ ├── 0f3734a3.406d4b27.js │ │ ├── 17896441.d59c403d.js │ │ ├── 1aa20f20.0f3ae967.js │ │ ├── 1be78505.f3421444.js │ │ ├── 1df93b7f.d1828fa7.js │ │ ├── 306c1064.978cf29f.js │ │ ├── 341a60e4.f63357d3.js │ │ ├── 3d4c5a46.e13b5cdb.js │ │ ├── 497b4376.67a8106d.js │ │ ├── 50cbbf64.60da3f26.js │ │ ├── 514b5684.397af66c.js │ │ ├── 7287d4d4.28010aa7.js │ │ ├── 7582a19b.f8200aa8.js │ │ ├── 7e775839.94fadffe.js │ │ ├── 870c29c3.14a81996.js │ │ ├── 8821e322.45ab6412.js │ │ ├── 8879ef5a.80e5b0da.js │ │ ├── 935f2afb.fb4c3e45.js │ │ ├── 972.ac2645c4.js │ │ ├── 98a810e1.49525f76.js │ │ ├── a8cc8d8f.b0b953e4.js │ │ ├── a9d05313.87acc806.js │ │ ├── c0b1b996.1bb2623a.js │ │ ├── c1115131.a9c9febe.js │ │ ├── e1b17052.67bafbf6.js │ │ ├── e3b5f4a5.a7eb10a4.js │ │ ├── e8f948e5.2f5b8034.js │ │ ├── ebc8cf94.645b3d14.js │ │ ├── ed87990c.91de7ed4.js │ │ ├── fcf0fce3.bfdd2f98.js │ │ ├── main.13bf895f.js │ │ ├── main.13bf895f.js.LICENSE.txt │ │ └── runtime~main.0a4045e2.js │ ├── docs │ ├── ACS-to-Teams-Meeting │ │ └── index.html │ ├── Authentication-App-With-NextJs-And-Microsoft-Graph │ │ ├── Configuring-Application-Azure-Active-Directory │ │ │ └── index.html │ │ ├── Creating-Application-Components │ │ │ └── index.html │ │ ├── Creating-Configuration-Files │ │ │ └── index.html │ │ ├── Creating-Pages-For-The-Application │ │ │ └── index.html │ │ ├── Defining-AAD-Provider-NextJs │ │ │ └── index.html │ │ ├── Important-Changes-Admin-Reminder-Pages │ │ │ └── index.html │ │ ├── Next-Steps-Conclusion │ │ │ └── index.html │ │ ├── Structuring-Project │ │ │ └── index.html │ │ └── index.html │ ├── Automate-Data-Reporting-with-Azure-Functions-and-Power-Automate │ │ ├── Congratulations │ │ │ └── index.html │ │ ├── Convert-Local-Script-Code-into-an-Azure-Function │ │ │ └── index.html │ │ ├── Create-and-Deploy-the-Function-App-to-Azure │ │ │ └── index.html │ │ ├── Install-the-Azure-Functions-Extension-and-Create-a-New-Function │ │ │ └── index.html │ │ ├── Use-Power-Automate-to-Retrieve-Data-from-an-Azure │ │ │ └── index.html │ │ └── index.html │ ├── Build-Productivity-Apps-By-Using-Microsoft-Graph-Toolkit │ │ └── index.html │ └── Take-A-Break-Reminder-App │ │ ├── Changing-NextauthTs-File │ │ └── index.html │ │ ├── Create-An-Application-Azure-Active-Directory │ │ └── index.html │ │ ├── Creating-Interface-File-JWT │ │ └── index.html │ │ ├── Developing-Get-Presence-API │ │ └── index.html │ │ ├── Important-Changes-Reminder-Page │ │ └── index.html │ │ ├── Installing-Dependencies-From-Kit-Get-Started │ │ └── index.html │ │ ├── Next Steps-Conclusion │ │ └── index.html │ │ └── index.html │ ├── img │ ├── acs-to-teams │ │ ├── 1-acs-azure-portal.png │ │ ├── 2-acs-react.png │ │ ├── 3-create-teams-meeting-link.png │ │ ├── 4-acs-identity-token.png │ │ ├── 5-deploy-swa.png │ │ ├── 6-deploy-container-apps.png │ │ ├── aad-user-id.png │ │ ├── architecture-no-title.png │ │ ├── architecture.png │ │ ├── fork-repo.png │ │ ├── search-acs-portal.png │ │ ├── search-swa-portal.png │ │ ├── teams-meeting-link.png │ │ └── user-identity-token.png │ ├── authentication-workshop │ │ ├── authentication.gif │ │ ├── gif-01.gif │ │ ├── image-01.png │ │ ├── image-02.png │ │ ├── image-03.png │ │ ├── image-04.png │ │ ├── image-05.png │ │ ├── image-06.png │ │ ├── image-07.png │ │ ├── image-08.png │ │ ├── image-09.png │ │ ├── image-10.png │ │ ├── image-11.png │ │ ├── image-111.png │ │ ├── image-12.png │ │ ├── image-13.png │ │ ├── image-14.png │ │ ├── image-15.png │ │ ├── image-16.jpg │ │ ├── image-17.jpg │ │ └── reminder.gif │ ├── automate-data-azure-functions-power-automate │ │ ├── azure-function-files.png │ │ ├── build-scheduled-flow-dialog.png │ │ ├── create-function-app-in-azure.png │ │ ├── create-function-dialog.png │ │ ├── excel-online-connector-values.png │ │ ├── excel-online-connector.png │ │ ├── functions-sign-into-azure.png │ │ ├── parse-json-action.png │ │ ├── parse-json-generate-schema.png │ │ ├── power-automate-flow-final.png │ │ ├── power-automate-flow.png │ │ ├── recurrence-action.png │ │ ├── scenario-overview.png │ │ ├── scheduled-flow.png │ │ ├── select-http-action.png │ │ ├── test-and-flow-checker.png │ │ ├── test-flow-result.png │ │ └── test-flow.png │ ├── enhance-skills.png │ ├── favicon.ico │ ├── hands-on-learning.png │ ├── logo.svg │ ├── microsoft-logo-dark.svg │ ├── microsoft-logo.svg │ ├── productivity-dashboard │ │ └── oneproductivityhub-overview.gif │ └── step-by-step.png │ ├── index.html │ └── sitemap.xml ├── samples ├── acs-to-teams-meeting │ ├── README.md │ ├── client │ │ └── react │ │ │ ├── .dockerignore │ │ │ ├── .gitignore │ │ │ ├── Dockerfile │ │ │ ├── README.md │ │ │ ├── config │ │ │ └── nginx.conf │ │ │ ├── package-lock.json │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── logo192.png │ │ │ ├── logo512.png │ │ │ ├── manifest.json │ │ │ └── robots.txt │ │ │ ├── src │ │ │ ├── App.css │ │ │ ├── App.tsx │ │ │ ├── index.css │ │ │ ├── index.tsx │ │ │ ├── react-app-env.d.ts │ │ │ ├── reportWebVitals.ts │ │ │ └── setupTests.ts │ │ │ └── tsconfig.json │ ├── server │ │ ├── csharp │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── GraphACSFunctions.sln │ │ │ └── GraphACSFunctions │ │ │ │ ├── .gitignore │ │ │ │ ├── ACSTokenFunction.cs │ │ │ │ ├── GraphACSFunctions.csproj │ │ │ │ ├── Program.cs │ │ │ │ ├── Properties │ │ │ │ ├── launchSettings.json │ │ │ │ ├── serviceDependencies.json │ │ │ │ └── serviceDependencies.local.json │ │ │ │ ├── Services │ │ │ │ ├── GraphService.cs │ │ │ │ └── IGraphService.cs │ │ │ │ ├── TeamsMeetingFunction.cs │ │ │ │ └── host.json │ │ └── typescript │ │ │ ├── .funcignore │ │ │ ├── .gitignore │ │ │ ├── .vscode │ │ │ ├── extensions.json │ │ │ ├── launch.json │ │ │ ├── settings.json │ │ │ └── tasks.json │ │ │ ├── README.md │ │ │ ├── Shared │ │ │ ├── dateTimeFormat.ts │ │ │ └── graph.ts │ │ │ ├── host.json │ │ │ ├── package-lock.json │ │ │ ├── package.json │ │ │ ├── src │ │ │ └── functions │ │ │ │ ├── httpTriggerAcsToken.ts │ │ │ │ └── httpTriggerTeamsUrl.ts │ │ │ └── tsconfig.json │ ├── setup.ps1 │ └── setup.sh ├── data-reporting-with-azure-functions-power-automate │ ├── README.md │ └── stats.xlsx ├── microsoft-graph-scenarios │ └── .gitkeep ├── openai-acs-msgraph │ ├── .devcontainer │ │ ├── Dockerfile │ │ ├── devcontainer.json │ │ ├── docker-compose.yml │ │ └── setup.sh │ ├── .env.example │ ├── .gitignore │ ├── .vscode │ │ ├── extensions.json │ │ ├── launch.json │ │ └── tasks.json │ ├── LICENSE │ ├── README.md │ ├── client │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── angular.json │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.html │ │ │ │ ├── app.component.scss │ │ │ │ ├── app.component.ts │ │ │ │ ├── calendar-events │ │ │ │ │ ├── calendar-events.component.html │ │ │ │ │ ├── calendar-events.component.scss │ │ │ │ │ └── calendar-events.component.ts │ │ │ │ ├── chat-help-dialog │ │ │ │ │ ├── chat-help-dialog.component.html │ │ │ │ │ ├── chat-help-dialog.component.scss │ │ │ │ │ └── chat-help-dialog.component.ts │ │ │ │ ├── chats │ │ │ │ │ ├── chats.component.html │ │ │ │ │ ├── chats.component.scss │ │ │ │ │ └── chats.component.ts │ │ │ │ ├── core │ │ │ │ │ ├── acs.service.ts │ │ │ │ │ ├── api-url.service.ts │ │ │ │ │ ├── data.service.ts │ │ │ │ │ ├── ensure-module-loaded-once.guard.ts │ │ │ │ │ ├── eventbus.service.ts │ │ │ │ │ ├── feature-flags.service.ts │ │ │ │ │ ├── graph.service.ts │ │ │ │ │ ├── overlay │ │ │ │ │ │ ├── overlay-request-response.interceptor.ts │ │ │ │ │ │ ├── overlay.component.html │ │ │ │ │ │ ├── overlay.component.scss │ │ │ │ │ │ └── overlay.component.ts │ │ │ │ │ └── sorter.service.ts │ │ │ │ ├── customers-list │ │ │ │ │ ├── customers-list.component.html │ │ │ │ │ ├── customers-list.component.scss │ │ │ │ │ └── customers-list.component.ts │ │ │ │ ├── email-sms-dialog │ │ │ │ │ ├── email-sms-dialog-data.ts │ │ │ │ │ ├── email-sms-dialog.component.html │ │ │ │ │ ├── email-sms-dialog.component.scss │ │ │ │ │ └── email-sms-dialog.component.ts │ │ │ │ ├── emails │ │ │ │ │ ├── emails.component.html │ │ │ │ │ ├── emails.component.scss │ │ │ │ │ └── emails.component.ts │ │ │ │ ├── files │ │ │ │ │ ├── files.component.html │ │ │ │ │ ├── files.component.scss │ │ │ │ │ └── files.component.ts │ │ │ │ ├── header │ │ │ │ │ ├── header.component.html │ │ │ │ │ ├── header.component.scss │ │ │ │ │ └── header.component.ts │ │ │ │ ├── phone-call │ │ │ │ │ ├── phone-call.component.html │ │ │ │ │ ├── phone-call.component.scss │ │ │ │ │ └── phone-call.component.ts │ │ │ │ ├── related-content │ │ │ │ │ ├── related-content.component.html │ │ │ │ │ ├── related-content.component.scss │ │ │ │ │ └── related-content.component.ts │ │ │ │ ├── shared │ │ │ │ │ ├── dynamic.pipe.ts │ │ │ │ │ ├── filter-textbox.component.ts │ │ │ │ │ ├── interfaces.ts │ │ │ │ │ ├── phone.pipe.ts │ │ │ │ │ ├── related-content-base.component.ts │ │ │ │ │ ├── svg-icons.ts │ │ │ │ │ ├── titlecase-underscore.pipe.ts │ │ │ │ │ └── truncate.pipe.ts │ │ │ │ └── textarea-dialog │ │ │ │ │ ├── dialog-data.ts │ │ │ │ │ ├── textarea-dialog.component.html │ │ │ │ │ ├── textarea-dialog.component.scss │ │ │ │ │ └── textarea-dialog.component.ts │ │ │ ├── assets │ │ │ │ ├── .gitkeep │ │ │ │ └── data.json │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── theme.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ ├── tsconfig.spec.json │ │ └── webpack.partial.js │ ├── customer documents │ │ ├── Adatum-Corporation-Logo.svg │ │ ├── Adatum-Corporation-PO-2005.docx │ │ ├── Adventure-Works-Cycles-Supplies.xlsx │ │ ├── Clock A102 Installation Instructions.docx │ │ ├── Company FAQs.docx │ │ ├── Tailwind-Traders-PO-1001.docx │ │ └── Tailwind-Traders-Supplies.xlsx │ ├── docker-compose.yml │ ├── images │ │ ├── demo-original.gif │ │ └── demo.gif │ └── server │ │ └── typescript │ │ ├── acs.ts │ │ ├── apiRoutes.ts │ │ ├── config.ts │ │ ├── db.schema │ │ ├── index.ts │ │ ├── initDatabase.ts │ │ ├── interfaces.ts │ │ ├── openAI.ts │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── postgres.ts │ │ └── tsconfig.json ├── productivity-hub │ └── README.md └── teams-apps │ └── README.md └── tutorials ├── .gitignore ├── README.md ├── babel.config.js ├── docs ├── ACS-to-Teams-Meeting │ └── index.md ├── Authentication-App-With-NextJs-And-Microsoft-Graph │ ├── 01-Configuring-Application-Azure-Active-Directory.md │ ├── 02-Structuring-Project.md │ ├── 03-Creating-Application-Components.md │ ├── 04-Defining-AAD-Provider-NextJs.md │ ├── 05-Creating-Pages-For-The-Application.md │ ├── 06-Creating-Configuration-Files.md │ ├── 07-Important-Changes-Admin-Reminder-Pages.md │ ├── 08-Next-Steps-Conclusion.md │ └── index.md ├── Automate-Data-Reporting-with-Azure-Functions-and-Power-Automate │ ├── 01-Install-the-Azure-Functions-Extension-and-Create-a-New-Function.md │ ├── 02-Convert-Local-Script-Code-into-an-Azure-Function.md │ ├── 03-Create-and-Deploy-the-Function-App-to-Azure.md │ ├── 04-Use-Power-Automate-to-Retrieve-Data-from-an-Azure.md │ ├── 05-Congratulations.md │ └── index.md ├── Build-Productivity-Apps-By-Using-Microsoft-Graph-Toolkit │ └── index.md └── Take-A-Break-Reminder-App │ ├── 01-Create-An-Application-Azure-Active-Directory.md │ ├── 02-Installing-Dependencies-From-Kit-Get-Started.md │ ├── 03-Changing-NextauthTs-File.md │ ├── 04-Developing-Get-Presence-API.md │ ├── 05-Important-Changes-Reminder-Page.md │ ├── 06-Creating-Interface-File-JWT.md │ ├── 07-Next Steps-Conclusion.md │ └── index.md ├── docusaurus.config.js ├── package-lock.json ├── package.json ├── sidebars.js ├── src ├── components │ └── HomepageFeatures │ │ ├── index.tsx │ │ └── styles.module.css ├── css │ └── custom.css └── pages │ ├── index.module.css │ └── index.tsx ├── static ├── .nojekyll └── img │ ├── acs-to-teams │ ├── 1-acs-azure-portal.png │ ├── 2-acs-react.png │ ├── 3-create-teams-meeting-link.png │ ├── 4-acs-identity-token.png │ ├── 5-deploy-swa.png │ ├── 6-deploy-container-apps.png │ ├── aad-user-id.png │ ├── architecture-no-title.png │ ├── architecture.png │ ├── fork-repo.png │ ├── search-acs-portal.png │ ├── search-swa-portal.png │ ├── teams-meeting-link.png │ └── user-identity-token.png │ ├── authentication-workshop │ ├── authentication.gif │ ├── gif-01.gif │ ├── image-01.png │ ├── image-02.png │ ├── image-03.png │ ├── image-04.png │ ├── image-05.png │ ├── image-06.png │ ├── image-07.png │ ├── image-08.png │ ├── image-09.png │ ├── image-10.png │ ├── image-11.png │ ├── image-111.png │ ├── image-12.png │ ├── image-13.png │ ├── image-14.png │ ├── image-15.png │ ├── image-16.jpg │ ├── image-17.jpg │ └── reminder.gif │ ├── automate-data-azure-functions-power-automate │ ├── azure-function-files.png │ ├── build-scheduled-flow-dialog.png │ ├── create-function-app-in-azure.png │ ├── create-function-dialog.png │ ├── excel-online-connector-values.png │ ├── excel-online-connector.png │ ├── functions-sign-into-azure.png │ ├── parse-json-action.png │ ├── parse-json-generate-schema.png │ ├── power-automate-flow-final.png │ ├── power-automate-flow.png │ ├── recurrence-action.png │ ├── scenario-overview.png │ ├── scheduled-flow.png │ ├── select-http-action.png │ ├── test-and-flow-checker.png │ ├── test-flow-result.png │ └── test-flow.png │ ├── enhance-skills.png │ ├── favicon.ico │ ├── hands-on-learning.png │ ├── logo.svg │ ├── microsoft-logo-dark.svg │ ├── microsoft-logo.svg │ ├── productivity-dashboard │ └── oneproductivityhub-overview.gif │ └── step-by-step.png └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | build 7 | 8 | # dependencies 9 | 10 | /node_modules 11 | /.pnp 12 | .pnp.js 13 | 14 | # testing 15 | /coverage 16 | 17 | # production 18 | 19 | 20 | # misc 21 | .DS_Store 22 | .env 23 | .env.local 24 | .env.development.local 25 | .env.test.local 26 | .env.production.local 27 | 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | /.vs 32 | -------------------------------------------------------------------------------- /.hintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "development" 4 | ], 5 | "hints": { 6 | "typescript-config/consistent-casing": "off", 7 | "typescript-config/strict": "off" 8 | } 9 | } -------------------------------------------------------------------------------- /.mono/registry/CurrentUser/software/microsoft/csdevkit/v1/pids/2176_133593215564764766/values.xml: -------------------------------------------------------------------------------- 1 |  2 | 133593281647659295 3 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "ms-azuretools.vscode-azurefunctions" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Attach to Node Functions", 6 | "type": "node", 7 | "request": "attach", 8 | "port": 9229, 9 | "preLaunchTask": "func: host start" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "azureFunctions.deploySubpath": "samples\\acs-to-teams-meeting\\server\\typescript", 3 | "azureFunctions.postDeployTask": "npm install (functions)", 4 | "azureFunctions.projectLanguage": "TypeScript", 5 | "azureFunctions.projectRuntime": "~4", 6 | "debug.internalConsoleOptions": "neverOpen", 7 | "azureFunctions.preDeployTask": "npm prune (functions)" 8 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "func", 6 | "command": "host start", 7 | "problemMatcher": "$func-node-watch", 8 | "isBackground": true, 9 | "dependsOn": "npm build (functions)", 10 | "options": { 11 | "cwd": "${workspaceFolder}/samples\\acs-to-teams-meeting\\server\\typescript" 12 | } 13 | }, 14 | { 15 | "type": "shell", 16 | "label": "npm install (functions)", 17 | "command": "npm install", 18 | "options": { 19 | "cwd": "${workspaceFolder}/samples\\acs-to-teams-meeting\\server\\typescript" 20 | } 21 | }, 22 | { 23 | "type": "shell", 24 | "label": "npm prune (functions)", 25 | "command": "npm prune --production", 26 | "dependsOn": "npm build (functions)", 27 | "problemMatcher": [], 28 | "options": { 29 | "cwd": "${workspaceFolder}/samples\\acs-to-teams-meeting\\server\\typescript" 30 | } 31 | } 32 | ] 33 | } -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Microsoft Cloud Integrations (code samples, videos, documentation) 2 | 3 | The `MicrosoftCloud` repo provides samples and hands-on exercises for different Microsoft Cloud integration scenarios across Azure, Microsoft 365, Power Platform, and GitHub. 4 | 5 | Website: https://microsoft.github.io/MicrosoftCloud/ 6 | 7 | ## Contributing 8 | 9 | This project welcomes contributions and suggestions. Most contributions require you to agree to a 10 | Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us 11 | the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. 12 | 13 | When you submit a pull request, a CLA bot will automatically determine whether you need to provide 14 | a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions 15 | provided by the bot. You will only need to do this once across all repos using our CLA. 16 | 17 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 18 | For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or 19 | contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. 20 | 21 | ## Trademarks 22 | 23 | This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft 24 | trademarks or logos is subject to and must follow 25 | [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). 26 | Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. 27 | Any use of third-party trademarks or logos are subject to those third-party's policies. 28 | 29 | ## Deployment to GitHub Pages 30 | 31 | Enable GitHub Pages to use the `gh-pages` branch by going to `https://github.com/[org_name]/[repo_name]/settings/pages` 32 | 33 | Publish: 34 | 35 | 1. `npm install` 36 | 1. Build and deploy the project by running `npm run build-deploy`. 37 | -------------------------------------------------------------------------------- /SUPPORT.md: -------------------------------------------------------------------------------- 1 | # TODO: The maintainer of this repo has not yet edited this file 2 | 3 | **REPO OWNER**: Do you want Customer Service & Support (CSS) support for this product/project? 4 | 5 | - **No CSS support:** Fill out this template with information about how to file issues and get help. 6 | - **Yes CSS support:** Fill out an intake form at [aka.ms/onboardsupport](https://aka.ms/onboardsupport). CSS will work with/help you to determine next steps. 7 | - **Not sure?** Fill out an intake as though the answer were "Yes". CSS will help you decide. 8 | 9 | *Then remove this first heading from this SUPPORT.MD file before publishing your repo.* 10 | 11 | # Support 12 | 13 | ## How to file issues and get help 14 | 15 | This project uses GitHub Issues to track bugs and feature requests. Please search the existing 16 | issues before filing new issues to avoid duplicates. For new issues, file your bug or 17 | feature request as a new Issue. 18 | 19 | For help and questions about using this project, please **REPO MAINTAINER: INSERT INSTRUCTIONS HERE 20 | FOR HOW TO ENGAGE REPO OWNERS OR COMMUNITY FOR HELP. COULD BE A STACK OVERFLOW TAG OR OTHER 21 | CHANNEL. WHERE WILL YOU HELP PEOPLE?**. 22 | 23 | ## Microsoft Support Policy 24 | 25 | Support for this **PROJECT or PRODUCT** is limited to the resources listed above. 26 | -------------------------------------------------------------------------------- /files/Copilot_Excel_Training_Data.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/files/Copilot_Excel_Training_Data.zip -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "microsoft-cloud-integrations", 3 | "version": "0.9.0", 4 | "private": true, 5 | "homepage": "https://microsoft.github.io/MicrosoftCloud", 6 | "scripts": { 7 | "deploy": "gh-pages -d public", 8 | "build-tutorials": "cd tutorials && npm run build", 9 | "build-deploy": "npm run build-tutorials && npm run deploy" 10 | }, 11 | "devDependencies": { 12 | "gh-pages": "^6.2.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /public/css/styles.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/css/styles.css -------------------------------------------------------------------------------- /public/data/previousFeatures.txt: -------------------------------------------------------------------------------- 1 | "feature": { 2 | "position": 1, 3 | "imageUrl": "./images/build-collaborative-apps.png", 4 | "url": "https://mybuild.microsoft.com/sessions/a330735b-d4cf-4be0-a8bc-4ceb17c49558?source=sessions", 5 | "title": "Building Real-time Collaborative Apps", 6 | "description": "Real-time Collaboration using the Microsoft Cloud" 7 | } -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/favicon.ico -------------------------------------------------------------------------------- /public/images/acs-to-teams-tutorial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/images/acs-to-teams-tutorial.png -------------------------------------------------------------------------------- /public/images/build-collaborative-apps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/images/build-collaborative-apps.png -------------------------------------------------------------------------------- /public/images/microsoft-cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/images/microsoft-cloud.png -------------------------------------------------------------------------------- /public/images/productivity-hub.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/images/productivity-hub.jpg -------------------------------------------------------------------------------- /public/images/real-time-presence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/images/real-time-presence.png -------------------------------------------------------------------------------- /public/images/teams-app-camp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/images/teams-app-camp.png -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/logo512.png -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /public/tutorials/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/.nojekyll -------------------------------------------------------------------------------- /public/tutorials/assets/images/architecture-no-title-b6b426985cb7bcbb342ef51b7e46f15c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/architecture-no-title-b6b426985cb7bcbb342ef51b7e46f15c.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/authentication-e0989c8f889eb42a20e5ff799ec906e9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/authentication-e0989c8f889eb42a20e5ff799ec906e9.gif -------------------------------------------------------------------------------- /public/tutorials/assets/images/build-scheduled-flow-dialog-d84a0efdafb3315d1abc2f9f6fd6ce42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/build-scheduled-flow-dialog-d84a0efdafb3315d1abc2f9f6fd6ce42.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/create-function-app-in-azure-4e952497f29bff9ea0de11309d88910f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/create-function-app-in-azure-4e952497f29bff9ea0de11309d88910f.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/create-function-dialog-ce82b4d8a33d14671da0cae4f2216bb4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/create-function-dialog-ce82b4d8a33d14671da0cae4f2216bb4.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/enhance-skills-fe2a033d4d547e02e48cfb543808e505.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/enhance-skills-fe2a033d4d547e02e48cfb543808e505.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/excel-online-connector-ecb555187cbdfc288eac177fa5808479.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/excel-online-connector-ecb555187cbdfc288eac177fa5808479.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/excel-online-connector-values-1c6f37b998d4be2bfb5b146cc97efb27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/excel-online-connector-values-1c6f37b998d4be2bfb5b146cc97efb27.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/functions-sign-into-azure-347d91e0ce25a767b99148e1a53ca242.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/functions-sign-into-azure-347d91e0ce25a767b99148e1a53ca242.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/gif-01-d9a5d0eaed3bbc5ea9c45272ae3e51d8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/gif-01-d9a5d0eaed3bbc5ea9c45272ae3e51d8.gif -------------------------------------------------------------------------------- /public/tutorials/assets/images/hands-on-learning-3fa647654838c2970ecb54018ea9aaa2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/hands-on-learning-3fa647654838c2970ecb54018ea9aaa2.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-01-5455e7e99bc3c79be78b0674d9aadf89.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-01-5455e7e99bc3c79be78b0674d9aadf89.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-02-c285321d2cb56b5c2fa6c329ac222d28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-02-c285321d2cb56b5c2fa6c329ac222d28.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-03-530bc02cdc0ea0fd222664447a17456d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-03-530bc02cdc0ea0fd222664447a17456d.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-04-c043fa343dc196745879187dcd62faab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-04-c043fa343dc196745879187dcd62faab.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-05-8c369fb374b9825a0c0f9377bfc8b74b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-05-8c369fb374b9825a0c0f9377bfc8b74b.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-06-ed5531907156f493b6eee972f725344d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-06-ed5531907156f493b6eee972f725344d.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-07-db5c1f42b2d3079590e350fa8ba4ccbb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-07-db5c1f42b2d3079590e350fa8ba4ccbb.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-08-3000815597d278da230882b600fd2100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-08-3000815597d278da230882b600fd2100.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-09-3679e41b5533b13798a9958eff85f902.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-09-3679e41b5533b13798a9958eff85f902.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-11-d43060060c4ddf2c0b90e179971676c8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-11-d43060060c4ddf2c0b90e179971676c8.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-111-845126e9d97392fc17dd60985515f73e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-111-845126e9d97392fc17dd60985515f73e.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-12-9f36310ccf9ea25e87c59575ea049925.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-12-9f36310ccf9ea25e87c59575ea049925.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-13-9a3de33d2d873badd53cf1008678f940.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-13-9a3de33d2d873badd53cf1008678f940.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-14-a5ca1363f60ae225f921dd8325b91298.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-14-a5ca1363f60ae225f921dd8325b91298.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-15-c0a0c843769de56bd2d040d6fa1950e0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-15-c0a0c843769de56bd2d040d6fa1950e0.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-16-816651cff52d83b75c017cbeda1cf2cd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-16-816651cff52d83b75c017cbeda1cf2cd.jpg -------------------------------------------------------------------------------- /public/tutorials/assets/images/image-17-e55b05375e37f8fa47195255ccf41a65.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/image-17-e55b05375e37f8fa47195255ccf41a65.jpg -------------------------------------------------------------------------------- /public/tutorials/assets/images/oneproductivityhub-overview-7cca59cb7e40eb84d0a6ee66843700dc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/oneproductivityhub-overview-7cca59cb7e40eb84d0a6ee66843700dc.gif -------------------------------------------------------------------------------- /public/tutorials/assets/images/parse-json-action-6d77f5f62124d269cedbb1dad0016f42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/parse-json-action-6d77f5f62124d269cedbb1dad0016f42.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/power-automate-flow-final-a8c08171679b94f3b2a348d0b7c7949e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/power-automate-flow-final-a8c08171679b94f3b2a348d0b7c7949e.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/reminder-862328564c1bd3d3f6a3c10553c0448d.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/reminder-862328564c1bd3d3f6a3c10553c0448d.gif -------------------------------------------------------------------------------- /public/tutorials/assets/images/scenario-overview-d540c31e34fab4c7d60b6468d93fc19d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/scenario-overview-d540c31e34fab4c7d60b6468d93fc19d.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/select-http-action-b22edace8e6e1551cdb461ac9ece815b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/select-http-action-b22edace8e6e1551cdb461ac9ece815b.png -------------------------------------------------------------------------------- /public/tutorials/assets/images/step-by-step-683a9957454faee5e2f6da5a86ac5eb8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/assets/images/step-by-step-683a9957454faee5e2f6da5a86ac5eb8.png -------------------------------------------------------------------------------- /public/tutorials/assets/js/7287d4d4.28010aa7.js: -------------------------------------------------------------------------------- 1 | "use strict";(self.webpackChunkdocs_website=self.webpackChunkdocs_website||[]).push([[656],{5745:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); -------------------------------------------------------------------------------- /public/tutorials/assets/js/972.ac2645c4.js: -------------------------------------------------------------------------------- 1 | "use strict";(self.webpackChunkdocs_website=self.webpackChunkdocs_website||[]).push([[972],{4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>i});var a=n(7294),l=n(5999),o=n(1944),r=n(7961);function i(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}}}]); -------------------------------------------------------------------------------- /public/tutorials/assets/js/e1b17052.67bafbf6.js: -------------------------------------------------------------------------------- 1 | "use strict";(self.webpackChunkdocs_website=self.webpackChunkdocs_website||[]).push([[8],{3769:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); -------------------------------------------------------------------------------- /public/tutorials/assets/js/main.13bf895f.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /* 2 | object-assign 3 | (c) Sindre Sorhus 4 | @license MIT 5 | */ 6 | 7 | /* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress 8 | * @license MIT */ 9 | 10 | /** 11 | * @license React 12 | * use-sync-external-store-shim.production.min.js 13 | * 14 | * Copyright (c) Facebook, Inc. and its affiliates. 15 | * 16 | * This source code is licensed under the MIT license found in the 17 | * LICENSE file in the root directory of this source tree. 18 | */ 19 | 20 | /** 21 | * Prism: Lightweight, robust, elegant syntax highlighting 22 | * 23 | * @license MIT 24 | * @author Lea Verou 25 | * @namespace 26 | * @public 27 | */ 28 | 29 | /** @license React v0.20.2 30 | * scheduler.production.min.js 31 | * 32 | * Copyright (c) Facebook, Inc. and its affiliates. 33 | * 34 | * This source code is licensed under the MIT license found in the 35 | * LICENSE file in the root directory of this source tree. 36 | */ 37 | 38 | /** @license React v16.13.1 39 | * react-is.production.min.js 40 | * 41 | * Copyright (c) Facebook, Inc. and its affiliates. 42 | * 43 | * This source code is licensed under the MIT license found in the 44 | * LICENSE file in the root directory of this source tree. 45 | */ 46 | 47 | /** @license React v17.0.2 48 | * react-dom.production.min.js 49 | * 50 | * Copyright (c) Facebook, Inc. and its affiliates. 51 | * 52 | * This source code is licensed under the MIT license found in the 53 | * LICENSE file in the root directory of this source tree. 54 | */ 55 | 56 | /** @license React v17.0.2 57 | * react.production.min.js 58 | * 59 | * Copyright (c) Facebook, Inc. and its affiliates. 60 | * 61 | * This source code is licensed under the MIT license found in the 62 | * LICENSE file in the root directory of this source tree. 63 | */ 64 | -------------------------------------------------------------------------------- /public/tutorials/img/acs-to-teams/1-acs-azure-portal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/acs-to-teams/1-acs-azure-portal.png -------------------------------------------------------------------------------- /public/tutorials/img/acs-to-teams/2-acs-react.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/acs-to-teams/2-acs-react.png -------------------------------------------------------------------------------- /public/tutorials/img/acs-to-teams/3-create-teams-meeting-link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/acs-to-teams/3-create-teams-meeting-link.png -------------------------------------------------------------------------------- /public/tutorials/img/acs-to-teams/4-acs-identity-token.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/acs-to-teams/4-acs-identity-token.png -------------------------------------------------------------------------------- /public/tutorials/img/acs-to-teams/5-deploy-swa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/acs-to-teams/5-deploy-swa.png -------------------------------------------------------------------------------- /public/tutorials/img/acs-to-teams/6-deploy-container-apps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/acs-to-teams/6-deploy-container-apps.png -------------------------------------------------------------------------------- /public/tutorials/img/acs-to-teams/aad-user-id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/acs-to-teams/aad-user-id.png -------------------------------------------------------------------------------- /public/tutorials/img/acs-to-teams/architecture-no-title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/acs-to-teams/architecture-no-title.png -------------------------------------------------------------------------------- /public/tutorials/img/acs-to-teams/architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/acs-to-teams/architecture.png -------------------------------------------------------------------------------- /public/tutorials/img/acs-to-teams/fork-repo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/acs-to-teams/fork-repo.png -------------------------------------------------------------------------------- /public/tutorials/img/acs-to-teams/search-acs-portal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/acs-to-teams/search-acs-portal.png -------------------------------------------------------------------------------- /public/tutorials/img/acs-to-teams/search-swa-portal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/acs-to-teams/search-swa-portal.png -------------------------------------------------------------------------------- /public/tutorials/img/acs-to-teams/teams-meeting-link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/acs-to-teams/teams-meeting-link.png -------------------------------------------------------------------------------- /public/tutorials/img/acs-to-teams/user-identity-token.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/acs-to-teams/user-identity-token.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/authentication.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/authentication.gif -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/gif-01.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/gif-01.gif -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-01.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-02.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-03.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-04.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-05.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-06.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-07.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-08.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-09.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-10.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-11.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-111.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-111.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-12.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-13.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-14.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-15.png -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-16.jpg -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/image-17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/image-17.jpg -------------------------------------------------------------------------------- /public/tutorials/img/authentication-workshop/reminder.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/authentication-workshop/reminder.gif -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/azure-function-files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/azure-function-files.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/build-scheduled-flow-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/build-scheduled-flow-dialog.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/create-function-app-in-azure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/create-function-app-in-azure.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/create-function-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/create-function-dialog.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/excel-online-connector-values.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/excel-online-connector-values.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/excel-online-connector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/excel-online-connector.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/functions-sign-into-azure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/functions-sign-into-azure.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/parse-json-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/parse-json-action.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/parse-json-generate-schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/parse-json-generate-schema.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/power-automate-flow-final.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/power-automate-flow-final.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/power-automate-flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/power-automate-flow.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/recurrence-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/recurrence-action.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/scenario-overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/scenario-overview.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/scheduled-flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/scheduled-flow.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/select-http-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/select-http-action.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/test-and-flow-checker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/test-and-flow-checker.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/test-flow-result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/test-flow-result.png -------------------------------------------------------------------------------- /public/tutorials/img/automate-data-azure-functions-power-automate/test-flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/automate-data-azure-functions-power-automate/test-flow.png -------------------------------------------------------------------------------- /public/tutorials/img/enhance-skills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/enhance-skills.png -------------------------------------------------------------------------------- /public/tutorials/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/favicon.ico -------------------------------------------------------------------------------- /public/tutorials/img/hands-on-learning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/hands-on-learning.png -------------------------------------------------------------------------------- /public/tutorials/img/productivity-dashboard/oneproductivityhub-overview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/productivity-dashboard/oneproductivityhub-overview.gif -------------------------------------------------------------------------------- /public/tutorials/img/step-by-step.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/public/tutorials/img/step-by-step.png -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | build 4 | .dockerignore 5 | **/.git 6 | **/.DS_Store 7 | **/node_modules -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .env 8 | 9 | # testing 10 | /coverage 11 | 12 | # production 13 | /build 14 | 15 | # misc 16 | .DS_Store 17 | .env.local 18 | .env.development.local 19 | .env.test.local 20 | .env.production.local 21 | 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/Dockerfile: -------------------------------------------------------------------------------- 1 | ##### Stage 1 2 | FROM node:lts as build 3 | LABEL author="Microsoft Cloud Advocates" 4 | 5 | # Grab the Azure Functions URL values from the build args passed in 6 | ARG REACT_APP_ACS_USER_FUNCTION 7 | ARG REACT_APP_ACS_MEETING_FUNCTION 8 | 9 | ## Used to pass Azure Functions URLs into the React build process 10 | ENV REACT_APP_ACS_USER_FUNCTION=$REACT_APP_ACS_USER_FUNCTION 11 | ENV REACT_APP_ACS_MEETING_FUNCTION=$REACT_APP_ACS_MEETING_FUNCTION 12 | 13 | WORKDIR /app 14 | COPY package.json /app/package.json 15 | COPY package-lock.json /app/package-lock.json 16 | RUN npm ci 17 | COPY . . 18 | RUN npm run build 19 | 20 | ##### Stage 2 21 | FROM nginx:alpine 22 | VOLUME /var/cache/nginx 23 | COPY --from=build /app/build /usr/share/nginx/html 24 | COPY ./config/nginx.conf /etc/nginx/conf.d/default.conf 25 | 26 | # docker build -t nginx-react . 27 | # docker run -p 8080:80 nginx-react -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/README.md: -------------------------------------------------------------------------------- 1 | # Using Azure Communication Services to Call into a Teams Meeting 2 | 3 | To run the React client, follow the steps in the `acs-to-teams-meeting/readme.md` file. -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/config/nginx.conf: -------------------------------------------------------------------------------- 1 | 2 | server { 3 | listen 0.0.0.0:80; 4 | listen [::]:80; 5 | default_type application/octet-stream; 6 | 7 | gzip on; 8 | gzip_comp_level 6; 9 | gzip_vary on; 10 | gzip_min_length 1000; 11 | gzip_proxied any; 12 | gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 13 | gzip_buffers 16 8k; 14 | client_max_body_size 256M; 15 | 16 | root /usr/share/nginx/html; 17 | 18 | location / { 19 | try_files $uri $uri/ /index.html =404; 20 | } 21 | } -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "acs-video-to-teams-meeting", 3 | "version": "0.2.0", 4 | "private": true, 5 | "dependencies": { 6 | "@azure/communication-common": "^2.3.1", 7 | "@azure/communication-react": "^1.21.0", 8 | "@fluentui/react": "^8.121.11", 9 | "@testing-library/jest-dom": "^5.16.5", 10 | "@testing-library/react-hooks": "^3.4.2", 11 | "@testing-library/user-event": "^13.5.0", 12 | "@types/jest": "^27.5.2", 13 | "@types/node": "^16.11.49", 14 | "@types/react": "^16.9.49", 15 | "@types/react-dom": "^16.9.8", 16 | "@types/uuid": "^9.0.0", 17 | "cross-env": "^7.0.3", 18 | "react": "~16.14.0", 19 | "react-dom": "16.13.1", 20 | "react-router-dom": "^5.1.2", 21 | "react-scripts": "^5.0.1", 22 | "react-test-renderer": "^16.14.0", 23 | "reactstrap": "^8.4.1", 24 | "typescript": "^4.9.4", 25 | "uuid": "^9.0.0", 26 | "web-vitals": "^2.1.4" 27 | }, 28 | "scripts": { 29 | "start": "cross-env GENERATE_SOURCEMAP=false react-scripts start", 30 | "build": "cross-env GENERATE_SOURCEMAP=false react-scripts build", 31 | "test": "react-scripts test", 32 | "eject": "react-scripts eject" 33 | }, 34 | "eslintConfig": { 35 | "extends": [ 36 | "react-app", 37 | "react-app/jest" 38 | ] 39 | }, 40 | "browserslist": { 41 | "production": [ 42 | ">0.2%", 43 | "not dead", 44 | "not op_mini all" 45 | ], 46 | "development": [ 47 | "last 1 chrome version", 48 | "last 1 firefox version", 49 | "last 1 safari version" 50 | ] 51 | }, 52 | "engines": { 53 | "node": ">=16.0.0" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/acs-to-teams-meeting/client/react/public/favicon.ico -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | ACS --> Teams Meeting Demo 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/acs-to-teams-meeting/client/react/public/logo192.png -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/acs-to-teams-meeting/client/react/public/logo512.png -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/src/App.css: -------------------------------------------------------------------------------- 1 | .wrapper { 2 | margin: 0 auto; 3 | height: 90vh; 4 | width: 90vw; 5 | } 6 | 7 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 20px; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | .wrapper { 11 | width: 95%; 12 | text-align: center; 13 | } 14 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/src/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | import { initializeIcons } from '@fluentui/react/lib/Icons'; 5 | import './index.css'; 6 | 7 | ReactDOM.render( 8 |
9 | 10 |
, 11 | document.getElementById('root') 12 | ); 13 | 14 | initializeIcons(); 15 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/src/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/src/reportWebVitals.ts: -------------------------------------------------------------------------------- 1 | import { ReportHandler } from 'web-vitals'; 2 | 3 | const reportWebVitals = (onPerfEntry?: ReportHandler) => { 4 | if (onPerfEntry && onPerfEntry instanceof Function) { 5 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 6 | getCLS(onPerfEntry); 7 | getFID(onPerfEntry); 8 | getFCP(onPerfEntry); 9 | getLCP(onPerfEntry); 10 | getTTFB(onPerfEntry); 11 | }); 12 | } 13 | }; 14 | 15 | export default reportWebVitals; 16 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/src/setupTests.ts: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/client/react/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 | "noFallthroughCasesInSwitch": true, 16 | "module": "esnext", 17 | "moduleResolution": "node", 18 | "resolveJsonModule": true, 19 | "isolatedModules": true, 20 | "noEmit": true, 21 | "jsx": "react-jsx" 22 | }, 23 | "include": [ 24 | "src" 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/csharp/.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.4.33213.308 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GraphACSFunctions", "GraphACSFunctions\GraphACSFunctions.csproj", "{961A783B-B2AB-4129-9C40-FECAA1643378}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {961A783B-B2AB-4129-9C40-FECAA1643378}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {961A783B-B2AB-4129-9C40-FECAA1643378}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {961A783B-B2AB-4129-9C40-FECAA1643378}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {961A783B-B2AB-4129-9C40-FECAA1643378}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {A692C73B-E810-43B2-9FF9-CD2380B75480} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions/ACSTokenFunction.cs: -------------------------------------------------------------------------------- 1 | using System.Net; 2 | using Microsoft.Azure.Functions.Worker; 3 | using Microsoft.Azure.Functions.Worker.Http; 4 | using Microsoft.AspNetCore.Http; 5 | using Microsoft.Extensions.Logging; 6 | using Azure.Communication.Identity; 7 | using Microsoft.AspNetCore.Mvc; 8 | 9 | namespace GraphACSFunctions; 10 | 11 | public class ACSTokenFunction 12 | { 13 | private static readonly CommunicationTokenScope[] Scopes = 14 | [ 15 | CommunicationTokenScope.VoIP, 16 | ]; 17 | 18 | private readonly CommunicationIdentityClient _tokenClient; 19 | 20 | public ACSTokenFunction(CommunicationIdentityClient tokenClient) 21 | { 22 | _tokenClient = tokenClient; 23 | } 24 | 25 | [Function("HttpTriggerAcsToken")] 26 | public async Task Run( 27 | [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequestData req, 28 | ILogger log) 29 | { 30 | var user = await _tokenClient.CreateUserAsync(); 31 | var userToken = await _tokenClient.GetTokenAsync(user, Scopes); 32 | 33 | var response = req.CreateResponse(HttpStatusCode.OK); 34 | await response.WriteAsJsonAsync( 35 | new 36 | { 37 | userId = user.Value.Id, 38 | userToken.Value.Token, 39 | userToken.Value.ExpiresOn 40 | } 41 | ); 42 | return response; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions/GraphACSFunctions.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | net8.0 4 | v4 5 | GraphACSFunctions 6 | Exe 7 | enable 8 | enable 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | PreserveNewest 26 | 27 | 28 | PreserveNewest 29 | Never 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions/Program.cs: -------------------------------------------------------------------------------- 1 | using Azure.Communication.Identity; 2 | using Azure.Identity; 3 | using GraphACSFunctions.Services; 4 | using Microsoft.Azure.Functions.Worker; 5 | using Microsoft.Extensions.Configuration; 6 | using Microsoft.Extensions.DependencyInjection; 7 | using Microsoft.Extensions.Hosting; 8 | using Microsoft.Graph; 9 | 10 | var host = new HostBuilder() 11 | .ConfigureFunctionsWebApplication() 12 | .ConfigureServices(services => { 13 | services.AddApplicationInsightsTelemetryWorkerService(); 14 | services.ConfigureFunctionsApplicationInsights(); 15 | services.AddSingleton(static p => 16 | { 17 | var config = p.GetRequiredService(); 18 | var clientSecretCredential = new ClientSecretCredential( 19 | config.GetValue("TENANT_ID"), 20 | config.GetValue("CLIENT_ID"), 21 | config.GetValue("CLIENT_SECRET") 22 | ); 23 | 24 | return new GraphServiceClient( 25 | clientSecretCredential, 26 | ["https://graph.microsoft.com/.default"] 27 | ); 28 | }); 29 | 30 | services.AddSingleton(static p => 31 | { 32 | var config = p.GetRequiredService(); 33 | var connectionString = config.GetValue("ACS_CONNECTION_STRING"); 34 | return new CommunicationIdentityClient(connectionString); 35 | }); 36 | 37 | services.AddSingleton(); 38 | }) 39 | .Build(); 40 | 41 | host.Run(); -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "Graph-ACS-Functions": { 4 | "commandName": "Project", 5 | "commandLineArgs": "--port 7071", 6 | "launchBrowser": false 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions/Properties/serviceDependencies.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "appInsights1": { 4 | "type": "appInsights" 5 | }, 6 | "storage1": { 7 | "type": "storage", 8 | "connectionId": "AzureWebJobsStorage" 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions/Properties/serviceDependencies.local.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "appInsights1": { 4 | "type": "appInsights.sdk" 5 | }, 6 | "storage1": { 7 | "type": "storage.emulator", 8 | "connectionId": "AzureWebJobsStorage" 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions/Services/GraphService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Microsoft.Graph; 4 | using Microsoft.Extensions.Configuration; 5 | 6 | namespace GraphACSFunctions.Services; 7 | 8 | public class GraphService : IGraphService 9 | { 10 | private readonly GraphServiceClient _graphServiceClient; 11 | private readonly IConfiguration _configuration; 12 | 13 | public GraphService(GraphServiceClient graphServiceClient, IConfiguration configuration) 14 | { 15 | _graphServiceClient = graphServiceClient; 16 | _configuration = configuration; 17 | } 18 | 19 | public async Task CreateMeetingAsync() 20 | { 21 | var userId = _configuration.GetValue("USER_ID"); 22 | var newMeeting = await _graphServiceClient 23 | .Users[userId] 24 | .Calendar 25 | .Events 26 | .PostAsync(new() 27 | { 28 | Subject = "Customer Service Meeting", 29 | Start = new() 30 | { 31 | DateTime = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss"), 32 | TimeZone = "UTC" 33 | }, 34 | End = new() 35 | { 36 | DateTime = DateTime.UtcNow.AddHours(1).ToString("yyyy-MM-ddTHH:mm:ss"), 37 | TimeZone = "UTC" 38 | }, 39 | IsOnlineMeeting = true 40 | }); 41 | return newMeeting?.OnlineMeeting?.JoinUrl ?? ""; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions/Services/IGraphService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace GraphACSFunctions.Services; 8 | public interface IGraphService 9 | { 10 | Task CreateMeetingAsync(); 11 | } 12 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions/TeamsMeetingFunction.cs: -------------------------------------------------------------------------------- 1 | 2 | using System.Net; 3 | using Microsoft.Azure.Functions.Worker; 4 | using Microsoft.Azure.Functions.Worker.Http; 5 | using Microsoft.Extensions.Logging; 6 | using GraphACSFunctions.Services; 7 | 8 | namespace GraphACSFunctions; 9 | 10 | public class TeamsMeetingFunction 11 | { 12 | private readonly IGraphService _graphService; 13 | 14 | public TeamsMeetingFunction(IGraphService graphService) => _graphService = graphService; 15 | 16 | [Function("HttpTriggerTeamsUrl")] 17 | public async Task Run( 18 | [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequestData req, 19 | ILogger log) 20 | { 21 | var response = req.CreateResponse(HttpStatusCode.OK); 22 | await response.WriteStringAsync(await _graphService.CreateMeetingAsync()); 23 | return response; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions/host.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0", 3 | "logging": { 4 | "applicationInsights": { 5 | "samplingSettings": { 6 | "isEnabled": true, 7 | "excludedTypes": "Request" 8 | } 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/typescript/.funcignore: -------------------------------------------------------------------------------- 1 | *.js.map 2 | *.ts 3 | .git* 4 | .vscode 5 | __azurite_db*__.json 6 | __blobstorage__ 7 | __queuestorage__ 8 | local.settings.json 9 | test 10 | tsconfig.json -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/typescript/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | 24 | # nyc test coverage 25 | .nyc_output 26 | 27 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 28 | .grunt 29 | 30 | # Bower dependency directory (https://bower.io/) 31 | bower_components 32 | 33 | # node-waf configuration 34 | .lock-wscript 35 | 36 | # Compiled binary addons (https://nodejs.org/api/addons.html) 37 | build/Release 38 | 39 | # Dependency directories 40 | node_modules/ 41 | jspm_packages/ 42 | 43 | # TypeScript v1 declaration files 44 | typings/ 45 | 46 | # Optional npm cache directory 47 | .npm 48 | 49 | # Optional eslint cache 50 | .eslintcache 51 | 52 | # Optional REPL history 53 | .node_repl_history 54 | 55 | # Output of 'npm pack' 56 | *.tgz 57 | 58 | # Yarn Integrity file 59 | .yarn-integrity 60 | 61 | # dotenv environment variables file 62 | .env 63 | .env.test 64 | 65 | # parcel-bundler cache (https://parceljs.org/) 66 | .cache 67 | 68 | # next.js build output 69 | .next 70 | 71 | # nuxt.js build output 72 | .nuxt 73 | 74 | # vuepress build output 75 | .vuepress/dist 76 | 77 | # Serverless directories 78 | .serverless/ 79 | 80 | # FuseBox cache 81 | .fusebox/ 82 | 83 | # DynamoDB Local files 84 | .dynamodb/ 85 | 86 | # TypeScript output 87 | dist 88 | out 89 | 90 | # Azure Functions artifacts 91 | bin 92 | obj 93 | appsettings.json 94 | local.settings.json 95 | 96 | # Azurite artifacts 97 | __blobstorage__ 98 | __queuestorage__ 99 | __azurite_db*__.json -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/typescript/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "ms-azuretools.vscode-azurefunctions" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/typescript/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Attach to Node Functions", 6 | "type": "node", 7 | "request": "attach", 8 | "port": 9229, 9 | "preLaunchTask": "func: host start" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/typescript/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "azureFunctions.deploySubpath": ".", 3 | "azureFunctions.postDeployTask": "npm install (functions)", 4 | "azureFunctions.projectLanguage": "TypeScript", 5 | "azureFunctions.projectRuntime": "~4", 6 | "debug.internalConsoleOptions": "neverOpen", 7 | "azureFunctions.preDeployTask": "npm prune (functions)" 8 | } -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/typescript/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "func", 6 | "command": "host start", 7 | "problemMatcher": "$func-node-watch", 8 | "isBackground": true, 9 | "dependsOn": "npm build (functions)" 10 | }, 11 | { 12 | "type": "shell", 13 | "label": "npm build (functions)", 14 | "command": "npm run build", 15 | "dependsOn": "npm install (functions)", 16 | "problemMatcher": "$tsc" 17 | }, 18 | { 19 | "type": "shell", 20 | "label": "npm install (functions)", 21 | "command": "npm install" 22 | }, 23 | { 24 | "type": "shell", 25 | "label": "npm prune (functions)", 26 | "command": "npm prune --production", 27 | "dependsOn": "npm build (functions)", 28 | "problemMatcher": [] 29 | } 30 | ] 31 | } -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/typescript/Shared/graph.ts: -------------------------------------------------------------------------------- 1 | import { startDateTimeAsync, endDateTimeAsync } from './dateTimeFormat'; 2 | import { ClientSecretCredential } from '@azure/identity'; 3 | import { Client } from '@microsoft/microsoft-graph-client'; 4 | import { TokenCredentialAuthenticationProvider } from '@microsoft/microsoft-graph-client/authProviders/azureTokenCredentials'; 5 | import 'isomorphic-fetch'; 6 | 7 | let clientSecretCredential; 8 | let appGraphClient; 9 | 10 | function ensureGraphForAppOnlyAuth() { 11 | 12 | if (!clientSecretCredential) { 13 | clientSecretCredential = new ClientSecretCredential( 14 | process.env.TENANT_ID, 15 | process.env.CLIENT_ID, 16 | process.env.CLIENT_SECRET 17 | ); 18 | } 19 | 20 | if (!appGraphClient) { 21 | const authProvider = new TokenCredentialAuthenticationProvider( 22 | clientSecretCredential, { 23 | scopes: [ 'https://graph.microsoft.com/.default' ] 24 | }); 25 | 26 | appGraphClient = Client.initWithMiddleware({ 27 | authProvider: authProvider 28 | }); 29 | } 30 | } 31 | 32 | async function createNewMeetingAsync(userId) { 33 | ensureGraphForAppOnlyAuth(); 34 | let startTime = await startDateTimeAsync(); 35 | let endTime = await endDateTimeAsync(); 36 | const newMeeting = `/users/${userId}/calendar/events`; 37 | 38 | const event = { 39 | subject: 'Customer Service Meeting', 40 | start: { 41 | dateTime: startTime, 42 | timeZone: 'UTC' 43 | }, 44 | end: { 45 | dateTime: endTime, 46 | timeZone: 'UTC' 47 | }, 48 | isOnlineMeeting: true 49 | }; 50 | 51 | const newEvent = await appGraphClient.api(newMeeting).post(event); 52 | return newEvent; 53 | } 54 | 55 | export default createNewMeetingAsync; -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/typescript/host.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0", 3 | "logging": { 4 | "applicationInsights": { 5 | "samplingSettings": { 6 | "isEnabled": true, 7 | "excludedTypes": "Request" 8 | } 9 | } 10 | }, 11 | "extensionBundle": { 12 | "id": "Microsoft.Azure.Functions.ExtensionBundle", 13 | "version": "[3.*, 4.0.0)" 14 | }, 15 | "extensions": { 16 | "http": { 17 | "routePrefix": "api", 18 | "maxOutstandingRequests": 200, 19 | "maxConcurrentRequests": 100, 20 | "dynamicThrottlesEnabled": true, 21 | "hsts": { 22 | "isEnabled": true, 23 | "maxAge": "10" 24 | }, 25 | "customHeaders": { 26 | "X-Content-Type-Options": "nosniff" 27 | } 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/typescript/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typescript", 3 | "version": "1.0.0", 4 | "description": "", 5 | "scripts": { 6 | "build": "tsc", 7 | "watch": "tsc -w", 8 | "clean": "rimraf dist", 9 | "prestart": "npm run clean && npm run build", 10 | "start": "func start" 11 | }, 12 | "dependencies": { 13 | "@azure/communication-identity": "^1.3.1", 14 | "@azure/functions": "^4.6.0", 15 | "@azure/identity": "^4.5.0", 16 | "@microsoft/microsoft-graph-client": "^3.0.7", 17 | "isomorphic-fetch": "^3.0.0" 18 | }, 19 | "devDependencies": { 20 | "@types/node": "22.9.0", 21 | "typescript": "^5.6.3", 22 | "rimraf": "^6.0.1" 23 | }, 24 | "main": "dist/src/functions/*.js" 25 | } 26 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/typescript/src/functions/httpTriggerAcsToken.ts: -------------------------------------------------------------------------------- 1 | import { app, HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions"; 2 | import { CommunicationIdentityClient } from '@azure/communication-identity'; 3 | 4 | export async function httpTriggerAcsToken(request: HttpRequest, context: InvocationContext): Promise { 5 | // Get ACS connection string from local.settings.json (or App Settings when in Azure) 6 | const connectionString = process.env.ACS_CONNECTION_STRING; 7 | let tokenClient = new CommunicationIdentityClient(connectionString); 8 | const user = await tokenClient.createUser(); 9 | const userToken = await tokenClient.getToken(user, ["voip"]); 10 | return { 11 | jsonBody: { userId: user.communicationUserId, ...userToken } 12 | }; 13 | } 14 | 15 | app.http('httpTriggerAcsToken', { 16 | methods: ['GET'], 17 | authLevel: 'anonymous', 18 | handler: httpTriggerAcsToken 19 | }); 20 | 21 | export default httpTriggerAcsToken; -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/typescript/src/functions/httpTriggerTeamsUrl.ts: -------------------------------------------------------------------------------- 1 | import { app, HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions"; 2 | import createNewMeetingAsync from '../../Shared/graph'; 3 | 4 | let teamsMeetingLink; 5 | 6 | export async function httpTriggerTeamsUrl(request: HttpRequest, context: InvocationContext): Promise { 7 | context.log("Request received"); 8 | const userId = process.env.USER_ID; 9 | context.log('UserId', userId); 10 | 11 | teamsMeetingLink = await createNewMeetingAsync(userId); 12 | const body = JSON.stringify(teamsMeetingLink); 13 | const meeting = JSON.parse(body); 14 | context.log("meeting:", meeting); 15 | 16 | return { 17 | // status: 200, /* Defaults to 200 */ 18 | body: meeting.onlineMeeting.joinUrl 19 | } 20 | }; 21 | 22 | app.http('httpTriggerTeamsUrl', { 23 | methods: ['GET'], 24 | authLevel: 'anonymous', 25 | handler: httpTriggerTeamsUrl 26 | }); 27 | 28 | export default httpTriggerTeamsUrl; -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/server/typescript/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "outDir": "dist", 6 | "rootDir": ".", 7 | "sourceMap": true, 8 | "strict": false 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/setup.ps1: -------------------------------------------------------------------------------- 1 | #Requires -Modules Az, Az.Communication 2 | 3 | # Create a shell variable named RESOURCE_GROUP 4 | # and assign it the value of the resource group name to use 5 | $RESOURCE_GROUP="MyResourceGroup" 6 | 7 | # create app registration and service principal 8 | Write-Output "Creating service principal..." 9 | $sp = New-AzADServicePrincipal -DisplayName 'ACS-Teams-Interop-App' 10 | Add-AzADAppPermission -ApplicationId $sp.AppId -ApiId 00000003-0000-0000-c000-000000000000 -PermissionId ef54d2bf-783f-4e0f-bca1-3210c0444d99 -Type Role 11 | # User needs to grant consent via Azure Portal if the permission requires admin consent because Azure PowerShell doesn't support it yet. 12 | 13 | Write-Output "Please grant admint consent via the Azure portal to $($sp.id) for the assigned Microsoft Graph permissions" 14 | 15 | # create acs instance 16 | Write-Output "Creating resource group named $RESOURCE_GROUP" 17 | New-AzResourceGroup -Name $RESOURCE_GROUP -Location westus 18 | $uniqueString = Get-Random 19 | Write-Output "Creating ACS instance..." 20 | New-AzCommunicationService -ResourceGroupName $RESOURCE_GROUP -Name "acstoteams${uniqueString}" -DataLocation UnitedStates -Location Global 21 | 22 | # create serverless function 23 | Write-Output "Creating Azure Serverless function..." 24 | New-AzStorageAccount -ResourceGroupName $RESOURCE_GROUP -Name "acstoteams${uniqueString}" -SkuName Standard_LRS -Location westus 25 | New-AzAppServicePlan -ResourceGroupName $RESOURCE_GROUP -Name "acstoteams${uniqueString}" -Location westus 26 | New-AzFunctionApp -ResourceGroupName $RESOURCE_GROUP -Name "acstoteams-function-app" -Location westus -Runtime Node -StorageAccountName "acstoteams${uniqueString}" 27 | 28 | # output app registration info 29 | $return = [PSCustomObject]@{ 30 | ClientId = $sp.AppId 31 | ClientSecret = $sp.PasswordCredentials.SecretText 32 | } 33 | 34 | Write-Output $return 35 | 36 | Write-Output "Please grant admint consent via the Azure portal to $($sp.id) for the assigned Microsoft Graph permissions. ` 37 | Go to https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps, select the ACS-Teams-Interop-App app, select API Permissions, and then grant admin consent to the Calendars.ReadWrite permission." 38 | -------------------------------------------------------------------------------- /samples/acs-to-teams-meeting/setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Create a shell variable named RESOURCE_GROUP 4 | # and assign it the value of the resource group name to use 5 | RESOURCE_GROUP="MyResourceGroup" 6 | 7 | # create app registration and service principal 8 | echo "Creating service principal..." 9 | APP_ID=$(az ad sp create-for-rbac -n 'ACS Teams Interop App' --query "appId" --only-show-errors --output tsv) 10 | APP_PASSWORD=$(az ad sp create-for-rbac -n 'ACS Teams Interop App' --query "password" --only-show-errors --output tsv) 11 | 12 | # grant api permissions 13 | echo "Granting Microsoft Graph permissions for service principal $appId" 14 | az ad app permission grant --id $APP_ID --api 00000003-0000-0000-c000-000000000000 --scope Calendars.ReadWrite > /dev/null 2>&1 15 | 16 | # create acs instance 17 | echo "Creating resource group named $RESOURCE_GROUP" 18 | az group create --location westus --name $RESOURCE_GROUP > /dev/null 2>&1 19 | echo "Creating ACS instance..." 20 | az extension add --name communication > /dev/null 2>&1 21 | UNIQUE_STRING=$(echo $RANDOM) 22 | az communication create --name "acstoteams$UNIQUE_STRING" --location "Global" --data-location "United States" -g $RESOURCE_GROUP --only-show-errors 23 | 24 | # # create serverless function 25 | echo "Creating Azure Serverless function..." 26 | az storage account create --name "acstoteams$UNIQUE_STRING" --location westus -g $RESOURCE_GROUP --sku Standard_LRS > /dev/null 2>&1 27 | az appservice plan create -g $RESOURCE_GROUP -n "acstoteams$UNIQUE_STRING" -l westus 28 | az functionapp create -g $RESOURCE_GROUP -p "acstoteams$UNIQUE_STRING" -n "acstoteams-function-app" -s "acstoteams$UNIQUE_STRING" --runtime node > /dev/null 2>&1 29 | 30 | # output clientId, password 31 | echo "\nCLIENT_ID: $APP_ID" 32 | echo "CLIENT_SECRET: $APP_PASSWORD" 33 | echo '\nAdd Calendar.ReadWrite permissions to configured permissions in the Azure Portal' 34 | -------------------------------------------------------------------------------- /samples/data-reporting-with-azure-functions-power-automate/README.md: -------------------------------------------------------------------------------- 1 | # Automate Data Reporting with Azure Functions and Power Automate 2 | 3 | In this tutorial you'll learn how to migrate a local Node.js script to Azure Functions using Visual Studio Code so that data can be retrieved more easily for reporting purposes. To automate calling the API, you'll learn how to setup a Power Automate flow, call the Azure Function, and store the data in Excel Online. 4 | 5 | [View Tutorial](https://microsoft.github.io/MicrosoftCloud/tutorials/docs/Automate-Data-Reporting-with-Azure-Functions-and-Power-Automate/) -------------------------------------------------------------------------------- /samples/data-reporting-with-azure-functions-power-automate/stats.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/data-reporting-with-azure-functions-power-automate/stats.xlsx -------------------------------------------------------------------------------- /samples/microsoft-graph-scenarios/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/microsoft-graph-scenarios/.gitkeep -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/devcontainers/javascript-node:0-18 2 | 3 | # [Optional] Uncomment this section to install additional OS packages. 4 | # RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ 5 | # && apt-get -y install --no-install-recommends 6 | 7 | # [Optional] Uncomment if you want to install an additional version of node using nvm 8 | # ARG EXTRA_NODE_VERSION=10 9 | # RUN su node -c "source /usr/local/share/nvm/nvm.sh && nvm install ${EXTRA_NODE_VERSION}" 10 | 11 | # [Optional] Uncomment if you want to install more global node modules 12 | # RUN su node -c "npm install -g " -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Angular, Node.js & PostgreSQL", 3 | "dockerComposeFile": "docker-compose.yml", 4 | "service": "app", 5 | "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", 6 | "forwardPorts": [ 7 | 3000, 8 | 4200, 9 | 5432 10 | ], 11 | "portsAttributes": { 12 | "3000": { "label": "Node port", "onAutoForward": "notify" }, 13 | "4200": { "label": "Angular port", "onAutoForward": "notify" }, 14 | "5432": { "label": "PostgreSQL port", "onAutoForward": "silent" } 15 | }, 16 | "features": { 17 | "ghcr.io/devcontainers/features/github-cli:1": { 18 | "version": "latest" 19 | } 20 | }, 21 | // Configure tool-specific properties. 22 | "customizations": { 23 | "vscode": { 24 | "extensions": [ 25 | "angular.ng-template" 26 | ] 27 | } 28 | }, 29 | "postCreateCommand": "/bin/bash .devcontainer/setup.sh", 30 | "hostRequirements": { 31 | "cpus": 4, 32 | "memory": "8gb", 33 | "storage": "32gb" 34 | } 35 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/.devcontainer/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | services: 3 | app: 4 | image: mcr.microsoft.com/devcontainers/javascript-node:0-18 5 | # build: 6 | # context: . 7 | # dockerfile: Dockerfile 8 | 9 | volumes: 10 | - ../..:/workspaces:cached 11 | 12 | # Overrides default command so things don't shut down after the process ends. 13 | command: sleep infinity 14 | 15 | # Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function. 16 | network_mode: service:db 17 | 18 | # Use "forwardPorts" in **devcontainer.json** to forward an app port locally. 19 | # (Adding the "ports" property to this file will not forward from a Codespace.) 20 | 21 | db: 22 | image: postgres 23 | restart: unless-stopped 24 | environment: 25 | POSTGRES_USER: web 26 | POSTGRES_PASSWORD: web-password 27 | POSTGRES_DB: CustomersDB 28 | volumes: 29 | - postgres-data:/var/lib/postgresql/data 30 | 31 | volumes: 32 | postgres-data: {} -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/.devcontainer/setup.sh: -------------------------------------------------------------------------------- 1 | # Needed to work around public port issue that causes CORS to fail 2 | 3 | gh codespace ports visibility 3000:public -c $CODESPACE_NAME 4 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/.env.example: -------------------------------------------------------------------------------- 1 | ENTRAID_CLIENT_ID= 2 | TEAM_ID= 3 | CHANNEL_ID= 4 | OPENAI_API_KEY= 5 | OPENAI_ENDPOINT= 6 | OPENAI_MODEL=gpt-4o 7 | OPENAI_API_VERSION=2024-05-01-preview 8 | POSTGRES_USER= 9 | POSTGRES_PASSWORD= 10 | ACS_CONNECTION_STRING= 11 | ACS_PHONE_NUMBER= 12 | ACS_EMAIL_ADDRESS= 13 | CUSTOMER_EMAIL_ADDRESS= 14 | CUSTOMER_PHONE_NUMBER= 15 | API_PORT=3000 16 | AZURE_AI_SEARCH_ENDPOINT= 17 | AZURE_AI_SEARCH_KEY= 18 | AZURE_AI_SEARCH_INDEX= -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # Environment variables 4 | .env 5 | 6 | # Postgres data folder 7 | data/* 8 | 9 | # Compiled output 10 | obj 11 | bin 12 | **/dist/ 13 | **/tmp 14 | **/out-tsc 15 | **/bazel-out 16 | 17 | # Node 18 | **/node_modules/ 19 | npm-debug.log 20 | yarn-error.log 21 | 22 | # IDEs and editors 23 | .idea/ 24 | .project 25 | .classpath 26 | .c9/ 27 | *.launch 28 | .settings/ 29 | *.sublime-workspace 30 | 31 | # Visual Studio Code 32 | .vscode/* 33 | !.vscode/settings.json 34 | !.vscode/tasks.json 35 | !.vscode/launch.json 36 | !.vscode/extensions.json 37 | .history/* 38 | 39 | # Miscellaneous 40 | **/.angular/cache 41 | **/.sass-cache/ 42 | /connect.lock 43 | /coverage 44 | /libpeerconnection.log 45 | testem.log 46 | /typings 47 | 48 | # System files 49 | .DS_Store 50 | Thumbs.db 51 | 52 | # Byte-compiled / optimized / DLL files 53 | __pycache__/ 54 | *.py[cod] 55 | *.pyo 56 | *.egg-info/ 57 | *.egg 58 | *.spec 59 | 60 | # Virtual environment directory 61 | venv/ 62 | 63 | # Distribution / packaging 64 | .Python 65 | build/ 66 | develop-eggs/ 67 | dist/ 68 | downloads/ 69 | eggs/ 70 | lib/ 71 | lib64/ 72 | parts/ 73 | sdist/ 74 | var/ 75 | wheels/ 76 | 77 | # PyInstaller 78 | # Usually these files are written by a python script from a template 79 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 80 | *.manifest 81 | 82 | # Jupyter Notebook 83 | .ipynb_checkpoints 84 | 85 | # Spyder project settings 86 | .spyderproject 87 | .spyproject 88 | 89 | # Rope project settings 90 | .ropeproject -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 3 | "recommendations": ["angular.ng-template"] 4 | } 5 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 3 | "version": "0.2.0", 4 | "configurations": [ 5 | { 6 | "name": "ng serve", 7 | "type": "chrome", 8 | "request": "launch", 9 | "preLaunchTask": "npm: start", 10 | "url": "http://localhost:4200/" 11 | }, 12 | { 13 | "name": "ng test", 14 | "type": "chrome", 15 | "request": "launch", 16 | "preLaunchTask": "npm: test", 17 | "url": "http://localhost:9876/debug.html" 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 3 | "version": "2.0.0", 4 | "tasks": [ 5 | { 6 | "type": "npm", 7 | "script": "start", 8 | "isBackground": true, 9 | "problemMatcher": { 10 | "owner": "typescript", 11 | "pattern": "$tsc", 12 | "background": { 13 | "activeOnStart": true, 14 | "beginsPattern": { 15 | "regexp": "(.*?)" 16 | }, 17 | "endsPattern": { 18 | "regexp": "bundle generation complete" 19 | } 20 | } 21 | } 22 | }, 23 | { 24 | "type": "npm", 25 | "script": "test", 26 | "isBackground": true, 27 | "problemMatcher": { 28 | "owner": "typescript", 29 | "pattern": "$tsc", 30 | "background": { 31 | "activeOnStart": true, 32 | "beginsPattern": { 33 | "regexp": "(.*?)" 34 | }, 35 | "endsPattern": { 36 | "regexp": "bundle generation complete" 37 | } 38 | } 39 | } 40 | } 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Dan Wahlin 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 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "ignorePatterns": [ 4 | "projects/**/*" 5 | ], 6 | "overrides": [ 7 | { 8 | "files": [ 9 | "*.ts" 10 | ], 11 | "extends": [ 12 | "eslint:recommended", 13 | "plugin:@typescript-eslint/recommended", 14 | "plugin:@angular-eslint/recommended", 15 | "plugin:@angular-eslint/template/process-inline-templates" 16 | ], 17 | "rules": { 18 | "@angular-eslint/directive-selector": [ 19 | "error", 20 | { 21 | "type": "attribute", 22 | "prefix": "app", 23 | "style": "camelCase" 24 | } 25 | ], 26 | "@angular-eslint/component-selector": [ 27 | "error", 28 | { 29 | "type": "element", 30 | "prefix": "app", 31 | "style": "kebab-case" 32 | } 33 | ] 34 | } 35 | }, 36 | { 37 | "files": [ 38 | "*.html" 39 | ], 40 | "extends": [ 41 | "plugin:@angular-eslint/template/recommended" 42 | ], 43 | "rules": {} 44 | } 45 | ] 46 | } 47 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-mgt", 3 | "version": "1.0.0", 4 | "env-file": "../../.env", 5 | "scripts": { 6 | "ng": "ng", 7 | "start": "ng serve --extra-webpack-config webpack.partial.js -o", 8 | "build": "ng build --extra-webpack-config webpack.partial.js", 9 | "watch": "ng build --watch --extra-webpack-config webpack.partial.js --configuration development", 10 | "lint": "ng lint" 11 | }, 12 | "private": true, 13 | "dependencies": { 14 | "@angular/animations": "^19.2.3", 15 | "@angular/cdk": "^19.2.6", 16 | "@angular/common": "^19.2.3", 17 | "@angular/compiler": "^19.2.3", 18 | "@angular/core": "^19.2.3", 19 | "@angular/forms": "^19.2.3", 20 | "@angular/material": "^19.2.6", 21 | "@angular/platform-browser": "^19.2.3", 22 | "@angular/platform-browser-dynamic": "^19.2.3", 23 | "@angular/router": "^19.2.3", 24 | "@azure/communication-calling": "^1.28.1", 25 | "@azure/communication-common": "^2.3.1", 26 | "@microsoft/mgt": "^4.2.4", 27 | "@microsoft/mgt-components": "^4.2.4", 28 | "dotenv": "^16.4.5", 29 | "ngx-build-plus": "^19.0.0", 30 | "rxjs": "~7.8.1", 31 | "tslib": "^2.6.3", 32 | "zone.js": "~0.15.0" 33 | }, 34 | "devDependencies": { 35 | "@angular/build": "^19.2.4", 36 | "@angular/cli": "^19.2.4", 37 | "@angular/compiler-cli": "^19.2.3", 38 | "@microsoft/microsoft-graph-types": "^2.40.0", 39 | "typescript": "~5.5.4" 40 | } 41 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | @if (this.loggedIn || !this.featureFlags.microsoft365Enabled) { 5 |
6 | 7 |
8 | 9 |
10 | } 11 | @if (!this.loggedIn && this.featureFlags.microsoft365Enabled) { 12 |
13 |

{{ signInMessage }}

14 |
15 | } 16 | 17 |    Working... 18 | 19 |
20 | 21 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/openai-acs-msgraph/client/src/app/app.component.scss -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/calendar-events/calendar-events.component.scss: -------------------------------------------------------------------------------- 1 | .root { 2 | display: flex; 3 | min-height: 75px; 4 | background: white; 5 | } 6 | 7 | .time-container { 8 | margin-top: 10px; 9 | margin-right: 10px; 10 | display: flex; 11 | flex-direction: column; 12 | align-items: flex-start; 13 | } 14 | 15 | .date { 16 | font-size: 13px; 17 | font-weight: bold; 18 | } 19 | 20 | .time { 21 | display: inline; 22 | font-size: 12px; 23 | } 24 | 25 | .location { 26 | font-size: 12px; 27 | } 28 | 29 | .details { 30 | margin-bottom: 20px; 31 | margin-top: 16px; 32 | font-size: 18px; 33 | min-width: 180px; 34 | padding-left: 5px; 35 | width: 400px; 36 | } 37 | 38 | .separator { 39 | width: 40px; 40 | display: flex; 41 | flex-direction: column; 42 | align-items: center; 43 | opacity: 1; 44 | } 45 | 46 | .vertical-line { 47 | align-content: center; 48 | width: 4px; 49 | background-color: #e5f2f3; 50 | } 51 | 52 | .vertical-line.top { 53 | height: 16px; 54 | } 55 | 56 | .vertical-line.bottom { 57 | flex: 1; 58 | } 59 | 60 | .circle { 61 | border-radius: 50%; 62 | height: 20px; 63 | width: 20px; 64 | position: relative; 65 | border: 2px solid #e5f2f3; 66 | } 67 | 68 | .circle .inner-circle { 69 | position: absolute; 70 | background-color: #307176; 71 | border-radius: 50%; 72 | height: 8px; 73 | width: 8px; 74 | 75 | top: 50%; 76 | left: 50%; 77 | margin: -4px 0 0 -4px; 78 | } 79 | 80 | .online-meeting { 81 | font-size: 10px; 82 | margin-top: 8px; 83 | } 84 | 85 | .online-meeting-icon { 86 | max-width: 16px; 87 | vertical-align: middle; 88 | } 89 | 90 | .online-meeting-link { 91 | text-decoration: none; 92 | color: #3063b2; 93 | } 94 | 95 | .attendees { 96 | margin-top: 8px; 97 | } 98 | 99 | .attendee { 100 | display: inline-block; 101 | } 102 | 103 | mgt-agenda { 104 | margin: 20px; 105 | } 106 | 107 | mgt-person { 108 | --avatar-size-s: 16px; 109 | margin-right: 4px; 110 | display: inline-block; 111 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/chat-help-dialog/chat-help-dialog.component.html: -------------------------------------------------------------------------------- 1 |

Chat Help

2 | 3 |
4 | 5 | 8 | 9 | @if (this.response) { 10 |
11 | {{ response }} 12 |
13 | } 14 |
15 | 16 |
17 |
18 |
19 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/chat-help-dialog/chat-help-dialog.component.scss: -------------------------------------------------------------------------------- 1 | textarea { 2 | height: 100px; 3 | width: 40vw; 4 | font-size: 1.2em; 5 | } 6 | 7 | .response { 8 | width: 40vw; 9 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/chat-help-dialog/chat-help-dialog.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, inject } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { MatDialogModule } from '@angular/material/dialog'; 5 | import { MatIconModule } from '@angular/material/icon'; 6 | import { MatButtonModule } from '@angular/material/button'; 7 | import { DataService } from '@core/data.service'; 8 | 9 | @Component({ 10 | selector: 'app-chat-help-dialog', 11 | templateUrl: './chat-help-dialog.component.html', 12 | styleUrls: ['./chat-help-dialog.component.scss'], 13 | imports: [CommonModule, FormsModule, MatButtonModule, MatDialogModule, MatIconModule] 14 | }) 15 | export class ChatHelpDialogComponent { 16 | prompt = 'How should I handle a company refund request?'; 17 | placeholder = 'How should I handle a company refund request?'; 18 | response = ''; 19 | dataService = inject(DataService) 20 | 21 | getHelp() { 22 | this.dataService.completeBYOD(this.prompt).subscribe((response: string) => { 23 | this.response = response; 24 | }); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/chats/chats.component.html: -------------------------------------------------------------------------------- 1 | @if (this.data) { 2 |
3 |

Chats

4 |
5 | 6 |

7 | 8 | @if (this.data.length) { 9 |
10 | @for (chatMessage of this.data;track chatMessage.id) { 11 | 12 | 13 | 14 | 15 | 16 | 17 | View Message 18 | 19 | 20 | } 21 |
22 | } 23 |
24 | 25 | @if (!this.data.length) { 26 |
27 |

No chat messages found

28 |
29 | } 30 |
31 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/chats/chats.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/openai-acs-msgraph/client/src/app/chats/chats.component.scss -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/chats/chats.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, CUSTOM_ELEMENTS_SCHEMA, inject, OnDestroy } from '@angular/core'; 2 | import { MatDialog } from '@angular/material/dialog'; 3 | import { Subscription } from 'rxjs'; 4 | import { RelatedContentBaseComponent } from '@shared/related-content-base.component'; 5 | import { TeamsDialogData } from '../textarea-dialog/dialog-data'; 6 | import { TextAreaDialogComponent } from '../textarea-dialog/textarea-dialog.component'; 7 | import { MatCardModule } from '@angular/material/card'; 8 | import { MatButtonModule } from '@angular/material/button'; 9 | 10 | @Component({ 11 | selector: 'app-chats', 12 | templateUrl: './chats.component.html', 13 | styleUrls: ['./chats.component.scss'], 14 | imports: [MatButtonModule, MatCardModule], 15 | schemas: [CUSTOM_ELEMENTS_SCHEMA] 16 | }) 17 | export class ChatsComponent extends RelatedContentBaseComponent implements OnDestroy { 18 | subscription = new Subscription(); 19 | dialog = inject(MatDialog); 20 | dialogData: TeamsDialogData = { 21 | id: '', 22 | teamId: '', 23 | channelId: '', 24 | message: '', 25 | webUrl: 'response.webUrl', 26 | title: 'Send Teams Chat', 27 | action: this.graphService.sendTeamsChat 28 | } 29 | 30 | openDialog() { 31 | this.dialogData.message = this.searchText; 32 | const dialogRef = this.dialog.open(TextAreaDialogComponent, { 33 | data: this.dialogData 34 | }); 35 | 36 | this.subscription = dialogRef.afterClosed().subscribe(response => { 37 | console.log('Teams chat dialog result:', response); 38 | if (response) { 39 | this.dialogData = response; 40 | this.search(this.searchText); 41 | } 42 | }); 43 | } 44 | 45 | // Could use the following to retrieve the files via code rather 46 | // than using web component 47 | override async search(query: string) { 48 | this.data = await this.graphService.searchChatMessages(query); 49 | } 50 | 51 | ngOnDestroy() { 52 | this.subscription.unsubscribe(); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/core/acs.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, inject } from '@angular/core'; 2 | import { HttpClient, HttpErrorResponse } from '@angular/common/http'; 3 | import { Observable, throwError } from 'rxjs'; 4 | import { catchError } from 'rxjs/operators'; 5 | import { AcsUser, EmailSmsResponse } from '@shared/interfaces'; 6 | import { ApiUrlService } from './api-url.service'; 7 | 8 | @Injectable({ 9 | providedIn: 'root' 10 | }) 11 | export class AcsService { 12 | 13 | http = inject(HttpClient); 14 | apiUrlService = inject(ApiUrlService); 15 | apiUrl = this.apiUrlService.getApiUrl(); 16 | 17 | getAcsToken(): Observable { 18 | return this.http.get(this.apiUrl + 'acstoken') 19 | .pipe( 20 | catchError(this.handleError) 21 | ); 22 | } 23 | 24 | sendSms(message: string, customerPhoneNumber: string) : Observable { 25 | return this.http.post(this.apiUrl + 'sendSms', { message, customerPhoneNumber }) 26 | .pipe( 27 | catchError(this.handleError) 28 | ); 29 | } 30 | 31 | sendEmail(subject: string, message: string, customerName: string, customerEmailAddress: string) : Observable { 32 | return this.http.post(this.apiUrl + 'sendEmail', { subject, message, customerName, customerEmailAddress }) 33 | .pipe( 34 | catchError(this.handleError) 35 | ); 36 | } 37 | 38 | private handleError(error: HttpErrorResponse) { 39 | console.error('server error:', error); 40 | if (error.error instanceof Error) { 41 | const errMessage = error.error.message; 42 | return throwError(() => errMessage); 43 | // Use the following instead if using lite-server 44 | // return Observable.throw(err.text() || 'backend server error'); 45 | } 46 | return throwError(() => error || 'Node.js server error'); 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/core/api-url.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from "@angular/core"; 2 | 3 | declare const API_PORT: string; 4 | 5 | @Injectable({ providedIn: 'root' }) 6 | export class ApiUrlService { 7 | 8 | apiUrl = ''; 9 | 10 | getApiUrl() { 11 | if (this.apiUrl) return this.apiUrl; 12 | 13 | const codespacesUrlSuffix = 'preview.app.github.dev'; 14 | let url = `${window.location.protocol}//${window.location.hostname}`; 15 | const appPort = 4200; 16 | const suffix = '/api/'; 17 | 18 | // Handle GitHub Codespaces URLs 19 | if (window.location.hostname.includes(codespacesUrlSuffix)) { 20 | url = url.replace(`-${appPort}.${codespacesUrlSuffix}`, `-${API_PORT}.${codespacesUrlSuffix}`); 21 | this.apiUrl = url + suffix; 22 | } 23 | else { 24 | this.apiUrl = `${url}:${API_PORT}${suffix}`; 25 | } 26 | 27 | return this.apiUrl; 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/core/ensure-module-loaded-once.guard.ts: -------------------------------------------------------------------------------- 1 | export class EnsureModuleLoadedOnceGuard { 2 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 3 | constructor(targetModule: any) { 4 | if (targetModule) { 5 | throw new Error(`${targetModule.constructor.name} has already been loaded. Import this module in the AppModule only.`); 6 | } 7 | } 8 | 9 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/core/eventbus.service.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | import { Injectable } from '@angular/core'; 3 | import { Subject, Subscription } from 'rxjs'; 4 | import { filter, map } from 'rxjs/operators'; 5 | 6 | @Injectable({providedIn: 'root'}) 7 | export class EventBusService { 8 | 9 | subject = new Subject(); 10 | 11 | on(event: Events, action: any): Subscription { 12 | return this.subject 13 | .pipe( 14 | filter((e: EmitEvent) => { 15 | return e.name === event; 16 | }), 17 | map((e: EmitEvent) => { 18 | return e.value; 19 | }) 20 | ) 21 | .subscribe(action); 22 | } 23 | 24 | emit(event: EmitEvent) { 25 | this.subject.next(event); 26 | } 27 | } 28 | 29 | export class EmitEvent { 30 | 31 | constructor(public name: any, public value?: any) { } 32 | 33 | } 34 | 35 | export enum Events { 36 | CustomerSelected, 37 | CustomerCall, 38 | HttpRequest, 39 | HttpResponse 40 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/core/feature-flags.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from "@angular/core"; 2 | 3 | declare const ENTRAID_CLIENT_ID: string; 4 | declare const ACS_PHONE_NUMBER: string; 5 | declare const ACS_EMAIL_ADDRESS: string; 6 | declare const OPENAI_API_KEY: string; 7 | declare var BYOD_ENABLED: boolean; 8 | 9 | @Injectable({ providedIn: 'root' }) 10 | export class FeatureFlagsService { 11 | microsoft365Enabled = (ENTRAID_CLIENT_ID) ? true : false; 12 | acsPhoneEnabled = (ACS_PHONE_NUMBER) ? true : false; 13 | acsEmailEnabled = (ACS_EMAIL_ADDRESS) ? true : false; 14 | openAIEnabled = (OPENAI_API_KEY) ? true : false; 15 | byodEnabled = (BYOD_ENABLED) ? true : false; 16 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/core/overlay/overlay-request-response.interceptor.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | import { Injectable, inject } from '@angular/core'; 3 | import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse } from '@angular/common/http'; 4 | 5 | import { Observable, of, /* delay */ } from 'rxjs'; 6 | import { tap, catchError } from 'rxjs/operators'; 7 | 8 | import { EventBusService, EmitEvent, Events } from '../eventbus.service'; 9 | 10 | @Injectable({ providedIn: 'root'}) 11 | export class OverlayRequestResponseInterceptor implements HttpInterceptor { 12 | 13 | eventBus = inject(EventBusService); 14 | 15 | intercept(req: HttpRequest, next: HttpHandler): Observable> { 16 | // const randomTime = this.getRandomIntInclusive(0, 1500); 17 | // const started = Date.now(); 18 | this.eventBus.emit(new EmitEvent(Events.HttpRequest)); 19 | return next 20 | .handle(req) 21 | .pipe( 22 | // delay(randomTime), // Simulate random Http call delays 23 | tap(event => { 24 | if (event instanceof HttpResponse) { 25 | // const elapsed = Date.now() - started; 26 | this.eventBus.emit(new EmitEvent(Events.HttpResponse)); 27 | } 28 | }), 29 | catchError(() => { 30 | this.eventBus.emit(new EmitEvent(Events.HttpResponse)); 31 | return of({}) as Observable>; 32 | }) 33 | ); 34 | } 35 | 36 | getRandomIntInclusive(min: number, max: number) { 37 | min = Math.ceil(min); 38 | max = Math.floor(max); 39 | return Math.floor(Math.random() * (max - min + 1)) + min; // The maximum is inclusive and the minimum is inclusive 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/core/overlay/overlay.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 |
-------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/core/overlay/overlay.component.scss: -------------------------------------------------------------------------------- 1 | .overlay { 2 | display:none; 3 | } 4 | 5 | .overlay.active { 6 | display: block; 7 | } 8 | 9 | .overlay-background { 10 | position: fixed; 11 | top: 0; 12 | right: 0; 13 | bottom: 0; 14 | left: 0; 15 | z-index: 1050; 16 | display: block; 17 | overflow: hidden; 18 | outline: 0; 19 | background-color:rgba(0,0,0,0.6); 20 | } 21 | 22 | .overlay-content { 23 | position: fixed; 24 | z-index: 999999; 25 | top: 50%; 26 | left: 50%; 27 | background-color: white; 28 | border: 1px solid rgb(94, 94, 94); 29 | -webkit-transform: translate(-50%, 0%); 30 | transform: translate(-50%, 0%); 31 | 32 | cursor: pointer; 33 | padding: 5; 34 | width: 285px; 35 | height: 100px; 36 | display: flex; 37 | align-items: center; 38 | justify-content: center; 39 | 40 | 41 | -webkit-transition: opacity 1s; 42 | -moz-transition: opacity 1s; 43 | -o-transition: opacity 1s; 44 | transition: opacity 1s; 45 | } 46 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/core/overlay/overlay.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input, OnDestroy, inject } from '@angular/core'; 2 | 3 | import { EventBusService, Events } from '../eventbus.service'; 4 | import { Subscription } from 'rxjs'; 5 | 6 | @Component({ 7 | selector: 'app-overlay', 8 | templateUrl: './overlay.component.html', 9 | styleUrls: ['./overlay.component.scss'], 10 | standalone: true 11 | }) 12 | export class OverlayComponent implements OnInit, OnDestroy { 13 | 14 | httpRequestSub: Subscription = {} as Subscription; 15 | httpResponseSub: Subscription = {} as Subscription; 16 | enabled = false; 17 | queue: Record[] = []; 18 | timerId = 0; 19 | timerHideId = 0; 20 | 21 | @Input() delay = 500; 22 | 23 | eventBus = inject(EventBusService); 24 | 25 | ngOnInit() { 26 | // Handle request 27 | this.httpRequestSub = this.eventBus.on(Events.HttpRequest, (() => { 28 | this.queue.push({}); 29 | if (this.queue.length === 1) { 30 | // Only show if we have an item in the queue after the delay time 31 | setTimeout(() => { 32 | if (this.queue.length) { this.enabled = true; } 33 | }, this.delay); 34 | } 35 | })); 36 | 37 | // Handle response 38 | this.httpResponseSub = this.eventBus.on(Events.HttpResponse, (() => { 39 | this.queue.pop(); 40 | if (this.queue.length === 0) { 41 | // Since we don't know if another XHR request will be made, pause before 42 | // hiding the overlay. If another XHR request comes in then the overlay 43 | // will stay visible which prevents a flicker 44 | setTimeout(() => { 45 | // Make sure queue is still 0 since a new XHR request may have come in 46 | // while timer was running 47 | if (this.queue.length === 0) { this.enabled = false; } 48 | }, this.delay); 49 | } 50 | })); 51 | } 52 | 53 | ngOnDestroy() { 54 | this.httpRequestSub.unsubscribe(); 55 | this.httpResponseSub.unsubscribe(); 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/core/sorter.service.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | import { Injectable } from '@angular/core'; 3 | 4 | @Injectable({providedIn: 'root'}) 5 | export class SorterService { 6 | 7 | property = ''; 8 | direction = 1; 9 | 10 | sort(collection: any[], prop: any) { 11 | this.property = prop; 12 | this.direction = this.direction * -1; 13 | 14 | collection.sort((a: any, b: any) => { 15 | let aVal: any; 16 | let bVal: any; 17 | 18 | // Handle resolving complex properties such as 'state.name' for prop value 19 | if (prop && prop.indexOf('.') > -1) { 20 | aVal = this.resolveProperty(prop, a); 21 | bVal = this.resolveProperty(prop, b); 22 | } 23 | else { 24 | aVal = a[prop]; 25 | bVal = b[prop]; 26 | } 27 | 28 | // Fix issues that spaces before/after string value can cause such as ' San Francisco' 29 | if (this.isString(aVal)) { aVal = aVal.trim().toUpperCase(); } 30 | if (this.isString(bVal)) { bVal = bVal.trim().toUpperCase(); } 31 | 32 | if (aVal === bVal) { 33 | return 0; 34 | } 35 | else if (aVal > bVal) { 36 | return this.direction * -1; 37 | } 38 | else { 39 | return this.direction * 1; 40 | } 41 | }); 42 | } 43 | 44 | isString(val: any): boolean { 45 | return (val && (typeof val === 'string' || val instanceof String)); 46 | } 47 | 48 | resolveProperty(path: string, obj: any) { 49 | return path.split('.').reduce(function(prev, curr) { 50 | return (prev ? prev[curr] : undefined); 51 | }, obj || self); 52 | } 53 | 54 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/customers-list/customers-list.component.scss: -------------------------------------------------------------------------------- 1 | td { 2 | vertical-align: middle; 3 | cursor: pointer; 4 | } 5 | 6 | textarea { 7 | height: 75px; 8 | width: 700px; 9 | font-size: 1.2em; 10 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/email-sms-dialog/email-sms-dialog-data.ts: -------------------------------------------------------------------------------- 1 | import { EmailSmsCompletion } from "@shared/interfaces"; 2 | 3 | export interface EmailSmsDialogData { 4 | title: string; 5 | prompt: string; 6 | customerPhoneNumber: string; 7 | company: string; 8 | customerName: string; 9 | customerEmailAddress: string; 10 | data?: EmailSmsCompletion; 11 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/email-sms-dialog/email-sms-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .message-label { 2 | margin-right: 5px; 3 | vertical-align: top; 4 | font-weight: bold; 5 | } 6 | 7 | textarea { 8 | height: 250px; 9 | width: 100%; 10 | 11 | &.email-message { 12 | margin-top: 15px; 13 | } 14 | 15 | &.sms-message { 16 | margin-top:70px; 17 | } 18 | } 19 | 20 | .email-subject { 21 | width: 100%; 22 | } 23 | 24 | .message-sent { 25 | font-weight: bold; 26 | color: green; 27 | font-size: 1.2em; 28 | } 29 | 30 | .error-message { 31 | font-weight: bold; 32 | color: red; 33 | font-size: 1.2em; 34 | } 35 | 36 | .tab-group { 37 | height: 550px; 38 | width: 60vw; 39 | } 40 | 41 | .grid-container { 42 | display: grid; 43 | grid-template-columns: 1fr 1fr; 44 | grid-gap: 20px; 45 | } 46 | 47 | .grid-container > div { 48 | padding: 20px; 49 | border: 1px solid #ccc; 50 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/emails/emails.component.html: -------------------------------------------------------------------------------- 1 | @if (this.data) { 2 |
3 |

Email

4 |
5 | 6 | 11 | 12 | 13 | 14 | 21 | @if (this.data.length) { 22 |
23 | @for (email of this.data;track $index) { 24 | 25 | 26 | {{email.resource.subject}} 27 | 28 | 29 | 30 | View Email Message 31 | 32 | 33 | } 34 |
35 | } 36 | 37 |
38 | @if (!this.data.length) { 39 |
40 |

No email messages found

41 |
42 | } 43 |
44 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/emails/emails.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/openai-acs-msgraph/client/src/app/emails/emails.component.scss -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/emails/emails.component.ts: -------------------------------------------------------------------------------- 1 | import { CUSTOM_ELEMENTS_SCHEMA, Component } from '@angular/core'; 2 | import { RelatedContentBaseComponent } from '@shared/related-content-base.component'; 3 | import { MatButtonModule } from '@angular/material/button'; 4 | import { MatCardModule } from '@angular/material/card'; 5 | 6 | @Component({ 7 | selector: 'app-emails', 8 | templateUrl: './emails.component.html', 9 | styleUrls: ['./emails.component.scss'], 10 | imports: [MatCardModule, MatButtonModule], 11 | schemas: [CUSTOM_ELEMENTS_SCHEMA] 12 | }) 13 | export class EmailsComponent extends RelatedContentBaseComponent { 14 | 15 | // Could use the following to retrieve the files via code rather 16 | // than using web component 17 | override async search(query: string) { 18 | // this.data = await this.graphService.searchEmailMessages(query); 19 | } 20 | 21 | } 22 | 23 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/files/files.component.html: -------------------------------------------------------------------------------- 1 | @if (this.data) { 2 |
3 |

Files

4 | 5 |
6 | 11 | 17 |
18 | @if (!this.data.length) { 19 |
20 |

No files found

21 |
22 | } 23 |
24 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/files/files.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/openai-acs-msgraph/client/src/app/files/files.component.scss -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/files/files.component.ts: -------------------------------------------------------------------------------- 1 | import { CUSTOM_ELEMENTS_SCHEMA, Component } from '@angular/core'; 2 | import { RelatedContentBaseComponent } from '@shared/related-content-base.component'; 3 | 4 | @Component({ 5 | selector: 'app-files', 6 | templateUrl: './files.component.html', 7 | styleUrls: ['./files.component.scss'], 8 | standalone: true, 9 | schemas: [CUSTOM_ELEMENTS_SCHEMA], 10 | }) 11 | export class FilesComponent extends RelatedContentBaseComponent { 12 | 13 | // Could use the following to retrieve the files via code rather 14 | // than using web component 15 | override async search(query: string) { 16 | // this.data = await this.graphService.searchFiles(query); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/header/header.component.html: -------------------------------------------------------------------------------- 1 | 2 | home 3 | Customers App 4 | 5 | 6 | @if (this.featureFlags.microsoft365Enabled) { 7 | 8 | } 9 | @if (this.featureFlags.byodEnabled) { 10 | chat 11 | } 12 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/header/header.component.scss: -------------------------------------------------------------------------------- 1 | .home-icon { 2 | margin-top: 0px; 3 | margin-right: 5px; 4 | } 5 | 6 | .chat-help-icon { 7 | margin-top: 0px; 8 | margin-left: 10px; 9 | cursor: pointer; 10 | } 11 | 12 | .title { 13 | margin-top: 3px; 14 | } 15 | 16 | .spacer { 17 | flex: 1 1 auto; 18 | } 19 | 20 | // mgt-login { 21 | // // --button-background-color: #3f51b5; 22 | // // --button-color--hover: #fff; 23 | // } 24 | 25 | mgt-login { 26 | --login-signed-in-background: transparent; 27 | --login-signed-in-hover-background: #565656; 28 | --login-popup-background-color: #3f51b5; 29 | --login-button-padding: 5px; 30 | --login-popup-padding: 8px; 31 | 32 | /** person component tokens **/ 33 | --person-line1-text-color: whitesmoke; 34 | --person-line2-text-color: white; 35 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/phone-call/phone-call.component.html: -------------------------------------------------------------------------------- 1 |
2 | 8 | 9 |   10 | 11 |   12 | 13 |
14 |
15 |
16 | @for (number of this.numbers;track $index) { 17 | 20 | } 21 |
22 |
-------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/phone-call/phone-call.component.scss: -------------------------------------------------------------------------------- 1 | .phone-container { 2 | margin-top: 12px; 3 | margin-right: 25px; 4 | } 5 | 6 | .phone-number-input { 7 | margin-bottom:1em; 8 | font-size: .75em; 9 | } 10 | 11 | button[mat-button].call-button { 12 | color: #fff; 13 | background-color: #14ad00; 14 | } 15 | 16 | button[mat-button].call-button:disabled { 17 | color: rgba(255, 255, 255, 0.5); 18 | background-color: #b0b0b0; 19 | cursor: not-allowed; 20 | } 21 | 22 | button[mat-button].hangup-button { 23 | color: #fff; 24 | background-color: red; 25 | } 26 | 27 | .dialer { 28 | background-color: #fff; 29 | position: absolute; 30 | z-index: 1000; 31 | top: 100; 32 | display: flex; 33 | flex-direction: column; 34 | align-items: center; 35 | 36 | .dialer-input { 37 | width: 200px; 38 | margin-bottom: 10px; 39 | } 40 | 41 | .dialer-buttons { 42 | display: grid; 43 | grid-template-columns: repeat(3, 1fr); 44 | grid-gap: 5px; 45 | } 46 | 47 | .dialer-button { 48 | background-color: #fafafa; 49 | color: #000; 50 | border: 1px solid #c9c9c9; 51 | width: 60px; 52 | height: 60px; 53 | font-size: 24px; 54 | } 55 | 56 | .call-button { 57 | margin-top: 10px; 58 | width: 200px; 59 | height: 40px; 60 | } 61 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/related-content/related-content.component.scss: -------------------------------------------------------------------------------- 1 | mat-card { 2 | margin-bottom: 10px; 3 | } 4 | 5 | .mat-mdc-card-title { 6 | font-size: 1.2em; 7 | } 8 | 9 | mat-panel-title { 10 | margin-top: 4px; 11 | margin-left: 15px; 12 | font-size: 1.2em; 13 | height: 50px; 14 | } 15 | 16 | mat-icon[svgIcon] { 17 | margin-right: 5px; 18 | width: 1.4em; 19 | } 20 | 21 | .panel-title { 22 | margin-left: 18px; 23 | font-size: 1em; 24 | } 25 | 26 | .mat-badge-medium.mat-badge-after .mat-badge-content { 27 | top: -10px; 28 | right: -10px; 29 | } 30 | 31 | .mat-badge-accent .mat-badge-content { 32 | background-color: #ff0000; 33 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/shared/dynamic.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform, inject } from '@angular/core'; 2 | import { CurrencyPipe, DatePipe, DecimalPipe } from '@angular/common'; 3 | import { PhonePipe } from './phone.pipe'; 4 | 5 | @Pipe({ 6 | name: 'dynamic', 7 | standalone: true 8 | }) 9 | export class DynamicPipe implements PipeTransform { 10 | currencyPipe = inject(CurrencyPipe); 11 | datePipe = inject(DatePipe); 12 | decimalPipe = inject(DecimalPipe); 13 | phonePipe = inject(PhonePipe); 14 | 15 | currencyHeaders = ['price', 'total', 'amount', 'sum', 'balance', 'revenue']; 16 | dateHeaders = ['date', 'time', 'created', 'updated', 'deleted']; 17 | phoneHeaders = ['phone', 'mobile', 'phone number', 'mobile number', 'office number']; 18 | reviewHeaders = ['review', 'rating', 'avg']; 19 | 20 | transform(value: string, header: string): unknown { 21 | if (this.currencyHeaders.some(substr => header.includes(substr))) { 22 | return this.currencyPipe.transform(value); 23 | } 24 | 25 | if (this.dateHeaders.some(substr => header.includes(substr))) { 26 | return this.datePipe.transform(value); 27 | } 28 | 29 | if (this.phoneHeaders.some(substr => header.includes(substr))) { 30 | return this.phonePipe.transform(value); 31 | } 32 | 33 | if (this.reviewHeaders.some(substr => header.includes(substr))) { 34 | return this.decimalPipe.transform(value, '1.0-1'); 35 | } 36 | 37 | return value; 38 | } 39 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/shared/filter-textbox.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, Output, EventEmitter } from '@angular/core'; 2 | import { FormsModule } from '@angular/forms'; 3 | 4 | @Component({ 5 | selector: 'app-filter-textbox', 6 | template: ` 7 | {{ label }} 8 | `, 9 | imports: [FormsModule] 10 | }) 11 | export class FilterTextboxComponent { 12 | 13 | @Input() label = 'Filter Data:'; 14 | 15 | private _filter = ''; 16 | @Input() get filter() { 17 | return this._filter; 18 | } 19 | 20 | set filter(val: string) { 21 | this._filter = val; 22 | this.changed.emit(this.filter); // Raise changed event 23 | } 24 | 25 | @Output() changed: EventEmitter = new EventEmitter(); 26 | 27 | } 28 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/shared/interfaces.ts: -------------------------------------------------------------------------------- 1 | export interface Phone { 2 | phone: string; 3 | } 4 | 5 | export interface EmailSmsCompletion { 6 | emailSubject: string; 7 | emailBody: string; 8 | error: string; 9 | sms: string; 10 | status: boolean; 11 | } 12 | 13 | export interface BYODCompletion { 14 | status: boolean; 15 | content: string; 16 | error: string; 17 | } 18 | 19 | export interface Customer { 20 | id: number; 21 | company: string; 22 | city: string; 23 | email: string; 24 | } 25 | 26 | export interface EmailSmsResponse { 27 | status: boolean; 28 | } 29 | 30 | export interface AcsUser { 31 | userId: string; 32 | token: string; 33 | expiresOn: Date; 34 | } 35 | 36 | export interface OneDriveFile { 37 | size: number; 38 | fileSystemInfo: { 39 | createdDateTime: Date; 40 | lastModifiedDateTime: Date; 41 | }, 42 | id: string; 43 | createdBy: { 44 | user: { 45 | displayName: string; 46 | email: string; 47 | } 48 | }, 49 | createdDateTime: Date; 50 | lastModifiedBy: { 51 | user: { 52 | displayName: string; 53 | email: string; 54 | } 55 | }, 56 | lastModifiedDateTime: Date; 57 | name: string; 58 | parentReference: { 59 | driveId: string; 60 | id: string; 61 | sharepointIds: { 62 | listId: string; 63 | listItemId: number; 64 | listItemUniqueId: string; 65 | }, 66 | siteId: string; 67 | }, 68 | webUrl: string; 69 | } 70 | 71 | export interface ChatMessageInfo { 72 | teamId: string; 73 | channelId: string; 74 | messageId: string; 75 | summary: string; 76 | } 77 | 78 | export interface ChatMessage { 79 | id: string; 80 | teamId: string; 81 | channelId: string; 82 | summary: string; 83 | body: string; 84 | from: string; 85 | date: Date; 86 | webUrl: string; 87 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/shared/phone.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'phone', 5 | standalone: true 6 | }) 7 | export class PhonePipe implements PipeTransform { 8 | 9 | transform(value: string | number): string { 10 | let phoneNumber = value.toString(); 11 | 12 | // Remove the plus symbol if present 13 | if (phoneNumber.startsWith('+')) { 14 | phoneNumber = phoneNumber.slice(1); 15 | } 16 | 17 | // Check if the phone number is at least 10 digits long 18 | if (phoneNumber.length < 10) { 19 | return value.toString(); 20 | } 21 | 22 | // Extract the last 10 digits and any remaining digits as the country code 23 | const countryCode = phoneNumber.slice(0, -10); 24 | const areaCode = phoneNumber.slice(-10, -7); 25 | const firstPart = phoneNumber.slice(-7, -4); 26 | const secondPart = phoneNumber.slice(-4); 27 | 28 | // Format the phone number including the country code 29 | return `+${countryCode} (${areaCode}) ${firstPart}-${secondPart}`; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/shared/related-content-base.component.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | import { Component, EventEmitter, Input, Output, inject } from "@angular/core"; 3 | import { GraphService } from "@core/graph.service"; 4 | 5 | @Component({ 6 | template: ``, 7 | standalone: true 8 | }) 9 | export abstract class RelatedContentBaseComponent { 10 | graphService: GraphService = inject(GraphService); 11 | 12 | @Output() 13 | dataLoaded: EventEmitter = new EventEmitter(); 14 | 15 | private _data: any[] = []; 16 | @Input() get data(): any[] { 17 | return this._data; 18 | } 19 | 20 | set data(value: any[]) { 21 | this._data = value; 22 | this.dataLoaded.emit(value); 23 | } 24 | 25 | private _searchText = ''; 26 | @Input() get searchText(): string { 27 | return this._searchText; 28 | } 29 | 30 | set searchText(value: string) { 31 | this._searchText = value; 32 | //if (value) { 33 | this.search(value as string); 34 | //} 35 | } 36 | 37 | dataChange(e: CustomEvent) { 38 | const value = e.detail.response.value[0]; 39 | const hits: any[] = []; 40 | if (value.hitsContainers && value.hitsContainers[0].hits) { 41 | for (const hit of value.hitsContainers[0].hits) { 42 | hits.push(hit); 43 | } 44 | } 45 | this.data = hits; 46 | } 47 | 48 | abstract search(searchText: string) : Promise; 49 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/shared/titlecase-underscore.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | import { TitleCasePipe } from '@angular/common'; 3 | 4 | @Pipe({ 5 | name: 'titleCaseUnderscore', 6 | standalone: true 7 | }) 8 | export class TitleCaseUnderscorePipe implements PipeTransform { 9 | 10 | constructor(private titlecasePipe: TitleCasePipe) { } 11 | 12 | transform(value: string): string { 13 | if (!value) return value; 14 | 15 | // Replace underscores with spaces 16 | const stringWithSpaces = value.replace(/_/g, ' '); 17 | 18 | // Use Angular's TitleCasePipe to title case the string 19 | const titleCasedString = this.titlecasePipe.transform(stringWithSpaces); 20 | 21 | return titleCasedString; 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/shared/truncate.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from "@angular/core"; 2 | 3 | @Pipe({ 4 | name: 'truncate', 5 | }) 6 | export class TruncatePipe implements PipeTransform { 7 | transform(value: string, max: number): string { 8 | return value && value.length > max ? `${value.slice(0, max)}...` : value; 9 | } 10 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/textarea-dialog/dialog-data.ts: -------------------------------------------------------------------------------- 1 | export interface DialogBase { 2 | title: string; 3 | message: string; 4 | action?: (message: string) => Promise 5 | } 6 | 7 | export interface TeamsDialogData extends DialogBase { 8 | id: string; 9 | teamId: string; 10 | channelId: string; 11 | webUrl: string; 12 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/textarea-dialog/textarea-dialog.component.html: -------------------------------------------------------------------------------- 1 |

{{ title }}

2 | 3 |
4 | 5 | 8 | Message: 9 | 10 | 11 |
12 | 13 | 14 |
15 |
-------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/textarea-dialog/textarea-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .message-label { 2 | margin-right: 5px; 3 | vertical-align: top; 4 | } 5 | 6 | textarea { 7 | height: 100px; 8 | width: 400px; 9 | } 10 | 11 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/app/textarea-dialog/textarea-dialog.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Inject, inject } from '@angular/core'; 2 | import { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; 3 | import { DataService } from '@core/data.service'; 4 | import { DialogBase, TeamsDialogData } from './dialog-data'; 5 | import { MatButtonModule } from '@angular/material/button'; 6 | import { FormsModule } from '@angular/forms'; 7 | import { MatIconModule } from '@angular/material/icon'; 8 | 9 | @Component({ 10 | selector: 'app-textarea-dialog', 11 | templateUrl: './textarea-dialog.component.html', 12 | styleUrls: ['./textarea-dialog.component.scss'], 13 | imports: [MatDialogModule, MatIconModule, FormsModule, MatButtonModule] 14 | }) 15 | export class TextAreaDialogComponent implements OnInit { 16 | title = ''; 17 | message = ''; 18 | initialMessage = ''; 19 | 20 | dialogRef = inject(MatDialogRef); 21 | dataService = inject(DataService); 22 | data: DialogBase | TeamsDialogData = inject(MAT_DIALOG_DATA); 23 | 24 | ngOnInit() { 25 | this.title = this.data instanceof Error ? '' : this.data.title; 26 | this.message = this.data instanceof Error ? '' : this.data.message; 27 | } 28 | 29 | async send() { 30 | if (this.data.action) { 31 | this.data = await this.data.action(this.message); 32 | this.dialogRef.close(this.data); 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/openai-acs-msgraph/client/src/assets/.gitkeep -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/assets/data.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "company": "Tailwind Traders", 5 | "city": " Phoenix ", 6 | "email": "jane.doe@example.com", 7 | "order-total": 400214.99 8 | }, 9 | { 10 | "id": 2, 11 | "company": "Adatum Corporation", 12 | "city": "Los Angeles ", 13 | "email": "john.smith@example.com", 14 | "order-total": 89553.99 15 | }, 16 | { 17 | "id": 3, 18 | "company": "Adventure Works Cycles", 19 | "city": " Las Vegas ", 20 | "email": "peter.gibbons@example.com", 21 | "order-total": 9451.99 22 | }, 23 | { 24 | "id": 4, 25 | "company": "Contoso Pharmaceuticals", 26 | "city": "Seattle", 27 | "email": "gene.david@example.com", 28 | "order-total": 15850.99 29 | } 30 | ] 31 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/openai-acs-msgraph/client/src/favicon.ico -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Angular: OpenAI, Microsoft Graph, and ACS 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | html, 3 | body { 4 | height: 100%; 5 | } 6 | 7 | body { 8 | margin: 0; 9 | font-family: Roboto, "Helvetica Neue", sans-serif; 10 | background: #fafafa; 11 | } 12 | 13 | main { 14 | margin: 15px; 15 | } 16 | 17 | th { 18 | cursor: pointer; 19 | } 20 | 21 | .scroller { 22 | max-height: 350px; 23 | overflow-y: auto; 24 | } 25 | 26 | .search-results { 27 | width: 25vw; 28 | } 29 | .mat-mdc-tab-body-content { 30 | padding-top: 10px; 31 | } 32 | 33 | .mat-mdc-tab-labels { 34 | margin-top: 10px; 35 | } 36 | 37 | .three-column { 38 | display: grid; 39 | grid-template-columns: auto auto auto; 40 | align-items: center; 41 | justify-content: left; 42 | grid-gap: 10px; 43 | } 44 | 45 | .spinner { 46 | height: 60px; 47 | width: 60px; 48 | animation: rotation .6s infinite linear; 49 | border-left: 6px solid rgba(0, 174, 239, .15); 50 | border-right: 6px solid rgba(0, 174, 239, .15); 51 | border-bottom: 6px solid rgba(0, 174, 239, .15); 52 | border-top: 6px solid rgba(0, 174, 239, .8); 53 | border-radius: 100%; 54 | } 55 | 56 | @keyframes rotation { 57 | from { 58 | transform: rotate(0deg); 59 | } 60 | 61 | to { 62 | transform: rotate(359deg); 63 | } 64 | } 65 | 66 | .close-button { 67 | position: absolute; 68 | top: 0; 69 | right: 0; 70 | color: black; 71 | background: transparent; 72 | border: none; 73 | cursor: pointer; 74 | } 75 | 76 | 77 | .button-color.mdc-button.mdc-button--outlined:hover { 78 | background-color: #3f51b5; 79 | color: #fff; 80 | } 81 | 82 | .mat-mdc-menu-item:hover { 83 | background-color: #3f51b5 !important; 84 | color: #fff; 85 | 86 | mat-icon { 87 | color: #fff; 88 | } 89 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/src/theme.scss: -------------------------------------------------------------------------------- 1 | // Custom Theming for Angular Material 2 | // For more information: https://material.angular.io/guide/theming 3 | @use '@angular/material' as mat; 4 | // Plus imports for other components in your app. 5 | 6 | // Include the common styles for Angular Material. We include this here so that you only 7 | // have to load a single css file for Angular Material in your app. 8 | // Be sure that you only ever include this mixin once! 9 | @include mat.elevation-classes(); 10 | @include mat.app-background(); 11 | 12 | // Define the palettes for your theme using the Material Design palettes available in palette.scss 13 | // (imported above). For each palette, you can optionally specify a default, lighter, and darker 14 | // hue. Available color palettes: https://material.io/design/color/ 15 | $theme-primary: mat.define-palette(mat.$indigo-palette); 16 | $theme-accent: mat.define-palette(mat.$pink-palette, A200, A100, A400); 17 | 18 | // The warn palette is optional (defaults to red). 19 | $theme-warn: mat.define-palette(mat.$red-palette); 20 | 21 | // Create the theme object. A theme consists of configurations for individual 22 | // theming systems such as "color" or "typography". 23 | $theme: mat.define-light-theme(( 24 | color: ( 25 | primary: $theme-primary, 26 | accent: $theme-accent, 27 | warn: $theme-warn, 28 | ), 29 | typography: mat.define-typography-config(), 30 | )); 31 | 32 | // Include theme styles for core and each component used in your app. 33 | // Alternatively, you can import and @include the theme mixins for each component 34 | // that you are using. 35 | @include mat.all-component-themes($theme); -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "compileOnSave": false, 4 | "compilerOptions": { 5 | "baseUrl": "./", 6 | "outDir": "./dist/out-tsc", 7 | "strict": true, 8 | "noImplicitOverride": true, 9 | "noPropertyAccessFromIndexSignature": true, 10 | "noImplicitReturns": true, 11 | "noFallthroughCasesInSwitch": true, 12 | "skipLibCheck": true, 13 | "esModuleInterop": true, 14 | "sourceMap": true, 15 | "declaration": false, 16 | "experimentalDecorators": true, 17 | "moduleResolution": "bundler", 18 | "importHelpers": true, 19 | "target": "ES2022", 20 | "module": "ES2022", 21 | "lib": [ 22 | "ES2022", 23 | "dom" 24 | ], 25 | "paths": { 26 | "@core/*": ["./src/app/core/*"], 27 | "@shared/*": ["./src/app/shared/*"] 28 | } 29 | }, 30 | "angularCompilerOptions": { 31 | "enableI18nLegacyMessageIdFormat": false, 32 | "strictInjectionParameters": true, 33 | "strictInputAccessModifiers": true, 34 | "strictTemplates": true 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ 2 | /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ 3 | { 4 | "extends": "./tsconfig.json", 5 | "compilerOptions": { 6 | "outDir": "./out-tsc/spec", 7 | "types": [ 8 | "jasmine" 9 | ] 10 | }, 11 | "include": [ 12 | "src/**/*.spec.ts", 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/client/webpack.partial.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | require('dotenv').config({ path: '../.env' }) 3 | 4 | module.exports = { 5 | plugins: [ 6 | new webpack.DefinePlugin({ 7 | "ENTRAID_CLIENT_ID": JSON.stringify(process.env.ENTRAID_CLIENT_ID), 8 | "TEAM_ID": JSON.stringify(process.env.TEAM_ID), 9 | "CHANNEL_ID": JSON.stringify(process.env.CHANNEL_ID), 10 | "OPENAI_API_KEY": (process.env.OPENAI_API_KEY) ? true : false, 11 | "ACS_CONNECTION_STRING": (process.env.ACS_CONNECTION_STRING) ? true : false, 12 | "ACS_PHONE_NUMBER": JSON.stringify(process.env.ACS_PHONE_NUMBER), 13 | "ACS_EMAIL_ADDRESS": (process.env.ACS_EMAIL_ADDRESS) ? true : false, 14 | "CUSTOMER_EMAIL_ADDRESS": JSON.stringify(process.env.CUSTOMER_EMAIL_ADDRESS), 15 | "CUSTOMER_PHONE_NUMBER": JSON.stringify(process.env.CUSTOMER_PHONE_NUMBER), 16 | "API_PORT": JSON.stringify(process.env.API_PORT), 17 | "BYOD_ENABLED": (process.env.AZURE_AI_SEARCH_ENDPOINT) ? true : false 18 | }) 19 | ] 20 | } -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/customer documents/Adatum-Corporation-Logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/customer documents/Adatum-Corporation-PO-2005.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/openai-acs-msgraph/customer documents/Adatum-Corporation-PO-2005.docx -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/customer documents/Adventure-Works-Cycles-Supplies.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/openai-acs-msgraph/customer documents/Adventure-Works-Cycles-Supplies.xlsx -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/customer documents/Clock A102 Installation Instructions.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/openai-acs-msgraph/customer documents/Clock A102 Installation Instructions.docx -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/customer documents/Company FAQs.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/openai-acs-msgraph/customer documents/Company FAQs.docx -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/customer documents/Tailwind-Traders-PO-1001.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/openai-acs-msgraph/customer documents/Tailwind-Traders-PO-1001.docx -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/customer documents/Tailwind-Traders-Supplies.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/openai-acs-msgraph/customer documents/Tailwind-Traders-Supplies.xlsx -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | postgresDb: 5 | image: postgres 6 | environment: 7 | POSTGRES_USER: web 8 | POSTGRES_PASSWORD: web-password 9 | POSTGRES_DB: CustomersDB 10 | PGDATA: /var/lib/pg_data 11 | volumes: 12 | - ./data:/var/lib/pg_data 13 | ports: 14 | - "5432:5432" 15 | 16 | # Alternatively, you can use the following command to run the container: 17 | # Mac/Linux: 18 | # docker run --name postgresDb -e POSTGRES_USER=web -e POSTGRES_PASSWORD=web-password -e POSTGRES_DB=CustomersDB -v "$(pwd)/data:/var/lib/postgresql/data" -p 5432:5432 postgres 19 | 20 | # Windows with PowerShell: 21 | # docker run --name postgresDb -e POSTGRES_USER=web -e POSTGRES_PASSWORD=web-password -e POSTGRES_DB=CustomersDB -v ${PWD}/data:/var/lib/postgresql/data -p 5432:5432 postgres 22 | 23 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/images/demo-original.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/openai-acs-msgraph/images/demo-original.gif -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/images/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/samples/openai-acs-msgraph/images/demo.gif -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/server/typescript/config.ts: -------------------------------------------------------------------------------- 1 | import dotenv from 'dotenv'; 2 | dotenv.config({ path: '../../.env' }); -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/server/typescript/db.schema: -------------------------------------------------------------------------------- 1 | - customers (id, company, city, email) 2 | - orders (id, customer_id, date, total) 3 | - order_items (id, order_id, product_id, quantity, price) 4 | - reviews (id, customer_id, review, date, comment) -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/server/typescript/index.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import express, { Request, Response, NextFunction } from 'express'; 3 | import cors from 'cors'; 4 | import apiRoutes from './apiRoutes'; 5 | 6 | const app = express(); 7 | const port = process.env.PORT || 3000; 8 | 9 | app.use(cors()); 10 | app.use(express.json()); 11 | app.use(express.urlencoded({ extended: true })); 12 | 13 | // Middleware to block specific file types 14 | app.use((req: Request, res: Response, next: NextFunction): void => { 15 | const fileExtension = path.extname(req.url); 16 | if (fileExtension === '.schema') { 17 | res.status(403).send('Access to this file is forbidden.'); 18 | return; 19 | } 20 | next(); 21 | }); 22 | 23 | app.use('/api', apiRoutes); 24 | 25 | app.listen(port, () => { 26 | console.log(`API listening at http://localhost:${port}`); 27 | }); -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/server/typescript/interfaces.ts: -------------------------------------------------------------------------------- 1 | export interface QueryData { 2 | sql: string; 3 | paramValues: any[]; 4 | error: string; 5 | } 6 | 7 | export interface EmailSmsResponse { 8 | status: boolean; 9 | email: string; 10 | sms: string; 11 | error: string; 12 | } 13 | 14 | export interface AzureOpenAIResponse { 15 | id: string; 16 | object: string; 17 | created: number; 18 | model: string; 19 | usage: { 20 | prompt_tokens: number; 21 | completion_tokens: number; 22 | total_tokens: number; 23 | }; 24 | choices: [{ 25 | role: string; 26 | message: { 27 | content: string; 28 | } 29 | }], 30 | finish_reason: string; 31 | index: number; 32 | error?: AzureOpenAIError; 33 | }; 34 | 35 | export interface AzureOpenAIError { 36 | code: string; 37 | message: string; 38 | } 39 | 40 | export interface ChatGPTData { 41 | max_tokens: number, 42 | temperature: number, 43 | dataSources?: CognitiveSearchDataSource[], 44 | response_format?: { 45 | type: string, 46 | }, 47 | messages: ChatGPTMessage[] 48 | } 49 | 50 | export interface CognitiveSearchDataSource { 51 | type: string, 52 | parameters: { 53 | endpoint: string, 54 | key: string, 55 | indexName: string 56 | } 57 | } 58 | 59 | export interface ChatGPTMessage { 60 | role: string; 61 | content: string; 62 | } 63 | 64 | export interface OpenAIHeadersBody { 65 | method: string, 66 | headers: { 67 | 'Content-Type': string; 68 | 'api-key': string; 69 | chatgpt_url?: string; 70 | chatgpt_key?: string; 71 | }, 72 | body: string; 73 | } 74 | 75 | export type AzureOpenAIYourDataResponse = { 76 | choices: { 77 | message: { 78 | content?: string; 79 | context?: { 80 | citations?: any[]; 81 | }; 82 | }; 83 | }[]; 84 | }; -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/server/typescript/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-apis", 3 | "version": "1.0.0", 4 | "main": "dist/index.js", 5 | "types": "dist/index.d.ts", 6 | "scripts": { 7 | "build": "tsc", 8 | "start": "nodemon --exec ts-node index.ts" 9 | }, 10 | "private": true, 11 | "dependencies": { 12 | "@azure/communication-email": "^1.0.0", 13 | "@azure/communication-identity": "^1.3.1", 14 | "@azure/communication-sms": "^1.0.0", 15 | "cors": "^2.8.5", 16 | "dotenv": "^16.4.7", 17 | "express": "^4.21.2", 18 | "openai": "^4.89.0", 19 | "pg": "^8.14.1", 20 | "tslib": "^2.8.1" 21 | }, 22 | "devDependencies": { 23 | "@types/cors": "^2.8.17", 24 | "@types/express": "^5.0.1", 25 | "@types/pg": "^8.11.11", 26 | "nodemon": "^3.1.9", 27 | "ts-node": "^10.9.2", 28 | "typescript": "~5.8.2" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/server/typescript/postgres.ts: -------------------------------------------------------------------------------- 1 | import { Pool } from 'pg'; 2 | import './config'; 3 | import { QueryData } from './interfaces'; 4 | 5 | const pool = new Pool({ 6 | user: process.env.POSTGRES_USER, 7 | host: 'localhost', 8 | database: 'CustomersDB', 9 | password: process.env.POSTGRES_PASSWORD, 10 | port: 5432, 11 | }); 12 | 13 | async function getCustomers() { 14 | try { 15 | console.log('Getting customers from database.'); 16 | return await pool.query('SELECT * FROM get_customers()'); 17 | } 18 | catch (e) { 19 | console.error('Error getting customers:', e); 20 | return null; 21 | } 22 | } 23 | 24 | async function queryDb(sqlCommandObject: QueryData): Promise { 25 | if (!sqlCommandObject) { 26 | return { error: 'Missing SQL command object.' }; 27 | } 28 | 29 | try { 30 | const result = await pool.query(sqlCommandObject.sql, sqlCommandObject.paramValues); 31 | 32 | // Check if the result has rows or an object literal, and handle accordingly 33 | if (!result.rows) { 34 | return []; 35 | } 36 | 37 | if (Array.isArray(result.rows)) { 38 | return result.rows; 39 | } 40 | 41 | if (typeof result.rows === 'object') { 42 | return [result.rows]; 43 | } 44 | 45 | return []; 46 | } 47 | catch (e) { 48 | console.error('Error executing query:', e); 49 | return { error: 'Error executing query.' }; 50 | } 51 | } 52 | 53 | export { getCustomers, queryDb }; -------------------------------------------------------------------------------- /samples/openai-acs-msgraph/server/typescript/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "module": "CommonJS", 5 | "outDir": "./dist", 6 | "rootDir": "./", 7 | "strict": true, 8 | "esModuleInterop": true, 9 | "skipLibCheck": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "allowSyntheticDefaultImports": true, 12 | }, 13 | "exclude": ["node_modules"] 14 | } 15 | -------------------------------------------------------------------------------- /samples/productivity-hub/README.md: -------------------------------------------------------------------------------- 1 | # Getting Started with One Productivity Hub Sample 2 | 3 | This sample shows you how to build a personal productivity hub as a Microsoft Teams tab to render calendar events, to-do tasks and file folders by using [Microsoft Graph Toolkit](https://docs.microsoft.com/en-us/graph/toolkit/overview) components and [TeamsFx Provider](https://www.npmjs.com/package/@microsoft/mgt-teamsfx-provider). 4 | 5 | - [One Productivity Hub Sample GitHub repository](https://github.com/OfficeDev/TeamsFx-Samples/tree/dev/graph-toolkit-one-productivity-hub) -------------------------------------------------------------------------------- /samples/teams-apps/README.md: -------------------------------------------------------------------------------- 1 | # Microsoft Teams App Camp On Demand 2 | 3 | This on-demand workshop teaches you how to build Teams applications "from scratch", which is important for developers who already have an application they want to extend into Microsoft Teams, or for developers who have a specific toolchain in mind. 4 | 5 | - [Teams app camp Homepage](https://microsoft.github.io/app-camp/) 6 | - [Teams app camp GitHub repository](https://github.com/microsoft/app-camp) -------------------------------------------------------------------------------- /tutorials/.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | /node_modules 3 | 4 | # Production 5 | /build 6 | 7 | # Generated files 8 | .docusaurus 9 | .cache-loader 10 | 11 | # Misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | -------------------------------------------------------------------------------- /tutorials/README.md: -------------------------------------------------------------------------------- 1 | # Website 2 | 3 | This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator. 4 | 5 | ### Installation 6 | 7 | ``` 8 | $ yarn 9 | ``` 10 | 11 | ### Local Development 12 | 13 | ``` 14 | $ yarn start 15 | ``` 16 | 17 | This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. 18 | 19 | ### Build 20 | 21 | ``` 22 | $ yarn build 23 | ``` 24 | 25 | This command generates static content into the `build` directory and can be served using any static contents hosting service. 26 | 27 | ### Deployment 28 | 29 | Using SSH: 30 | 31 | ``` 32 | $ USE_SSH=true yarn deploy 33 | ``` 34 | 35 | Not using SSH: 36 | 37 | ``` 38 | $ GIT_USER= yarn deploy 39 | ``` 40 | 41 | If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. 42 | -------------------------------------------------------------------------------- /tutorials/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /tutorials/docs/ACS-to-Teams-Meeting/index.md: -------------------------------------------------------------------------------- 1 | # Audio/Video Calling from a Custom App into a Teams Meeting 2 | 3 | **Level**: Intermediate 4 | 5 | ## Introduction 6 | 7 | In this tutorial you'll learn how Azure Communication Services can be used in a custom React application to allow a user to make an audio/video call into a Microsoft Teams meeting. You'll learn about the different building blocks that can be used to make this scenario possible and be provided with hands-on steps to walk you through the different Microsoft Cloud services involved. 8 | 9 |

View Tutorial

10 | 11 | Here's an overview of the application solution: 12 | 13 | ![ACS Audio/Video Solution](/img/acs-to-teams/architecture-no-title.png "Scenario Architecture") 14 | 15 | ### Pre-requisites 16 | - [Node](https://nodejs.org) - Node 16+ and npm 7+ will be used for this project 17 | - [git](https://learn.microsoft.com/devops/develop/git/install-and-set-up-git) 18 | - [Visual Studio Code](https://code.visualstudio.com/) 19 | - [Azure Functions Extension for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions) 20 | - [Azure subscription](https://azure.microsoft.com/free/search) 21 | - [Microsoft 365 developer tenant](https://developer.microsoft.com/microsoft-365/dev-program) 22 | - [GitHub account](https://github.com) 23 | 24 | ### Technologies used in this tutorial include 25 | - React 26 | - Azure Communication Services 27 | - Azure Functions 28 | - Microsoft Graph 29 | - Microsoft Teams -------------------------------------------------------------------------------- /tutorials/docs/Authentication-App-With-NextJs-And-Microsoft-Graph/02-Structuring-Project.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 2. Structuring the Project 3 | sidebar_position: 1 4 | --- 5 | 6 | Once we already created our application on the Azure Portal, we can start to code our application. In this tutorial we will use Next.js. But you can use any other framework you want. Let's install the Next.js framework! 7 | 8 | Open your terminal and run the following command: 9 | 10 | ```bash 11 | npx create-next-app auth-app --typescript 12 | ``` 13 | 14 | Now we already have our application created, let's execute it to see if everything is working. 15 | 16 | ```bash 17 | cd auth-app 18 | ``` 19 | 20 | ```bash 21 | npm run dev 22 | ``` 23 | 24 | Open the browser and go to the following address: `http://localhost:3000`. 25 | 26 | Now we need to install some dependencies. And one of them is the **[Microsoft Graph Client](https://learn.microsoft.com/en-us/graph/sdks/create-client?tabs=Javascript)**. To install it, run the following command: 27 | 28 | ```bash 29 | npm install @microsoft/microsoft-graph-client 30 | ``` 31 | 32 | If you want to know more about the Microsoft Graph Client, **[you can read the documentation](https://docs.microsoft.com/en-us/graph/sdks/sdks-overview)**. And also, **[know about the NPM package](https://www.npmjs.com/package/@microsoft/microsoft-graph-client)**. 33 | 34 | Another package we will need to install is NextAuth.js. It is a library that helps us to integrate authentication login sessions with Next.js. To install it, run the following command: 35 | 36 | ```bash 37 | npm install next-auth 38 | ``` 39 | 40 | Also, if you want to know more about NextAuth.js, **[you can read the documentation](https://next-auth.js.org/)**. And also, **[know about the NPM package](https://www.npmjs.com/package/next-auth)**. 41 | 42 | Now we can finally start to create some components for our application. But we will do that in the next section. 43 | 44 | -------------------------------------------------------------------------------- /tutorials/docs/Authentication-App-With-NextJs-And-Microsoft-Graph/08-Next-Steps-Conclusion.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 8. Next Steps & Final Words 3 | sidebar_position: 1 4 | --- 5 | 6 | # Next Steps & Final Words 7 | 8 | We hope you enjoyed this workshop and learned something new! If you have any questions or comments, don't hesitate to reach out to us! 9 | 10 | If you want to go further, make the `Take break reminder app workshop`. There we will go into the `Reminder` page. A page that will inform you each 60 minutes to take a break. If you want to make this workshop, go to the Workshop Reminder App. 11 | 12 | If you want to learn more about Microsoft Graph, we have a lot of free courses and Learn Modules about it. Below you can see some interesting resources and links: 13 | 14 | - ✅ **[Microsoft Graph Fundalmentals](https://learn.microsoft.com/en-us/training/paths/m365-msgraph-fundamentals/)** 15 | - ✅ **[Access a user's calendar events in a JavaScript app with Microsoft Graph](https://learn.microsoft.com/en-us/training/modules/msgraph-access-user-events/)** 16 | - ✅ **[Show a user's emails in a JavaScript app with Microsoft Graph](https://learn.microsoft.com/en-us/training/modules/msgraph-show-user-emails/)** 17 | - ✅ **[Download and upload files in a JavaScript app with Microsoft Graph](https://learn.microsoft.com/en-us/training/modules/msgraph-manage-files/)** 18 | - ✅ **[Access user photo information by using Microsoft Graph](https://learn.microsoft.com/en-us/training/modules/msgraph-user-photo-information/)** 19 | - ✅ **[Configure a JavaScript application to retrieve Microsoft 365 data by using Microsoft Graph](https://learn.microsoft.com/en-us/training/modules/msgraph-javascript-app/)** 20 | - ✅ **[Build apps with Microsoft Graph – Associate](https://learn.microsoft.com/en-us/training/paths/m365-msgraph-associate/)** 21 | 22 | And, see you in the next workshop! 😊 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /tutorials/docs/Automate-Data-Reporting-with-Azure-Functions-and-Power-Automate/01-Install-the-Azure-Functions-Extension-and-Create-a-New-Function.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 1. Install the Azure Functions Extension and Create a New Function 3 | sidebar_position: 1 4 | --- 5 | 6 | # Exercise 1 7 | 8 | ## Install the Azure Functions Extension for VS Code 9 | 10 | In this exercise you'll create an empty project, install the Azure Functions extension for VS Code, and create a new function. 11 | 12 | To get started, perform the following tasks: 13 | 14 | 1. Create an empty folder on your desktop and open it in VS Code. 15 | 16 | 1. Install the [Azure Functions extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions) if it's not already installed. 17 | 18 | 1. Click on the **Azure** icon in the VS Code sidebar. 19 | 20 | :::note 21 | If you don't see the Azure icon after installing the Azure Functions extension, right-click on the VS Code sidebar and select **Azure** from the menu. 22 | ::: 23 | 24 | 1. Sign in to Azure if you're not already signed in. 25 | 26 | ![Sign in to Azure](/img/automate-data-azure-functions-power-automate/functions-sign-into-azure.png "Sign in to Azure") 27 | 28 | 1. Locate the **Workspace** section and click the **+** icon. 29 | 1. Select **Create Function** and then select **Yes**. 30 | 31 | ![Create Azure Function Dialog](/img/automate-data-azure-functions-power-automate/create-function-dialog.png "Create Azure Function Dialog") 32 | 33 | 1. Select the following: 34 | 35 | - **Language** : TypeScript 36 | - **Trigger** : HTTP trigger 37 | - **Function Name** : getGitHubRepoStats 38 | - **Authorization level** : Anonymous 39 | 40 |
41 | 42 | :::note 43 | If you opened an existing project folder instead of an empty one, you may be prompted to overwrite the **.gitignore** and **package.json** files. 44 | ::: 45 | 46 | 1. You will see the following folder and files added to your project: 47 | 48 | ![Create Azure Function Project Dialog](/img/automate-data-azure-functions-power-automate/azure-function-files.png "Create Azure Function Project Dialog") -------------------------------------------------------------------------------- /tutorials/docs/Automate-Data-Reporting-with-Azure-Functions-and-Power-Automate/03-Create-and-Deploy-the-Function-App-to-Azure.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 3. Create and Deploy the Function App to Azure 3 | sidebar_position: 3 4 | --- 5 | 6 | # Exercise 3 7 | 8 | ## Create and Deploy the Function App to Azure 9 | 10 | Now that the function is working locally, it's time to deploy it to Azure. 11 | 12 | 1. Open the VS Code command pallet (`shift + cmd + p` on Mac | `shift + ctrl + p` on Windows), and select **Azure Functions: Create Function App in Azure**. 13 | 14 | ![Create Function App in Azure](/img/automate-data-azure-functions-power-automate/create-function-app-in-azure.png "Create Function App in Azure") 15 | 16 | 1. You'll be prompted to enter the following information: 17 | 18 | - Your Azure subscription name. 19 | - The function name - enter `getGitHubRepoStats` 20 | 21 | :::note 22 | A globally unique name is required. You can make the name more unique by adding a number or your last name to the end of the name. 23 | ::: 24 | 25 | - The runtime stack - Select the latest `Node.js LTS` version. 26 | - The region (select any region you'd like). 27 | 28 | 1. Once the Azure Function App is created you’ll see a message about viewing the details. 29 | 30 | 1. The next step is to deploy the code. Go back to the command pallet in VS Code and select **Azure Functions: Deploy to Function App**. You'll be asked to select your subscription and the Function App name you created earlier. 31 | 32 | 1. Once the function is deployed to Azure, do the following: 33 | 34 | - Select the Azure extension in VS Code (click the Azure icon in the sidebar). 35 | - Expand your subscription. 36 | - Expand your Function App. 37 | - Right-click on the function and select **Browse Website**. Ensure the function app is working correctly. 38 | - Add `/api/getGitHubRepoStats` to the URL and you should see data returned from your function. 39 | 40 | 1. Perform the following steps: 41 | 42 | - Copy the Azure Function domain to a local file. 43 | - Copy the JSON data returned from the function call to a local file. 44 | 45 | You'll use these values in the next exercise. 46 | 47 | -------------------------------------------------------------------------------- /tutorials/docs/Automate-Data-Reporting-with-Azure-Functions-and-Power-Automate/05-Congratulations.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 5 3 | --- 4 | 5 | # Congratulations! 6 | 7 | ## You've completed this tutorial! 8 | 9 | ![Power Automate and Azure Functions Flow](/img/automate-data-azure-functions-power-automate/scenario-overview.png "Power Automate and Azure Functions Flow") 10 | 11 | To clean up your resources, perform the following tasks: 12 | 13 | 1. Go to the Azure Portal: 14 | 15 | - Delete your Azure Active Directory app registration. 16 | - Delete your Azure Functions resource group. 17 | 18 | 1. Go back to your Power Automate flow's home screen and select **Delete** from the top toolbar. 19 | 20 | 1. Go to your OneDrive account and delete the **data** folder. -------------------------------------------------------------------------------- /tutorials/docs/Automate-Data-Reporting-with-Azure-Functions-and-Power-Automate/index.md: -------------------------------------------------------------------------------- 1 | # Automate Data Reporting with Azure Functions and Power Automate 2 | 3 | **Level**: Intermediate 4 | 5 | # Introduction 6 | 7 | In this tutorial you'll learn how to migrate a local Node.js script to Azure Functions using Visual Studio Code so that data can be retrieved more easily for reporting purposes. To automate calling the API, you'll learn how to setup a Power Automate flow, call the Azure Function, and store the data in Excel Online. 8 | 9 | Here's an overview of the application solution. Power Automate is used to setup a recurring action that calls out to Azure Functions, retrieves JSON data, parses it, extracts the desired values, and stores the data in Excel Online (note that many other storage options could be chosen). 10 | 11 | ![Power Automate and Azure Functions Flow](/img/automate-data-azure-functions-power-automate/scenario-overview.png "Power Automate and Azure Functions Flow") 12 | 13 | ### Pre-requisites 14 | - [Node](https://nodejs.org) - Node LTS 15 | - [git](https://learn.microsoft.com/devops/develop/git/install-and-set-up-git) 16 | - [Visual Studio Code](https://code.visualstudio.com/) 17 | - [Azure Functions Extension for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions) 18 | - [Azure subscription](https://azure.microsoft.com/free/search) 19 | - [Microsoft 365 developer tenant](https://developer.microsoft.com/microsoft-365/dev-program) 20 | 21 | ### Technologies used in this tutorial include 22 | - Node.js 23 | - Azure Functions 24 | - GitHub 25 | - Power Automate 26 | - VS Code -------------------------------------------------------------------------------- /tutorials/docs/Build-Productivity-Apps-By-Using-Microsoft-Graph-Toolkit/index.md: -------------------------------------------------------------------------------- 1 | # Build Productivity Apps by using Microsoft Graph Toolkit 2 | 3 | **Level**: Beginner 4 | 5 | ## Introduction 6 | 7 | The One Productivity Hub tutorial shows you how to build a tab for viewing your calendar events, to-do tasks and files by using Microsoft Graph Toolkit components and TeamsFx Provider. 8 | 9 | ![One Productivity Hub Tutorial](/img/productivity-dashboard/oneproductivityhub-overview.gif "One Productivity Hub Tutorial") 10 | 11 |

View the Tutorial

12 | 13 | ### Pre-requisites 14 | - [NodeJS](https://nodejs.org/en/), fully tested on NodeJS 14, 16 15 | - A Microsoft 365 account. If you do not have Microsoft 365 account, apply one from [Microsoft 365 developer program](https://developer.microsoft.com/en-us/microsoft-365/dev-program) 16 | - Latest [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) 17 | 18 | ### Technologies used in this tutorial include 19 | - Azure Active Directory 20 | - Microsoft Graph Toolkit 21 | - TeamsFx -------------------------------------------------------------------------------- /tutorials/docs/Take-A-Break-Reminder-App/02-Installing-Dependencies-From-Kit-Get-Started.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 2. Installing dependencies from the Kit Get Started 3 | sidebar_position: 1 4 | --- 5 | 6 | Again, if you are not coming from the previous workshop, **[you can download the source code of the project we will be working on in this workshop](https://github.com/glaucia86/kitstarter-msgraph-nextjs)** 7 | 8 | After downloading the source code, you should run the following command in the terminal: 9 | 10 | ```bash 11 | cd kitstarter-msgraph-nextjs 12 | ``` 13 | 14 | ```bash 15 | npm install 16 | ``` 17 | 18 | At the root of the project, create a file called `env.local` and fill in the following environment variables: 19 | 20 | ```env 21 | AZURE_AD_CLIENT_ID= 22 | AZURE_AD_CLIENT_SECRET= 23 | AZURE_AD_TENANT_ID= 24 | NEXTAUTH_SECRET= # Linux: `openssl rand -hex 32` or go to https://generate-secret.now.sh/32 25 | ``` 26 | 27 | And finally to run the project, run the following command: 28 | 29 | ```bash 30 | npm run dev 31 | ``` 32 | 33 | Open your browser and go to the following address: `http://localhost:3000` 34 | 35 | If everything is working correctly, we can move on to the next section. 36 | 37 | -------------------------------------------------------------------------------- /tutorials/docs/Take-A-Break-Reminder-App/07-Next Steps-Conclusion.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 7. Next Steps & Final Words 3 | sidebar_position: 1 4 | --- 5 | 6 | We hope you enjoyed this workshop and learned something new! If you have any questions or comments, don't hesitate to reach out to us! 7 | 8 | If you want to learn more about Microsoft Graph, we have a lot of free courses and Learn Modules about it. Below you can see some interesting resources and links: 9 | 10 | - ✅ **[Microsoft Graph Fundalmentals](https://learn.microsoft.com/en-us/training/paths/m365-msgraph-fundamentals/)** 11 | - ✅ **[Access a user's calendar events in a JavaScript app with Microsoft Graph](https://learn.microsoft.com/en-us/training/modules/msgraph-access-user-events/)** 12 | - ✅ **[Show a user's emails in a JavaScript app with Microsoft Graph](https://learn.microsoft.com/en-us/training/modules/msgraph-show-user-emails/)** 13 | - ✅ **[Download and upload files in a JavaScript app with Microsoft Graph](https://learn.microsoft.com/en-us/training/modules/msgraph-manage-files/)** 14 | - ✅ **[Access user photo information by using Microsoft Graph](https://learn.microsoft.com/en-us/training/modules/msgraph-user-photo-information/)** 15 | - ✅ **[Configure a JavaScript application to retrieve Microsoft 365 data by using Microsoft Graph](https://learn.microsoft.com/en-us/training/modules/msgraph-javascript-app/)** 16 | - ✅ **[Build apps with Microsoft Graph – Associate](https://learn.microsoft.com/en-us/training/paths/m365-msgraph-associate/)** 17 | 18 | And, see you sooner! 😊 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /tutorials/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docs-website", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "move-tutorials": "rimraf ../public/tutorials && mv build ../public/tutorials", 7 | "docusaurus": "docusaurus", 8 | "start": "docusaurus start", 9 | "build": "docusaurus build && npm run move-tutorials", 10 | "swizzle": "docusaurus swizzle", 11 | "deploy": "docusaurus deploy", 12 | "clear": "docusaurus clear", 13 | "serve": "docusaurus serve", 14 | "write-translations": "docusaurus write-translations", 15 | "write-heading-ids": "docusaurus write-heading-ids", 16 | "typecheck": "tsc" 17 | }, 18 | "dependencies": { 19 | "@docusaurus/core": "^2.4.1", 20 | "@docusaurus/preset-classic": "^2.4.1", 21 | "@mdx-js/react": "^1.6.22", 22 | "clsx": "^1.2.1", 23 | "prism-react-renderer": "^1.3.5", 24 | "react": "^17.0.2", 25 | "react-dom": "^17.0.2" 26 | }, 27 | "devDependencies": { 28 | "@docusaurus/module-type-aliases": "^2.4.1", 29 | "@tsconfig/docusaurus": "^1.0.6", 30 | "rimraf": "^3.0.2", 31 | "typescript": "^4.9.3" 32 | }, 33 | "browserslist": { 34 | "production": [ 35 | ">0.5%", 36 | "not dead", 37 | "not op_mini all" 38 | ], 39 | "development": [ 40 | "last 1 chrome version", 41 | "last 1 firefox version", 42 | "last 1 safari version" 43 | ] 44 | }, 45 | "engines": { 46 | "node": ">=16.14" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /tutorials/sidebars.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Creating a sidebar enables you to: 3 | - create an ordered group of docs 4 | - render a sidebar for each doc of that group 5 | - provide next/previous navigation 6 | 7 | The sidebars can be generated from the filesystem, or explicitly defined here. 8 | 9 | Create as many sidebars as you want. 10 | */ 11 | 12 | // @ts-check 13 | 14 | /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ 15 | const sidebars = { 16 | // By default, Docusaurus generates a sidebar from the docs folder structure 17 | tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], 18 | 19 | // But you can create a sidebar manually 20 | /* 21 | tutorialSidebar: [ 22 | 'intro', 23 | 'hello', 24 | { 25 | type: 'category', 26 | label: 'Tutorial', 27 | items: ['tutorial-basics/create-a-document'], 28 | }, 29 | ], 30 | */ 31 | }; 32 | 33 | module.exports = sidebars; 34 | -------------------------------------------------------------------------------- /tutorials/src/components/HomepageFeatures/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import styles from './styles.module.css'; 4 | 5 | type FeatureItem = { 6 | title: string; 7 | image?: string; 8 | Svg?: React.ComponentType>; 9 | description: JSX.Element; 10 | }; 11 | 12 | const FeatureList: FeatureItem[] = [ 13 | { 14 | title: 'Hands-On Learning', 15 | image: require('@site/static/img/hands-on-learning.png').default, 16 | description: ( 17 | <> 18 | Hands-on tutorials show how services across the Microsoft Cloud can be integrated. 19 | 20 | ), 21 | }, 22 | { 23 | title: 'Step-by-Step Guidance', 24 | image: require('@site/static/img/step-by-step.png').default, 25 | description: ( 26 | <> 27 | Step-by-step guidance helps you understand how to provision services and walks you through the end-to-end process. 28 | 29 | ), 30 | }, 31 | { 32 | title: 'Enhance Your Skills', 33 | image: require('@site/static/img/enhance-skills.png').default, 34 | description: ( 35 | <> 36 | Take your Microsoft Cloud skills to the next level by learning more about service to service communication, deployment, security, and more. 37 | 38 | ), 39 | }, 40 | ]; 41 | 42 | function Feature({title, image, Svg, description}: FeatureItem) { 43 | return ( 44 |
45 |
46 | {Svg && } 47 | {image && image} 48 |
49 |
50 |

{title}

51 |

{description}

52 |
53 |
54 | ); 55 | } 56 | 57 | export default function HomepageFeatures(): JSX.Element { 58 | return ( 59 |
60 |
61 |
62 | {FeatureList.map((props, idx) => ( 63 | 64 | ))} 65 |
66 |
67 |
68 | ); 69 | } 70 | -------------------------------------------------------------------------------- /tutorials/src/components/HomepageFeatures/styles.module.css: -------------------------------------------------------------------------------- 1 | .features { 2 | display: flex; 3 | align-items: center; 4 | padding: 2rem 0; 5 | width: 100%; 6 | } 7 | 8 | .featureSvg { 9 | height: 322px; 10 | width: 322px; 11 | } 12 | -------------------------------------------------------------------------------- /tutorials/src/pages/index.module.css: -------------------------------------------------------------------------------- 1 | /** 2 | * CSS files with the .module.css suffix will be treated as CSS modules 3 | * and scoped locally. 4 | */ 5 | 6 | .heroBanner { 7 | padding: 4rem 0; 8 | text-align: center; 9 | position: relative; 10 | overflow: hidden; 11 | } 12 | 13 | @media screen and (max-width: 996px) { 14 | .heroBanner { 15 | padding: 2rem; 16 | } 17 | } 18 | 19 | .buttons { 20 | display: flex; 21 | align-items: center; 22 | justify-content: center; 23 | } 24 | -------------------------------------------------------------------------------- /tutorials/src/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import Link from '@docusaurus/Link'; 4 | import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; 5 | import Layout from '@theme/Layout'; 6 | import HomepageFeatures from '@site/src/components/HomepageFeatures'; 7 | 8 | import styles from './index.module.css'; 9 | 10 | function HomepageHeader() { 11 | const {siteConfig} = useDocusaurusContext(); 12 | return ( 13 |
14 |
15 |

{siteConfig.title}

16 |

{siteConfig.tagline}

17 |
18 | 21 | Explore Tutorials   🧭 22 | 23 |
24 |
25 |
26 | ); 27 | } 28 | 29 | export default function Home(): JSX.Element { 30 | const {siteConfig} = useDocusaurusContext(); 31 | return ( 32 | 35 | 36 |
37 | 38 |
39 |
40 | ); 41 | } 42 | -------------------------------------------------------------------------------- /tutorials/static/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/.nojekyll -------------------------------------------------------------------------------- /tutorials/static/img/acs-to-teams/1-acs-azure-portal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/acs-to-teams/1-acs-azure-portal.png -------------------------------------------------------------------------------- /tutorials/static/img/acs-to-teams/2-acs-react.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/acs-to-teams/2-acs-react.png -------------------------------------------------------------------------------- /tutorials/static/img/acs-to-teams/3-create-teams-meeting-link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/acs-to-teams/3-create-teams-meeting-link.png -------------------------------------------------------------------------------- /tutorials/static/img/acs-to-teams/4-acs-identity-token.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/acs-to-teams/4-acs-identity-token.png -------------------------------------------------------------------------------- /tutorials/static/img/acs-to-teams/5-deploy-swa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/acs-to-teams/5-deploy-swa.png -------------------------------------------------------------------------------- /tutorials/static/img/acs-to-teams/6-deploy-container-apps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/acs-to-teams/6-deploy-container-apps.png -------------------------------------------------------------------------------- /tutorials/static/img/acs-to-teams/aad-user-id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/acs-to-teams/aad-user-id.png -------------------------------------------------------------------------------- /tutorials/static/img/acs-to-teams/architecture-no-title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/acs-to-teams/architecture-no-title.png -------------------------------------------------------------------------------- /tutorials/static/img/acs-to-teams/architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/acs-to-teams/architecture.png -------------------------------------------------------------------------------- /tutorials/static/img/acs-to-teams/fork-repo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/acs-to-teams/fork-repo.png -------------------------------------------------------------------------------- /tutorials/static/img/acs-to-teams/search-acs-portal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/acs-to-teams/search-acs-portal.png -------------------------------------------------------------------------------- /tutorials/static/img/acs-to-teams/search-swa-portal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/acs-to-teams/search-swa-portal.png -------------------------------------------------------------------------------- /tutorials/static/img/acs-to-teams/teams-meeting-link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/acs-to-teams/teams-meeting-link.png -------------------------------------------------------------------------------- /tutorials/static/img/acs-to-teams/user-identity-token.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/acs-to-teams/user-identity-token.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/authentication.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/authentication.gif -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/gif-01.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/gif-01.gif -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-01.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-02.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-03.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-04.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-05.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-06.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-07.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-08.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-09.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-10.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-11.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-111.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-111.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-12.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-13.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-14.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-15.png -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-16.jpg -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/image-17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/image-17.jpg -------------------------------------------------------------------------------- /tutorials/static/img/authentication-workshop/reminder.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/authentication-workshop/reminder.gif -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/azure-function-files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/azure-function-files.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/build-scheduled-flow-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/build-scheduled-flow-dialog.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/create-function-app-in-azure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/create-function-app-in-azure.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/create-function-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/create-function-dialog.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/excel-online-connector-values.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/excel-online-connector-values.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/excel-online-connector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/excel-online-connector.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/functions-sign-into-azure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/functions-sign-into-azure.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/parse-json-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/parse-json-action.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/parse-json-generate-schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/parse-json-generate-schema.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/power-automate-flow-final.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/power-automate-flow-final.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/power-automate-flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/power-automate-flow.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/recurrence-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/recurrence-action.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/scenario-overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/scenario-overview.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/scheduled-flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/scheduled-flow.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/select-http-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/select-http-action.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/test-and-flow-checker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/test-and-flow-checker.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/test-flow-result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/test-flow-result.png -------------------------------------------------------------------------------- /tutorials/static/img/automate-data-azure-functions-power-automate/test-flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/automate-data-azure-functions-power-automate/test-flow.png -------------------------------------------------------------------------------- /tutorials/static/img/enhance-skills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/enhance-skills.png -------------------------------------------------------------------------------- /tutorials/static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/favicon.ico -------------------------------------------------------------------------------- /tutorials/static/img/hands-on-learning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/hands-on-learning.png -------------------------------------------------------------------------------- /tutorials/static/img/productivity-dashboard/oneproductivityhub-overview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/productivity-dashboard/oneproductivityhub-overview.gif -------------------------------------------------------------------------------- /tutorials/static/img/step-by-step.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/MicrosoftCloud/a6c41b7c3b4ff65bca9746dc3b0faee98fb6b49e/tutorials/static/img/step-by-step.png -------------------------------------------------------------------------------- /tutorials/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // This file is not used in compilation. It is here just for a nice editor experience. 3 | "extends": "@tsconfig/docusaurus/tsconfig.json", 4 | "compilerOptions": { 5 | "baseUrl": "." 6 | } 7 | } 8 | --------------------------------------------------------------------------------