├── Source ├── FY19GraphShowcaseDemo │ ├── MeetingCaptureWebApp │ │ ├── Views │ │ │ ├── _ViewStart.cshtml │ │ │ ├── _ViewImports.cshtml │ │ │ ├── Test │ │ │ │ ├── MgtTest.cshtml │ │ │ │ └── Index.cshtml │ │ │ ├── Shared │ │ │ │ ├── _ValidationScriptsPartial.cshtml │ │ │ │ ├── _TeamsTabLayout.cshtml │ │ │ │ ├── _LoginPartial.cshtml │ │ │ │ ├── Error.cshtml │ │ │ │ └── _Layout.cshtml │ │ │ ├── MeetingCapture │ │ │ │ ├── index.cshtml │ │ │ │ └── upcomingMeetings.cshtml │ │ │ └── Tab │ │ │ │ ├── Configure.cshtml │ │ │ │ └── DeleteEvents.cshtml │ │ ├── libman.json │ │ ├── Manifest │ │ │ ├── color.png │ │ │ ├── outline.png │ │ │ ├── PublishTeamApp.ps1 │ │ │ └── manifest.json │ │ ├── wwwroot │ │ │ ├── favicon.ico │ │ │ ├── images │ │ │ │ └── MeetingCapture.jpg │ │ │ ├── lib │ │ │ │ ├── ckeditor │ │ │ │ │ ├── plugins │ │ │ │ │ │ ├── icons.png │ │ │ │ │ │ ├── icons_hidpi.png │ │ │ │ │ │ ├── link │ │ │ │ │ │ │ ├── images │ │ │ │ │ │ │ │ ├── anchor.png │ │ │ │ │ │ │ │ └── hidpi │ │ │ │ │ │ │ │ │ └── anchor.png │ │ │ │ │ │ │ └── dialogs │ │ │ │ │ │ │ │ └── anchor.js │ │ │ │ │ │ ├── dialog │ │ │ │ │ │ │ ├── dialogDefinition.js │ │ │ │ │ │ │ └── styles │ │ │ │ │ │ │ │ └── dialog.css │ │ │ │ │ │ ├── about │ │ │ │ │ │ │ └── dialogs │ │ │ │ │ │ │ │ ├── logo_ckeditor.png │ │ │ │ │ │ │ │ ├── hidpi │ │ │ │ │ │ │ │ └── logo_ckeditor.png │ │ │ │ │ │ │ │ └── about.js │ │ │ │ │ │ └── clipboard │ │ │ │ │ │ │ └── dialogs │ │ │ │ │ │ │ └── paste.js │ │ │ │ │ ├── samples │ │ │ │ │ │ ├── img │ │ │ │ │ │ │ ├── logo.png │ │ │ │ │ │ │ ├── header-bg.png │ │ │ │ │ │ │ ├── github-top.png │ │ │ │ │ │ │ ├── navigation-tip.png │ │ │ │ │ │ │ └── header-separator.png │ │ │ │ │ │ ├── old │ │ │ │ │ │ │ ├── assets │ │ │ │ │ │ │ │ ├── sample.jpg │ │ │ │ │ │ │ │ ├── inlineall │ │ │ │ │ │ │ │ │ └── logo.png │ │ │ │ │ │ │ │ ├── uilanguages │ │ │ │ │ │ │ │ │ └── languages.js │ │ │ │ │ │ │ │ ├── posteddata.php │ │ │ │ │ │ │ │ └── outputxhtml │ │ │ │ │ │ │ │ │ └── outputxhtml.css │ │ │ │ │ │ │ ├── sample_posteddata.php │ │ │ │ │ │ │ ├── dialog │ │ │ │ │ │ │ │ └── assets │ │ │ │ │ │ │ │ │ └── my_dialog.js │ │ │ │ │ │ │ ├── sample.js │ │ │ │ │ │ │ ├── appendto.html │ │ │ │ │ │ │ ├── tabindex.html │ │ │ │ │ │ │ ├── uicolor.html │ │ │ │ │ │ │ ├── ajax.html │ │ │ │ │ │ │ └── readonly.html │ │ │ │ │ │ ├── toolbarconfigurator │ │ │ │ │ │ │ ├── font │ │ │ │ │ │ │ │ ├── fontello.eot │ │ │ │ │ │ │ │ ├── fontello.ttf │ │ │ │ │ │ │ │ ├── fontello.woff │ │ │ │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ │ │ │ ├── config.json │ │ │ │ │ │ │ │ └── fontello.svg │ │ │ │ │ │ │ ├── lib │ │ │ │ │ │ │ │ └── codemirror │ │ │ │ │ │ │ │ │ ├── show-hint.css │ │ │ │ │ │ │ │ │ ├── neo.css │ │ │ │ │ │ │ │ │ └── LICENSE │ │ │ │ │ │ │ ├── css │ │ │ │ │ │ │ │ └── fontello.css │ │ │ │ │ │ │ └── js │ │ │ │ │ │ │ │ └── fulltoolbareditor.js │ │ │ │ │ │ └── js │ │ │ │ │ │ │ └── sample.js │ │ │ │ │ ├── skins │ │ │ │ │ │ └── moono-lisa │ │ │ │ │ │ │ ├── icons.png │ │ │ │ │ │ │ ├── icons_hidpi.png │ │ │ │ │ │ │ ├── images │ │ │ │ │ │ │ ├── lock.png │ │ │ │ │ │ │ ├── arrow.png │ │ │ │ │ │ │ ├── close.png │ │ │ │ │ │ │ ├── refresh.png │ │ │ │ │ │ │ ├── spinner.gif │ │ │ │ │ │ │ ├── lock-open.png │ │ │ │ │ │ │ └── hidpi │ │ │ │ │ │ │ │ ├── close.png │ │ │ │ │ │ │ │ ├── lock.png │ │ │ │ │ │ │ │ ├── refresh.png │ │ │ │ │ │ │ │ └── lock-open.png │ │ │ │ │ │ │ └── readme.md │ │ │ │ │ ├── config.js │ │ │ │ │ ├── README.md │ │ │ │ │ ├── build-config.js │ │ │ │ │ └── adapters │ │ │ │ │ │ └── jquery.js │ │ │ │ ├── jquery-validation-unobtrusive │ │ │ │ │ └── LICENSE.txt │ │ │ │ ├── jquery-validation │ │ │ │ │ └── LICENSE.md │ │ │ │ ├── bootstrap │ │ │ │ │ ├── LICENSE │ │ │ │ │ └── dist │ │ │ │ │ │ └── css │ │ │ │ │ │ └── bootstrap-reboot.min.css │ │ │ │ ├── jquery │ │ │ │ │ └── LICENSE.txt │ │ │ │ └── mgt │ │ │ │ │ └── mgt-loader.js │ │ │ └── js │ │ │ │ ├── index.js │ │ │ │ └── teamsHelper.js │ │ ├── appsettings.Development.json │ │ ├── Services │ │ │ ├── Interfaces │ │ │ │ ├── IViewRenderService.cs │ │ │ │ ├── ICommunicationService.cs │ │ │ │ ├── IUserService.cs │ │ │ │ ├── INotesService.cs │ │ │ │ ├── IFileService.cs │ │ │ │ ├── IPlanTaskService.cs │ │ │ │ ├── IMeetingService.cs │ │ │ │ ├── ICalendarService.cs │ │ │ │ └── IMeetingDBService.cs │ │ │ ├── BaseGraphService.cs │ │ │ ├── ViewRenderService.cs │ │ │ ├── FileService.cs │ │ │ ├── NotesService.cs │ │ │ ├── CommunicationService.cs │ │ │ └── UserService.cs │ │ ├── Models │ │ │ ├── ErrorViewModel.cs │ │ │ ├── TaskViewModel.cs │ │ │ ├── FindAvailableTimesParasModel.cs │ │ │ ├── FollowUpMeetingsViewModel.cs │ │ │ ├── EmailTemplateViewModel.cs │ │ │ └── NewMeetingViewModel.cs │ │ ├── Data │ │ │ ├── Agenda.cs │ │ │ ├── ShowCaseDbContext.cs │ │ │ ├── TeamChannel.cs │ │ │ ├── TaskFile.cs │ │ │ ├── MeetingAttendee.cs │ │ │ └── Meeting.cs │ │ ├── Extensions │ │ │ └── AzureAdOptions.cs │ │ ├── Controllers │ │ │ ├── AuthController.cs │ │ │ ├── TemplatesController.cs │ │ │ ├── TabController.cs │ │ │ └── TestController.cs │ │ ├── Properties │ │ │ └── launchSettings.json │ │ ├── appsettings.json │ │ ├── MeetingCaptureWebApp.csproj │ │ ├── Program.cs │ │ ├── Helpers │ │ │ ├── AsyncUtil.cs │ │ │ └── GraphAuthProvider.cs │ │ └── Startup.cs │ ├── MeetingCaptureWebJob │ │ ├── IEmailService.cs │ │ ├── Extension.cs │ │ ├── Settings.job │ │ ├── appsettings.json │ │ ├── MeetingCaptureWebJob.csproj │ │ ├── EmailService.cs │ │ └── Program.cs │ ├── PublishWebapp.ps1 │ └── FY19GraphShowcaseDemo.sln └── SPFX │ └── PendingMeetings │ ├── .vscode │ ├── extensions.json │ ├── settings.json │ └── launch.json │ ├── src │ ├── index.ts │ ├── webparts │ │ └── upcomingMeetings │ │ │ ├── components │ │ │ ├── IUpcomingMeetingsProps.ts │ │ │ ├── IUpcomingMeetingsState.ts │ │ │ └── UpcomingMeetings.scss │ │ │ ├── loc │ │ │ ├── en-us.js │ │ │ └── mystrings.d.ts │ │ │ ├── UpcomingMeetingsWebPart.manifest.json │ │ │ └── UpcomingMeetingsWebPart.ts │ └── services │ │ └── MSGraphService.ts │ ├── README.md │ ├── mgt │ └── microsoft-mgt-1.0.0.tgz │ ├── config │ ├── copy-assets.json │ ├── write-manifests.json │ ├── deploy-azure-storage.json │ ├── serve.json │ ├── config.json │ └── package-solution.json │ ├── teams │ ├── 55366f15-df34-42b0-b484-8fe6d6f42c4a_color.png │ └── 55366f15-df34-42b0-b484-8fe6d6f42c4a_outline.png │ ├── gulpfile.js │ ├── .yo-rc.json │ ├── .gitignore │ ├── .editorconfig │ ├── tslint.json │ ├── tsconfig.json │ ├── PublishWebpart.ps1 │ └── package.json ├── assets ├── add-scope.png ├── app-id-uri.png ├── AAD-Consent.jpg ├── add-spfx-app.png ├── consent-popup.png ├── teams-add-app.jpg ├── teams-team-name.jpg ├── office365-client.jpg ├── permissions-added.png ├── teamapp-manifest.jpg ├── teams-add-channel.jpg ├── teams-add-members.jpg ├── teams-create-team.jpg ├── teams-import-app.jpg ├── teams-install-app.jpg ├── Azure-LogicApp-Edit.jpg ├── Azure-LogicApp-Save.jpg ├── approve-api-access.png ├── configure-web-part.png ├── teams-channel-name.jpg ├── teams-delete-events.jpg ├── teams-open-appstudio.jpg ├── teams-publish-kind.jpg ├── teams-team-created.jpg ├── azure-database-schema.jpg ├── configured-permissions.png ├── teams-channel-created.jpg ├── teams-search-appstudio.jpg ├── teams-select-mainfest.jpg ├── teams-select-settings.jpg ├── Actionable-Message-Form.jpg ├── Actionable-Message-Info.jpg ├── Azure-LogicApp-Resource.jpg ├── azure-resources-database.jpg ├── request-api-permissions.png ├── team-build-from-scratch.jpg ├── teams-add-meetingCapture.jpg ├── teams-add-pendingMeetings.jpg ├── teams-save-meetingCapture.jpg ├── Azure-LogicApp-Connections.jpg ├── azure-resources-queryeditor.jpg ├── teams-save-pendingMeetings.jpg ├── teams-setup-meetingCapture.jpg └── teams-setup-pendingMeetings.jpg ├── Deployment ├── DeployTemplate.ps1 ├── ARMParameters.json └── NewApp.ps1 ├── azure-pipelines.yml ├── LICENSE └── .gitattributes /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Views/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "_Layout"; 3 | } 4 | -------------------------------------------------------------------------------- /assets/add-scope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/add-scope.png -------------------------------------------------------------------------------- /assets/app-id-uri.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/app-id-uri.png -------------------------------------------------------------------------------- /assets/AAD-Consent.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/AAD-Consent.jpg -------------------------------------------------------------------------------- /assets/add-spfx-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/add-spfx-app.png -------------------------------------------------------------------------------- /assets/consent-popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/consent-popup.png -------------------------------------------------------------------------------- /assets/teams-add-app.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-add-app.jpg -------------------------------------------------------------------------------- /assets/teams-team-name.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-team-name.jpg -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "msjsdiag.debugger-for-chrome" 4 | ] 5 | } -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/src/index.ts: -------------------------------------------------------------------------------- 1 | // A file is required to be in the root of the /src directory by the TypeScript compiler 2 | -------------------------------------------------------------------------------- /assets/office365-client.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/office365-client.jpg -------------------------------------------------------------------------------- /assets/permissions-added.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/permissions-added.png -------------------------------------------------------------------------------- /assets/teamapp-manifest.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teamapp-manifest.jpg -------------------------------------------------------------------------------- /assets/teams-add-channel.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-add-channel.jpg -------------------------------------------------------------------------------- /assets/teams-add-members.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-add-members.jpg -------------------------------------------------------------------------------- /assets/teams-create-team.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-create-team.jpg -------------------------------------------------------------------------------- /assets/teams-import-app.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-import-app.jpg -------------------------------------------------------------------------------- /assets/teams-install-app.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-install-app.jpg -------------------------------------------------------------------------------- /assets/Azure-LogicApp-Edit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/Azure-LogicApp-Edit.jpg -------------------------------------------------------------------------------- /assets/Azure-LogicApp-Save.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/Azure-LogicApp-Save.jpg -------------------------------------------------------------------------------- /assets/approve-api-access.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/approve-api-access.png -------------------------------------------------------------------------------- /assets/configure-web-part.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/configure-web-part.png -------------------------------------------------------------------------------- /assets/teams-channel-name.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-channel-name.jpg -------------------------------------------------------------------------------- /assets/teams-delete-events.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-delete-events.jpg -------------------------------------------------------------------------------- /assets/teams-open-appstudio.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-open-appstudio.jpg -------------------------------------------------------------------------------- /assets/teams-publish-kind.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-publish-kind.jpg -------------------------------------------------------------------------------- /assets/teams-team-created.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-team-created.jpg -------------------------------------------------------------------------------- /assets/azure-database-schema.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/azure-database-schema.jpg -------------------------------------------------------------------------------- /assets/configured-permissions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/configured-permissions.png -------------------------------------------------------------------------------- /assets/teams-channel-created.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-channel-created.jpg -------------------------------------------------------------------------------- /assets/teams-search-appstudio.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-search-appstudio.jpg -------------------------------------------------------------------------------- /assets/teams-select-mainfest.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-select-mainfest.jpg -------------------------------------------------------------------------------- /assets/teams-select-settings.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-select-settings.jpg -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/libman.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0", 3 | "defaultProvider": "cdnjs", 4 | "libraries": [] 5 | } -------------------------------------------------------------------------------- /assets/Actionable-Message-Form.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/Actionable-Message-Form.jpg -------------------------------------------------------------------------------- /assets/Actionable-Message-Info.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/Actionable-Message-Info.jpg -------------------------------------------------------------------------------- /assets/Azure-LogicApp-Resource.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/Azure-LogicApp-Resource.jpg -------------------------------------------------------------------------------- /assets/azure-resources-database.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/azure-resources-database.jpg -------------------------------------------------------------------------------- /assets/request-api-permissions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/request-api-permissions.png -------------------------------------------------------------------------------- /assets/team-build-from-scratch.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/team-build-from-scratch.jpg -------------------------------------------------------------------------------- /assets/teams-add-meetingCapture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-add-meetingCapture.jpg -------------------------------------------------------------------------------- /assets/teams-add-pendingMeetings.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-add-pendingMeetings.jpg -------------------------------------------------------------------------------- /assets/teams-save-meetingCapture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-save-meetingCapture.jpg -------------------------------------------------------------------------------- /assets/Azure-LogicApp-Connections.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/Azure-LogicApp-Connections.jpg -------------------------------------------------------------------------------- /assets/azure-resources-queryeditor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/azure-resources-queryeditor.jpg -------------------------------------------------------------------------------- /assets/teams-save-pendingMeetings.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-save-pendingMeetings.jpg -------------------------------------------------------------------------------- /assets/teams-setup-meetingCapture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-setup-meetingCapture.jpg -------------------------------------------------------------------------------- /assets/teams-setup-pendingMeetings.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/assets/teams-setup-pendingMeetings.jpg -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/README.md: -------------------------------------------------------------------------------- 1 | ## pending-meetings 2 | 3 | This web part displays upcoming meetings and uses the Microsoft Graph Toolkit to implement the user interface. -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/mgt/microsoft-mgt-1.0.0.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/SPFX/PendingMeetings/mgt/microsoft-mgt-1.0.0.tgz -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Views/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using MeetingCaptureWebApp 2 | @using MeetingCaptureWebApp.Models 3 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 4 | -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/config/copy-assets.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/copy-assets.schema.json", 3 | "deployCdnPath": "temp/deploy" 4 | } 5 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Manifest/color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Manifest/color.png -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/config/write-manifests.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/write-manifests.schema.json", 3 | "cdnBasePath": "" 4 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Manifest/outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Manifest/outline.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/favicon.ico -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/teams/55366f15-df34-42b0-b484-8fe6d6f42c4a_color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/SPFX/PendingMeetings/teams/55366f15-df34-42b0-b484-8fe6d6f42c4a_color.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/images/MeetingCapture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/images/MeetingCapture.jpg -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/teams/55366f15-df34-42b0-b484-8fe6d6f42c4a_outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/SPFX/PendingMeetings/teams/55366f15-df34-42b0-b484-8fe6d6f42c4a_outline.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/icons.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Views/Test/MgtTest.cshtml: -------------------------------------------------------------------------------- 1 | 2 | @{ 3 | ViewData["Title"] = "MgtTest"; 4 | } 5 | 6 |

MgtTest

7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/img/logo.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/icons_hidpi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/icons_hidpi.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/img/header-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/img/header-bg.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/img/github-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/img/github-top.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/icons.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Views/Shared/_ValidationScriptsPartial.cshtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/link/images/anchor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/link/images/anchor.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/img/navigation-tip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/img/navigation-tip.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/old/assets/sample.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/old/assets/sample.jpg -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/img/header-separator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/img/header-separator.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/icons_hidpi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/icons_hidpi.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/lock.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/dialog/dialogDefinition.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. 3 | For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license 4 | */ 5 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/arrow.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/close.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/refresh.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/spinner.gif -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebJob/IEmailService.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | 3 | namespace MeetingCaptureWebJob 4 | { 5 | public interface IEmailService 6 | { 7 | Task SendEmailAsync(string[] emails, string subject, string message); 8 | } 9 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Manifest/PublishTeamApp.ps1: -------------------------------------------------------------------------------- 1 | $compress = @{ 2 | Path= ".\manifest.json", ".\color.png", ".\outline.png"; 3 | CompressionLevel = "Fastest"; 4 | DestinationPath = ".\manifest.zip"; 5 | 6 | } 7 | Compress-Archive @compress -Update; -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/link/images/hidpi/anchor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/link/images/hidpi/anchor.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/old/assets/inlineall/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/old/assets/inlineall/logo.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/lock-open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/lock-open.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/about/dialogs/logo_ckeditor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/about/dialogs/logo_ckeditor.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/hidpi/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/hidpi/close.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/hidpi/lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/hidpi/lock.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/hidpi/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/hidpi/refresh.png -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/gulpfile.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const gulp = require('gulp'); 4 | const build = require('@microsoft/sp-build-web'); 5 | build.addSuppression(`Warning - [sass] The local CSS class 'ms-Grid' is not camelCase and will not be type-safe.`); 6 | 7 | build.initialize(gulp); 8 | -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/src/webparts/upcomingMeetings/components/IUpcomingMeetingsProps.ts: -------------------------------------------------------------------------------- 1 | import { WebPartContext } from '@microsoft/sp-webpart-base'; 2 | 3 | export interface IUpcomingMeetingsProps { 4 | teamId: string; 5 | channelId: string; 6 | webPartContext: WebPartContext; 7 | } 8 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/toolbarconfigurator/font/fontello.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/toolbarconfigurator/font/fontello.eot -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/toolbarconfigurator/font/fontello.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/toolbarconfigurator/font/fontello.ttf -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/hidpi/lock-open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/images/hidpi/lock-open.png -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/toolbarconfigurator/font/fontello.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/meetings-capture-sample/master/Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/toolbarconfigurator/font/fontello.woff -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/src/webparts/upcomingMeetings/loc/en-us.js: -------------------------------------------------------------------------------- 1 | define([], function() { 2 | return { 3 | "PropertyPaneDescription": "Description", 4 | "BasicGroupName": "Group Name", 5 | "DescriptionFieldLabel": "Description Field", 6 | "TeamIdFieldLabel": "Team Id Field" 7 | } 8 | }); -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Services/Interfaces/IViewRenderService.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | 3 | namespace MeetingCaptureWebApp.Services 4 | { 5 | public interface IViewRenderService 6 | { 7 | Task RenderToStringAsync(string viewName, object model); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/src/webparts/upcomingMeetings/components/IUpcomingMeetingsState.ts: -------------------------------------------------------------------------------- 1 | import * as Graph from '@microsoft/microsoft-graph-types'; 2 | export interface IUpcomingMeetingsState { 3 | loadedEvents: boolean; 4 | loadedTasks: boolean; 5 | assignedToMe: boolean; 6 | showEvents: boolean; 7 | view:string; 8 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/toolbarconfigurator/font/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Font license info 2 | 3 | 4 | ## Font Awesome 5 | 6 | Copyright (C) 2012 by Dave Gandy 7 | 8 | Author: Dave Gandy 9 | License: SIL () 10 | Homepage: http://fortawesome.github.com/Font-Awesome/ 11 | -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/config/deploy-azure-storage.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/deploy-azure-storage.schema.json", 3 | "workingDir": "./temp/deploy/", 4 | "account": "", 5 | "container": "pending-meetings", 6 | "accessKey": "" 7 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Models/ErrorViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace MeetingCaptureWebApp.Models 4 | { 5 | public class ErrorViewModel 6 | { 7 | public string RequestId { get; set; } 8 | 9 | public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/config/serve.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/json-schemas/core-build/serve.schema.json", 3 | "port": 4321, 4 | "https": true, 5 | "initialPage": "https://localhost:5432/workbench", 6 | "api": { 7 | "port": 5432, 8 | "entryPath": "node_modules/@microsoft/sp-webpart-workbench/lib/api/" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Models/TaskViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace MeetingCaptureWebApp.Models 2 | { 3 | public class TaskViewModel 4 | { 5 | public string Title { get; set; } 6 | public string DueDate { get; set; } 7 | public string AssignedTo { get; set; } 8 | public bool Completed { get; set; } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Services/Interfaces/ICommunicationService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | 4 | namespace MeetingCaptureWebApp.Services 5 | { 6 | public interface ICommunicationService 7 | { 8 | public Task CreateOnlineMeeting(string subject, DateTime startDateTime, string organizerId); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/src/webparts/upcomingMeetings/loc/mystrings.d.ts: -------------------------------------------------------------------------------- 1 | declare interface IUpcomingMeetingsWebPartStrings { 2 | PropertyPaneDescription: string; 3 | BasicGroupName: string; 4 | DescriptionFieldLabel: string; 5 | } 6 | 7 | declare module 'UpcomingMeetingsWebPartStrings' { 8 | const strings: IUpcomingMeetingsWebPartStrings; 9 | export = strings; 10 | } 11 | -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/.yo-rc.json: -------------------------------------------------------------------------------- 1 | { 2 | "@microsoft/generator-sharepoint": { 3 | "isCreatingSolution": true, 4 | "environment": "spo", 5 | "version": "1.9.1", 6 | "libraryName": "pending-meetings", 7 | "libraryId": "9550387c-9ba4-4c3f-b377-67ab67dd253f", 8 | "packageManager": "npm", 9 | "isDomainIsolated": false, 10 | "componentType": "webpart" 11 | } 12 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/dialog/styles/dialog.css: -------------------------------------------------------------------------------- 1 | .cke_dialog_open { 2 | overflow: hidden; 3 | } 4 | 5 | .cke_dialog_container { 6 | position: fixed; 7 | overflow-y: auto; 8 | overflow-x: auto; 9 | width: 100%; 10 | height: 100%; 11 | top: 0; 12 | left: 0; 13 | z-index: 10010; 14 | } 15 | 16 | .cke_dialog_body { 17 | position: relative; 18 | } 19 | -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | // Configure glob patterns for excluding files and folders in the file explorer. 4 | "files.exclude": { 5 | "**/.git": true, 6 | "**/.DS_Store": true, 7 | "**/bower_components": true, 8 | "**/coverage": true, 9 | "**/lib-amd": true, 10 | "src/**/*.scss.ts": true 11 | }, 12 | "typescript.tsdk": ".\\node_modules\\typescript\\lib" 13 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebJob/Extension.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace MeetingCaptureWebJob 6 | { 7 | public static class Extension 8 | { 9 | public static DateTime RoundUp(this DateTime dateTime, TimeSpan roundingInterval) 10 | { 11 | return new DateTime(((dateTime.Ticks + roundingInterval.Ticks - 1) / roundingInterval.Ticks) * roundingInterval.Ticks); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Dependency directories 7 | node_modules 8 | 9 | # Build generated files 10 | dist 11 | lib 12 | solution 13 | temp 14 | *.sppkg 15 | 16 | # Coverage directory used by tools like istanbul 17 | coverage 18 | 19 | # OSX 20 | .DS_Store 21 | 22 | # Visual Studio files 23 | .ntvs_analysis.dat 24 | .vs 25 | bin 26 | obj 27 | 28 | # Resx Generated Code 29 | *.resx.ts 30 | 31 | # Styles Generated Code 32 | *.scss.ts 33 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Models/FindAvailableTimesParasModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | 6 | namespace MeetingCaptureWebApp.Models 7 | { 8 | public class FindAvailableTimesParasModel 9 | { 10 | public string[] Mails { get; set; } 11 | public string StartTime { get; set; } 12 | public string EndTime { get; set; } 13 | public int Interval { get; set; } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Services/Interfaces/IUserService.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Graph; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | 5 | namespace MeetingCaptureWebApp.Services 6 | { 7 | public interface IUserService 8 | { 9 | Task GetUserByEmail(string email); 10 | Task> SearchUser(string searchWord); 11 | Task> GetRelevancePeople(string teamId); 12 | Task SendMail(string subject, string[] mails, string content); 13 | Task Me(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Data/Agenda.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel.DataAnnotations; 3 | using System.ComponentModel.DataAnnotations.Schema; 4 | 5 | namespace MeetingCaptureWebApp.Data 6 | { 7 | public class Agenda 8 | { 9 | [Key] 10 | [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 11 | public int Id { get; set; } 12 | public string Title { get; set; } 13 | 14 | public int MeetingId { get; set; } 15 | [ForeignKey("MeetingId")] 16 | public virtual Meeting Meeting { get; set; } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | 8 | [*] 9 | 10 | # change these settings to your own preference 11 | indent_style = space 12 | indent_size = 2 13 | 14 | # we recommend you to keep these unchanged 15 | end_of_line = lf 16 | charset = utf-8 17 | trim_trailing_whitespace = true 18 | insert_final_newline = true 19 | 20 | [*.md] 21 | trim_trailing_whitespace = false 22 | 23 | [{package,bower}.json] 24 | indent_style = space 25 | indent_size = 2 -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebJob/Settings.job: -------------------------------------------------------------------------------- 1 | { 2 | 3 | // Examples: 4 | 5 | // Runs every minute 6 | // "schedule": "0 * * * * *" 7 | 8 | // Runs every 15 minutes 9 | // "schedule": "0 */15 * * * *" 10 | 11 | // Runs every hour (i.e. whenever the count of minutes is 0) 12 | "schedule": "0 * 0/6 * * *" 13 | 14 | // Runs every hour from 9 AM to 5 PM 15 | // "schedule": "0 0 9-17 * * *" 16 | 17 | // Runs at 9:30 AM every day 18 | // "schedule": "0 30 9 * * *" 19 | 20 | // Runs at 9:30 AM every week day 21 | // "schedule": "0 30 9 * * 1-5" 22 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Data/ShowCaseDbContext.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.EntityFrameworkCore; 2 | 3 | namespace MeetingCaptureWebApp.Data 4 | { 5 | 6 | public class ShowCaseDbContext: DbContext 7 | { 8 | public DbSet Meetings { get; set; } 9 | public DbSet Agendas { get; set; } 10 | public DbSet Attendees { get; set; } 11 | public DbSet TaskFiles { get; set; } 12 | public DbSet TeamChannels { get; set; } 13 | public ShowCaseDbContext(DbContextOptions options) : base(options) 14 | { 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Data/TeamChannel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.ComponentModel.DataAnnotations.Schema; 5 | using System.Linq; 6 | using System.Threading.Tasks; 7 | 8 | namespace MeetingCaptureWebApp.Data 9 | { 10 | public class TeamChannel 11 | { 12 | [Key] 13 | public string Id { get; set; } 14 | public string Name { get; set; } 15 | public string FolderId { get; set; } 16 | public string OnenoteSectionId { get; set; } 17 | public string PlanId { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/config.2.0.schema.json", 3 | "version": "2.0", 4 | "bundles": { 5 | "upcoming-meetings-web-part": { 6 | "components": [ 7 | { 8 | "entrypoint": "./lib/webparts/upcomingMeetings/UpcomingMeetingsWebPart.js", 9 | "manifest": "./src/webparts/upcomingMeetings/UpcomingMeetingsWebPart.manifest.json" 10 | } 11 | ] 12 | } 13 | }, 14 | "externals": { 15 | 16 | }, 17 | "localizedResources": { 18 | "UpcomingMeetingsWebPartStrings": "lib/webparts/upcomingMeetings/loc/{locale}.js" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Views/Shared/_TeamsTabLayout.cshtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | MeetingCaptureWebApp 7 | 8 | 9 | 10 | 11 | 12 |
13 | @RenderBody() 14 |
15 | @RenderSection("Scripts", required: false) 16 | 17 | 18 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Services/Interfaces/INotesService.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Graph; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace MeetingCaptureWebApp.Services 8 | { 9 | public interface INotesService 10 | { 11 | Task AddNotes(string teamId, string channelSectionId, string meetingName, string notes); 12 | Task<(OnenotePage meetingNotes, string content)> GetMeetingNotes(string teamId, string pageId); 13 | Task RemoveNotes(string teamId, string pageId); 14 | Task GetChannelSection(string teamId, string channelDisplayName); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) .NET Foundation. All rights reserved. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use 4 | these files except in compliance with the License. You may obtain a copy of the 5 | License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software distributed 10 | under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 11 | CONDITIONS OF ANY KIND, either express or implied. See the License for the 12 | specific language governing permissions and limitations under the License. 13 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Views/Shared/_LoginPartial.cshtml: -------------------------------------------------------------------------------- 1 | @using System.Security.Principal 2 | 3 | 20 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Services/BaseGraphService.cs: -------------------------------------------------------------------------------- 1 | using MeetingCaptureWebApp.Helpers; 2 | using Microsoft.Graph; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using System.Threading.Tasks; 7 | 8 | namespace MeetingCaptureWebApp.Services 9 | { 10 | abstract public class BaseGraphService 11 | { 12 | protected readonly IGraphSdkHelper _graphSdkHelper; 13 | protected GraphServiceClient GraphClient { get; } 14 | public BaseGraphService(IGraphSdkHelper graphSdkHelper) 15 | { 16 | _graphSdkHelper = graphSdkHelper; 17 | GraphClient = _graphSdkHelper.GetAuthenticatedClient(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Extensions/AzureAdOptions.cs: -------------------------------------------------------------------------------- 1 | namespace MeetingCaptureWebApp.Extensions 2 | { 3 | public class AzureAdOptions 4 | { 5 | public string ClientId { get; set; } 6 | 7 | public string ClientSecret { get; set; } 8 | 9 | public string Instance { get; set; } 10 | 11 | public string Domain { get; set; } 12 | 13 | public string TenantId { get; set; } 14 | 15 | public string CallbackPath { get; set; } 16 | 17 | public string BaseUrl { get; set; } 18 | 19 | public string Scopes { get; set; } 20 | 21 | public string GraphResourceId { get; set; } 22 | 23 | public string GraphScopes { get; set; } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Data/TaskFile.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.ComponentModel.DataAnnotations.Schema; 5 | using System.Linq; 6 | using System.Threading.Tasks; 7 | 8 | namespace MeetingCaptureWebApp.Data 9 | { 10 | public class TaskFile 11 | { 12 | [Key] 13 | [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 14 | public int Id { get; set; } 15 | public string Name { get; set; } 16 | public string Location { get; set; } 17 | public int MeetingId { get; set; } 18 | [ForeignKey("MeetingId")] 19 | public virtual Meeting Meeting { get; set; } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Data/MeetingAttendee.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.ComponentModel.DataAnnotations.Schema; 5 | using System.Linq; 6 | using System.Threading.Tasks; 7 | 8 | namespace MeetingCaptureWebApp.Data 9 | { 10 | public class MeetingAttendee 11 | { 12 | [Key] 13 | [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 14 | public int Id { get; set; } 15 | public string Name { get; set; } 16 | public string Email { get; set; } 17 | public int MeetingId { get; set; } 18 | [ForeignKey("MeetingId")] 19 | public virtual Meeting Meeting { get; set; } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/toolbarconfigurator/font/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "css_prefix_text": "icon-", 4 | "css_use_suffix": false, 5 | "hinting": true, 6 | "units_per_em": 1000, 7 | "ascent": 850, 8 | "glyphs": [ 9 | { 10 | "uid": "f48ae54adfb27d8ada53d0fd9e34ee10", 11 | "css": "trash-empty", 12 | "code": 59392, 13 | "src": "fontawesome" 14 | }, 15 | { 16 | "uid": "1c4068ed75209e21af36017df8871802", 17 | "css": "down-big", 18 | "code": 59393, 19 | "src": "fontawesome" 20 | }, 21 | { 22 | "uid": "95376bf082bfec6ce06ea1cda7bd7ead", 23 | "css": "up-big", 24 | "code": 59394, 25 | "src": "fontawesome" 26 | } 27 | ] 28 | } -------------------------------------------------------------------------------- /Deployment/DeployTemplate.ps1: -------------------------------------------------------------------------------- 1 | param( 2 | [Parameter(Mandatory)] 3 | [String]$resourceGroupName = (Read-Host -Prompt "Enter the Resource Group name") 4 | ) 5 | 6 | #central us contains all required resources 7 | $location = "centralus" 8 | 9 | try { 10 | Write-Host "Creating resource group..." -ForegroundColor Green 11 | $resourceGroup = New-AzResourceGroup -Name $resourceGroupName -Location $location 12 | 13 | Write-Host "Deploying resource..." -ForegroundColor Green 14 | $deployedResult =New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName ` 15 | -TemplateFile ".\ARMTemplate.json" ` 16 | -TemplateParameterFile ".\ARMParameters.json" 17 | Write-Host "Completed!" -ForegroundColor Green 18 | } 19 | catch { 20 | Write-Host $_.Exception.Message 21 | Write-Host $_.Exception.ItemName 22 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Services/Interfaces/IFileService.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Graph; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.IO; 5 | using System.Linq; 6 | using System.Security.Claims; 7 | using System.Threading.Tasks; 8 | 9 | namespace MeetingCaptureWebApp.Services 10 | { 11 | public interface IFileService 12 | { 13 | Task GetChannelFolder(string groupId, string channelId); 14 | Task CreateMeetingFolder(string groupId, string channelFolderId, string folderName); 15 | Task UploadFile(string groupId, string folderId, string fileName, Stream fileContent); 16 | Task> GetFiles(string groupId, string folderId); 17 | Task DeleteItems(string groupiId, string itemId); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Services/Interfaces/IPlanTaskService.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Graph; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace MeetingCaptureWebApp.Services 8 | { 9 | public interface IPlanTaskService 10 | { 11 | Task GetOrCreatePlanByChannel(string groupId, string channelId); 12 | Task CreateBucket(string planId, string bucketName); 13 | Task> GetTasksByBucket(string bucketId); 14 | Task> CreatePreReadTaskForEachUser(string planId, string bucketId, string taskTitle, DriveItem uploadFile, DateTime dueDateTime, IEnumerable assigneeIds); 15 | Task DeleteBucket(string bucketId); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebJob/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "ConnectionStrings": { 3 | "DefaultConnection": "Server=tcp:YOUR DATABASE NAME.database.windows.net,1433;Initial Catalog=showcasedemo;Persist Security Info=False;User ID=YOUR USER ID;Password=YOUR PASSWORD;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" 4 | }, 5 | "Logging": { 6 | "LogLevel": { 7 | "Default": "Information", 8 | "Microsoft": "Warning", 9 | "Microsoft.Hosting.Lifetime": "Information" 10 | } 11 | }, 12 | "LogicAppEmailSettings": { 13 | "TriggerUri": "YOUR LOGIC APP TRIGGER URI" 14 | }, 15 | "JobIntervalMin": 360, 16 | "AdvanceMin": 1440, 17 | "TimeRange": 360, 18 | "OriginatorId": "8390d9dc-8d83-4545-9b6e-78ee304e53d9", 19 | "AllowedHosts": "*" 20 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Services/Interfaces/IMeetingService.cs: -------------------------------------------------------------------------------- 1 | using MeetingCaptureWebApp.Data; 2 | using Microsoft.AspNetCore.Http; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Threading.Tasks; 6 | 7 | namespace MeetingCaptureWebApp.Services 8 | { 9 | public interface IMeetingService 10 | { 11 | Task CreateOrGetChannelInfo(string channelId, string teamId); 12 | Task InitializeMeeting(string title, string teamId, TeamChannel channel, DateTime date, string[] agendas); 13 | Task SetupMeetingEvent(string title, DateTime start, DateTime end, Meeting meeting, TeamChannel channel, IFormFile[] files, string[] attendees); 14 | Task RemoveMeetingEvent(string eventId, string teamId, bool removeNotePage = true); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Controllers/AuthController.cs: -------------------------------------------------------------------------------- 1 | using MeetingCaptureWebApp.Helpers; 2 | using Microsoft.AspNetCore.Mvc; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using System.Threading.Tasks; 7 | 8 | namespace MeetingCaptureWebApp.Controllers 9 | { 10 | public class AuthController : Controller 11 | { 12 | private readonly IGraphSdkHelper _graphSdkHelper; 13 | public AuthController(IGraphSdkHelper graphSdkHelper) 14 | { 15 | _graphSdkHelper = graphSdkHelper; 16 | } 17 | 18 | [HttpPost] 19 | public IActionResult UpdateCachedAssertion([FromQuery] string userObjectId) 20 | { 21 | _graphSdkHelper.UpdateAssertion(userObjectId); 22 | return Ok(); 23 | } 24 | 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:60894", 7 | "sslPort": 44359 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "environmentVariables": { 15 | "ASPNETCORE_ENVIRONMENT": "Development" 16 | } 17 | }, 18 | "MeetingCaptureWebApp": { 19 | "commandName": "Project", 20 | "launchBrowser": true, 21 | "applicationUrl": "https://localhost:5001;http://localhost:5000", 22 | "environmentVariables": { 23 | "ASPNETCORE_ENVIRONMENT": "Development" 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Models/FollowUpMeetingsViewModel.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Graph; 2 | using System.Collections.Generic; 3 | 4 | namespace MeetingCaptureWebApp.Models 5 | { 6 | public class FollowUpMeetingsViewModel 7 | { 8 | public string MeetingTitle { get; set; } 9 | public string TeamId { get; set; } 10 | public string ChannelId { get; set; } 11 | public IEnumerable Agendas { get; set; } 12 | public IEnumerable Attendees { get; set; } 13 | public IEnumerable Attachments { get; set; } 14 | public string Start { get; set; } 15 | public string End { get; set; } 16 | public string PlannerId { get; set; } 17 | public string BucketId { get; set; } 18 | public string NoteContent { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Views/Test/Index.cshtml: -------------------------------------------------------------------------------- 1 | 3 | 4 | @{ 5 | ViewData["Title"] = "Home Page"; 6 | } 7 | 8 |

Microsoft Graph ASP.NET Core 2.1 Connect Sample

9 | 10 | @if (!User.Identity.IsAuthenticated) 11 | { 12 |
13 |

Choose Sign in at the top of the page and sign in with your work or school account.

14 | } 15 | @if (User.Identity.IsAuthenticated) 16 | { 17 | 20 |
21 |
22 |
@ViewData["Response"]
23 |
24 | } -------------------------------------------------------------------------------- /Deployment/ARMParameters.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", 3 | "contentVersion": "1.0.0.0", 4 | "parameters": { 5 | "webAppName":{ 6 | "value":"" 7 | }, 8 | "customHostname": { 9 | "value":"" 10 | }, 11 | "sqlAdministratorLogin": { 12 | "value": "" 13 | }, 14 | "sqlAdministratorLoginPassword": { 15 | "value": "" 16 | }, 17 | "sqlDatabaseName": { 18 | "value": "" 19 | }, 20 | "actionMessageOriginatorId": { 21 | "value": "" 22 | }, 23 | "clientId": { 24 | "value": "" 25 | }, 26 | "clientSecret": { 27 | "value": "" 28 | }, 29 | "tenantId": { 30 | "value": "" 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Controllers/TemplatesController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | using System.Linq; 3 | 4 | namespace MeetingCaptureWebApp.Controllers 5 | { 6 | public class TemplatesController : Controller 7 | { 8 | public IActionResult Invitation() 9 | { 10 | return View(); 11 | } 12 | 13 | public IActionResult MeetingCreated() 14 | { 15 | return View(); 16 | } 17 | 18 | public static string GetAbbreviation(string displayName) 19 | { 20 | if (displayName.Split(' ').Length >= 2) 21 | { 22 | var array = displayName.Split(' '); 23 | 24 | return array[0].First().ToString().ToUpper() + array[1].First().ToString().ToUpper(); 25 | } 26 | 27 | return displayName.Substring(0, 2).ToUpper(); 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Services/Interfaces/ICalendarService.cs: -------------------------------------------------------------------------------- 1 | using MeetingCaptureWebApp.Data; 2 | using Microsoft.Graph; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using System.Threading.Tasks; 7 | 8 | namespace MeetingCaptureWebApp.Services 9 | { 10 | public interface ICalendarService 11 | { 12 | Task SearchAvailableTime(string[] emails, string start, string end, int interval); 13 | Task GetEvent(string teamId, string eventId); 14 | Task> GetUpcomingLatestMeeting(string teamId, string channelId); 15 | Task CreateEvent(string subject, DateTimeTimeZone startTime, DateTimeTimeZone endTime, string htmlContent, IEnumerable attendees, Meeting meeting, string bucketId); 16 | Task DeleteEventById(string teamId, string eventId); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/old/sample_posteddata.php: -------------------------------------------------------------------------------- 1 |
 2 | 
 3 | -------------------------------------------------------------------------------------------
 4 |   CKEditor - Posted Data
 5 | 
 6 |   We are sorry, but your Web server does not support the PHP language used in this script.
 7 | 
 8 |   Please note that CKEditor can be used with any other server-side language than just PHP.
 9 |   To save the content created with CKEditor you need to read the POST data on the server
10 |   side and write it to a file or the database.
11 | 
12 |   Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
13 |   For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
14 | -------------------------------------------------------------------------------------------
15 | 
16 | 
*/ include "assets/posteddata.php"; ?> 17 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Models/EmailTemplateViewModel.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Graph; 2 | using System; 3 | using System.Collections.Generic; 4 | 5 | namespace MeetingCaptureWebApp.Models 6 | { 7 | public class EmailTemplateViewModel 8 | { 9 | public string Title { get; set; } 10 | 11 | public string MeetingDate { get; set; } 12 | 13 | public IEnumerable Agendas { get; set; } 14 | 15 | public IEnumerable Attachments { get; set; } 16 | 17 | public IEnumerable Users { get; set; } 18 | 19 | public IEnumerable Tasks { get; set; } 20 | 21 | public DateTimeOffset Start { get; set; } 22 | 23 | public DateTimeOffset End { get; set; } 24 | 25 | public string NoteContent { get; set; } 26 | 27 | public string NoteUri { get; set; } 28 | 29 | public string JoinUrl { get; set; } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/toolbarconfigurator/lib/codemirror/show-hint.css: -------------------------------------------------------------------------------- 1 | .CodeMirror-hints { 2 | position: absolute; 3 | z-index: 10; 4 | overflow: hidden; 5 | list-style: none; 6 | 7 | margin: 0; 8 | padding: 2px; 9 | 10 | -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); 11 | -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); 12 | box-shadow: 2px 3px 5px rgba(0,0,0,.2); 13 | border-radius: 3px; 14 | border: 1px solid silver; 15 | 16 | background: white; 17 | font-size: 90%; 18 | font-family: monospace; 19 | 20 | max-height: 20em; 21 | overflow-y: auto; 22 | } 23 | 24 | .CodeMirror-hint { 25 | margin: 0; 26 | padding: 0 4px; 27 | border-radius: 2px; 28 | max-width: 19em; 29 | overflow: hidden; 30 | white-space: pre; 31 | color: black; 32 | cursor: pointer; 33 | } 34 | 35 | li.CodeMirror-hint-active { 36 | background: #08f; 37 | color: white; 38 | } 39 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/js/index.js: -------------------------------------------------------------------------------- 1 | var createMeetingDialogHtmlElement = document.getElementById('createMeetingDialog'); 2 | var createMeetingDialog = new fabric['Dialog'](createMeetingDialogHtmlElement); 3 | 4 | function goToNewMeetingPage() { 5 | TeamsHelper.get(function (teamContext) { 6 | location.href = `/MeetingCapture/newMeeting`; 7 | }); 8 | } 9 | 10 | (function () { 11 | TeamsHelper.get(function (teamContext) { 12 | $.getJSON(`/MeetingCapture/GetUpcomingEvents?teamId=${encodeURIComponent(teamContext.teamId)}&channelId=${encodeURIComponent(teamContext.channelId)}`, function (result) { 13 | if (result.count > 0) { 14 | location.href = `/MeetingCapture/upcomingMeetings`; 15 | } 16 | else { 17 | createMeetingDialog.open(); 18 | $('#btnNewMeeting').show(); 19 | } 20 | }); 21 | }); 22 | }()); -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@microsoft/sp-tslint-rules/base-tslint.json", 3 | "rules": { 4 | "class-name": false, 5 | "export-name": false, 6 | "forin": false, 7 | "label-position": false, 8 | "member-access": true, 9 | "no-arg": false, 10 | "no-console": false, 11 | "no-construct": false, 12 | "no-duplicate-variable": true, 13 | "no-eval": false, 14 | "no-function-expression": true, 15 | "no-internal-module": true, 16 | "no-shadowed-variable": true, 17 | "no-switch-case-fall-through": true, 18 | "no-unnecessary-semicolons": true, 19 | "no-unused-expression": true, 20 | "no-use-before-declare": true, 21 | "no-with-statement": true, 22 | "semicolon": true, 23 | "trailing-comma": false, 24 | "typedef": false, 25 | "typedef-whitespace": false, 26 | "use-named-parameter": true, 27 | "variable-name": false, 28 | "whitespace": false 29 | } 30 | } -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./node_modules/@microsoft/rush-stack-compiler-2.9/includes/tsconfig-web.json", 3 | "compilerOptions": { 4 | "target": "es5", 5 | "forceConsistentCasingInFileNames": true, 6 | "module": "esnext", 7 | "moduleResolution": "node", 8 | "jsx": "react", 9 | "declaration": true, 10 | "sourceMap": true, 11 | "experimentalDecorators": true, 12 | "skipLibCheck": true, 13 | "outDir": "lib", 14 | "inlineSources": false, 15 | "strictNullChecks": false, 16 | "noUnusedLocals": false, 17 | "typeRoots": [ 18 | "./node_modules/@types", 19 | "./node_modules/@microsoft" 20 | ], 21 | "types": [ 22 | "es6-promise", 23 | "webpack-env" 24 | ], 25 | "lib": [ 26 | "es5", 27 | "dom", 28 | "es2015.collection" 29 | ] 30 | }, 31 | "include": [ 32 | "src/**/*.ts" 33 | ], 34 | "exclude": [ 35 | "node_modules", 36 | "lib" 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Views/Shared/Error.cshtml: -------------------------------------------------------------------------------- 1 | @model ErrorViewModel 2 | @{ 3 | ViewData["Title"] = "Error"; 4 | } 5 | 6 |

Error.

7 |

An error occurred while processing your request.

8 | 9 | @if (Model.ShowRequestId) 10 | { 11 |

12 | Request ID: @Model.RequestId 13 |

14 | } 15 | 16 |

Development Mode

17 |

18 | Swapping to Development environment will display more detailed information about the error that occurred. 19 |

20 |

21 | The Development environment shouldn't be enabled for deployed applications. 22 | It can result in displaying sensitive information from exceptions to end users. 23 | For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development 24 | and restarting the app. 25 |

26 | -------------------------------------------------------------------------------- /azure-pipelines.yml: -------------------------------------------------------------------------------- 1 | # ASP.NET 2 | # Build and test ASP.NET projects. 3 | # Add steps that publish symbols, save build artifacts, deploy, and more: 4 | # https://docs.microsoft.com/azure/devops/pipelines/apps/aspnet/build-aspnet-4 5 | 6 | trigger: 7 | - master 8 | 9 | pool: 10 | vmImage: 'windows-latest' 11 | 12 | variables: 13 | solution: '**/*.sln' 14 | buildPlatform: 'Any CPU' 15 | buildConfiguration: 'Release' 16 | 17 | steps: 18 | - task: NuGetToolInstaller@1 19 | 20 | - task: NuGetCommand@2 21 | inputs: 22 | restoreSolution: '$(solution)' 23 | 24 | - task: VSBuild@1 25 | inputs: 26 | solution: '$(solution)' 27 | msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)"' 28 | platform: '$(buildPlatform)' 29 | configuration: '$(buildConfiguration)' 30 | 31 | - task: VSTest@2 32 | inputs: 33 | platform: '$(buildPlatform)' 34 | configuration: '$(buildConfiguration)' 35 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "ConnectionStrings": { 3 | "DefaultConnection": "" 4 | }, 5 | "AzureAd": { 6 | "TenantId": "0534985e-032e-430a-9b95-60f5277b96f4", 7 | "ClientId": "b51680be-9b31-4927-9e3e-fa8024a7d98e", 8 | "ClientSecret": ":6f0z=bCFU5ccwLYe=dW_gv7?Bi:xvo/", 9 | "CallbackPath": "/signin-oidc", 10 | 11 | "BaseUrl": "https://localhost:44359", 12 | "Scopes": "openid email profile offline_access", 13 | "GraphResourceId": "https://graph.microsoft.com/", 14 | "GraphScopes": "User.Read User.Read.All Calendars.Read People.Read People.Read.All Contacts.Read Group.ReadWrite.All Notes.Create Notes.ReadWrite Notes.ReadWrite.All Mail.Send", 15 | "TeamTabResource": "fy19teams.canvizsite.tk/b51680be-9b31-4927-9e3e-fa8024a7d98e" 16 | }, 17 | "Logging": { 18 | "LogLevel": { 19 | "Default": "Information", 20 | "Microsoft": "Warning", 21 | "Microsoft.Hosting.Lifetime": "Information" 22 | } 23 | }, 24 | "AllowedHosts": "*" 25 | } 26 | -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/config/package-solution.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/package-solution.schema.json", 3 | "solution": { 4 | "name": "pending-meetings-client-side-solution", 5 | "id": "9550387c-9ba4-4c3f-b377-67ab67dd253f", 6 | "version": "1.0.6.0", 7 | "includeClientSideAssets": true, 8 | "skipFeatureDeployment": true, 9 | "webApiPermissionRequests": [ 10 | { 11 | "resource": "Microsoft Graph", 12 | "scope": "User.Read" 13 | }, 14 | { 15 | "resource": "Microsoft Graph", 16 | "scope": "User.ReadBasic.All" 17 | }, 18 | { 19 | "resource": "Microsoft Graph", 20 | "scope": "People.Read" 21 | }, 22 | { 23 | "resource": "Microsoft Graph", 24 | "scope": "Calendars.Read" 25 | }, 26 | { 27 | "resource": "Microsoft Graph", 28 | "scope": "Group.Read.All" 29 | } 30 | ] 31 | }, 32 | "paths": { 33 | "zippedPackage": "solution/pending-meetings.sppkg" 34 | } 35 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/toolbarconfigurator/lib/codemirror/neo.css: -------------------------------------------------------------------------------- 1 | /* neo theme for codemirror */ 2 | 3 | /* Color scheme */ 4 | 5 | .cm-s-neo.CodeMirror { 6 | background-color:#ffffff; 7 | color:#2e383c; 8 | line-height:1.4375; 9 | } 10 | .cm-s-neo .cm-comment {color:#75787b} 11 | .cm-s-neo .cm-keyword, .cm-s-neo .cm-property {color:#1d75b3} 12 | .cm-s-neo .cm-atom,.cm-s-neo .cm-number {color:#75438a} 13 | .cm-s-neo .cm-node,.cm-s-neo .cm-tag {color:#9c3328} 14 | .cm-s-neo .cm-string {color:#b35e14} 15 | .cm-s-neo .cm-variable,.cm-s-neo .cm-qualifier {color:#047d65} 16 | 17 | 18 | /* Editor styling */ 19 | 20 | .cm-s-neo pre { 21 | padding:0; 22 | } 23 | 24 | .cm-s-neo .CodeMirror-gutters { 25 | border:none; 26 | border-right:10px solid transparent; 27 | background-color:transparent; 28 | } 29 | 30 | .cm-s-neo .CodeMirror-linenumber { 31 | padding:0; 32 | color:#e0e2e5; 33 | } 34 | 35 | .cm-s-neo .CodeMirror-guttermarker { color: #1d75b3; } 36 | .cm-s-neo .CodeMirror-guttermarker-subtle { color: #e0e2e5; } 37 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Data/Meeting.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.ComponentModel.DataAnnotations.Schema; 5 | 6 | namespace MeetingCaptureWebApp.Data 7 | { 8 | public class Meeting 9 | { 10 | [Key] 11 | [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 12 | public int Id { get; set; } 13 | public string EventId { get; set; } 14 | public string TeamId { get; set; } 15 | public string ChannelId { get; set; } 16 | public string FolderId { get; set; } 17 | public string BucketId { get; set; } 18 | public string NoteId { get; set; } 19 | public string NoteTitle { get; set; } 20 | public DateTime? StartTime { get; set; } 21 | 22 | [Required] 23 | public ICollection Agendas { get; set; } 24 | [Required] 25 | public ICollection TaskFiles { get; set; } 26 | [Required] 27 | public ICollection Attendees { get; set; } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Services/Interfaces/IMeetingDBService.cs: -------------------------------------------------------------------------------- 1 | using MeetingCaptureWebApp.Data; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace MeetingCaptureWebApp.Services 8 | { 9 | public interface IMeetingDBService 10 | { 11 | Task GetMeetingById(int id); 12 | Task GetMeetingByEventId(string eventId); 13 | Task> GetMeetingByTimeRange(DateTime startTime, DateTime endTime); 14 | 15 | Task UpdateMeeting(Meeting meeting); 16 | Task UpdateMeeting(Meeting meeting, IList meetingAttendees, IList taskFiles); 17 | Task DeleteMeeting(Meeting meeting); 18 | Task AddMeeting(Meeting meeting); 19 | IList ListMeetings(string teamId, string channelId); 20 | string GenerateMeetingHtmlMeetingBody(Meeting meeting, string ogId); 21 | 22 | Task GetChannelById(string channelId); 23 | Task AddChannel(TeamChannel teamChannel); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Views/MeetingCapture/index.cshtml: -------------------------------------------------------------------------------- 1 |
2 | 3 | 6 |
7 | 8 |
9 |
10 |

No upcoming meetings are set up for this channel, do you want to make one?

11 |
12 |
13 | 16 | 19 |
20 |
21 | 22 | @section Scripts { 23 | 24 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Microsoft Graph 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 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/old/dialog/assets/my_dialog.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. 3 | * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license 4 | */ 5 | 6 | CKEDITOR.dialog.add( 'myDialog', function() { 7 | return { 8 | title: 'My Dialog', 9 | minWidth: 400, 10 | minHeight: 200, 11 | contents: [ 12 | { 13 | id: 'tab1', 14 | label: 'First Tab', 15 | title: 'First Tab', 16 | elements: [ 17 | { 18 | id: 'input1', 19 | type: 'text', 20 | label: 'Text Field' 21 | }, 22 | { 23 | id: 'select1', 24 | type: 'select', 25 | label: 'Select Field', 26 | items: [ 27 | [ 'option1', 'value1' ], 28 | [ 'option2', 'value2' ] 29 | ] 30 | } 31 | ] 32 | }, 33 | { 34 | id: 'tab2', 35 | label: 'Second Tab', 36 | title: 'Second Tab', 37 | elements: [ 38 | { 39 | id: 'button1', 40 | type: 'button', 41 | label: 'Button Field' 42 | } 43 | ] 44 | } 45 | ] 46 | }; 47 | } ); 48 | 49 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Controllers/TabController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Mvc; 6 | using MeetingCaptureWebApp.Models; 7 | using MeetingCaptureWebApp.Services; 8 | 9 | namespace MeetingCaptureWebApp.Controllers 10 | { 11 | public class TabController : Controller 12 | { 13 | private readonly IMeetingService _meetingService; 14 | public TabController(IMeetingService meetingService) 15 | { 16 | _meetingService = meetingService; 17 | } 18 | 19 | [Route("configure")] 20 | public IActionResult Configure() 21 | { 22 | return View(); 23 | } 24 | [Route("DeleteEvents")] 25 | public IActionResult DeleteEvents() 26 | { 27 | return View(); 28 | } 29 | [HttpPost] 30 | public async Task DeleteMeeting([FromQuery]string eventId, [FromQuery]string teamId) 31 | { 32 | await _meetingService.RemoveMeetingEvent(eventId, teamId, true); 33 | return Ok(); 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/PublishWebapp.ps1: -------------------------------------------------------------------------------- 1 | param( 2 | [Parameter(Mandatory)] 3 | [String]$ResourceGroupName, 4 | [Parameter(Mandatory)] 5 | [String]$WebAppName 6 | ) 7 | 8 | $currentPath = Get-Location 9 | 10 | Remove-item .\output -Recurse -Force -Confirm:$false 11 | #publish webapp 12 | Write-Host "Building WebApp..." -ForegroundColor "Green" 13 | dotnet publish .\MeetingCaptureWebApp\MeetingCaptureWebApp.csproj -c Release -o .\output 14 | 15 | #publish webjob 16 | Write-Host "Building WebJob..." -ForegroundColor "Green" 17 | dotnet publish .\MeetingCaptureWebJob\MeetingCaptureWebJob.csproj -c Release -o .\output\app_data\jobs\triggered\sendmail 18 | 19 | Write-Host "Packing WebApp..." -ForegroundColor "Green" 20 | Compress-Archive ".\output\*" -DestinationPath ".\output\webpackage.zip" 21 | 22 | try { 23 | Write-Host "Publishing WebApp..." -ForegroundColor "Green" 24 | Publish-AzWebApp -ResourceGroupName $ResourceGroupName -Name $WebAppName -ArchivePath "$currentPath\output\webpackage.zip" -Confirm:$false -Force > $null 25 | Write-Host "Completed!" -ForegroundColor "Green" 26 | } 27 | catch { 28 | Write-Host $_.Exception.Message 29 | Write-Host $_.Exception.ItemName 30 | } -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/PublishWebpart.ps1: -------------------------------------------------------------------------------- 1 | param( 2 | [Parameter(Mandatory)] 3 | [String]$orgName, 4 | [Parameter(Mandatory)] 5 | [String]$adminUPN 6 | ) 7 | 8 | $filePath = "./sharepoint/solution/pending-meetings.sppkg"; 9 | 10 | #Connect to Tenant site 11 | write-host "Connecting to "https://$orgName.sharepoint.com"..." -Foreground "Green" 12 | $userCredential = Get-Credential -UserName $adminUPN -Message "Type the password." 13 | Connect-PnPOnline -Url https://$orgName.sharepoint.com -Credentials $userCredential 14 | 15 | #Check if webpart is deployed 16 | write-host "Checking if webpart is deployed already..." -Foreground "Green" 17 | $app = Get-PnPApp|Where-Object {$_.Title -eq "pending-meetings-client-side-solution"} 18 | if ($null -ne $app) 19 | { 20 | Write-Host "Removing deployed webpart..." -Foreground "Green" 21 | Unpublish-PnPApp -Identity $app.Id 22 | Uninstall-PnPApp -Identity $app.Id 23 | Remove-PnPApp -Identity $app.Id 24 | } 25 | 26 | Write-Host "Deploying webpart..." -Foreground "Green" 27 | $app = Add-PnPApp -Path $filePath -Publish -Overwrite 28 | Write-Host "Syncing to Teams" -Foreground "Green" 29 | Sync-PnPAppToTeams -Identity $app.Id 30 | 31 | write-host "Complete!" -Foreground "Green" 32 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/jquery-validation/LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | ===================== 3 | 4 | Copyright Jörn Zaefferer 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in 14 | all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/toolbarconfigurator/lib/codemirror/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (C) 2014 by Marijn Haverbeke and others 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/bootstrap/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2011-2018 Twitter, Inc. 4 | Copyright (c) 2011-2018 The Bootstrap Authors 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in 14 | all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/src/webparts/upcomingMeetings/UpcomingMeetingsWebPart.manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", 3 | "id": "55366f15-df34-42b0-b484-8fe6d6f42c4a", 4 | "alias": "UpcomingMeetingsWebPart", 5 | "componentType": "WebPart", 6 | 7 | // The "*" signifies that the version should be taken from the package.json 8 | "version": "*", 9 | "manifestVersion": 2, 10 | 11 | // If true, the component can only be installed on sites where Custom Script is allowed. 12 | // Components that allow authors to embed arbitrary script code should set this to true. 13 | // https://support.office.com/en-us/article/Turn-scripting-capabilities-on-or-off-1f2c515f-5d7e-448a-9fd7-835da935584f 14 | "requiresCustomScript": false, 15 | "supportedHosts": ["SharePointWebPart", "TeamsTab"], 16 | 17 | "preconfiguredEntries": [{ 18 | "groupId": "5c03119e-3074-46fd-976b-c60198311f72", // Other 19 | "group": { "default": "Other" }, 20 | "title": { "default": "PendingMeetings" }, 21 | "description": { "default": "PendingMeetings description" }, 22 | "officeFabricIconFontName": "Page", 23 | "properties": { 24 | "description": "PendingMeetings", 25 | "teamId":"", 26 | "channelId":"" 27 | } 28 | }] 29 | } 30 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Models/NewMeetingViewModel.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Http; 2 | using Newtonsoft.Json; 3 | using System; 4 | using System.Collections.Generic; 5 | 6 | namespace MeetingCaptureWebApp.Models 7 | { 8 | public class NewMeetingViewModel 9 | { 10 | public string Subject { get; set; } 11 | 12 | public DateTime Start { get; set; } 13 | 14 | public DateTime End { get; set; } 15 | 16 | public IEnumerable Attachments { get; set; } 17 | 18 | public string AgendaJSONString 19 | { 20 | get => JsonConvert.SerializeObject(Agendas); 21 | set 22 | { 23 | Agendas = JsonConvert.DeserializeObject>(value); 24 | } 25 | } 26 | internal IEnumerable Agendas { get; set; } 27 | 28 | public string AttendeesJSONString 29 | { 30 | get => JsonConvert.SerializeObject(Attendees); 31 | set 32 | { 33 | Attendees = JsonConvert.DeserializeObject>(value); 34 | } 35 | } 36 | 37 | internal IEnumerable Attendees { get; set; } 38 | 39 | public string TeamId { get; set; } 40 | 41 | public string ChannelId { get; set; } 42 | 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Controllers/TestController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Security.Claims; 5 | using System.Threading.Tasks; 6 | using MeetingCaptureWebApp.Helpers; 7 | using MeetingCaptureWebApp.Services; 8 | using Microsoft.AspNetCore.Authorization; 9 | using Microsoft.AspNetCore.Hosting; 10 | using Microsoft.AspNetCore.Mvc; 11 | using Microsoft.Extensions.Configuration; 12 | 13 | namespace MeetingCaptureWebApp.Controllers 14 | { 15 | public class TestController : Controller 16 | { 17 | private readonly IGraphSdkHelper _graphSdkHelper; 18 | private readonly INotesService _notesService; 19 | 20 | public TestController(IGraphSdkHelper graphSdkHelper, INotesService notesService) 21 | { 22 | _graphSdkHelper = graphSdkHelper; 23 | _notesService = notesService; 24 | } 25 | 26 | [Authorize] 27 | public IActionResult Index(string email) 28 | { 29 | if (User.Identity.IsAuthenticated) 30 | { 31 | //ViewData["Response"] = await GraphService.GetUserJson(, email, HttpContext); 32 | } 33 | 34 | return View(); 35 | } 36 | 37 | [Authorize] 38 | public IActionResult MgtTest() 39 | { 40 | return View(); 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebJob/MeetingCaptureWebJob.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | Exe 4 | netcoreapp3.0 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | PreserveNewest 21 | 22 | 23 | Always 24 | 25 | 26 | -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pending-meetings", 3 | "version": "0.0.1", 4 | "private": true, 5 | "main": "lib/index.js", 6 | "engines": { 7 | "node": ">=0.10.0" 8 | }, 9 | "scripts": { 10 | "build": "gulp bundle", 11 | "clean": "gulp clean", 12 | "test": "gulp test" 13 | }, 14 | "dependencies": { 15 | "@microsoft/mgt": "file:mgt/microsoft-mgt-1.0.0.tgz", 16 | "@microsoft/sp-core-library": "1.9.1", 17 | "@microsoft/sp-lodash-subset": "1.9.1", 18 | "@microsoft/sp-office-ui-fabric-core": "^1.9.1", 19 | "@microsoft/sp-webpart-base": "1.9.1", 20 | "@types/es6-promise": "0.0.33", 21 | "@types/react": "16.8.8", 22 | "@types/react-dom": "16.8.3", 23 | "@types/webpack-env": "1.13.1", 24 | "immutability-helper": "^2.5.0", 25 | "office-ui-fabric-react": "^6.189.2", 26 | "react": "16.8.5", 27 | "react-dom": "16.8.5" 28 | }, 29 | "resolutions": { 30 | "@types/react": "16.8.8" 31 | }, 32 | "devDependencies": { 33 | "@microsoft/microsoft-graph-types": "^1.10.0", 34 | "@microsoft/rush-stack-compiler-2.9": "0.7.16", 35 | "@microsoft/sp-build-web": "1.9.1", 36 | "@microsoft/sp-module-interfaces": "1.9.1", 37 | "@microsoft/sp-tslint-rules": "1.9.1", 38 | "@microsoft/sp-webpart-workbench": "1.9.1", 39 | "@types/chai": "3.4.34", 40 | "@types/mocha": "2.2.38", 41 | "ajv": "~5.2.2", 42 | "gulp": "~3.9.1" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Manifest/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", 3 | "manifestVersion": "1.5", 4 | "version": "1.0", 5 | "id": "b9cc7986-dd56-4b57-ab7d-9c4e5288b775", 6 | "packageName": "com.fy19teams.com", 7 | "developer": { 8 | "name": "canviz", 9 | "websiteUrl": "https://www.canviz.com", 10 | "privacyUrl": "https://www.canviz.com", 11 | "termsOfUseUrl": "https://www.canviz.com" 12 | }, 13 | "name": { 14 | "short": "Meeting Capture Web", 15 | "full": "Meeting Capture Web for Teams" 16 | }, 17 | "description": { 18 | "short": "Meeting Capture Web", 19 | "full": "Meeting Capture Web" 20 | }, 21 | "icons": { 22 | "outline": "outline.png", 23 | "color": "color.png" 24 | }, 25 | "accentColor": "#ffffff", 26 | "configurableTabs": [ 27 | { 28 | "configurationUrl": "https://fy19teams.canvizsite.tk/configure/", 29 | "canUpdateConfiguration": true, 30 | "scopes": [ 31 | "team", 32 | "groupchat" 33 | ] 34 | } 35 | ], 36 | "permissions": [ 37 | "messageTeamMembers", 38 | "identity" 39 | ], 40 | "validDomains": [ 41 | "fy19teams.canvizsite.tk" 42 | ], 43 | "webApplicationInfo": { 44 | "id": "b51680be-9b31-4927-9e3e-fa8024a7d98e", 45 | "resource": "api://fy19teams.canvizsite.tk/b51680be-9b31-4927-9e3e-fa8024a7d98e" 46 | } 47 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. 3 | * For licensing, see https://ckeditor.com/legal/ckeditor-oss-license 4 | */ 5 | 6 | CKEDITOR.editorConfig = function( config ) { 7 | // Define changes to default configuration here. 8 | // For complete reference see: 9 | // https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html 10 | 11 | // The toolbar groups arrangement, optimized for a single toolbar row. 12 | config.toolbarGroups = [ 13 | { name: 'document', groups: [ 'mode', 'document', 'doctools' ] }, 14 | { name: 'clipboard', groups: [ 'clipboard', 'undo' ] }, 15 | { name: 'editing', groups: [ 'find', 'selection', 'spellchecker' ] }, 16 | { name: 'forms' }, 17 | { name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] }, 18 | { name: 'paragraph', groups: [ 'list', 'indent', 'blocks', 'align', 'bidi' ] }, 19 | { name: 'links' }, 20 | { name: 'insert' }, 21 | { name: 'styles' }, 22 | { name: 'colors' }, 23 | { name: 'tools' }, 24 | { name: 'others' }, 25 | { name: 'about' } 26 | ]; 27 | 28 | // The default plugins included in the basic setup define some buttons that 29 | // are not needed in a basic editor. They are removed here. 30 | config.removeButtons = 'Cut,Copy,Paste,Undo,Redo,Anchor,Underline,Strike,Subscript,Superscript'; 31 | 32 | // Dialog windows are also simplified. 33 | config.removeDialogTabs = 'link:advanced'; 34 | }; 35 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/old/assets/uilanguages/languages.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. 3 | For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license 4 | */ 5 | var CKEDITOR_LANGS=function(){var c={af:"Afrikaans",ar:"Arabic",az:"Azerbaijani",bg:"Bulgarian",bn:"Bengali/Bangla",bs:"Bosnian",ca:"Catalan",cs:"Czech",cy:"Welsh",da:"Danish",de:"German","de-ch":"German (Switzerland)",el:"Greek",en:"English","en-au":"English (Australia)","en-ca":"English (Canadian)","en-gb":"English (United Kingdom)",eo:"Esperanto",es:"Spanish","es-mx":"Spanish (Mexico)",et:"Estonian",eu:"Basque",fa:"Persian",fi:"Finnish",fo:"Faroese",fr:"French","fr-ca":"French (Canada)",gl:"Galician", 6 | gu:"Gujarati",he:"Hebrew",hi:"Hindi",hr:"Croatian",hu:"Hungarian",id:"Indonesian",is:"Icelandic",it:"Italian",ja:"Japanese",ka:"Georgian",km:"Khmer",ko:"Korean",ku:"Kurdish",lt:"Lithuanian",lv:"Latvian",mk:"Macedonian",mn:"Mongolian",ms:"Malay",nb:"Norwegian Bokmal",nl:"Dutch",no:"Norwegian",oc:"Occitan",pl:"Polish",pt:"Portuguese (Portugal)","pt-br":"Portuguese (Brazil)",ro:"Romanian",ru:"Russian",si:"Sinhala",sk:"Slovak",sq:"Albanian",sl:"Slovenian",sr:"Serbian (Cyrillic)","sr-latn":"Serbian (Latin)", 7 | sv:"Swedish",th:"Thai",tr:"Turkish",tt:"Tatar",ug:"Uighur",uk:"Ukrainian",vi:"Vietnamese",zh:"Chinese Traditional","zh-cn":"Chinese Simplified"},b=[],a;for(a in CKEDITOR.lang.languages)b.push({code:a,name:c[a]||a});b.sort(function(a,b){return a.name//samples/index.html 36 | 37 | For example: 38 | 39 | http://www.example.com/ckeditor/samples/index.html 40 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/MeetingCaptureWebApp.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp3.0 5 | aspnet-MeetingCaptureWebApp-9142664a-df65-495a-aa78-9d290795b709 6 | 1 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | all 16 | runtime; build; native; contentfiles; analyzers; buildtransitive 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | /** 3 | * Install Chrome Debugger Extension for Visual Studio Code to debug your components with the 4 | * Chrome browser: https://aka.ms/spfx-debugger-extensions 5 | */ 6 | "version": "0.2.0", 7 | "configurations": [{ 8 | "name": "Local workbench", 9 | "type": "chrome", 10 | "request": "launch", 11 | "url": "https://localhost:4321/temp/workbench.html", 12 | "webRoot": "${workspaceRoot}", 13 | "sourceMaps": true, 14 | "sourceMapPathOverrides": { 15 | "webpack:///.././src/*": "${webRoot}/src/*", 16 | "webpack:///../../../src/*": "${webRoot}/src/*", 17 | "webpack:///../../../../src/*": "${webRoot}/src/*", 18 | "webpack:///../../../../../src/*": "${webRoot}/src/*" 19 | }, 20 | "runtimeArgs": [ 21 | "--remote-debugging-port=9222" 22 | ] 23 | }, 24 | { 25 | "name": "Hosted workbench", 26 | "type": "chrome", 27 | "request": "launch", 28 | "url": "https://enter-your-SharePoint-site/_layouts/workbench.aspx", 29 | "webRoot": "${workspaceRoot}", 30 | "sourceMaps": true, 31 | "sourceMapPathOverrides": { 32 | "webpack:///.././src/*": "${webRoot}/src/*", 33 | "webpack:///../../../src/*": "${webRoot}/src/*", 34 | "webpack:///../../../../src/*": "${webRoot}/src/*", 35 | "webpack:///../../../../../src/*": "${webRoot}/src/*" 36 | }, 37 | "runtimeArgs": [ 38 | "--remote-debugging-port=9222", 39 | "-incognito" 40 | ] 41 | } 42 | ] 43 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/old/assets/posteddata.php: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | Sample — CKEditor 12 | 13 | 14 | 15 |

16 | CKEditor — Posted Data 17 |

18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | $value ) 31 | { 32 | if ( ( !is_string($value) && !is_numeric($value) ) || !is_string($key) ) 33 | continue; 34 | 35 | if ( get_magic_quotes_gpc() ) 36 | $value = htmlspecialchars( stripslashes((string)$value) ); 37 | else 38 | $value = htmlspecialchars( (string)$value ); 39 | ?> 40 | 41 | 42 | 43 | 44 | 48 |
Field NameValue
49 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebJob/EmailService.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.Options; 2 | using Newtonsoft.Json.Linq; 3 | using System; 4 | using System.Net.Http; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace MeetingCaptureWebJob 9 | { 10 | public class EmailService : IEmailService 11 | { 12 | public EmailService(IOptions optionsAccessor) 13 | { 14 | Options = optionsAccessor.Value; 15 | } 16 | public LogicAppSenderOptions Options { get; } //set only via Secret Manager 17 | public async Task SendEmailAsync(string[] mailTo, string subject, string mailContent) 18 | { 19 | var slideUpdateNotificationLogicAppTriggerUri = 20 | new Uri(Options.TriggerUri); 21 | HttpClient httpClient = new HttpClient(); 22 | var postData = (dynamic)new JObject(); 23 | postData.mailto = String.Join(';',mailTo); 24 | postData.subject = subject; 25 | postData.body = mailContent; 26 | 27 | var content = new StringContent( 28 | postData.ToString(), 29 | Encoding.UTF8, 30 | "application/json"); 31 | 32 | var response = await httpClient.PostAsync( 33 | slideUpdateNotificationLogicAppTriggerUri, 34 | content); 35 | 36 | try 37 | { 38 | response.EnsureSuccessStatusCode(); 39 | } 40 | catch (HttpRequestException ex) 41 | { 42 | ex.ToString(); 43 | } 44 | } 45 | } 46 | 47 | public class LogicAppSenderOptions 48 | { 49 | public string TriggerUri { get; set; } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/FY19GraphShowcaseDemo.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.29403.142 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MeetingCaptureWebApp", "MeetingCaptureWebApp\MeetingCaptureWebApp.csproj", "{52536B2F-6E61-406B-8DB9-2F11078819C4}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MeetingCaptureWebJob", "MeetingCaptureWebJob\MeetingCaptureWebJob.csproj", "{7F277E80-C468-48DE-B79D-353A716EB6C9}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Release|Any CPU = Release|Any CPU 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {52536B2F-6E61-406B-8DB9-2F11078819C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {52536B2F-6E61-406B-8DB9-2F11078819C4}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {52536B2F-6E61-406B-8DB9-2F11078819C4}.Release|Any CPU.ActiveCfg = Release|Any CPU 19 | {52536B2F-6E61-406B-8DB9-2F11078819C4}.Release|Any CPU.Build.0 = Release|Any CPU 20 | {7F277E80-C468-48DE-B79D-353A716EB6C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {7F277E80-C468-48DE-B79D-353A716EB6C9}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {7F277E80-C468-48DE-B79D-353A716EB6C9}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {7F277E80-C468-48DE-B79D-353A716EB6C9}.Release|Any CPU.Build.0 = Release|Any CPU 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {8590E723-56F6-4C32-9076-35D9AEF75231} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Hosting; 6 | using Microsoft.Extensions.Configuration; 7 | using Microsoft.Extensions.Hosting; 8 | using Microsoft.Extensions.Logging; 9 | using MeetingCaptureWebApp.Data; 10 | using Microsoft.Extensions.DependencyInjection; 11 | 12 | namespace MeetingCaptureWebApp 13 | { 14 | public class Program 15 | { 16 | public static void Main(string[] args) 17 | { 18 | //CreateHostBuilder(args).Build().Run(); 19 | 20 | var host = CreateHostBuilder(args).Build(); 21 | 22 | CreateDbIfNotExists(host); 23 | 24 | host.Run(); 25 | } 26 | private static void CreateDbIfNotExists(IHost host) 27 | { 28 | using (var scope = host.Services.CreateScope()) 29 | { 30 | var services = scope.ServiceProvider; 31 | try 32 | { 33 | var context = services.GetRequiredService(); 34 | context.Database.EnsureCreated(); 35 | } 36 | catch (Exception ex) 37 | { 38 | var logger = services.GetRequiredService>(); 39 | logger.LogError(ex, "An error occurred creating the DB."); 40 | } 41 | } 42 | } 43 | public static IHostBuilder CreateHostBuilder(string[] args) => 44 | Host.CreateDefaultBuilder(args) 45 | .ConfigureWebHostDefaults(webBuilder => 46 | { 47 | webBuilder.UseStartup(); 48 | }); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/jquery/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright JS Foundation and other contributors, https://js.foundation/ 2 | 3 | This software consists of voluntary contributions made by many 4 | individuals. For exact contribution history, see the revision history 5 | available at https://github.com/jquery/jquery 6 | 7 | The following license applies to all parts of this software except as 8 | documented below: 9 | 10 | ==== 11 | 12 | Permission is hereby granted, free of charge, to any person obtaining 13 | a copy of this software and associated documentation files (the 14 | "Software"), to deal in the Software without restriction, including 15 | without limitation the rights to use, copy, modify, merge, publish, 16 | distribute, sublicense, and/or sell copies of the Software, and to 17 | permit persons to whom the Software is furnished to do so, subject to 18 | the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be 21 | included in all copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 27 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 28 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 29 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 30 | 31 | ==== 32 | 33 | All files located in the node_modules and external directories are 34 | externally maintained libraries used by this software which have their 35 | own licenses; we recommend you read them, as their terms may differ from 36 | the terms above. 37 | -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/src/services/MSGraphService.ts: -------------------------------------------------------------------------------- 1 | import { MSGraphClient } from '@microsoft/sp-http'; 2 | import * as Graph from '@microsoft/microsoft-graph-types'; 3 | /** 4 | * Provides methods to access Microsoft Graph APIs. 5 | */ 6 | export class MSGraphService { 7 | public static ExtSchema: string = "meetingCapture.Extensions"; 8 | constructor(private client: MSGraphClient) { 9 | } 10 | 11 | public getEventsByGroupAndChannel(groupId: string, channelId:string): Promise { 12 | return new Promise((resolve, reject) => { 13 | this.client.api(`/groups/${groupId}/calendar/events`) 14 | .filter(`Extensions/any(f:f/id eq '${MSGraphService.ExtSchema}')`) 15 | .expand(`Extensions($filter=id eq '${MSGraphService.ExtSchema}')`) 16 | .get((error, events) => { 17 | if (error) reject(error); 18 | else { 19 | let returnEvents = []; 20 | for(var i = 0; i < events.value.length ; i ++) 21 | { 22 | let extensions = events.value[i].extensions; 23 | if(extensions){ 24 | let extension = extensions[0]; 25 | if(extension.channelId && extension.channelId === channelId){ 26 | returnEvents.push(events.value[i]); 27 | } 28 | } 29 | } 30 | console.log("getEventsByGroupAndChannel "+ returnEvents.length); 31 | resolve(returnEvents); 32 | } 33 | 34 | }); 35 | }); 36 | } 37 | public getPlannerBucket(bucketId:string): Promise { 38 | return new Promise((resolve, reject) => { 39 | this.client.api(`/planner/buckets/${bucketId}`).get((error, bucket) => { 40 | if (error) reject(error); 41 | else resolve(bucket); 42 | }); 43 | }); 44 | } 45 | 46 | } -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/toolbarconfigurator/font/fontello.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Copyright (C) 2014 by original authors @ fontello.com 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/js/sample.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. 3 | * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license 4 | */ 5 | 6 | /* exported initSample */ 7 | 8 | if ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) 9 | CKEDITOR.tools.enableHtml5Elements( document ); 10 | 11 | // The trick to keep the editor in the sample quite small 12 | // unless user specified own height. 13 | CKEDITOR.config.height = 150; 14 | CKEDITOR.config.width = 'auto'; 15 | 16 | var initSample = ( function() { 17 | var wysiwygareaAvailable = isWysiwygareaAvailable(), 18 | isBBCodeBuiltIn = !!CKEDITOR.plugins.get( 'bbcode' ); 19 | 20 | return function() { 21 | var editorElement = CKEDITOR.document.getById( 'editor' ); 22 | 23 | // :((( 24 | if ( isBBCodeBuiltIn ) { 25 | editorElement.setHtml( 26 | 'Hello world!\n\n' + 27 | 'I\'m an instance of [url=https://ckeditor.com]CKEditor[/url].' 28 | ); 29 | } 30 | 31 | // Depending on the wysiwygarea plugin availability initialize classic or inline editor. 32 | if ( wysiwygareaAvailable ) { 33 | CKEDITOR.replace( 'editor' ); 34 | } else { 35 | editorElement.setAttribute( 'contenteditable', 'true' ); 36 | CKEDITOR.inline( 'editor' ); 37 | 38 | // TODO we can consider displaying some info box that 39 | // without wysiwygarea the classic editor may not work. 40 | } 41 | }; 42 | 43 | function isWysiwygareaAvailable() { 44 | // If in development mode, then the wysiwygarea must be available. 45 | // Split REV into two strings so builder does not replace it :D. 46 | if ( CKEDITOR.revision == ( '%RE' + 'V%' ) ) { 47 | return true; 48 | } 49 | 50 | return !!CKEDITOR.plugins.get( 'wysiwygarea' ); 51 | } 52 | } )(); 53 | 54 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/link/dialogs/anchor.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. 3 | For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license 4 | */ 5 | CKEDITOR.dialog.add("anchor",function(c){function d(b,a){return b.createFakeElement(b.document.createElement("a",{attributes:a}),"cke_anchor","anchor")}return{title:c.lang.link.anchor.title,minWidth:300,minHeight:60,getModel:function(b){var a=b.getSelection();b=a.getRanges()[0];a=a.getSelectedElement();b.shrink(CKEDITOR.SHRINK_ELEMENT);(a=b.getEnclosedNode())&&a.type===CKEDITOR.NODE_TEXT&&(a=a.getParent());b=a&&a.type===CKEDITOR.NODE_ELEMENT&&("anchor"===a.data("cke-real-element-type")||a.is("a"))? 6 | a:void 0;return b||null},onOk:function(){var b=CKEDITOR.tools.trim(this.getValueOf("info","txtName")),b={id:b,name:b,"data-cke-saved-name":b},a=this.getModel(c);a?a.data("cke-realelement")?(b=d(c,b),b.replace(a),CKEDITOR.env.ie&&c.getSelection().selectElement(b)):a.setAttributes(b):(a=(a=c.getSelection())&&a.getRanges()[0],a.collapsed?(b=d(c,b),a.insertNode(b)):(CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(b["class"]="cke_anchor"),b=new CKEDITOR.style({element:"a",attributes:b}),b.type=CKEDITOR.STYLE_INLINE, 7 | b.applyToRange(a)))},onShow:function(){var b=c.getSelection(),a=this.getModel(c),d=a&&a.data("cke-realelement");if(a=d?CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,a):CKEDITOR.plugins.link.getSelectedLink(c)){var e=a.data("cke-saved-name");this.setValueOf("info","txtName",e||"");!d&&b.selectElement(a)}this.getContentElement("info","txtName").focus()},contents:[{id:"info",label:c.lang.link.anchor.title,accessKey:"I",elements:[{type:"text",id:"txtName",label:c.lang.link.anchor.name,required:!0,validate:function(){return this.getValue()? 8 | !0:(alert(c.lang.link.anchor.errorName),!1)}}]}]}}); -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Helpers/AsyncUtil.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading; 5 | using System.Threading.Tasks; 6 | 7 | namespace MeetingCaptureWebApp.Helpers 8 | { 9 | /// 10 | /// Helper class to run async methods within a sync process. 11 | /// 12 | public static class AsyncUtil 13 | { 14 | private static readonly TaskFactory _taskFactory = new 15 | TaskFactory(CancellationToken.None, 16 | TaskCreationOptions.None, 17 | TaskContinuationOptions.None, 18 | TaskScheduler.Default); 19 | 20 | /// 21 | /// Executes an async Task method which has a void return value synchronously 22 | /// USAGE: AsyncUtil.RunSync(() => AsyncMethod()); 23 | /// 24 | /// Task method to execute 25 | public static void RunSync(Func task) 26 | => _taskFactory 27 | .StartNew(task) 28 | .Unwrap() 29 | .GetAwaiter() 30 | .GetResult(); 31 | 32 | /// 33 | /// Executes an async Task method which has a T return type synchronously 34 | /// USAGE: T result = AsyncUtil.RunSync(() => AsyncMethod()); 35 | /// 36 | /// Return Type 37 | /// Task method to execute 38 | /// 39 | public static TResult RunSync(Func> task) 40 | => _taskFactory 41 | .StartNew(task) 42 | .Unwrap() 43 | .GetAwaiter() 44 | .GetResult(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/about/dialogs/about.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. 3 | For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license 4 | */ 5 | CKEDITOR.dialog.add("about",function(a){a=a.lang.about;var b=CKEDITOR.getUrl(CKEDITOR.plugins.get("about").path+"dialogs/"+(CKEDITOR.env.hidpi?"hidpi/":"")+"logo_ckeditor.png");return{title:a.dlgTitle,minWidth:390,minHeight:210,contents:[{id:"tab1",label:"",title:"",expand:!0,padding:0,elements:[{type:"html",html:'\x3cstyle type\x3d"text/css"\x3e.cke_about_container{color:#000 !important;padding:10px 10px 0;margin-top:5px}.cke_about_container p{margin: 0 0 10px;}.cke_about_container .cke_about_logo{height:81px;background-color:#fff;background-image:url('+ 6 | b+");"+(CKEDITOR.env.hidpi?"background-size:194px 58px;":"")+'background-position:center; background-repeat:no-repeat;margin-bottom:10px;}.cke_about_container a{cursor:pointer !important;color:#00B2CE !important;text-decoration:underline !important;}.cke_about_container \x3e p,.cke_rtl .cke_about_container \x3e p{text-align:center;}\x3c/style\x3e\x3cdiv class\x3d"cke_about_container"\x3e\x3cdiv class\x3d"cke_about_logo"\x3e\x3c/div\x3e\x3cp\x3eCKEditor '+CKEDITOR.version+" (revision "+CKEDITOR.revision+ 7 | ')\x3cbr\x3e\x3ca target\x3d"_blank" rel\x3d"noopener noreferrer" href\x3d"https://ckeditor.com/"\x3ehttps://ckeditor.com\x3c/a\x3e\x3c/p\x3e\x3cp\x3e'+a.moreInfo+'\x3cbr\x3e\x3ca target\x3d"_blank" rel\x3d"noopener noreferrer" href\x3d"https://ckeditor.com/legal/ckeditor-oss-license/"\x3ehttps://ckeditor.com/legal/ckeditor-oss-license/\x3c/a\x3e\x3c/p\x3e\x3cp\x3e'+a.copy.replace("$1",'\x3ca target\x3d"_blank" rel\x3d"noopener noreferrer" href\x3d"https://cksource.com/"\x3eCKSource\x3c/a\x3e - Frederico Knabben')+ 8 | "\x3c/p\x3e\x3c/div\x3e"}]}],buttons:[CKEDITOR.dialog.cancelButton]}}); -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Views/Tab/Configure.cshtml: -------------------------------------------------------------------------------- 1 | @* 2 | * * Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. 3 | * * See LICENSE in the project root for license information. 4 | *@ 5 | 6 | @{ 7 | Layout = "~/Views/Shared/_TeamsTabLayout.cshtml"; 8 | } 9 | 10 |
11 | 12 | 16 |
17 | 18 | @section Scripts { 19 | 48 | } 49 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/old/sample.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. 3 | * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license 4 | */ 5 | 6 | // Tool scripts for the sample pages. 7 | // This file can be ignored and is not required to make use of CKEditor. 8 | 9 | ( function() { 10 | CKEDITOR.on( 'instanceReady', function( ev ) { 11 | // Check for sample compliance. 12 | var editor = ev.editor, 13 | meta = CKEDITOR.document.$.getElementsByName( 'ckeditor-sample-required-plugins' ), 14 | requires = meta.length ? CKEDITOR.dom.element.get( meta[ 0 ] ).getAttribute( 'content' ).split( ',' ) : [], 15 | missing = [], 16 | i; 17 | 18 | if ( requires.length ) { 19 | for ( i = 0; i < requires.length; i++ ) { 20 | if ( !editor.plugins[ requires[ i ] ] ) 21 | missing.push( '' + requires[ i ] + '' ); 22 | } 23 | 24 | if ( missing.length ) { 25 | var warn = CKEDITOR.dom.element.createFromHtml( 26 | '
' + 27 | 'To fully experience this demo, the ' + missing.join( ', ' ) + ' plugin' + ( missing.length > 1 ? 's are' : ' is' ) + ' required.' + 28 | '
' 29 | ); 30 | warn.insertBefore( editor.container ); 31 | } 32 | } 33 | 34 | // Set icons. 35 | var doc = new CKEDITOR.dom.document( document ), 36 | icons = doc.find( '.button_icon' ); 37 | 38 | for ( i = 0; i < icons.count(); i++ ) { 39 | var icon = icons.getItem( i ), 40 | name = icon.getAttribute( 'data-icon' ), 41 | style = CKEDITOR.skin.getIconStyle( name, ( CKEDITOR.lang.dir == 'rtl' ) ); 42 | 43 | icon.addClass( 'cke_button_icon' ); 44 | icon.addClass( 'cke_button__' + name + '_icon' ); 45 | icon.setAttribute( 'style', style ); 46 | icon.setStyle( 'float', 'none' ); 47 | 48 | } 49 | } ); 50 | } )(); 51 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/mgt/mgt-loader.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ------------------------------------------------------------------------------------------- 3 | * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. 4 | * See License in the project root for license information. 5 | * ------------------------------------------------------------------------------------------- 6 | */ 7 | 8 | (function() { 9 | 'use strict'; 10 | 11 | var rootPath = getScriptPath(); 12 | 13 | // decide es5 or es6 14 | if (es6()) { 15 | window.WebComponents = window.WebComponents || {}; 16 | window.WebComponents.root = rootPath + 'wc/'; 17 | 18 | addScript(rootPath + 'wc/webcomponents-loader.js'); 19 | addScript(rootPath + 'mgt.es6.js'); 20 | } else { 21 | // es5 bundle already includes all the polyfills 22 | addScript(rootPath + 'mgt.es5.js'); 23 | } 24 | 25 | function getScriptPath() { 26 | var scripts = document.getElementsByTagName('script'); 27 | var path = scripts[scripts.length - 1].src.split('?')[0]; 28 | var dir = 29 | path 30 | .split('/') 31 | .slice(0, -1) 32 | .join('/') + '/'; 33 | return dir; 34 | } 35 | 36 | // from https://stackoverflow.com/questions/29046635/javascript-es6-cross-browser-detection 37 | function es6() { 38 | 'use strict'; 39 | 40 | if (typeof Symbol == 'undefined') return false; 41 | try { 42 | eval('class Foo {}'); 43 | eval('var bar = (x) => x+1'); 44 | } catch (e) { 45 | return false; 46 | } 47 | 48 | return true; 49 | } 50 | 51 | function addScript(src, onload) { 52 | // TODO: support async loading 53 | 54 | var tag = document.createElement('script'); 55 | tag.src = src; 56 | 57 | // if (onload) { 58 | // tag.addEventListener("load", onload); 59 | // } 60 | 61 | document.write(tag.outerHTML); 62 | // document.head.appendChild(tag); 63 | } 64 | })(); 65 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/toolbarconfigurator/css/fontello.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'fontello'; 3 | src: url('../font/fontello.eot?89024372'); 4 | src: url('../font/fontello.eot?89024372#iefix') format('embedded-opentype'), 5 | url('../font/fontello.woff?89024372') format('woff'), 6 | url('../font/fontello.ttf?89024372') format('truetype'), 7 | url('../font/fontello.svg?89024372#fontello') format('svg'); 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ 12 | /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ 13 | /* 14 | @media screen and (-webkit-min-device-pixel-ratio:0) { 15 | @font-face { 16 | font-family: 'fontello'; 17 | src: url('../font/fontello.svg?89024372#fontello') format('svg'); 18 | } 19 | } 20 | */ 21 | 22 | [class^="icon-"]:before, [class*=" icon-"]:before { 23 | font-family: "fontello"; 24 | font-style: normal; 25 | font-weight: normal; 26 | speak: none; 27 | 28 | display: inline-block; 29 | text-decoration: inherit; 30 | width: 1em; 31 | margin-right: .2em; 32 | text-align: center; 33 | /* opacity: .8; */ 34 | 35 | /* For safety - reset parent styles, that can break glyph codes*/ 36 | font-variant: normal; 37 | text-transform: none; 38 | 39 | /* fix buttons height, for twitter bootstrap */ 40 | line-height: 1em; 41 | 42 | /* Animation center compensation - margins should be symmetric */ 43 | /* remove if not needed */ 44 | margin-left: .2em; 45 | 46 | /* you can be more comfortable with increased icons size */ 47 | /* font-size: 120%; */ 48 | 49 | /* Uncomment for 3D effect */ 50 | /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ 51 | } 52 | 53 | .icon-trash:before { content: '\e802'; } /* '' */ 54 | .icon-down-big:before { content: '\e800'; } /* '' */ 55 | .icon-up-big:before { content: '\e801'; } /* '' */ 56 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/build-config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. 3 | * For licensing, see LICENSE.md or https://ckeditor.com/license 4 | */ 5 | 6 | /** 7 | * This file was added automatically by CKEditor builder. 8 | * You may re-use it at any time to build CKEditor again. 9 | * 10 | * If you would like to build CKEditor online again 11 | * (for example to upgrade), visit one the following links: 12 | * 13 | * (1) https://ckeditor.com/cke4/builder 14 | * Visit online builder to build CKEditor from scratch. 15 | * 16 | * (2) https://ckeditor.com/cke4/builder/96ecc832758dabb2d4fb95021f0e04f6 17 | * Visit online builder to build CKEditor, starting with the same setup as before. 18 | * 19 | * (3) https://ckeditor.com/cke4/builder/download/96ecc832758dabb2d4fb95021f0e04f6 20 | * Straight download link to the latest version of CKEditor (Optimized) with the same setup as before. 21 | * 22 | * NOTE: 23 | * This file is not used by CKEditor, you may remove it. 24 | * Changing this file will not change your CKEditor configuration. 25 | */ 26 | 27 | var CKBUILDER_CONFIG = { 28 | skin: 'moono-lisa', 29 | preset: 'basic', 30 | ignore: [ 31 | '.DS_Store', 32 | '.bender', 33 | '.editorconfig', 34 | '.gitattributes', 35 | '.gitignore', 36 | '.idea', 37 | '.jscsrc', 38 | '.jshintignore', 39 | '.jshintrc', 40 | '.mailmap', 41 | '.npm', 42 | '.travis.yml', 43 | 'bender-err.log', 44 | 'bender-out.log', 45 | 'bender.ci.js', 46 | 'bender.js', 47 | 'dev', 48 | 'gruntfile.js', 49 | 'less', 50 | 'node_modules', 51 | 'package.json', 52 | 'tests' 53 | ], 54 | plugins : { 55 | 'about' : 1, 56 | 'autogrow' : 1, 57 | 'basicstyles' : 1, 58 | 'clipboard' : 1, 59 | 'enterkey' : 1, 60 | 'entities' : 1, 61 | 'floatingspace' : 1, 62 | 'indentlist' : 1, 63 | 'link' : 1, 64 | 'list' : 1, 65 | 'toolbar' : 1, 66 | 'undo' : 1, 67 | 'wysiwygarea' : 1 68 | }, 69 | languages : { 70 | 'en' : 1 71 | } 72 | }; -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Views/Shared/_Layout.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.Extensions.Configuration 2 | @inject IConfiguration Configuration 3 | @{ 4 | string teamTabResource = Configuration["AzureAd:TeamTabResource"]; 5 | } 6 | 7 | 8 | 9 | 10 | 11 | 12 | MeetingCaptureWebApp 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | @RenderBody() 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 47 | 48 | @RenderSection("Scripts", required: false) 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/skins/moono-lisa/readme.md: -------------------------------------------------------------------------------- 1 | "Moono-lisa" Skin 2 | ================= 3 | 4 | This skin has been made a **default skin** starting from CKEditor 4.6.0 and is maintained by the core developers. 5 | 6 | For more information about skins, please check the [CKEditor Skin SDK](https://ckeditor.com/docs/ckeditor4/latest/guide/skin_sdk_intro.html) 7 | documentation. 8 | 9 | Features 10 | ------------------- 11 | "Moono-lisa" is a monochromatic skin, which offers a modern, flat and minimalistic look which blends very well in modern design. 12 | It comes with the following features: 13 | 14 | - Chameleon feature with brightness. 15 | - High-contrast compatibility. 16 | - Graphics source provided in SVG. 17 | 18 | Directory Structure 19 | ------------------- 20 | 21 | CSS parts: 22 | - **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance, 23 | - **mainui.css**: the file contains styles of entire editor outline structures, 24 | - **toolbar.css**: the file contains styles of the editor toolbar space (top), 25 | - **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar, 26 | - **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded 27 | until the first panel open up, 28 | - **elementspath.css**: the file contains styles of the editor elements path bar (bottom), 29 | - **menu.css**: the file contains styles of all editor menus including context menu and button drop-down, 30 | it's not loaded until the first menu open up, 31 | - **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open, 32 | - **reset.css**: the file defines the basis of style resets among all editor UI spaces, 33 | - **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference, 34 | - **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks. 35 | 36 | Other parts: 37 | - **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature, 38 | - **images/**: contains a fill general used images, 39 | - **dev/**: contains SVG and PNG source of the skin icons. 40 | 41 | License 42 | ------- 43 | 44 | Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. 45 | 46 | For licensing, see LICENSE.md or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license) 47 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Services/ViewRenderService.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Http; 2 | using Microsoft.AspNetCore.Mvc; 3 | using Microsoft.AspNetCore.Mvc.Abstractions; 4 | using Microsoft.AspNetCore.Mvc.ModelBinding; 5 | using Microsoft.AspNetCore.Mvc.Razor; 6 | using Microsoft.AspNetCore.Mvc.Rendering; 7 | using Microsoft.AspNetCore.Mvc.ViewFeatures; 8 | using Microsoft.AspNetCore.Routing; 9 | using System; 10 | using System.IO; 11 | using System.Threading.Tasks; 12 | 13 | namespace MeetingCaptureWebApp.Services 14 | { 15 | public class ViewRenderService : IViewRenderService 16 | { 17 | private readonly IRazorViewEngine _razorViewEngine; 18 | private readonly ITempDataProvider _tempDataProvider; 19 | private readonly IServiceProvider _serviceProvider; 20 | 21 | public ViewRenderService(IRazorViewEngine razorViewEngine, 22 | ITempDataProvider tempDataProvider, 23 | IServiceProvider serviceProvider) 24 | { 25 | _razorViewEngine = razorViewEngine; 26 | _tempDataProvider = tempDataProvider; 27 | _serviceProvider = serviceProvider; 28 | } 29 | 30 | public async Task RenderToStringAsync(string viewName, object model) 31 | { 32 | var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider }; 33 | var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); 34 | 35 | using (var sw = new StringWriter()) 36 | { 37 | var viewResult = _razorViewEngine.FindView(actionContext, viewName, false); 38 | 39 | if (viewResult.View == null) 40 | { 41 | throw new ArgumentNullException($"{viewName} does not match any available view"); 42 | } 43 | 44 | var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary()) 45 | { 46 | Model = model 47 | }; 48 | 49 | var viewContext = new ViewContext( 50 | actionContext, 51 | viewResult.View, 52 | viewDictionary, 53 | new TempDataDictionary(actionContext.HttpContext, _tempDataProvider), 54 | sw, 55 | new HtmlHelperOptions() 56 | ); 57 | 58 | await viewResult.View.RenderAsync(viewContext); 59 | return sw.ToString(); 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/old/appendto.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | Append To Page Element Using JavaScript Code — CKEditor Sample 10 | 11 | 12 | 13 | 14 |

15 | CKEditor Samples » Append To Page Element Using JavaScript Code 16 |

17 |
18 | This sample is not maintained anymore. Check out the brand new samples in CKEditor Examples. 19 |
20 |
21 |
22 |

23 | The CKEDITOR.appendTo() method serves to to place editors inside existing DOM elements. Unlike CKEDITOR.replace(), 24 | a target container to be replaced is no longer necessary. A new editor 25 | instance is inserted directly wherever it is desired. 26 |

27 |
CKEDITOR.appendTo( 'container_id',
28 | 	{ /* Configuration options to be used. */ }
29 | 	'Editor content to be used.'
30 | );
31 |
32 | 46 |
47 |
48 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/js/teamsHelper.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | _teams_helper = { 3 | resourceId: document.getElementById("teamTabResource").value, 4 | groupId: undefined, 5 | channelId: undefined, 6 | authToken: undefined, 7 | userObjectId: undefined, 8 | getAsync: function () { 9 | return new Promise((resolve, reject) => { 10 | TeamsHelper.get(function (teamContext) { 11 | resolve({ "Authorization": teamContext.authToken }); 12 | }); 13 | }); 14 | }, 15 | get: function (CB) { 16 | 17 | let that = TeamsHelper; 18 | var authTokenRequest = { 19 | successCallback: function (result) { 20 | //if (!that.authToken) { 21 | // console.log("Token: " + result); 22 | //} 23 | that.authToken = result; 24 | if (!that.groupId || !that.channelId || !that.tuid) { 25 | microsoftTeams.getContext(function (context) { 26 | that.groupId = context.groupId; 27 | that.channelId = context.channelId; 28 | that.userObjectId = context.userObjectId; 29 | 30 | $.ajaxSetup({ 31 | beforeSend: function (xhr) { 32 | xhr.setRequestHeader('Authorization', that.authToken); 33 | } 34 | }); 35 | CB({ teamId: that.groupId, channelId: that.channelId, authToken: that.authToken, userObjectId: that.userObjectId }); 36 | }); 37 | } 38 | else { 39 | $.ajaxSetup({ 40 | beforeSend: function (xhr) { 41 | xhr.setRequestHeader('Authorization', that.authToken); 42 | } 43 | }); 44 | CB({teamId: that.groupId, channelId: that.channelId, authToken: that.authToken }); 45 | } 46 | }, 47 | failureCallback: function (error) { 48 | console.log("Failure: " + error); 49 | }, 50 | resources: [that.resourceId] 51 | }; 52 | microsoftTeams.authentication.getAuthToken(authTokenRequest); 53 | } 54 | }; 55 | microsoftTeams.initialize(); 56 | this.TeamsHelper = _teams_helper; 57 | })(); -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Services/FileService.cs: -------------------------------------------------------------------------------- 1 | using MeetingCaptureWebApp.Helpers; 2 | using Microsoft.AspNetCore.Http; 3 | using Microsoft.Graph; 4 | using System; 5 | using System.Collections.Generic; 6 | using System.IO; 7 | using System.Linq; 8 | using System.Security.Claims; 9 | using System.Threading.Tasks; 10 | 11 | namespace MeetingCaptureWebApp.Services 12 | { 13 | public class FileService : BaseGraphService, IFileService 14 | { 15 | public FileService(IGraphSdkHelper graphSdkHelper):base(graphSdkHelper) 16 | { 17 | } 18 | public async Task CreateMeetingFolder(string groupId, string channelFolderId, string folderName) 19 | { 20 | var driveItem = new DriveItem 21 | { 22 | Name = folderName, 23 | Folder = new Folder(), 24 | AdditionalData = new Dictionary 25 | { 26 | { "@microsoft.graph.conflictBehavior", "rename" } 27 | }, 28 | }; 29 | return await GraphClient.Groups[groupId].Drive.Items[channelFolderId].Children.Request().AddAsync(driveItem); 30 | } 31 | 32 | public async Task> GetFiles(string groupId, string folderId) 33 | { 34 | var retValue = new List(); 35 | var pagedFiles = await GraphClient.Groups[groupId].Drive.Items[folderId].Children.Request().GetAsync(); 36 | retValue.AddRange(pagedFiles.CurrentPage); 37 | while (pagedFiles.NextPageRequest != null) 38 | { 39 | pagedFiles = await pagedFiles.NextPageRequest.GetAsync(); 40 | retValue.AddRange(pagedFiles.CurrentPage); 41 | } 42 | return retValue; 43 | } 44 | 45 | public async Task UploadFile(string groupId, string folderId, string fileName, Stream fileContent) 46 | { 47 | return await GraphClient.Groups[groupId].Drive.Items[folderId].ItemWithPath(fileName).Content.Request().PutAsync(fileContent); 48 | } 49 | 50 | public async Task GetChannelFolder(string groupId, string channelId) 51 | { 52 | var channel = await GraphClient.Teams[groupId].Channels[channelId].Request().GetAsync(); 53 | return await GraphClient.Groups[groupId].Drive.Root.ItemWithPath(channel.DisplayName).Request().GetAsync(); 54 | } 55 | 56 | public async Task DeleteItems(string groupiId, string itemId) 57 | { 58 | await GraphClient.Groups[groupiId].Drive.Items[itemId].Request().DeleteAsync(); 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/old/tabindex.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | TAB Key-Based Navigation — CKEditor Sample 10 | 11 | 12 | 22 | 42 | 43 | 44 |

45 | CKEditor Samples » TAB Key-Based Navigation 46 |

47 |
48 | This sample is not maintained anymore. Check out its brand new version in CKEditor Examples. 49 |
50 |
51 |

52 | This sample shows how tab key navigation among editor instances is 53 | affected by the tabIndex attribute from 54 | the original page element. Use TAB key to move between the editors. 55 |

56 |
57 |

58 | 59 |

60 |
61 |

62 | 63 |

64 |

65 | 66 |

67 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Services/NotesService.cs: -------------------------------------------------------------------------------- 1 | using MeetingCaptureWebApp.Helpers; 2 | using Microsoft.Graph; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.IO; 6 | using System.Linq; 7 | using System.Net.Http; 8 | using System.Text; 9 | using System.Threading.Tasks; 10 | using System.Web; 11 | 12 | namespace MeetingCaptureWebApp.Services 13 | { 14 | public class NotesService : BaseGraphService, INotesService 15 | { 16 | public NotesService(IGraphSdkHelper graphSdkHelper) : base(graphSdkHelper) 17 | { 18 | 19 | } 20 | public async Task AddNotes(string teamId, string channelSectionId, string meetingName, string notes) 21 | { 22 | string notesContent = $"{meetingName}{notes}"; 23 | return await GraphClient.Groups[teamId].Onenote.Sections[channelSectionId].Pages.Request().AddAsync(notesContent, "text/html"); 24 | } 25 | 26 | public async Task<(OnenotePage meetingNotes, string content)> GetMeetingNotes(string teamId, string pageId) 27 | { 28 | var oneNotePage = await GraphClient.Groups[teamId].Onenote.Pages[pageId].Request().GetAsync(); 29 | var content = await GraphClient.Groups[teamId].Onenote.Pages[pageId].Content.Request().GetAsync(); 30 | var reader = new StreamReader(content); 31 | return (oneNotePage, reader.ReadToEnd()); 32 | } 33 | 34 | public async Task RemoveNotes(string teamId, string pageId) 35 | { 36 | await GraphClient.Groups[teamId].Onenote.Pages[pageId].Request().DeleteAsync(); 37 | } 38 | 39 | public async Task GetChannelSection(string teamId, string channelDisplayName) 40 | { 41 | var notebooks = await GraphClient.Groups[teamId].Onenote.Notebooks.Request().GetAsync(); 42 | return await GetOrCreateOnenoteSectionByChannel(teamId, notebooks.First().Id, channelDisplayName); 43 | } 44 | 45 | private async Task GetOrCreateOnenoteSectionByChannel(string teamId, string notebookId, string channelName) 46 | { 47 | var sectionsPage = await GraphClient.Groups[teamId].Onenote.Notebooks[notebookId].Sections.Request().Filter(Uri.EscapeDataString($"displayName eq '{channelName.Replace("'", "''")}'")).GetAsync(); 48 | var channelSection = sectionsPage.CurrentPage.FirstOrDefault(); 49 | if (channelSection == null) 50 | { 51 | channelSection = new OnenoteSection 52 | { 53 | DisplayName = channelName 54 | }; 55 | channelSection = await GraphClient.Groups[teamId].Onenote.Notebooks[notebookId].Sections.Request().AddAsync(channelSection); 56 | } 57 | return channelSection; 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/old/uicolor.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | UI Color Picker — CKEditor Sample 10 | 11 | 12 | 13 | 14 |

15 | CKEditor Samples » UI Color 16 |

17 |
18 | This sample is not maintained anymore. Check out its brand new version in CKEditor Examples. 19 |
20 |
21 |

22 | This sample shows how to automatically replace <textarea> elements 23 | with a CKEditor instance with an option to change the color of its user interface.
24 | Note:The UI skin color feature depends on the CKEditor skin 25 | compatibility. The Moono and Kama skins are examples of skins that work with it. 26 |

27 |
28 |
29 |

30 | This editor instance has a UI color value defined in configuration to change the skin color, 31 | To specify the color of the user interface, set the uiColor property: 32 |

33 |
34 | CKEDITOR.replace( 'textarea_id', {
35 | 	uiColor: '#14B8C4'
36 | });
37 |

38 | Note that textarea_id in the code above is the id attribute of 39 | the <textarea> element to be replaced. 40 |

41 |

42 | 43 | 56 |

57 |

58 | 59 |

60 |
61 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Helpers/GraphAuthProvider.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Microsoft.Extensions.Configuration; 4 | using Microsoft.Identity.Client; 5 | using Microsoft.Graph; 6 | using MeetingCaptureWebApp.Extensions; 7 | 8 | namespace MeetingCaptureWebApp.Helpers 9 | { 10 | public class GraphAuthProvider : IGraphAuthProvider 11 | { 12 | private IConfidentialClientApplication _oboApp; 13 | private IConfidentialClientApplication _deamonApp; 14 | private readonly string[] _scopes; 15 | 16 | public GraphAuthProvider(IConfiguration configuration) 17 | { 18 | var azureOptions = new AzureAdOptions(); 19 | configuration.Bind("AzureAd", azureOptions); 20 | 21 | // More info about MSAL Client Applications: https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Client-Applications 22 | _oboApp = ConfidentialClientApplicationBuilder.Create(azureOptions.ClientId) 23 | .WithClientSecret(azureOptions.ClientSecret) 24 | .WithAuthority(AzureCloudInstance.AzurePublic, AadAuthorityAudience.AzureAdAndPersonalMicrosoftAccount) 25 | .WithRedirectUri(azureOptions.BaseUrl + azureOptions.CallbackPath) 26 | .Build(); 27 | 28 | Authority = _oboApp.Authority; 29 | 30 | _scopes = azureOptions.GraphScopes.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 31 | 32 | _deamonApp = ConfidentialClientApplicationBuilder.Create(azureOptions.ClientId) 33 | .WithClientSecret(azureOptions.ClientSecret) 34 | .WithAuthority($"https://login.microsoftonline.com/{azureOptions.TenantId}") 35 | .Build(); 36 | } 37 | 38 | public string Authority { get; } 39 | 40 | public async Task GetUserAccessTokenAsync(string jwtBearerToken) 41 | { 42 | var account = await _oboApp.AcquireTokenOnBehalfOf(_scopes, new UserAssertion(jwtBearerToken)).ExecuteAsync(); 43 | if (account == null) throw new ServiceException(new Error 44 | { 45 | Code = "TokenNotFound", 46 | Message = "Unable to retrieve the access token from assertion" 47 | }); 48 | 49 | return account.AccessToken; 50 | } 51 | 52 | public async Task GetApplicationAccessTokenAsync() 53 | { 54 | string[] scopes = new string[] { "https://graph.microsoft.com/.default" }; 55 | 56 | AuthenticationResult result = null; 57 | result = await _deamonApp.AcquireTokenForClient(scopes) 58 | .ExecuteAsync(); 59 | 60 | return result.AccessToken; 61 | } 62 | } 63 | 64 | public interface IGraphAuthProvider 65 | { 66 | string Authority { get; } 67 | 68 | Task GetUserAccessTokenAsync(string jwtBearerToken); 69 | 70 | Task GetApplicationAccessTokenAsync(); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/old/ajax.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | Ajax — CKEditor Sample 10 | 11 | 12 | 40 | 41 | 42 |

43 | CKEditor Samples » Create and Destroy Editor Instances for Ajax Applications 44 |

45 |
46 | This sample is not maintained anymore. Check out its brand new version in CKEditor Examples. 47 |
48 |
49 |

50 | This sample shows how to create and destroy CKEditor instances on the fly. After the removal of CKEditor the content created inside the editing 51 | area will be displayed in a <div> element. 52 |

53 |

54 | For details of how to create this setup check the source code of this sample page 55 | for JavaScript code responsible for the creation and destruction of a CKEditor instance. 56 |

57 |
58 |

Click the buttons to create and remove a CKEditor instance.

59 |

60 | 61 | 62 |

63 | 64 |
65 |
66 | 74 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Services/CommunicationService.cs: -------------------------------------------------------------------------------- 1 | using MeetingCaptureWebApp.Extensions; 2 | using MeetingCaptureWebApp.Helpers; 3 | using Microsoft.Extensions.Configuration; 4 | using Microsoft.Graph; 5 | using Newtonsoft.Json; 6 | using Newtonsoft.Json.Linq; 7 | using System; 8 | using System.Collections.Generic; 9 | using System.Linq; 10 | using System.Net.Http; 11 | using System.Net.Http.Headers; 12 | using System.Text; 13 | using System.Threading.Tasks; 14 | 15 | namespace MeetingCaptureWebApp.Services 16 | { 17 | public class CommunicationService : ICommunicationService 18 | { 19 | private readonly IGraphSdkHelper _graphSdkHelper; 20 | 21 | public CommunicationService(IGraphSdkHelper graphSdkHelper) 22 | { 23 | _graphSdkHelper = graphSdkHelper; 24 | //_graphClient = _graphSdkHelper.GetDaemonAppClient(); 25 | } 26 | 27 | // Currently MS Graph Client SDK does not support OnlineMeeting API. 28 | public async Task CreateOnlineMeeting(string subject, DateTime startDateTime, string organizerId) 29 | { 30 | var onlineMeeting = new 31 | { 32 | meetingType = "scheduled", 33 | subject, 34 | startDateTime, 35 | participants = new 36 | { 37 | organizer = new 38 | { 39 | identity = new 40 | { 41 | user = new 42 | { 43 | id = organizerId 44 | } 45 | } 46 | } 47 | } 48 | }; 49 | 50 | var accessToken = await _graphSdkHelper.GetDaemonAppAccessToken(); 51 | 52 | using (var client = new HttpClient()) 53 | { 54 | client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); 55 | using (var request = new HttpRequestMessage(HttpMethod.Post, "https://graph.microsoft.com/beta/app/onlineMeetings")) 56 | { 57 | var json = JsonConvert.SerializeObject(onlineMeeting); 58 | using (var stringContent = new StringContent(json, Encoding.UTF8, "application/json")) 59 | { 60 | request.Content = stringContent; 61 | 62 | using (var response = await client 63 | .SendAsync(request, HttpCompletionOption.ResponseHeadersRead) 64 | .ConfigureAwait(false)) 65 | { 66 | response.EnsureSuccessStatusCode(); 67 | string result = await response.Content.ReadAsStringAsync(); 68 | dynamic jToken = JToken.Parse(result); 69 | return jToken.joinUrl; 70 | } 71 | } 72 | } 73 | } 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/old/assets/outputxhtml/outputxhtml.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. 3 | * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license 4 | * 5 | * Styles used by the XHTML 1.1 sample page (xhtml.html). 6 | */ 7 | 8 | /** 9 | * Basic definitions for the editing area. 10 | */ 11 | body 12 | { 13 | font-family: Arial, Verdana, sans-serif; 14 | font-size: 80%; 15 | color: #000000; 16 | background-color: #ffffff; 17 | padding: 5px; 18 | margin: 0px; 19 | } 20 | 21 | /** 22 | * Core styles. 23 | */ 24 | 25 | .Bold 26 | { 27 | font-weight: bold; 28 | } 29 | 30 | .Italic 31 | { 32 | font-style: italic; 33 | } 34 | 35 | .Underline 36 | { 37 | text-decoration: underline; 38 | } 39 | 40 | .StrikeThrough 41 | { 42 | text-decoration: line-through; 43 | } 44 | 45 | .Subscript 46 | { 47 | vertical-align: sub; 48 | font-size: smaller; 49 | } 50 | 51 | .Superscript 52 | { 53 | vertical-align: super; 54 | font-size: smaller; 55 | } 56 | 57 | /** 58 | * Font faces. 59 | */ 60 | 61 | .FontComic 62 | { 63 | font-family: 'Comic Sans MS'; 64 | } 65 | 66 | .FontCourier 67 | { 68 | font-family: 'Courier New'; 69 | } 70 | 71 | .FontTimes 72 | { 73 | font-family: 'Times New Roman'; 74 | } 75 | 76 | /** 77 | * Font sizes. 78 | */ 79 | 80 | .FontSmaller 81 | { 82 | font-size: smaller; 83 | } 84 | 85 | .FontLarger 86 | { 87 | font-size: larger; 88 | } 89 | 90 | .FontSmall 91 | { 92 | font-size: 8pt; 93 | } 94 | 95 | .FontBig 96 | { 97 | font-size: 14pt; 98 | } 99 | 100 | .FontDouble 101 | { 102 | font-size: 200%; 103 | } 104 | 105 | /** 106 | * Font colors. 107 | */ 108 | .FontColor1 109 | { 110 | color: #ff9900; 111 | } 112 | 113 | .FontColor2 114 | { 115 | color: #0066cc; 116 | } 117 | 118 | .FontColor3 119 | { 120 | color: #ff0000; 121 | } 122 | 123 | .FontColor1BG 124 | { 125 | background-color: #ff9900; 126 | } 127 | 128 | .FontColor2BG 129 | { 130 | background-color: #0066cc; 131 | } 132 | 133 | .FontColor3BG 134 | { 135 | background-color: #ff0000; 136 | } 137 | 138 | /** 139 | * Indentation. 140 | */ 141 | 142 | .Indent1 143 | { 144 | margin-left: 40px; 145 | } 146 | 147 | .Indent2 148 | { 149 | margin-left: 80px; 150 | } 151 | 152 | .Indent3 153 | { 154 | margin-left: 120px; 155 | } 156 | 157 | /** 158 | * Alignment. 159 | */ 160 | 161 | .JustifyLeft 162 | { 163 | text-align: left; 164 | } 165 | 166 | .JustifyRight 167 | { 168 | text-align: right; 169 | } 170 | 171 | .JustifyCenter 172 | { 173 | text-align: center; 174 | } 175 | 176 | .JustifyFull 177 | { 178 | text-align: justify; 179 | } 180 | 181 | /** 182 | * Other. 183 | */ 184 | 185 | code 186 | { 187 | font-family: courier, monospace; 188 | background-color: #eeeeee; 189 | padding-left: 1px; 190 | padding-right: 1px; 191 | border: #c0c0c0 1px solid; 192 | } 193 | 194 | kbd 195 | { 196 | padding: 0px 1px 0px 1px; 197 | border-width: 1px 2px 2px 1px; 198 | border-style: solid; 199 | } 200 | 201 | blockquote 202 | { 203 | color: #808080; 204 | } 205 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/adapters/jquery.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. 3 | For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license 4 | */ 5 | (function(a){if("undefined"==typeof a)throw Error("jQuery should be loaded before CKEditor jQuery adapter.");if("undefined"==typeof CKEDITOR)throw Error("CKEditor should be loaded before CKEditor jQuery adapter.");CKEDITOR.config.jqueryOverrideVal="undefined"==typeof CKEDITOR.config.jqueryOverrideVal?!0:CKEDITOR.config.jqueryOverrideVal;a.extend(a.fn,{ckeditorGet:function(){var a=this.eq(0).data("ckeditorInstance");if(!a)throw"CKEditor is not initialized yet, use ckeditor() with a callback.";return a}, 6 | ckeditor:function(g,e){if(!CKEDITOR.env.isCompatible)throw Error("The environment is incompatible.");if(!a.isFunction(g)){var m=e;e=g;g=m}var k=[];e=e||{};this.each(function(){var b=a(this),c=b.data("ckeditorInstance"),f=b.data("_ckeditorInstanceLock"),h=this,l=new a.Deferred;k.push(l.promise());if(c&&!f)g&&g.apply(c,[this]),l.resolve();else if(f)c.once("instanceReady",function(){setTimeout(function d(){c.element?(c.element.$==h&&g&&g.apply(c,[h]),l.resolve()):setTimeout(d,100)},0)},null,null,9999); 7 | else{if(e.autoUpdateElement||"undefined"==typeof e.autoUpdateElement&&CKEDITOR.config.autoUpdateElement)e.autoUpdateElementJquery=!0;e.autoUpdateElement=!1;b.data("_ckeditorInstanceLock",!0);c=a(this).is("textarea")?CKEDITOR.replace(h,e):CKEDITOR.inline(h,e);b.data("ckeditorInstance",c);c.on("instanceReady",function(e){var d=e.editor;setTimeout(function n(){if(d.element){e.removeListener();d.on("dataReady",function(){b.trigger("dataReady.ckeditor",[d])});d.on("setData",function(a){b.trigger("setData.ckeditor", 8 | [d,a.data])});d.on("getData",function(a){b.trigger("getData.ckeditor",[d,a.data])},999);d.on("destroy",function(){b.trigger("destroy.ckeditor",[d])});d.on("save",function(){a(h.form).submit();return!1},null,null,20);if(d.config.autoUpdateElementJquery&&b.is("textarea")&&a(h.form).length){var c=function(){b.ckeditor(function(){d.updateElement()})};a(h.form).submit(c);a(h.form).bind("form-pre-serialize",c);b.bind("destroy.ckeditor",function(){a(h.form).unbind("submit",c);a(h.form).unbind("form-pre-serialize", 9 | c)})}d.on("destroy",function(){b.removeData("ckeditorInstance")});b.removeData("_ckeditorInstanceLock");b.trigger("instanceReady.ckeditor",[d]);g&&g.apply(d,[h]);l.resolve()}else setTimeout(n,100)},0)},null,null,9999)}});var f=new a.Deferred;this.promise=f.promise();a.when.apply(this,k).then(function(){f.resolve()});this.editor=this.eq(0).data("ckeditorInstance");return this}});CKEDITOR.config.jqueryOverrideVal&&(a.fn.val=CKEDITOR.tools.override(a.fn.val,function(g){return function(e){if(arguments.length){var m= 10 | this,k=[],f=this.each(function(){var b=a(this),c=b.data("ckeditorInstance");if(b.is("textarea")&&c){var f=new a.Deferred;c.setData(e,function(){f.resolve()});k.push(f.promise());return!0}return g.call(b,e)});if(k.length){var b=new a.Deferred;a.when.apply(this,k).done(function(){b.resolveWith(m)});return b.promise()}return f}var f=a(this).eq(0),c=f.data("ckeditorInstance");return f.is("textarea")&&c?c.getData():g.call(f)}}))})(window.jQuery); -------------------------------------------------------------------------------- /Source/SPFX/PendingMeetings/src/webparts/upcomingMeetings/UpcomingMeetingsWebPart.ts: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import * as ReactDom from 'react-dom'; 3 | import { Version } from '@microsoft/sp-core-library'; 4 | import { 5 | BaseClientSideWebPart, 6 | IPropertyPaneConfiguration, 7 | PropertyPaneTextField 8 | } from '@microsoft/sp-webpart-base'; 9 | 10 | import * as strings from 'UpcomingMeetingsWebPartStrings'; 11 | import UpcomingMeetings from './components/UpcomingMeetings'; 12 | import { IUpcomingMeetingsProps } from './components/IUpcomingMeetingsProps'; 13 | 14 | // import the providers at the top of the page 15 | //import { Providers, SharePointProvider } from '@microsoft/mgt/dist/commonjs'; 16 | import {Providers, SharePointProvider} from '@microsoft/mgt'; 17 | import * as microsoftTeams from '@microsoft/teams-js'; 18 | 19 | export interface IUpcomingMeetingsWebPartProps { 20 | description: string; 21 | teamId: string; 22 | channelId: string; 23 | } 24 | 25 | export default class UpcomingMeetingsWebPart extends BaseClientSideWebPart { 26 | // set the global provider 27 | protected async onInit() { 28 | Providers.globalProvider = new SharePointProvider(this.context); 29 | } 30 | 31 | public render(): void { 32 | if(this.context.microsoftTeams){ 33 | this.context.microsoftTeams.getContext(context =>{ 34 | console.log("group Id "+ context.groupId +" channelId "+ context.channelId); 35 | const element: React.ReactElement = React.createElement( 36 | UpcomingMeetings, 37 | { 38 | teamId: context.groupId, 39 | channelId: context.channelId, 40 | webPartContext: this.context 41 | } 42 | ); 43 | ReactDom.render(element, this.domElement); 44 | }); 45 | } 46 | else{ 47 | const element: React.ReactElement = React.createElement( 48 | UpcomingMeetings, 49 | { 50 | teamId: this.properties.teamId, 51 | channelId: this.properties.channelId, 52 | webPartContext: this.context 53 | } 54 | ); 55 | 56 | ReactDom.render(element, this.domElement); 57 | } 58 | } 59 | 60 | protected onDispose(): void { 61 | ReactDom.unmountComponentAtNode(this.domElement); 62 | } 63 | 64 | protected get dataVersion(): Version { 65 | return Version.parse('1.0'); 66 | } 67 | 68 | protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { 69 | return { 70 | pages: [ 71 | { 72 | header: { 73 | description: strings.PropertyPaneDescription 74 | }, 75 | groups: [ 76 | { 77 | groupName: strings.BasicGroupName, 78 | groupFields: [ 79 | PropertyPaneTextField('teamId', { 80 | label: 'Team Id Text Field', 81 | multiline: false 82 | }), 83 | PropertyPaneTextField('channelId', { 84 | label: 'Channel Id Text Field', 85 | multiline: false 86 | }) 87 | ] 88 | } 89 | ] 90 | } 91 | ] 92 | }; 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/old/readonly.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | Using the CKEditor Read-Only API — CKEditor Sample 10 | 11 | 12 | 38 | 39 | 40 |

41 | CKEditor Samples » Using the CKEditor Read-Only API 42 |

43 |
44 | This sample is not maintained anymore. Check out its brand new version in CKEditor Examples. 45 |
46 |
47 |

48 | This sample shows how to use the 49 | setReadOnly 50 | API to put editor into the read-only state that makes it impossible for users to change the editor contents. 51 |

52 |

53 | For details on how to create this setup check the source code of this sample page. 54 |

55 |
56 |
57 |

58 | 59 |

60 |

61 | 62 | 63 |

64 |
65 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebJob/Program.cs: -------------------------------------------------------------------------------- 1 | using MeetingCaptureWebApp.Data; 2 | using MeetingCaptureWebApp.Helpers; 3 | using MeetingCaptureWebApp.Services; 4 | using Microsoft.EntityFrameworkCore; 5 | using Microsoft.Extensions.Configuration; 6 | using Microsoft.Extensions.DependencyInjection; 7 | using System; 8 | using System.IO; 9 | using System.Linq; 10 | using System.Threading.Tasks; 11 | using static MeetingCaptureWebJob.EmailService; 12 | 13 | namespace MeetingCaptureWebJob 14 | { 15 | class Program 16 | { 17 | static async Task Main(string[] args) 18 | { 19 | var config = new ConfigurationBuilder() 20 | .SetBasePath(Directory.GetCurrentDirectory()) 21 | .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) 22 | .AddEnvironmentVariables() 23 | .Build(); 24 | 25 | //services DI 26 | var services = new ServiceCollection(); 27 | services.AddTransient(); 28 | services.AddTransient(); 29 | services.AddDbContext(item => item.UseSqlServer(config.GetConnectionString("DefaultConnection"))); 30 | services.Configure(options => config.GetSection("LogicAppEmailSettings").Bind(options)); 31 | 32 | var serviceProvider = services.BuildServiceProvider(); 33 | 34 | var mailService = serviceProvider.GetService(); 35 | var meetingService = serviceProvider.GetService(); 36 | 37 | var jobIntervalMin = config.GetValue("JobIntervalMin"); 38 | var jobAdvanceMin = config.GetValue("AdvanceMin"); 39 | var jobTimeRangeMin = config.GetValue("TimeRange"); 40 | var orgId = config.GetValue("OriginatorId"); 41 | var endTime = DateTime.Now.AddMinutes(jobAdvanceMin + (jobIntervalMin/2)).RoundUp(TimeSpan.FromMinutes(jobTimeRangeMin)); 42 | var startTime = endTime.AddMinutes(0 - jobTimeRangeMin); 43 | 44 | Console.WriteLine($"Advance meeting: {jobAdvanceMin} min"); 45 | Console.WriteLine($"Job time range: {jobTimeRangeMin} min"); 46 | Console.WriteLine($"Send notification from {startTime} to {endTime}"); 47 | Console.WriteLine($"Originator Id: {orgId}"); 48 | 49 | var meetings = await meetingService.GetMeetingByTimeRange(startTime, endTime); 50 | foreach (var meeting in meetings) 51 | { 52 | try 53 | { 54 | var mailBody = meetingService.GenerateMeetingHtmlMeetingBody(meeting, orgId); 55 | await mailService.SendEmailAsync(meeting.Attendees.Select(o => o.Email).ToArray(), $"{meeting.StartTime.Value.ToString("yyyy-MM-dd")} pre-session documents", mailBody); 56 | Console.WriteLine($"Create mail for meeting id {meeting.Id} successful."); 57 | } 58 | catch (Exception ex) 59 | { 60 | Console.WriteLine($"Create mail for meeting id {meeting.Id} failed. {ex}"); 61 | } 62 | } 63 | Console.WriteLine("Job finished"); 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Views/MeetingCapture/upcomingMeetings.cshtml: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 7 |
8 |
9 |
10 | 11 | 12 | 48 | 49 |
50 |
51 | 52 | @section Scripts { 53 | 54 | } 55 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Startup.cs: -------------------------------------------------------------------------------- 1 | 2 | using Microsoft.AspNetCore.Authentication.Cookies; 3 | using Microsoft.AspNetCore.Authentication.OpenIdConnect; 4 | using Microsoft.Extensions.Configuration; 5 | using Microsoft.Extensions.DependencyInjection; 6 | using Microsoft.AspNetCore.Authorization; 7 | using Microsoft.AspNetCore.Mvc.Authorization; 8 | using Microsoft.EntityFrameworkCore; 9 | using Microsoft.AspNetCore.Builder; 10 | using Microsoft.AspNetCore.Hosting; 11 | using Microsoft.Extensions.Hosting; 12 | 13 | using MeetingCaptureWebApp.Extensions; 14 | using MeetingCaptureWebApp.Helpers; 15 | using MeetingCaptureWebApp.Data; 16 | using MeetingCaptureWebApp.Services; 17 | using System; 18 | 19 | namespace MeetingCaptureWebApp 20 | { 21 | public class Startup 22 | { 23 | public const string ObjectIdentifierType = "http://schemas.microsoft.com/identity/claims/objectidentifier"; 24 | public const string TenantIdType = "http://schemas.microsoft.com/identity/claims/tenantid"; 25 | 26 | public Startup(IConfiguration configuration) 27 | { 28 | Configuration = configuration; 29 | } 30 | 31 | public IConfiguration Configuration { get; } 32 | 33 | // This method gets called by the runtime. Use this method to add services to the container. 34 | public void ConfigureServices(IServiceCollection services) 35 | { 36 | services.AddMemoryCache(); 37 | 38 | services.AddSingleton(); 39 | services.AddTransient(); 40 | services.AddTransient(); 41 | services.AddTransient(); 42 | services.AddTransient(); 43 | services.AddTransient(); 44 | services.AddTransient(); 45 | services.AddTransient(); 46 | services.AddTransient(); 47 | services.AddTransient(); 48 | services.AddScoped(); 49 | services.AddHttpContextAccessor(); 50 | 51 | services.AddControllersWithViews(); 52 | 53 | services.AddRazorPages(); 54 | services.AddDbContext(item => item.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 55 | } 56 | 57 | // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 58 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 59 | { 60 | if (env.IsDevelopment()) 61 | { 62 | app.UseDeveloperExceptionPage(); 63 | } 64 | else 65 | { 66 | app.UseExceptionHandler("/Home/Error"); 67 | // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. 68 | app.UseHsts(); 69 | } 70 | app.UseHttpsRedirection(); 71 | app.UseStaticFiles(); 72 | app.UseRouting(); 73 | 74 | app.UseEndpoints(endpoints => 75 | { 76 | endpoints.MapControllerRoute( 77 | name: "default", 78 | pattern: "{controller=MeetingCapture}/{action=Index}/{id?}"); 79 | endpoints.MapRazorPages(); 80 | }); 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Services/UserService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Text.RegularExpressions; 6 | using System.Threading.Tasks; 7 | using MeetingCaptureWebApp.Helpers; 8 | using Microsoft.Extensions.Caching.Memory; 9 | using Microsoft.Graph; 10 | 11 | namespace MeetingCaptureWebApp.Services 12 | { 13 | public class UserService : BaseGraphService, IUserService 14 | { 15 | private readonly IMemoryCache _memoryCache; 16 | 17 | public UserService(IGraphSdkHelper graphSdkHelper, IMemoryCache memoryCache) : base(graphSdkHelper) 18 | { 19 | _memoryCache = memoryCache; 20 | } 21 | 22 | public async Task> GetRelevancePeople(string teamId) 23 | { 24 | var people = await GraphClient.Me.People.Request().Select("displayName,scoredEmailAddresses").Top(50).GetAsync(); 25 | 26 | var memberIds = await GetGroupUserIds(teamId); 27 | 28 | return people.Where(o => memberIds.Contains(o.Id)).Take(5).ToList(); 29 | } 30 | 31 | public async Task> SearchUser(string searchWord) 32 | { 33 | string searchWordEncode = searchWord.Replace("'", "''"); 34 | return await GraphClient.Users.Request().Filter(Uri.EscapeDataString($"startswith(displayName,'${searchWordEncode}') or startswith(givenName,'{searchWordEncode}') or startswith(surname,'{searchWordEncode}') or startswith(mail,'{searchWordEncode}') or startswith(userPrincipalName,'{searchWordEncode}'")).GetAsync(); 35 | } 36 | 37 | public async Task GetUserByEmail(string email) 38 | { 39 | if (_memoryCache.TryGetValue(email, out User user)) 40 | { 41 | return user; 42 | } 43 | 44 | user = await GraphClient.Users[email].Request().GetAsync(); 45 | 46 | _memoryCache.Set(email, user); 47 | 48 | return user; 49 | } 50 | 51 | public Task Me() 52 | { 53 | return GraphClient.Me.Request().GetAsync(); 54 | } 55 | 56 | public Task SendMail(string subject, string[] mails, string content) 57 | { 58 | var message = new Message 59 | { 60 | Subject = subject, 61 | Body = new ItemBody 62 | { 63 | ContentType = BodyType.Html, 64 | Content = content 65 | }, 66 | ToRecipients = mails.Select(mail => new Recipient 67 | { 68 | EmailAddress = new EmailAddress 69 | { 70 | Address = mail 71 | } 72 | }).ToList() 73 | }; 74 | 75 | var saveToSentItems = false; 76 | 77 | return GraphClient.Me 78 | .SendMail(message, saveToSentItems) 79 | .Request() 80 | .PostAsync(); 81 | } 82 | 83 | private async Task> GetGroupUserIds(string teamId) 84 | { 85 | var result = new List(); 86 | var members = await GraphClient.Groups[teamId].TransitiveMembers.Request().Select("id").Top(50).GetAsync(); 87 | result.AddRange(members.Where(o => o is User).Select(o => o.Id)); 88 | while (members.NextPageRequest != null) 89 | { 90 | members = await members.NextPageRequest.GetAsync(); 91 | result.AddRange(members.Where(o => o is User).Select(o => o.Id)); 92 | } 93 | return result; 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/Views/Tab/DeleteEvents.cshtml: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 | 41 | 42 |
43 |
44 |
45 |
46 |
47 | 50 |
51 |
52 | 53 |
54 |
55 |
56 |
57 | Deleting meeting....... 58 |
59 |
60 |
61 |
62 | 63 |
64 | 65 | @section Scripts { 66 | 67 | } 68 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/plugins/clipboard/dialogs/paste.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. 3 | For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license 4 | */ 5 | CKEDITOR.dialog.add("paste",function(c){function k(a){var b=new CKEDITOR.dom.document(a.document),g=b.getBody(),d=b.getById("cke_actscrpt");d&&d.remove();g.setAttribute("contenteditable",!0);g.on(e.mainPasteEvent,function(a){a=e.initPasteDataTransfer(a);f?a!=f&&(f=e.initPasteDataTransfer()):f=a});if(CKEDITOR.env.ie&&8>CKEDITOR.env.version)b.getWindow().on("blur",function(){b.$.selection.empty()});b.on("keydown",function(a){a=a.data;var b;switch(a.getKeystroke()){case 27:this.hide();b=1;break;case 9:case CKEDITOR.SHIFT+ 6 | 9:this.changeFocus(1),b=1}b&&a.preventDefault()},this);c.fire("ariaWidget",new CKEDITOR.dom.element(a.frameElement));b.getWindow().getFrame().removeCustomData("pendingFocus")&&g.focus()}var h=c.lang.clipboard,e=CKEDITOR.plugins.clipboard,f;c.on("pasteDialogCommit",function(a){a.data&&c.fire("paste",{type:"auto",dataValue:a.data.dataValue,method:"paste",dataTransfer:a.data.dataTransfer||e.initPasteDataTransfer()})},null,null,1E3);return{title:h.paste,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?370: 7 | 350,minHeight:CKEDITOR.env.quirks?250:245,onShow:function(){this.parts.dialog.$.offsetHeight;this.setupContent();this._.committed=!1},onLoad:function(){(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)&&"rtl"==c.lang.dir&&this.parts.contents.setStyle("overflow","hidden")},onOk:function(){this.commitContent()},contents:[{id:"general",label:c.lang.common.generalTab,elements:[{type:"html",id:"pasteMsg",html:'\x3cdiv style\x3d"white-space:normal;width:340px"\x3e'+h.pasteMsg+"\x3c/div\x3e"},{type:"html", 8 | id:"editing_area",style:"width:100%;height:100%",html:"",focus:function(){var a=this.getInputElement(),b=a.getFrameDocument().getBody();!b||b.isReadOnly()?a.setCustomData("pendingFocus",1):b.focus()},setup:function(){var a=this.getDialog(),b='\x3chtml dir\x3d"'+c.config.contentsLangDirection+'" lang\x3d"'+(c.config.contentsLanguage||c.langCode)+'"\x3e\x3chead\x3e\x3cstyle\x3ebody{margin:3px;height:95%;word-break:break-all;}\x3c/style\x3e\x3c/head\x3e\x3cbody\x3e\x3cscript id\x3d"cke_actscrpt" type\x3d"text/javascript"\x3ewindow.parent.CKEDITOR.tools.callFunction('+ 9 | CKEDITOR.tools.addFunction(k,a)+",this);\x3c/script\x3e\x3c/body\x3e\x3c/html\x3e",g=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie&&!CKEDITOR.env.edge?"javascript:void((function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+'})())"':"",d=CKEDITOR.dom.element.createFromHtml('\x3ciframe class\x3d"cke_pasteframe" frameborder\x3d"0" allowTransparency\x3d"true" src\x3d"'+g+'" aria-label\x3d"'+h.pasteArea+'" aria-describedby\x3d"'+a.getContentElement("general", 10 | "pasteMsg").domId+'"\x3e\x3c/iframe\x3e');f=null;d.on("load",function(a){a.removeListener();a=d.getFrameDocument();a.write(b);c.focusManager.add(a.getBody());CKEDITOR.env.air&&k.call(this,a.getWindow().$)},a);d.setCustomData("dialog",a);a=this.getElement();a.setHtml("");a.append(d);if(CKEDITOR.env.ie&&!CKEDITOR.env.edge){var e=CKEDITOR.dom.element.createFromHtml('\x3cspan tabindex\x3d"-1" style\x3d"position:absolute" role\x3d"presentation"\x3e\x3c/span\x3e');e.on("focus",function(){setTimeout(function(){d.$.contentWindow.focus()})}); 11 | a.append(e);this.focus=function(){e.focus();this.fire("focus")}}this.getInputElement=function(){return d};CKEDITOR.env.ie&&(a.setStyle("display","block"),a.setStyle("height",d.$.offsetHeight+2+"px"))},commit:function(){var a=this.getDialog().getParentEditor(),b=this.getInputElement().getFrameDocument().getBody(),c=b.getBogus();c&&c.remove();b=b.getHtml();this.getDialog()._.committed=!0;a.fire("pasteDialogCommit",{dataValue:b,dataTransfer:f||e.initPasteDataTransfer()})}}]}]}}); -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/ckeditor/samples/toolbarconfigurator/js/fulltoolbareditor.js: -------------------------------------------------------------------------------- 1 | window.ToolbarConfigurator={}; 2 | (function(){function e(){this.instanceid="fte"+CKEDITOR.tools.getNextId();this.textarea=new CKEDITOR.dom.element("textarea");this.textarea.setAttributes({id:this.instanceid,name:this.instanceid,contentEditable:!0});this.editorInstance=this.buttons=null}ToolbarConfigurator.FullToolbarEditor=e;e.prototype.init=function(b){var a=this;document.body.appendChild(this.textarea.$);CKEDITOR.replace(this.instanceid);this.editorInstance=CKEDITOR.instances[this.instanceid];this.editorInstance.once("configLoaded",function(d){var c= 3 | d.editor.config;delete c.removeButtons;delete c.toolbarGroups;delete c.toolbar;ToolbarConfigurator.AbstractToolbarModifier.extendPluginsConfig(c);d.editor.once("loaded",function(){a.buttons=e.toolbarToButtons(a.editorInstance.toolbar);a.buttonsByGroup=e.groupButtons(a.buttons);a.buttonNamesByGroup=a.groupButtonNamesByGroup(a.buttons);d.editor.container.hide();"function"===typeof b&&b(a.buttons)})})};e.prototype.groupButtonNamesByGroup=function(b){var a=this;b=e.groupButtons(b);for(var d in b)b[d]= 4 | e.map(b[d],function(b){return a.getCamelCasedButtonName(b.name)});return b};e.prototype.getGroupByName=function(b){for(var a=this.editorInstance.config.toolbarGroups||this.getFullToolbarGroupsConfig(),d=a.length,c=0;c*{ 41 | line-height: 32px; 42 | font-size: 24px; 43 | @media #{$mobile} { 44 | font-size: 32px; 45 | } 46 | } 47 | >label{ 48 | font-weight: 600; 49 | padding-right: 15px; 50 | } 51 | .ms-Dropdown-title{ 52 | font-size: 20px; 53 | @media #{$mobile} { 54 | font-size: 24px; 55 | } 56 | } 57 | } 58 | .task{ 59 | box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.092); 60 | position: relative; 61 | color: rgb(51, 51, 51); 62 | margin: 0px 0px 32px 0px; 63 | padding: 15px 15px; 64 | font-size: 16px; 65 | line-height: 1.31; 66 | background: white; 67 | .TaskTitle{ 68 | font-weight: bold; 69 | @media #{$mobile} { 70 | font-size: 24px; 71 | } 72 | } 73 | .TaskDetails{ 74 | margin-top: 10px; 75 | display: flex; 76 | .dueDate{ 77 | width: 20%; 78 | } 79 | .eventTitle{ 80 | width: 80%; 81 | } 82 | } 83 | .eventStatus{ 84 | display: flex; 85 | justify-content: flex-end; 86 | font-weight: bold; 87 | span{ 88 | margin-left: 5px; 89 | font-weight: normal; 90 | } 91 | } 92 | } 93 | } 94 | } 95 | 96 | /* .event { 97 | box-shadow: var(--event-box-shadow, 0px 2px 8px rgba(0, 0, 0, 0.092)); 98 | display: flex; 99 | margin: 10px 10px; 100 | background-color: white; 101 | .eventtimecontainer { 102 | display: flex; 103 | flex-direction: column; 104 | width: 120px; 105 | margin: 18px 38px 18px 18px; 106 | color: rgb(51, 51, 51); 107 | .eventtime { 108 | font-size: var(--event-time-font-size, 12px); 109 | color: #000000; 110 | font-weight: 600; 111 | } 112 | } 113 | .eventdetailscontainer { 114 | margin: 14px 18px 14px 0px; 115 | .eventsubject { 116 | font-size: var(--event-subject-font-size, 19px); 117 | color: #333333; 118 | margin: 0px 18px 0px 0px; 119 | } 120 | .eventlocationcontainer { 121 | display: flex; 122 | margin: 8px 18px 0px 0px; 123 | .eventlocation { 124 | font-size: var(--event-location-font-size, 12px); 125 | color: #000000; 126 | margin: 0px 0px 0px 4px; 127 | } 128 | } 129 | } 130 | } */ 131 | } 132 | -------------------------------------------------------------------------------- /Source/FY19GraphShowcaseDemo/MeetingCaptureWebApp/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2019 The Bootstrap Authors 4 | * Copyright 2011-2019 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important} 8 | /*# sourceMappingURL=bootstrap-reboot.min.css.map */ --------------------------------------------------------------------------------