From a3b8ca87273d1b9d09d2882eaa90b16e3b8dfd8d Mon Sep 17 00:00:00 2001 From: Ejaz Hussain Date: Sun, 29 Oct 2023 22:41:56 +0000 Subject: [PATCH] react-realtime-incidentdashboard sample added --- .../.eslintrc.js | 379 ++++++++++++++++++ .../.gitignore | 35 ++ .../.npmignore | 16 + .../.yo-rc.json | 21 + .../README.md | 178 ++++++++ .../assets/list-notification-architecture.jpg | Bin 0 -> 50199 bytes .../assets/list-notification-dashboard.jpg | Bin 0 -> 99757 bytes .../assets/list-notification-teams.jpg | Bin 0 -> 39185 bytes .../assets/pnp-list-template.xml | 159 ++++++++ .../O365Clinic.Function.Webhooks/.gitignore | 264 ++++++++++++ .../Cards/Incident - Copy.json | 42 ++ .../Cards/Incident.json | 118 ++++++ .../Helpers/AdaptiveCardHelper.cs | 27 ++ .../Helpers/FunctionHelper.cs | 29 ++ .../Helpers/GraphAuthenticationManager.cs | 55 +++ .../Helpers/SPAuthenticationManager.cs | 76 ++++ .../Interfaces/IAuthenticationService.cs | 13 + .../Interfaces/IGraphService.cs | 18 + .../Interfaces/INotificationService.cs | 18 + .../Interfaces/ISharePointService.cs | 19 + .../Mapper/IncidentMapper.cs | 33 ++ .../Model/AzureFunctionSettings.cs | 18 + .../Model/IncidentItem.cs | 23 ++ .../Model/NotificationModel.cs | 34 ++ .../Model/ResponseModel.cs | 15 + .../Model/SubscriptionModel.cs | 27 ++ .../O365Clinic.Function.Webhooks.csproj | 31 ++ .../ProcessTicket.cs | 49 +++ .../SPWebhookReceiver.cs | 79 ++++ .../Services/GraphService.cs | 71 ++++ .../Services/NotificationService.cs | 57 +++ .../Services/SharePointService.cs | 136 +++++++ .../O365Clinic.Function.Webhooks/Startup.cs | 92 +++++ .../O365Clinic.Function.Webhooks/host.json | 12 + .../local.settings.copy.json | 16 + .../config/config.json | 20 + .../config/deploy-azure-storage.json | 7 + .../config/package-solution.json | 40 ++ .../config/sass.json | 3 + .../config/serve.json | 6 + .../config/write-manifests.json | 4 + .../fast-serve/config.json | 6 + .../fast-serve/webpack.extend.js | 24 ++ .../gulpfile.js | 22 + .../package.json | 53 +++ .../src/common/helpers/LogHelper.ts | 36 ++ .../src/common/services/SPService.ts | 46 +++ .../src/index.ts | 1 + .../dashboard/DashboardWebPart.manifest.json | 39 ++ .../webparts/dashboard/DashboardWebPart.ts | 215 ++++++++++ .../src/webparts/dashboard/assets/custom.d.ts | 20 + .../dashboard/assets/icon_service.png | Bin 0 -> 71327 bytes .../dashboard/assets/welcome-dark.png | Bin 0 -> 12545 bytes .../dashboard/assets/welcome-light.png | Bin 0 -> 12816 bytes .../components/Dashboard.module.scss | 66 +++ .../dashboard/components/Dashboard.tsx | 33 ++ .../dashboard/components/IDashboardProps.ts | 37 ++ .../SupportTickets/SupportTickets.tsx | 171 ++++++++ .../components/SupportTickets/TicketItem.tsx | 88 ++++ .../webPartTitle/WebPartTitle.module.scss | 43 ++ .../components/webPartTitle/WebPartTitle.tsx | 62 +++ .../components/webPartTitle/index.ts | 1 + .../webparts/dashboard/hooks/AppContext.ts | 6 + .../src/webparts/dashboard/loc/en-us.js | 16 + .../src/webparts/dashboard/loc/mystrings.d.ts | 19 + .../webparts/dashboard/models/IAppContext.ts | 9 + ...2052-c243-49d8-ab15-d537e9f1ad1c_color.png | Bin 0 -> 10248 bytes ...52-c243-49d8-ab15-d537e9f1ad1c_outline.png | Bin 0 -> 249 bytes .../tsconfig.json | 26 ++ 69 files changed, 3279 insertions(+) create mode 100644 samples/react-realtime-incidentdashboard/.eslintrc.js create mode 100644 samples/react-realtime-incidentdashboard/.gitignore create mode 100644 samples/react-realtime-incidentdashboard/.npmignore create mode 100644 samples/react-realtime-incidentdashboard/.yo-rc.json create mode 100644 samples/react-realtime-incidentdashboard/README.md create mode 100644 samples/react-realtime-incidentdashboard/assets/list-notification-architecture.jpg create mode 100644 samples/react-realtime-incidentdashboard/assets/list-notification-dashboard.jpg create mode 100644 samples/react-realtime-incidentdashboard/assets/list-notification-teams.jpg create mode 100644 samples/react-realtime-incidentdashboard/assets/pnp-list-template.xml create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/.gitignore create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Cards/Incident - Copy.json create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Cards/Incident.json create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Helpers/AdaptiveCardHelper.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Helpers/FunctionHelper.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Helpers/GraphAuthenticationManager.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Helpers/SPAuthenticationManager.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Interfaces/IAuthenticationService.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Interfaces/IGraphService.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Interfaces/INotificationService.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Interfaces/ISharePointService.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Mapper/IncidentMapper.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/AzureFunctionSettings.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/IncidentItem.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/NotificationModel.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/ResponseModel.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/SubscriptionModel.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/O365Clinic.Function.Webhooks.csproj create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/ProcessTicket.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/SPWebhookReceiver.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Services/GraphService.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Services/NotificationService.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Services/SharePointService.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Startup.cs create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/host.json create mode 100644 samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/local.settings.copy.json create mode 100644 samples/react-realtime-incidentdashboard/config/config.json create mode 100644 samples/react-realtime-incidentdashboard/config/deploy-azure-storage.json create mode 100644 samples/react-realtime-incidentdashboard/config/package-solution.json create mode 100644 samples/react-realtime-incidentdashboard/config/sass.json create mode 100644 samples/react-realtime-incidentdashboard/config/serve.json create mode 100644 samples/react-realtime-incidentdashboard/config/write-manifests.json create mode 100644 samples/react-realtime-incidentdashboard/fast-serve/config.json create mode 100644 samples/react-realtime-incidentdashboard/fast-serve/webpack.extend.js create mode 100644 samples/react-realtime-incidentdashboard/gulpfile.js create mode 100644 samples/react-realtime-incidentdashboard/package.json create mode 100644 samples/react-realtime-incidentdashboard/src/common/helpers/LogHelper.ts create mode 100644 samples/react-realtime-incidentdashboard/src/common/services/SPService.ts create mode 100644 samples/react-realtime-incidentdashboard/src/index.ts create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/DashboardWebPart.manifest.json create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/DashboardWebPart.ts create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/assets/custom.d.ts create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/assets/icon_service.png create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/assets/welcome-dark.png create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/assets/welcome-light.png create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/Dashboard.module.scss create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/Dashboard.tsx create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/IDashboardProps.ts create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/SupportTickets/SupportTickets.tsx create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/SupportTickets/TicketItem.tsx create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/webPartTitle/WebPartTitle.module.scss create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/webPartTitle/WebPartTitle.tsx create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/webPartTitle/index.ts create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/hooks/AppContext.ts create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/loc/en-us.js create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/loc/mystrings.d.ts create mode 100644 samples/react-realtime-incidentdashboard/src/webparts/dashboard/models/IAppContext.ts create mode 100644 samples/react-realtime-incidentdashboard/teams/d04b2052-c243-49d8-ab15-d537e9f1ad1c_color.png create mode 100644 samples/react-realtime-incidentdashboard/teams/d04b2052-c243-49d8-ab15-d537e9f1ad1c_outline.png create mode 100644 samples/react-realtime-incidentdashboard/tsconfig.json diff --git a/samples/react-realtime-incidentdashboard/.eslintrc.js b/samples/react-realtime-incidentdashboard/.eslintrc.js new file mode 100644 index 000000000..9f0159d1a --- /dev/null +++ b/samples/react-realtime-incidentdashboard/.eslintrc.js @@ -0,0 +1,379 @@ +require("@rushstack/eslint-config/patch/modern-module-resolution"); +module.exports = { + extends: ["@microsoft/eslint-config-spfx/lib/profiles/react"], + parserOptions: { tsconfigRootDir: __dirname }, + overrides: [ + { + files: ["*.ts", "*.tsx"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: "./tsconfig.json", + ecmaVersion: 2018, + sourceType: "module", + }, + rules: { + semi: 2, //Added by //O3C + "react/jsx-no-target-blank": 0, //O3C + // Prevent usage of the JavaScript null value, while allowing code to access existing APIs that may require null. https://www.npmjs.com/package/@rushstack/eslint-plugin + "@rushstack/no-new-null": 1, + // Require Jest module mocking APIs to be called before any other statements in their code block. https://www.npmjs.com/package/@rushstack/eslint-plugin + "@rushstack/hoist-jest-mock": 1, + // Require regular expressions to be constructed from string constants rather than dynamically building strings at runtime. https://www.npmjs.com/package/@rushstack/eslint-plugin-security + "@rushstack/security/no-unsafe-regexp": 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + "@typescript-eslint/adjacent-overload-signatures": 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // + // CONFIGURATION: By default, these are banned: String, Boolean, Number, Object, Symbol + "@typescript-eslint/ban-types": [ + 1, + { + extendDefaults: false, + types: { + String: { + message: "Use 'string' instead", + fixWith: "string", + }, + Boolean: { + message: "Use 'boolean' instead", + fixWith: "boolean", + }, + Number: { + message: "Use 'number' instead", + fixWith: "number", + }, + Object: { + message: + "Use 'object' instead, or else define a proper TypeScript type:", + }, + Symbol: { + message: "Use 'symbol' instead", + fixWith: "symbol", + }, + Function: { + message: + "The 'Function' type accepts any function-like value.\nIt provides no type safety when calling the function, which can be a common source of bugs.\nIt also accepts things like class declarations, which will throw at runtime as they will not be called with 'new'.\nIf you are expecting the function to accept certain arguments, you should explicitly define the function shape.", + }, + }, + }, + ], + // RATIONALE: Code is more readable when the type of every variable is immediately obvious. + // Even if the compiler may be able to infer a type, this inference will be unavailable + // to a person who is reviewing a GitHub diff. This rule makes writing code harder, + // but writing code is a much less important activity than reading it. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + "@typescript-eslint/explicit-function-return-type": [ + 0, //O3C + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + allowHigherOrderFunctions: false, + }, + ], + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: although this is a recommended rule, it is up to dev to select coding style. + // Set to 1 (warning) or 2 (error) to enable. + "@typescript-eslint/explicit-member-accessibility": 0, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + "@typescript-eslint/no-array-constructor": 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // + // RATIONALE: The "any" keyword disables static type checking, the main benefit of using TypeScript. + // This rule should be suppressed only in very special cases such as JSON.stringify() + // where the type really can be anything. Even if the type is flexible, another type + // may be more appropriate such as "unknown", "{}", or "Record". + "@typescript-eslint/no-explicit-any": 0, //O3C + // RATIONALE: The #1 rule of promises is that every promise chain must be terminated by a catch() + // handler. Thus wherever a Promise arises, the code must either append a catch handler, + // or else return the object to a caller (who assumes this responsibility). Unterminated + // promise chains are a serious issue. Besides causing errors to be silently ignored, + // they can also cause a NodeJS process to terminate unexpectedly. + "@typescript-eslint/no-floating-promises": 0, // FRESH + // RATIONALE: Catches a common coding mistake. + "@typescript-eslint/no-for-in-array": 2, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + "@typescript-eslint/no-misused-new": 2, + // RATIONALE: The "namespace" keyword is not recommended for organizing code because JavaScript lacks + // a "using" statement to traverse namespaces. Nested namespaces prevent certain bundler + // optimizations. If you are declaring loose functions/variables, it's better to make them + // static members of a class, since classes support property getters and their private + // members are accessible by unit tests. Also, the exercise of choosing a meaningful + // class name tends to produce more discoverable APIs: for example, search+replacing + // the function "reverse()" is likely to return many false matches, whereas if we always + // write "Text.reverse()" is more unique. For large scale organization, it's recommended + // to decompose your code into separate NPM packages, which ensures that component + // dependencies are tracked more conscientiously. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + "@typescript-eslint/no-namespace": [ + 1, + { + allowDeclarations: false, + allowDefinitionFiles: false, + }, + ], + // RATIONALE: Parameter properties provide a shorthand such as "constructor(public title: string)" + // that avoids the effort of declaring "title" as a field. This TypeScript feature makes + // code easier to write, but arguably sacrifices readability: In the notes for + // "@typescript-eslint/member-ordering" we pointed out that fields are central to + // a class's design, so we wouldn't want to bury them in a constructor signature + // just to save some typing. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Set to 1 (warning) or 2 (error) to enable the rule + "@typescript-eslint/no-parameter-properties": 0, + // RATIONALE: When left in shipping code, unused variables often indicate a mistake. Dead code + // may impact performance. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + "@typescript-eslint/no-unused-vars": [ + 1, + { + vars: "all", + // Unused function arguments often indicate a mistake in JavaScript code. However in TypeScript code, + // the compiler catches most of those mistakes, and unused arguments are fairly common for type signatures + // that are overriding a base class method or implementing an interface. + args: "none", + }, + ], + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + "@typescript-eslint/no-use-before-define": [ + 2, + { + functions: false, + classes: true, + variables: true, + enums: true, + typedefs: true, + }, + ], + // Disallows require statements except in import statements. + // In other words, the use of forms such as var foo = require("foo") are banned. Instead use ES6 style imports or import foo = require("foo") imports. + "@typescript-eslint/no-var-requires": "error", + // RATIONALE: The "module" keyword is deprecated except when describing legacy libraries. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + "@typescript-eslint/prefer-namespace-keyword": 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: it's up to developer to decide if he wants to add type annotations + // Set to 1 (warning) or 2 (error) to enable the rule + "@typescript-eslint/no-inferrable-types": 0, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: declaration of empty interfaces may be helpful for generic types scenarios + "@typescript-eslint/no-empty-interface": 0, + // RATIONALE: This rule warns if setters are defined without getters, which is probably a mistake. + "accessor-pairs": 1, + // RATIONALE: In TypeScript, if you write x["y"] instead of x.y, it disables type checking. + "dot-notation": [ + 1, + { + allowPattern: "^_", + }, + ], + // RATIONALE: Catches code that is likely to be incorrect + eqeqeq: 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "for-direction": 1, + // RATIONALE: Catches a common coding mistake. + "guard-for-in": 2, + // RATIONALE: If you have more than 2,000 lines in a single source file, it's probably time + // to split up your code. + "max-lines": ["warn", { max: 2000 }], + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-async-promise-executor": 0, //O3C + // RATIONALE: Deprecated language feature. + "no-caller": 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-compare-neg-zero": 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-cond-assign": 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-constant-condition": 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-control-regex": 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-debugger": 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-delete-var": 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-duplicate-case": 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-empty": 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-empty-character-class": 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-empty-pattern": 1, + // RATIONALE: Eval is a security concern and a performance concern. + "no-eval": 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-ex-assign": 2, + // RATIONALE: System types are global and should not be tampered with in a scalable code base. + // If two different libraries (or two versions of the same library) both try to modify + // a type, only one of them can win. Polyfills are acceptable because they implement + // a standardized interoperable contract, but polyfills are generally coded in plain + // JavaScript. + "no-extend-native": 1, + // Disallow unnecessary labels + "no-extra-label": 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-fallthrough": 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-func-assign": 1, + // RATIONALE: Catches a common coding mistake. + "no-implied-eval": 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-invalid-regexp": 2, + // RATIONALE: Catches a common coding mistake. + "no-label-var": 2, + // RATIONALE: Eliminates redundant code. + "no-lone-blocks": 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-misleading-character-class": 2, + // RATIONALE: Catches a common coding mistake. + "no-multi-str": 2, + // RATIONALE: It's generally a bad practice to call "new Thing()" without assigning the result to + // a variable. Either it's part of an awkward expression like "(new Thing()).doSomething()", + // or else implies that the constructor is doing nontrivial computations, which is often + // a poor class design. + "no-new": 1, + // RATIONALE: Obsolete language feature that is deprecated. + "no-new-func": 2, + // RATIONALE: Obsolete language feature that is deprecated. + "no-new-object": 2, + // RATIONALE: Obsolete notation. + "no-new-wrappers": 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-octal": 2, + // RATIONALE: Catches code that is likely to be incorrect + "no-octal-escape": 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-regex-spaces": 2, + // RATIONALE: Catches a common coding mistake. + "no-return-assign": 2, + // RATIONALE: Security risk. + "no-script-url": 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-self-assign": 2, + // RATIONALE: Catches a common coding mistake. + "no-self-compare": 2, + // RATIONALE: This avoids statements such as "while (a = next(), a && a.length);" that use + // commas to create compound expressions. In general code is more readable if each + // step is split onto a separate line. This also makes it easier to set breakpoints + // in the debugger. + "no-sequences": 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-shadow-restricted-names": 2, + // RATIONALE: Obsolete language feature that is deprecated. + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-sparse-arrays": 2, + // RATIONALE: Although in theory JavaScript allows any possible data type to be thrown as an exception, + // such flexibility adds pointless complexity, by requiring every catch block to test + // the type of the object that it receives. Whereas if catch blocks can always assume + // that their object implements the "Error" contract, then the code is simpler, and + // we generally get useful additional information like a call stack. + "no-throw-literal": 2, + // RATIONALE: Catches a common coding mistake. + "no-unmodified-loop-condition": 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-unsafe-finally": 2, + // RATIONALE: Catches a common coding mistake. + "no-unused-expressions": 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-unused-labels": 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-useless-catch": 1, + // RATIONALE: Avoids a potential performance problem. + "no-useless-concat": 1, + // RATIONALE: The "var" keyword is deprecated because of its confusing "hoisting" behavior. + // Always use "let" or "const" instead. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + "no-var": 2, + // RATIONALE: Generally not needed in modern code. + "no-void": 1, + // RATIONALE: Obsolete language feature that is deprecated. + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "no-with": 2, + // RATIONALE: Makes logic easier to understand, since constants always have a known value + // @typescript-eslint\eslint-plugin\dist\configs\eslint-recommended.js + "prefer-const": 1, + // RATIONALE: Catches a common coding mistake where "resolve" and "reject" are confused. + "promise/param-names": 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "require-atomic-updates": 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "require-yield": 1, + // "Use strict" is redundant when using the TypeScript compiler. + strict: [2, "never"], + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + "use-isnan": 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + // Set to 1 (warning) or 2 (error) to enable. + // Rationale to disable: !!{} + "no-extra-boolean-cast": 0, + // ==================================================================== + // @microsoft/eslint-plugin-spfx + // ==================================================================== + "@microsoft/spfx/import-requires-chunk-name": 1, + "@microsoft/spfx/no-require-ensure": 2, + "@microsoft/spfx/pair-react-dom-render-unmount": 0, //O3C + }, + }, + { + // For unit tests, we can be a little bit less strict. The settings below revise the + // defaults specified in the extended configurations, as well as above. + files: [ + // Test files + "*.test.ts", + "*.test.tsx", + "*.spec.ts", + "*.spec.tsx", + + // Facebook convention + "**/__mocks__/*.ts", + "**/__mocks__/*.tsx", + "**/__tests__/*.ts", + "**/__tests__/*.tsx", + + // Microsoft convention + "**/test/*.ts", + "**/test/*.tsx", + ], + rules: { + "no-new": 0, + "class-name": 0, + "export-name": 0, + forin: 0, + "label-position": 0, + "member-access": 2, + "no-arg": 0, + "no-console": 0, + "no-construct": 0, + "no-duplicate-variable": 2, + "no-eval": 0, + "no-function-expression": 2, + "no-internal-module": 2, + "no-shadowed-variable": 2, + "no-switch-case-fall-through": 2, + "no-unnecessary-semicolons": 2, + "no-unused-expression": 2, + "no-with-statement": 2, + semicolon: 2, + "trailing-comma": 0, + typedef: 0, + "typedef-whitespace": 0, + "use-named-parameter": 2, + "variable-name": 0, + whitespace: 0, + }, + }, + ], +}; diff --git a/samples/react-realtime-incidentdashboard/.gitignore b/samples/react-realtime-incidentdashboard/.gitignore new file mode 100644 index 000000000..572f0a3c7 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/.gitignore @@ -0,0 +1,35 @@ +# Logs +logs +*.log +npm-debug.log* + +# Dependency directories +node_modules + +# Build generated files +dist +lib +release +solution +temp +*.sppkg +.heft + +# Coverage directory used by tools like istanbul +coverage + +# OSX +.DS_Store + +# Visual Studio files +.ntvs_analysis.dat +.vs +bin +obj + +# Resx Generated Code +*.resx.ts + +# Styles Generated Code +*.scss.ts +*.scss.d.ts \ No newline at end of file diff --git a/samples/react-realtime-incidentdashboard/.npmignore b/samples/react-realtime-incidentdashboard/.npmignore new file mode 100644 index 000000000..ae0b487c0 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/.npmignore @@ -0,0 +1,16 @@ +!dist +config + +gulpfile.js + +release +src +temp + +tsconfig.json +tslint.json + +*.log + +.yo-rc.json +.vscode diff --git a/samples/react-realtime-incidentdashboard/.yo-rc.json b/samples/react-realtime-incidentdashboard/.yo-rc.json new file mode 100644 index 000000000..95a0544ce --- /dev/null +++ b/samples/react-realtime-incidentdashboard/.yo-rc.json @@ -0,0 +1,21 @@ +{ + "@microsoft/generator-sharepoint": { + "plusBeta": false, + "isCreatingSolution": true, + "nodeVersion": "16.18.1", + "sdksVersions": { + "@microsoft/microsoft-graph-client": "3.0.2", + "@microsoft/teams-js": "2.12.0" + }, + "version": "1.18.0", + "libraryName": "incident-dashbaord", + "libraryId": "2d3d9ea6-eef2-419e-8eeb-682c38aadd41", + "environment": "spo", + "packageManager": "npm", + "solutionName": "incident-dashbaord", + "solutionShortDescription": "incident-dashbaord description", + "skipFeatureDeployment": true, + "isDomainIsolated": false, + "componentType": "webpart" + } +} diff --git a/samples/react-realtime-incidentdashboard/README.md b/samples/react-realtime-incidentdashboard/README.md new file mode 100644 index 000000000..d285e06c8 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/README.md @@ -0,0 +1,178 @@ +# List notifications + Micrsoft Teams Integrations + +## Summary + +1. This sample web part illustrating using the SharePoint Framework List subscription capability, which allows you to get notified of changes to custom list [Tickets] refresh the displayed data. + +2. Azure Function is being used as notification URL for list webhook subscription. If any critical ticket is added or updated then a notification will be sent to the Microsoft Teams + +## Solution Architecture + +![Solution Architecture](./assets/list-notification-architecture.jpg "Solution Architecture") + +## Demo + +![Application demo](./assets/list-notification-dashboard.jpg "Application demo") + +![Application demo](./assets/list-notification-teams.jpg "Application demo") + +## Compatibility + +| :warning: Important | +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Every SPFx version is only compatible with specific version(s) of Node.js. In order to be able to build this sample, please ensure that the version of Node on your workstation matches one of the versions listed in this section. This sample will not work on a different version of Node. | +| Refer to for more information on SPFx compatibility. | + +![SPFx 1.17.4](https://img.shields.io/badge/SPFx-1.18.0-green.svg) +![Node.js v16.18.1](https://img.shields.io/badge/Node.js-v16.18.1-green.svg) +![Compatible with SharePoint Online](https://img.shields.io/badge/SharePoint%20Online-Compatible-green.svg) +![Does not work with SharePoint 2019](https://img.shields.io/badge/SharePoint%20Server%202019-Incompatible-red.svg "SharePoint Server 2019 requires SPFx 1.4.1 or lower") +![Does not work with SharePoint 2016 (Feature Pack 2)]( "SharePoint Server 2016 Feature Pack 2 requires SPFx 1.1") +![Teams Incompatible](https://img.shields.io/badge/Teams-Incompatible-lightgrey.svg) +![Local Workbench Incompatible](https://img.shields.io/badge/Local%20Workbench-Incompatible-red.svg "This solution requires access to a user's user and group ids") +![Hosted Workbench Compatible](https://img.shields.io/badge/Hosted%20Workbench-Compatible-green.svg) +![Compatible with Remote Containers](https://img.shields.io/badge/Remote%20Containers-Compatible-green.svg) + +## Applies to + +- [SharePoint Framework](https://aka.ms/spfx) +- [Microsoft 365 tenant](https://learn.microsoft.com/sharepoint/dev/spfx/set-up-your-developer-tenant) + +> Get your own free development tenant by subscribing to [Microsoft 365 developer program](http://aka.ms/m365devprogram) + +## Prerequisites + +To implement this scenario, you will need to configure the following components: + +### 1. Create Ticket list + +- Run the following PnP PowerShell command to add new list call Tickets. You can find the **pnp-list-template.xml** under assets folder + +```PowerShell +Connect-PnPOnline -Url {SiteURL} -Interactive +Invoke-PnPSiteTemplate -Path $listTemplatePath + +``` + +### 2. Register Azure AD app for SharePoint Online Authentication using Certificate approach + +- Run the following command to Create an Azure AD app and upload the certificate to Azure AD app as well as to your local machine + +```PowerShell + +$app = Register-PnPAzureADApp -ApplicationName "SP.List.Webhook" -Tenant contoso.onmicrosoft.com -OutPath c:\temp -CertificatePassword (ConvertTo-SecureString -String "password" -AsPlainText -Force) -Scopes "Sites.FullControl.All" -Store CurrentUser -Interactive +``` + +- Keep note of the EncodedBased64String value of the certificate + +### 3. Create Azure Storage Account + +- Follow the below link to Create Azure Storage Account. + + Create a Azure storge account [Click here for more detail](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-create?tabs=azure-portal). + +### 4. Create Microsoft Teams incoming webhook + +1. Open the Teams channel where you want to add the webhook. +2. Click the ••• menu in the top-right corner and select Connectors. +3. Search for Incoming Webhook and select Add. +4. Click Configure and enter a name and description for your webhook. +5. Click Add to Team. +6. Copy the webhook URL. Keep it save the URL. we need this in later stages + +### 5. Deploy the Azure function via Visual Studio 2022 + +To deploy an Azure Function from Visual Studio 2022, follow these steps: + +1. Open the Azure Function project (**from backend folder**) in Visual Studio 2022. +2. Select Publish from the Build menu. +3. Select Azure Functions as the publish target. +4. Click Publish. + +> Visual Studio will package the function code and deploy it to Azure. Once the deployment is complete, you will be able to access the function from the Azure portal. + +### 6. Add following Azure Function Configuration Settings + +```JSON +[ + + { + "name": "AzureWebJobsStorage", + "value": "Azure storage connection string", + }, + { + "name": "CertificateBase64Encoded", + "value": "Certificate base64 encoded value", + }, + { + "name": "ClientId", + "value": "xxxxxx-xxxxx-4b47-b143-db04e3b5586f", + }, + { + "name": "TenantBaseUrl", + "value": "https://tenant.sharepoint.com", + }, + { + "name": "TenantId", + "value": "xxxx-xxxxx-xxx-8304-0f0f2f840b5d", + }, + { + "name": "WebhookUrl", + "value": "Micrsoft Teams webhook URL" + } + +] +``` + +### 7. Adds a new Webhook subscription + +Run the following command to add the list webhook subscription + +```PowerShell +$AzureFunctionUrl = "https://spwebhook.azurewebsites.net/api/SPWebhookReceiver?clientId=blobs_extension" +Add-PnPWebhookSubscription -List "Tickets" -NotificationUrl $AzureFunctionUrl +``` + +## Contributors + +- [Ejaz Hussain](https://github.com/ejazhussain) + +## Version history + +| Version | Date | Comments | +| ------- | ---------------- | --------------- | +| 1.0.0 | October 29, 2023 | Initial release | + +## Minimal Path to Awesome + +1. Complete the above listed Prerequisites +2. Clone this repository +3. From your command line, change your current directory to the directory containing this sample (`react-realtime-incidentdashboard`, located under `samples`) +4. In the command line run: + +```cmd + `npm install` + `gulp bundle` + `gulp package-solution` +``` + +5. Deploy the package to your app catalog + +6. In the command-line run: + +```cmd + gulp serve --nobrowser +``` + +7. Open the hosted workbench on a SharePoint site - i.e. https://_tenant_.sharepoint.com/site/_sitename_/_layouts/workbench.aspx + +- Add the [O365C] Incident Dashboard web part to the page. +- In the web part properties, configure the following properties under Settings group + 1. Add Site URL + 2. Select a list. [only custom lists are allowed] + +## Features + +1. Increased productivity: List webhook can help to increase productivity by automating the process of sending notifications to Micrsoft Teams Channel when the bug is critical. + +2. Reduced downtime: The web part can help to reduce downtime by ensuring that team members are aware of critical tickets as soon as they are added or updated. diff --git a/samples/react-realtime-incidentdashboard/assets/list-notification-architecture.jpg b/samples/react-realtime-incidentdashboard/assets/list-notification-architecture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cad951feb06e80743eb659c317b8ab1dc3da5b49 GIT binary patch literal 50199 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 literal 0 HcmV?d00001 diff --git a/samples/react-realtime-incidentdashboard/assets/list-notification-dashboard.jpg b/samples/react-realtime-incidentdashboard/assets/list-notification-dashboard.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5930928219617dd311bb8e423e1055414922f6d GIT binary patch literal 99757 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

#1cP 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

wHvB>&|W+^65 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + clienttemplates.js + + + + GRIDFIXED + + + + + + + + + + + + + + + + + + + + + + 30 + clienttemplates.js + + + + + + + + + + + + + + + + + + + + + + 30 + clienttemplates.js + + + + + + + + + + + + + + + + + + + 30 + clienttemplates.js + + + + + + + Critical + High + Normal + Low + + + + + Blocked + In progress + Completed + Duplicate + By design + Won't fix + New + + New + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/.gitignore b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/.gitignore new file mode 100644 index 000000000..ff5b00c50 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/.gitignore @@ -0,0 +1,264 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# Azure Functions localsettings file +local.settings.json + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +#*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc \ No newline at end of file diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Cards/Incident - Copy.json b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Cards/Incident - Copy.json new file mode 100644 index 000000000..2c0a89337 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Cards/Incident - Copy.json @@ -0,0 +1,42 @@ +{ + "@type": "MessageCard", + "@context": "http://schema.org/extensions", + "summary": "A critical incident reported", + "sections": [ + { + "title": "${Title}", + "image": "https://o365clinicstorage.blob.core.windows.net/images/icon_task_yellow.png", + "facts": [ + { + "name": "Title:", + "value": "${Title}" + }, + { + "name": "Description:", + "value": "${Description}" + }, + { + "name": "Priority:", + "value": "${Priority}" + }, + { + "name": "Date reported:", + "value": "${DateReported}" + }, + { + "name": "Reported by:", + "value": "${Issueloggedby}" + } + ] + } + ], + "potentialAction": [ + { + "@context": "http://schema.org", + "@type": "ViewAction", + "name": "View Task Details", + "target": [ "${IncidentURL}" ] + } + + ] +} \ No newline at end of file diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Cards/Incident.json b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Cards/Incident.json new file mode 100644 index 000000000..2a86dbac1 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Cards/Incident.json @@ -0,0 +1,118 @@ +{ + + "type": "message", + "attachments": [ + { + "contentType": "application/vnd.microsoft.card.adaptive", + "contentUrl": null, + "content": { + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "type": "AdaptiveCard", + "version": "1.4", + "msteams": { + "width": "Full" + }, + "body": [ + { + "type": "ColumnSet", + "style": "default", + "columns": [ + { + "type": "Column", + "items": [ + { + "type": "TextBlock", + "size": "ExtraLarge", + "weight": "Bolder", + "text": "${Title}", + "wrap": true, + "fontType": "Default", + "color": "Attention", + "isSubtle": false + } + ], + "width": "stretch", + "padding": "None" + } + ], + "padding": "Default", + "spacing": "None", + "bleed": true + }, + { + "type": "Container", + "id": "", + "padding": "Large", + "items": [ + { + "type": "ColumnSet", + "columns": [ + { + "type": "Column", + "items": [ + { + "type": "Image", + "style": "Default", + "url": "https://o365clinicstorage.blob.core.windows.net/images/Images/it-support-ticket.jpeg", + "size": "Stretch" + } + ], + "width": "150px", + "padding": "None", + "separator": true, + "style": "default", + "bleed": true + }, + { + "type": "Column", + "items": [ + { + "type": "TextBlock", + "text": "${Description}", + "wrap": true, + "spacing": "Medium", + "style": "default", + "size": "Medium", + "weight": "Bolder" + }, + { + "type": "TextBlock", + "spacing": "Small", + "isSubtle": true, + "text": "${Priority}", + "wrap": true, + "size": "Small" + }, + { + "type": "TextBlock", + "text": "[More info](${ItemDisplayUrl})", + "wrap": true, + "color": "Accent", + "isSubtle": false, + "fontType": "Default", + "weight": "Bolder", + "spacing": "Small" + } + ], + "width": "stretch", + "padding": "None" + } + ], + "spacing": "Large", + "padding": "None", + "style": "default", + "bleed": false, + "separator": true + } + + ], + "spacing": "Medium", + "separator": true, + "style": "emphasis", + "bleed": true + } + ] + } + } + ] +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Helpers/AdaptiveCardHelper.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Helpers/AdaptiveCardHelper.cs new file mode 100644 index 000000000..3b9eb1293 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Helpers/AdaptiveCardHelper.cs @@ -0,0 +1,27 @@ +using AdaptiveCards.Templating; + +using Newtonsoft.Json; +using System; + +namespace O365Clinic.Function.Webhooks.Helpers +{ + public class AdaptiveCardHelper + { + public static string BindAdaptiveCardData(string adaptiveCardJson, T data) + { + if (data == null) + throw new ArgumentNullException("data"); + + var adaptiveCardObject = JsonConvert.DeserializeObject(adaptiveCardJson); + + // Create a Template instance from the template payload + AdaptiveCardTemplate template = new AdaptiveCardTemplate(adaptiveCardObject); + + // "Expand" the template - this generates the final Adaptive Card payload + string adaptiveCardPayload = template.Expand(data); + return adaptiveCardPayload; + } + + + } +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Helpers/FunctionHelper.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Helpers/FunctionHelper.cs new file mode 100644 index 000000000..20d69830d --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Helpers/FunctionHelper.cs @@ -0,0 +1,29 @@ +using Microsoft.Azure.WebJobs; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace O365Clinic.Function.Webhooks.Helpers +{ + public class FunctionHelper + { + internal static string GetCurrentDirectory(ExecutionContext executionContext) + { + string currentDirectory = executionContext.FunctionDirectory; + + var dInfo = new DirectoryInfo(currentDirectory); + + return dInfo.Parent.FullName; + } + + internal static string GetFilesDirectory(ExecutionContext executionContext) + { + string currentDirectory = GetCurrentDirectory(executionContext); + + return currentDirectory + "\\Cards"; + } + } +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Helpers/GraphAuthenticationManager.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Helpers/GraphAuthenticationManager.cs new file mode 100644 index 000000000..17fbbd830 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Helpers/GraphAuthenticationManager.cs @@ -0,0 +1,55 @@ +using Azure.Identity; +using Microsoft.Extensions.Configuration; +using Microsoft.Graph; +using Microsoft.Identity.Client; +using O365Clinic.Function.Webhooks.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace O365Clinic.Function.Webhooks.Helpers +{ + public class GraphAuthenticationManager + { + + public static GraphServiceClient GetAuthenticatedGraphClient(AzureFunctionSettings config) + { + + try + { + // The client credentials flow requires that you request the + // /.default scope, and pre-configure your permissions on the + // app registration in Azure. An administrator must grant consent + // to those permissions beforehand. + var scopes = new[] { "https://graph.microsoft.com/.default" }; + + // Values from app registration + var clientId = config.ClientId; + var tenantId = config.TenantId; + var clientSecret = config.ClientSecret; + + // using Azure.Identity; + var options = new ClientSecretCredentialOptions + { + AuthorityHost = AzureAuthorityHosts.AzurePublicCloud, + }; + + // https://learn.microsoft.com/dotnet/api/azure.identity.clientsecretcredential + var clientSecretCredential = new ClientSecretCredential( + tenantId, clientId, clientSecret, options); + + var graphClient = new GraphServiceClient(clientSecretCredential, scopes); + + return graphClient; + } + catch (Exception) + { + + throw; + } + + } + } +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Helpers/SPAuthenticationManager.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Helpers/SPAuthenticationManager.cs new file mode 100644 index 000000000..813fd5614 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Helpers/SPAuthenticationManager.cs @@ -0,0 +1,76 @@ +using Microsoft.Identity.Client; +using Microsoft.SharePoint.Client; +using System; +using System.Linq; +using System.Security.Cryptography.X509Certificates; +using System.Threading.Tasks; + + +namespace O365Clinic.Function.Webhooks.Helpers +{ + public class SPAuthenticationManager: IDisposable + { + private bool disposedValue; + public ClientContext GetContext(string siteUrl, string clientId, string tenantId, string certificateThumbprint, string tenantBaseUrl) + { + string accessToken = EnsureAccessTokenAsync(clientId, tenantId, certificateThumbprint, tenantBaseUrl).GetAwaiter().GetResult(); + ClientContext clientContext = new ClientContext(siteUrl); + clientContext.ExecutingWebRequest += + delegate (object oSender, WebRequestEventArgs webRequestEventArgs) + { + webRequestEventArgs.WebRequestExecutor.RequestHeaders["Authorization"] = + "Bearer " + accessToken; + }; + return clientContext; + } + + public async Task EnsureAccessTokenAsync(string clientId, string tenantId, string certificateThumbprint, string tenantBaseUrl) + { + X509Certificate2 certificate = LoadCertificate(certificateThumbprint); + var scopes = new string[] { $"{tenantBaseUrl}/.default" }; + + IConfidentialClientApplication clientApp = ConfidentialClientApplicationBuilder + .Create(clientId) + .WithCertificate(certificate) + .WithTenantId(tenantId) + .Build(); + + AuthenticationResult authResult = await clientApp.AcquireTokenForClient(scopes).ExecuteAsync(); + string accessToken = authResult.AccessToken; + return accessToken; + } + + + private X509Certificate2 LoadCertificate(string certificateThumbprint) + { + // Will only be populated correctly when running in the Azure Function host + string certBase64Encoded = Environment.GetEnvironmentVariable("CertificateBase64Encoded", EnvironmentVariableTarget.Process); + + if (!string.IsNullOrEmpty(certBase64Encoded)) + { + // Azure Function flow + return new X509Certificate2(Convert.FromBase64String(certBase64Encoded), + "", + X509KeyStorageFlags.Exportable | + X509KeyStorageFlags.MachineKeySet | + X509KeyStorageFlags.EphemeralKeySet); + } + else + { + // Local flow + var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); + store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); + var certificateCollection = store.Certificates.Find(X509FindType.FindByThumbprint, certificateThumbprint, false); + store.Close(); + + return certificateCollection.First(); + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + GC.SuppressFinalize(this); + } + } +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Interfaces/IAuthenticationService.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Interfaces/IAuthenticationService.cs new file mode 100644 index 000000000..55b00a42e --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Interfaces/IAuthenticationService.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace O365Clinic.Function.Webhooks.Interfaces +{ + public interface IAuthenticationService + { + Task GetAccessTokenAsync(string[] scopes); + } +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Interfaces/IGraphService.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Interfaces/IGraphService.cs new file mode 100644 index 000000000..794a10558 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Interfaces/IGraphService.cs @@ -0,0 +1,18 @@ +using Microsoft.Graph.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace O365Clinic.Function.Webhooks.Interfaces +{ + public interface IGraphService + { + Task GetUsersAsync(); + Task SendMessageToChannel(); + + } + + +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Interfaces/INotificationService.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Interfaces/INotificationService.cs new file mode 100644 index 000000000..c4600be61 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Interfaces/INotificationService.cs @@ -0,0 +1,18 @@ +using Microsoft.Graph.Models; +using O365Clinic.Function.Webhooks.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace O365Clinic.Function.Webhooks.Interfaces +{ + public interface INotificationService + { + Task SendNotificationToChannel(string webhookUrl, IncidentItem incidentItem, string itemDisplayUrl, string cardPath); + + } + + +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Interfaces/ISharePointService.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Interfaces/ISharePointService.cs new file mode 100644 index 000000000..e893ec266 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Interfaces/ISharePointService.cs @@ -0,0 +1,19 @@ + +using O365Clinic.Function.Webhooks.Models; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace O365Clinic.Function.Webhooks +{ + public interface ISharePointService + { + ///

+ /// Get Incidents + /// + /// + /// + //Task> GetTickets(string siteUrl); + Task GetListRecentChanges(string siteUrl, string cardPath); + + } +} \ No newline at end of file diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Mapper/IncidentMapper.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Mapper/IncidentMapper.cs new file mode 100644 index 000000000..d30bb0905 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Mapper/IncidentMapper.cs @@ -0,0 +1,33 @@ +using Microsoft.SharePoint.Client; +using O365Clinic.Function.Webhooks.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace O365Clinic.Function.Webhooks.Mapper +{ + public static class IncidentMapper + { + public static IncidentItem MapIncidents(ListItem listItem) + { + List result = new List + { + new IncidentItem + { + Title = !string.IsNullOrEmpty(listItem["Title"].ToString()) ? listItem["Title"].ToString() : string.Empty, + Description = !string.IsNullOrEmpty(listItem["Description"].ToString()) ? listItem["Description"].ToString() : string.Empty, + Status = !string.IsNullOrEmpty(listItem["Status"].ToString()) ? listItem["Status"].ToString() : string.Empty, + Priority = !string.IsNullOrEmpty(listItem["Priority"].ToString()) ? listItem["Priority"].ToString() : string.Empty, + DateReported = !string.IsNullOrEmpty(listItem["DateReported"].ToString()) ? listItem["DateReported"].ToString() : string.Empty, + IssueSource = listItem["IssueSource"] != null ? (listItem["IssueSource"] as FieldUrlValue).Url.ToString() : string.Empty, + IssueLoggedBy = listItem["Issueloggedby"] != null ? (listItem["Issueloggedby"] as FieldUserValue).Email : string.Empty, + } + }; + + return result.FirstOrDefault(); + + } + } +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/AzureFunctionSettings.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/AzureFunctionSettings.cs new file mode 100644 index 000000000..22515aa72 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/AzureFunctionSettings.cs @@ -0,0 +1,18 @@ +using System.Security.Cryptography.X509Certificates; + +namespace O365Clinic.Function.Webhooks.Models +{ + public class AzureFunctionSettings + { + public string TenantId { get; set; } + + public string TenantBaseUrl { get; set; } + public string ClientId { get; set; } + public string ClientSecret { get; set; } + public string CertificateThumbprint { get; set; } + public string CertificateName { get; set; } + public string SiteUrl { get; set; } + public string WebhookUrl { get; set; } + + } +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/IncidentItem.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/IncidentItem.cs new file mode 100644 index 000000000..d804037b8 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/IncidentItem.cs @@ -0,0 +1,23 @@ +using Microsoft.SharePoint.Client; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace O365Clinic.Function.Webhooks.Models +{ + public class IncidentItem + { + public string Title { get; set; } + public string Description { get; set; } + public string Priority { get; set; } + public string Status { get; set; } + public string AssignedTo { get; set; } + public string DateReported { get; set; } + public string IssueSource { get; set; } + public string IssueLoggedBy { get; set; } + public string Images { get; set; } + + } +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/NotificationModel.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/NotificationModel.cs new file mode 100644 index 000000000..9df8b7b5b --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/NotificationModel.cs @@ -0,0 +1,34 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace O365Clinic.Function.Webhooks.Model +{ + public class NotificationModel + { + [JsonProperty(PropertyName = "subscriptionId")] + public string SubscriptionId { get; set; } + + [JsonProperty(PropertyName = "clientState")] + public string ClientState { get; set; } + + [JsonProperty(PropertyName = "expirationDateTime")] + public DateTime ExpirationDateTime { get; set; } + + [JsonProperty(PropertyName = "resource")] + public string Resource { get; set; } + + [JsonProperty(PropertyName = "tenantId")] + public string TenantId { get; set; } + + [JsonProperty(PropertyName = "siteUrl")] + public string SiteUrl { get; set; } + + [JsonProperty(PropertyName = "webId")] + public string WebId { get; set; } + } + +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/ResponseModel.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/ResponseModel.cs new file mode 100644 index 000000000..d5e5ea664 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/ResponseModel.cs @@ -0,0 +1,15 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace O365Clinic.Function.Webhooks.Model +{ + public class ResponseModel + { + [JsonProperty(PropertyName = "value")] + public List Value { get; set; } + } +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/SubscriptionModel.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/SubscriptionModel.cs new file mode 100644 index 000000000..3d1e29d65 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Model/SubscriptionModel.cs @@ -0,0 +1,27 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace O365Clinic.Function.Webhooks.Model +{ + public class SubscriptionModel + { + [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] + public string Id { get; set; } + + [JsonProperty(PropertyName = "clientState", NullValueHandling = NullValueHandling.Ignore)] + public string ClientState { get; set; } + + [JsonProperty(PropertyName = "expirationDateTime")] + public DateTime ExpirationDateTime { get; set; } + + [JsonProperty(PropertyName = "notificationUrl")] + public string NotificationUrl { get; set; } + + [JsonProperty(PropertyName = "resource", NullValueHandling = NullValueHandling.Ignore)] + public string Resource { get; set; } + } +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/O365Clinic.Function.Webhooks.csproj b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/O365Clinic.Function.Webhooks.csproj new file mode 100644 index 000000000..bba0b38ff --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/O365Clinic.Function.Webhooks.csproj @@ -0,0 +1,31 @@ + + + net6.0 + v4 + + + + + + + + + + + + + Always + + + PreserveNewest + + + Always + Never + + + Always + Never + + + diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/ProcessTicket.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/ProcessTicket.cs new file mode 100644 index 000000000..febb5d301 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/ProcessTicket.cs @@ -0,0 +1,49 @@ +using System; +using Microsoft.Azure.WebJobs; +using Microsoft.Azure.WebJobs.Host; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json; +using O365Clinic.Function.Webhooks.Models; +using System.Threading.Tasks; +using Microsoft.SharePoint.Client; +using System.Collections.Generic; +using System.IO; +using O365Clinic.Function.Webhooks.Helpers; + +namespace O365Clinic.Function.Webhooks +{ + public class ProcessTicket + { + private readonly AzureFunctionSettings configSettings; + private readonly ISharePointService sharePointService; + + public ProcessTicket(AzureFunctionSettings settings, ISharePointService sharePointService) + { + configSettings = settings; + this.sharePointService = sharePointService; + } + + [FunctionName("ProcessTicket")] + public void Run([QueueTrigger("o365c-webhookqueue", Connection = "AzureWebJobsStorage")] string myQueueItem, ILogger log, ExecutionContext executionContext) + { + log.LogInformation($"C# Queue trigger function processed: {myQueueItem}"); + + var cardPath = Path.Combine(executionContext.FunctionAppDirectory, "Cards", "Incident.json"); + log.LogInformation($"Cards directory: {cardPath}"); + //string cardsDir = FunctionHelper.GetFilesDirectory(executionContext); + + var data = (JObject)JsonConvert.DeserializeObject(myQueueItem); + + var notificationResource = data["resource"].Value(); + + var siteUrl = configSettings.TenantBaseUrl + data["siteUrl"].Value(); + + log.LogInformation($"List siteUrl: {siteUrl}"); + + sharePointService.GetListRecentChanges(siteUrl, cardPath).GetAwaiter().GetResult(); + + log.LogInformation($"notificationResource: {notificationResource}"); + } + } +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/SPWebhookReceiver.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/SPWebhookReceiver.cs new file mode 100644 index 000000000..fc97c8c61 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/SPWebhookReceiver.cs @@ -0,0 +1,79 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Azure.WebJobs; +using Microsoft.Azure.WebJobs.Extensions.Http; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Microsoft.WindowsAzure.Storage.Queue; +using O365Clinic.Function.Webhooks.Model; +using System.Text; +using Azure.Storage.Queues; +using O365Clinic.Function.Webhooks.Models; +using System.Collections.Generic; +using O365Clinic.Function.Webhooks.Services; +using O365Clinic.Function.Webhooks.Interfaces; +using Microsoft.AspNetCore.Mvc.Filters; + +namespace O365Clinic.Function.Webhooks +{ + public class SPWebhookReceiver + { + + private readonly AzureFunctionSettings _configSettings; + + public SPWebhookReceiver( + ILoggerFactory loggerFactory, + AzureFunctionSettings settings + ) + { + _configSettings = settings; + } + + [FunctionName("SPWebhookReceiver")] + public async Task Run( + [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, + [Queue("o365c-webhookqueue", Connection = "AzureWebJobsStorage")] QueueClient outputQueue, ILogger log, ExecutionContext execution) + { + log.LogInformation($"Webhook was triggered!"); + + + // Grab the validationToken URL parameter + string validationToken = req.Query["validationtoken"]; + + // If a validation token is present, we need to respond within 5 seconds by + // returning the given validation token. This only happens when a new + // webhook is being added + if (validationToken != null) + { + log.LogInformation($"Validation token {validationToken} received"); + return new OkObjectResult(validationToken); + } + + log.LogInformation($"SharePoint triggered our webhook...great :-)"); + var content = await new StreamReader(req.Body).ReadToEndAsync(); + log.LogInformation($"Received following payload: {content}"); + + var notifications = JsonConvert.DeserializeObject>(content).Value; + log.LogInformation($"Found {notifications.Count} notifications"); + + if (notifications.Count > 0) + { + log.LogInformation($"Processing notifications..."); + foreach (var notification in notifications) + { + // add message to the queue + string message = JsonConvert.SerializeObject(notification); + log.LogInformation($"Before adding a message to the queue. Message content: {message}"); + await outputQueue.SendMessageAsync(message); + log.LogInformation($"Message added :-)"); + } + } + + // if we get here we assume the request was well received + return new OkObjectResult($"Added to queue"); + } + } +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Services/GraphService.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Services/GraphService.cs new file mode 100644 index 000000000..626b55152 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Services/GraphService.cs @@ -0,0 +1,71 @@ +using Microsoft.Extensions.Logging; +using Microsoft.Graph.Models; +using O365Clinic.Function.Webhooks.Helpers; +using O365Clinic.Function.Webhooks.Interfaces; +using O365Clinic.Function.Webhooks.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace O365Clinic.Function.Webhooks.Services +{ + + public class GraphService: IGraphService + { + private readonly AzureFunctionSettings _configSettings; + private readonly ILogger logger; + + public GraphService( + ILoggerFactory loggerFactory, + AzureFunctionSettings settings + + ) + { + logger = loggerFactory.CreateLogger(); + _configSettings = settings; + } + + public async Task GetUsersAsync() + { + try + { + var graphClient = GraphAuthenticationManager.GetAuthenticatedGraphClient(_configSettings); + + var result = await graphClient.Users.GetAsync(); + + return result; + } + catch (Exception) + { + return null; + } + + } + public async Task SendMessageToChannel() + { + try + { + var graphClient = GraphAuthenticationManager.GetAuthenticatedGraphClient(_configSettings); + + var requestBody = new ChatMessage + { + Body = new ItemBody + { + Content = "Hello World", + }, + }; + var result = await graphClient.Teams["cd76833a-7bf1-410f-ad41-6dac0b388540"].Channels["19:8d963euP_6rM_P_j8-s3RVcnU189W6Vv_qsPaUJcUIQ1@thread.tacv2"].Messages.PostAsync(requestBody); + + return result; + } + catch (Exception ex) + { + return null; + } + + } + } + +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Services/NotificationService.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Services/NotificationService.cs new file mode 100644 index 000000000..efe7d2c6e --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Services/NotificationService.cs @@ -0,0 +1,57 @@ +using Microsoft.SharePoint.News.DataModel; +using O365Clinic.Function.Webhooks.Helpers; +using O365Clinic.Function.Webhooks.Interfaces; +using O365Clinic.Function.Webhooks.Models; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http.Headers; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace O365Clinic.Function.Webhooks.Services +{ + public class NotificationService : INotificationService + { + public async Task SendNotificationToChannel(string webhookUrl, IncidentItem incidentItem, string itemDisplayUrl, string cardPath) + { + string cardJson = GetConnectorCardJson(incidentItem, itemDisplayUrl, cardPath); + await PostCardAsync(webhookUrl, cardJson); + } + private async Task PostCardAsync(string webhookUrl, string cardJson) + { + //prepare the http POST + HttpClient client = new HttpClient(); + client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + var content = new StringContent(cardJson, System.Text.Encoding.UTF8, "application/json"); + using (var response = await client.PostAsync(webhookUrl, content)) + { + // Check response.IsSuccessStatusCode and take appropriate action if needed. + } + } + + public string GetConnectorCardJson(IncidentItem incidentItem, string itemDisplayUrl, string cardPath) + { + + var filePath = cardPath; + var adaptiveCardJson = File.ReadAllText(filePath); + var cardData = new + { + + Title = incidentItem.Title, + Description = incidentItem.Description, + Priority = incidentItem.Priority, + DateReported = incidentItem.DateReported, + Issueloggedby = incidentItem.IssueLoggedBy, + ItemDisplayUrl = itemDisplayUrl, + }; + var taskCard = AdaptiveCardHelper.BindAdaptiveCardData(adaptiveCardJson, cardData); + + return taskCard; + + + } + } +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Services/SharePointService.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Services/SharePointService.cs new file mode 100644 index 000000000..a2068c6e2 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Services/SharePointService.cs @@ -0,0 +1,136 @@ + +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Primitives; +using Newtonsoft.Json.Linq; +using O365Clinic.Function.Webhooks.Interfaces; +using O365Clinic.Function.Webhooks.Models; +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Web; +using System.Security.Policy; + +using System.Linq; +using O365Clinic.Function.Webhooks.Helpers; +using Microsoft.SharePoint.Client; +using ChangeToken = Microsoft.SharePoint.Client.ChangeToken; +using O365Clinic.Function.Webhooks.Mapper; + +namespace O365Clinic.Function.Webhooks.Services +{ + public class SharePointService : ISharePointService + { + private readonly AzureFunctionSettings _configSettings; + private readonly INotificationService _notificationService; + private readonly ILogger logger; + + public SharePointService( + ILoggerFactory loggerFactory, + AzureFunctionSettings settings, + INotificationService notificationService + ) + { + logger = loggerFactory.CreateLogger(); + _configSettings = settings; + _notificationService = notificationService; + } + + public async Task GetListRecentChanges(string siteUrl, string cardPath) + { + logger.LogInformation("Gettinng list recent changes..."); + string result = string.Empty; + using (SPAuthenticationManager authenticationManager = new SPAuthenticationManager()) + using (var clientContext = authenticationManager.GetContext(siteUrl, _configSettings.ClientId, _configSettings.TenantId, _configSettings.CertificateThumbprint, _configSettings.TenantBaseUrl)) + { + logger.LogInformation("SP Context initialized"); + try + { + Web web = clientContext.Web; + List list = web.Lists.GetByTitle("Tickets"); + clientContext.Load(list); + await clientContext.ExecuteQueryAsync(); + + var listId = list.Id.ToString(); + var duration = "5"; + + ChangeToken changeTokenStart = new ChangeToken(); + changeTokenStart.StringValue = string.Format("1;3;{0};{1};-1", listId, DateTime.Now.AddMinutes(Convert.ToInt32(duration) * -1).ToUniversalTime().Ticks.ToString()); + ChangeToken changeTokenEnd = new ChangeToken(); + changeTokenEnd.StringValue = string.Format("1;3;{0};{1};-1", listId, DateTime.Now.ToUniversalTime().Ticks.ToString()); + ChangeQuery changeTokenQuery = new ChangeQuery(false, false); + changeTokenQuery.Item = true; + changeTokenQuery.Add = true; + changeTokenQuery.Update = true; + changeTokenQuery.ChangeTokenStart = changeTokenStart; + changeTokenQuery.ChangeTokenEnd = changeTokenEnd; + + var changes = list.GetChanges(changeTokenQuery); + clientContext.Load(changes); + await clientContext.ExecuteQueryAsync(); + + logger.LogInformation("Total Changes: " + changes.Count); + + + if (changes.Count > 0) + { + foreach (var change in changes) + { + if (change is ChangeItem) + { + var item = (ChangeItem)change; + var itemId = item.ItemId; + var listItem = list.GetItemById(itemId); + clientContext.Load(listItem); + clientContext.Load(listItem, li => li["Title"], li => li["Description"], li => li["Status"], li => li["Priority"], li => li["IssueSource"], li => li["Issueloggedby"]); + await clientContext.ExecuteQueryAsync(); + + if (listItem != null) + { + IncidentItem incidentItem = IncidentMapper.MapIncidents(listItem); + + if (incidentItem.Priority.Equals("Critical", StringComparison.OrdinalIgnoreCase)) + { + var itemDisplayUrl = _configSettings.TenantBaseUrl + listItem["FileDirRef"].ToString() + "/"+ "DispForm.aspx?ID=" + listItem["ID"]; + logger.LogInformation("Critical ticket found"); + logger.LogInformation("Posting notification to IT Support Channel in Teams"); + await _notificationService.SendNotificationToChannel(_configSettings.WebhookUrl, incidentItem, itemDisplayUrl, cardPath); + logger.LogInformation("Notification sent successfully"); + + + } + } + } + } + } + result = changes.Count.ToString(); + + + } + catch (Exception ex) + { + throw; + } + + + } + } + + + + public async Task GetWebTitle(string siteUrl) + { + List incidentItems = new List(); + string result = string.Empty; + using (SPAuthenticationManager authenticationManager = new SPAuthenticationManager()) + using (var context = authenticationManager.GetContext(siteUrl, _configSettings.ClientId, _configSettings.TenantId, _configSettings.CertificateThumbprint, _configSettings.TenantBaseUrl)) + { + context.Load(context.Web, p => p.Title); + await context.ExecuteQueryAsync(); + result = context.Web.Title; + } + return result; + } + + } +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Startup.cs b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Startup.cs new file mode 100644 index 000000000..a3b2012f8 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/Startup.cs @@ -0,0 +1,92 @@ +using Microsoft.Azure.Functions.Extensions.DependencyInjection; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using O365Clinic.Function.Webhooks.Interfaces; +using O365Clinic.Function.Webhooks.Models; +using O365Clinic.Function.Webhooks.Services; +using System; +using System.Linq; +using System.Security.Cryptography.X509Certificates; + + +[assembly: FunctionsStartup(typeof(O365Clinic.Function.Webhooks.Startup))] + +namespace O365Clinic.Function.Webhooks +{ + public class Startup : FunctionsStartup + { + public override void Configure(IFunctionsHostBuilder builder) + { + + var config = builder.GetContext().Configuration; + var azureFunctionSettings = new AzureFunctionSettings(); + config.Bind(azureFunctionSettings); + + // Add our configuration class + builder.Services.AddSingleton(options => { return azureFunctionSettings; }); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + + ////Register the code page provider + //Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + + + //// Add and configure PnP Core SDK + //builder.Services.AddPnPCore(options => + //{ + + // // Load the certificate to use + // X509Certificate2 cert = LoadCertificate(azureFunctionSettings); + + // // Disable telemetry because of mixed versions on AppInsights dependencies + // options.DisableTelemetry = true; + + // // Configure an authentication provider with certificate (Required for app only) + // var authProvider = new X509CertificateAuthenticationProvider( + // azureFunctionSettings.ClientId, + // azureFunctionSettings.TenantId, + // cert + // ); + + // // And set it as default + // options.DefaultAuthenticationProvider = authProvider; + + // // Add a default configuration with the site configured in app settings + // options.Sites.Add("Default", + // new PnPCoreSiteOptions + // { + // SiteUrl = azureFunctionSettings.SiteUrl, + // AuthenticationProvider = authProvider + // }); + //}); + + } + + private static X509Certificate2 LoadCertificate(AzureFunctionSettings azureFunctionSettings) + { + // Will only be populated correctly when running in the Azure Function host + string certBase64Encoded = Environment.GetEnvironmentVariable("CertificateFromKeyVault", EnvironmentVariableTarget.Process); + + if (!string.IsNullOrEmpty(certBase64Encoded)) + { + // Azure Function flow + return new X509Certificate2(Convert.FromBase64String(certBase64Encoded), + "", + X509KeyStorageFlags.Exportable | + X509KeyStorageFlags.MachineKeySet | + X509KeyStorageFlags.EphemeralKeySet); + } + else + { + // Local flow + var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); + store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); + var certificateCollection = store.Certificates.Find(X509FindType.FindByThumbprint, azureFunctionSettings.CertificateThumbprint, false); + store.Close(); + + return certificateCollection.First(); + } + } + } +} diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/host.json b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/host.json new file mode 100644 index 000000000..ee5cf5f83 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/host.json @@ -0,0 +1,12 @@ +{ + "version": "2.0", + "logging": { + "applicationInsights": { + "samplingSettings": { + "isEnabled": true, + "excludedTypes": "Request" + }, + "enableLiveMetricsFilters": true + } + } +} \ No newline at end of file diff --git a/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/local.settings.copy.json b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/local.settings.copy.json new file mode 100644 index 000000000..409f95ed5 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/backend/O365Clinic.Function.Webhooks/local.settings.copy.json @@ -0,0 +1,16 @@ +{ + "IsEncrypted": false, + "Values": { + "AzureWebJobsStorage": "Azure Storage Account Key", + "FUNCTIONS_WORKER_RUNTIME": "dotnet", + "TenantBaseUrl": "https://TenantName.sharepoint.com", + "SiteUrl": "https://TenantName.sharepoint.com/sites/incident-mgmt/", + "TenantId": "zzzzzzz-9ebc-4eb1-xxxx-xxxxxxxx", + "ClientId": "xxxxxxx-1178-xxxxx-xxx-db04e3b5586f", + "CertificateThumbPrint": "zxxxxxx3A7DE372AC7FC5C5ED2xxx", + "WebhookUrl": "https://TenantName.webhook.office.com/webhookb2/xxxxx-7bf1-410f-ad41-xxxxxxxx@xxxxxxx-9ebc-4eb1-8304-xxxxxxx/IncomingWebhook/xxxxxxxxxxxxxxxxxxxxxxxxxxx/2a5de346-1d63-4c7a-897f-xxxxxxxxxxxxxxxx" + }, + "Host": { + "CORS": "*" + } +} \ No newline at end of file diff --git a/samples/react-realtime-incidentdashboard/config/config.json b/samples/react-realtime-incidentdashboard/config/config.json new file mode 100644 index 000000000..b914aabb1 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/config/config.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/config.2.0.schema.json", + "version": "2.0", + "bundles": { + "dashboard-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/dashboard/DashboardWebPart.js", + "manifest": "./src/webparts/dashboard/DashboardWebPart.manifest.json" + } + ] + } + }, + "externals": {}, + "localizedResources": { + "DashboardWebPartStrings": "lib/webparts/dashboard/loc/{locale}.js", + "PropertyControlStrings": "node_modules/@pnp/spfx-property-controls/lib/loc/{locale}.js", + "ControlStrings": "node_modules/@pnp/spfx-controls-react/lib/loc/{locale}.js" + } +} \ No newline at end of file diff --git a/samples/react-realtime-incidentdashboard/config/deploy-azure-storage.json b/samples/react-realtime-incidentdashboard/config/deploy-azure-storage.json new file mode 100644 index 000000000..bb1fab23c --- /dev/null +++ b/samples/react-realtime-incidentdashboard/config/deploy-azure-storage.json @@ -0,0 +1,7 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/deploy-azure-storage.schema.json", + "workingDir": "./release/assets/", + "account": "", + "container": "incident-dashbaord", + "accessKey": "" +} \ No newline at end of file diff --git a/samples/react-realtime-incidentdashboard/config/package-solution.json b/samples/react-realtime-incidentdashboard/config/package-solution.json new file mode 100644 index 000000000..1dd11047a --- /dev/null +++ b/samples/react-realtime-incidentdashboard/config/package-solution.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/package-solution.schema.json", + "solution": { + "name": "O365C Incident Dashbaord", + "id": "2d3d9ea6-eef2-419e-8eeb-682c38aadd41", + "version": "1.0.0.0", + "includeClientSideAssets": true, + "skipFeatureDeployment": true, + "isDomainIsolated": false, + "developer": { + "name": "", + "websiteUrl": "", + "privacyUrl": "", + "termsOfUseUrl": "", + "mpnId": "Undefined-1.18.0" + }, + "metadata": { + "shortDescription": { + "default": "O365C Incident Dashbaord description" + }, + "longDescription": { + "default": "O365C Incident Dashbaord description" + }, + "screenshotPaths": [], + "videoUrl": "", + "categories": [] + }, + "features": [ + { + "title": "O365C Incident DashbaordFeature", + "description": "The feature that activates elements of the incident-dashbaord solution.", + "id": "78ea4350-7b84-4c43-978b-4999534d87e7", + "version": "1.0.0.0" + } + ] + }, + "paths": { + "zippedPackage": "solution/o365c-incident-dashbaord.sppkg" + } +} \ No newline at end of file diff --git a/samples/react-realtime-incidentdashboard/config/sass.json b/samples/react-realtime-incidentdashboard/config/sass.json new file mode 100644 index 000000000..5e78c982d --- /dev/null +++ b/samples/react-realtime-incidentdashboard/config/sass.json @@ -0,0 +1,3 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/core-build/sass.schema.json" +} \ No newline at end of file diff --git a/samples/react-realtime-incidentdashboard/config/serve.json b/samples/react-realtime-incidentdashboard/config/serve.json new file mode 100644 index 000000000..a4c03e287 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/config/serve.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/spfx-serve.schema.json", + "port": 4321, + "https": true, + "initialPage": "https://{tenantDomain}/_layouts/workbench.aspx" +} diff --git a/samples/react-realtime-incidentdashboard/config/write-manifests.json b/samples/react-realtime-incidentdashboard/config/write-manifests.json new file mode 100644 index 000000000..bad352605 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/config/write-manifests.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/write-manifests.schema.json", + "cdnBasePath": "" +} \ No newline at end of file diff --git a/samples/react-realtime-incidentdashboard/fast-serve/config.json b/samples/react-realtime-incidentdashboard/fast-serve/config.json new file mode 100644 index 000000000..fbb6384ca --- /dev/null +++ b/samples/react-realtime-incidentdashboard/fast-serve/config.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://raw.githubusercontent.com/s-KaiNet/spfx-fast-serve/master/schema/config.latest.schema.json", + "cli": { + "isLibraryComponent": false + } +} \ No newline at end of file diff --git a/samples/react-realtime-incidentdashboard/fast-serve/webpack.extend.js b/samples/react-realtime-incidentdashboard/fast-serve/webpack.extend.js new file mode 100644 index 000000000..22e737e60 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/fast-serve/webpack.extend.js @@ -0,0 +1,24 @@ +/* +* User webpack settings file. You can add your own settings here. +* Changes from this file will be merged into the base webpack configuration file. +* This file will not be overwritten by the subsequent spfx-fast-serve calls. +*/ + +// you can add your project related webpack configuration here, it will be merged using webpack-merge module +// i.e. plugins: [new webpack.Plugin()] +const webpackConfig = { + +} + +// for even more fine-grained control, you can apply custom webpack settings using below function +const transformConfig = function (initialWebpackConfig) { + // transform the initial webpack config here, i.e. + // initialWebpackConfig.plugins.push(new webpack.Plugin()); etc. + + return initialWebpackConfig; +} + +module.exports = { + webpackConfig, + transformConfig +} diff --git a/samples/react-realtime-incidentdashboard/gulpfile.js b/samples/react-realtime-incidentdashboard/gulpfile.js new file mode 100644 index 000000000..8e3857742 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/gulpfile.js @@ -0,0 +1,22 @@ +'use strict'; + +const build = require('@microsoft/sp-build-web'); + +build.addSuppression(`Warning - [sass] The local CSS class 'ms-Grid' is not camelCase and will not be type-safe.`); + +var getTasks = build.rig.getTasks; +build.rig.getTasks = function () { + var result = getTasks.call(build.rig); + + result.set('serve', result.get('serve-deprecated')); + + return result; +}; + +/* fast-serve */ +const { addFastServe } = require("spfx-fast-serve-helpers"); +addFastServe(build); +/* end of fast-serve */ + +build.initialize(require('gulp')); + diff --git a/samples/react-realtime-incidentdashboard/package.json b/samples/react-realtime-incidentdashboard/package.json new file mode 100644 index 000000000..5d126ec3a --- /dev/null +++ b/samples/react-realtime-incidentdashboard/package.json @@ -0,0 +1,53 @@ +{ + "name": "incident-dashbaord", + "version": "0.0.1", + "private": true, + "engines": { + "node": ">=16.13.0 <17.0.0 || >=18.17.1 <19.0.0" + }, + "main": "lib/index.js", + "scripts": { + "build": "gulp bundle", + "clean": "gulp clean", + "test": "gulp test", + "serve": "gulp bundle --custom-serve --max_old_space_size=4096 && fast-serve" + }, + "dependencies": { + "@fluentui/react": "^8.106.4", + "@microsoft/sp-component-base": "1.18.0", + "@microsoft/sp-core-library": "1.18.0", + "@microsoft/sp-list-subscription": "1.18.0", + "@microsoft/sp-lodash-subset": "1.18.0", + "@microsoft/sp-office-ui-fabric-core": "1.18.0", + "@microsoft/sp-property-pane": "1.18.0", + "@microsoft/sp-webpart-base": "1.18.0", + "@pnp/logging": "^3.19.0", + "@pnp/sp": "^3.19.0", + "@pnp/spfx-controls-react": "3.15.0", + "@pnp/spfx-property-controls": "3.14.0", + "antd": "^5.10.2", + "eslint-plugin-import": "2.28.1", + "eslint-plugin-prettier": "5.0.1", + "react": "17.0.1", + "react-dom": "17.0.1", + "styled-components": "^6.1.0", + "tslib": "2.3.1" + }, + "devDependencies": { + "@microsoft/eslint-config-spfx": "1.18.0", + "@microsoft/eslint-plugin-spfx": "1.18.0", + "@microsoft/rush-stack-compiler-4.7": "0.1.0", + "@microsoft/sp-build-web": "1.18.0", + "@microsoft/sp-module-interfaces": "1.18.0", + "@rushstack/eslint-config": "2.5.1", + "@types/react": "17.0.45", + "@types/react-dom": "17.0.17", + "@types/webpack-env": "~1.15.2", + "ajv": "^6.12.5", + "eslint": "8.7.0", + "eslint-plugin-react-hooks": "4.3.0", + "gulp": "4.0.2", + "spfx-fast-serve-helpers": "~1.18.0", + "typescript": "4.7.4" + } +} diff --git a/samples/react-realtime-incidentdashboard/src/common/helpers/LogHelper.ts b/samples/react-realtime-incidentdashboard/src/common/helpers/LogHelper.ts new file mode 100644 index 000000000..3a163ba38 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/common/helpers/LogHelper.ts @@ -0,0 +1,36 @@ +import { Logger, LogLevel } from "@pnp/logging"; + +export class LogHelper { + + public static verbose(className: string, methodName: string, message: string):void { + message = this._formatMessage(className, methodName, message); + Logger.write(message, LogLevel.Verbose); + } + + public static info(className: string, methodName: string, message: string):void { + message = this._formatMessage(className, methodName, message); + Logger.write(message, LogLevel.Info); + } + + public static warning(className: string, methodName: string, message: string):void { + message = this._formatMessage(className, methodName, message); + Logger.write(message, LogLevel.Warning); + } + + public static error(className: string, methodName: string, message: string):void { + message = this._formatMessage(className, methodName, message); + Logger.write(message, LogLevel.Error); + } + + public static exception(className: string, methodName: string, error: Error):void { + error.message = this._formatMessage(className, methodName, error.message); + Logger.error(error); + } + + private static _formatMessage(className: string, methodName: string, message: string): string { + const d:Date = new Date(); + const dateStr:string = d.getDate() + '-' + (d.getMonth() + 1) + '-' + d.getFullYear() + ' ' + + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds() + '.' + d.getMilliseconds(); + return `${dateStr} ${className} > ${methodName} > ${message}`; + } +} \ No newline at end of file diff --git a/samples/react-realtime-incidentdashboard/src/common/services/SPService.ts b/samples/react-realtime-incidentdashboard/src/common/services/SPService.ts new file mode 100644 index 000000000..e0073024a --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/common/services/SPService.ts @@ -0,0 +1,46 @@ +import { SPFI } from "@pnp/sp"; +import { RenderListDataOptions } from "@pnp/sp/lists"; +import { LogHelper } from "../helpers/LogHelper"; + +import "@pnp/sp/webs"; +import "@pnp/sp/lists"; +import "@pnp/sp/items"; +import "@pnp/sp/items/get-all"; + +class SPService { + private static _sp: SPFI; + + public static Init(sp: SPFI) { + this._sp = sp; + LogHelper.info("SPService", "constructor", "PnP SP context initialised"); + } + public static getTicketsAsync = async (listId: string) => { + try { + const items: any = await this._sp.web.lists + .getById(listId) + .items.select("*", "ID", "Title") + .orderBy("Modified", false) + .getAll(); + console.log("SPService -> getTicketsAsync", items); + return items; + } catch (err) { + LogHelper.error("SPService", "getTicketsAsync", err); + return null; + } + }; + public static getListItemsStreamAsync = async (listName: string) => { + try { + const items: any = await this._sp.web.lists + .getByTitle(listName) + .renderListDataAsStream({ + RenderOptions: RenderListDataOptions.ListData, + }); + + return items; + } catch (err) { + LogHelper.error("PnPSPService", "getListItemsStreamAsync", err); + return null; + } + }; +} +export default SPService; diff --git a/samples/react-realtime-incidentdashboard/src/index.ts b/samples/react-realtime-incidentdashboard/src/index.ts new file mode 100644 index 000000000..fb81db1e2 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/index.ts @@ -0,0 +1 @@ +// A file is required to be in the root of the /src directory by the TypeScript compiler diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/DashboardWebPart.manifest.json b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/DashboardWebPart.manifest.json new file mode 100644 index 000000000..eaa073af3 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/DashboardWebPart.manifest.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "d04b2052-c243-49d8-ab15-d537e9f1ad1c", + "alias": "DashboardWebPart", + "componentType": "WebPart", + // The "*" signifies that the version should be taken from the package.json + "version": "*", + "manifestVersion": 2, + // If true, the component can only be installed on sites where Custom Script is allowed. + // Components that allow authors to embed arbitrary script code should set this to true. + // https://support.office.com/en-us/article/Turn-scripting-capabilities-on-or-off-1f2c515f-5d7e-448a-9fd7-835da935584f + "requiresCustomScript": false, + "supportedHosts": [ + "SharePointWebPart", + "TeamsPersonalApp", + "TeamsTab", + "SharePointFullPage" + ], + "supportsThemeVariants": true, + "preconfiguredEntries": [ + { + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", // Advanced + "group": { + "default": "Advanced" + }, + "title": { + "default": "[O365C] Incident Dashboard" + }, + "description": { + "default": "Incident Dashboard description" + }, + "officeFabricIconFontName": "Page", + "properties": { + "title": "[O365C] Incident Dashboard", + "description": "This web part allows you to see latest information about the reported incidents" + } + } + ] +} \ No newline at end of file diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/DashboardWebPart.ts b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/DashboardWebPart.ts new file mode 100644 index 000000000..62b4acb40 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/DashboardWebPart.ts @@ -0,0 +1,215 @@ +import * as React from "react"; +import * as ReactDom from "react-dom"; +import { Version } from "@microsoft/sp-core-library"; +import { + type IPropertyPaneConfiguration, + PropertyPaneTextField, +} from "@microsoft/sp-property-pane"; +import { BaseClientSideWebPart } from "@microsoft/sp-webpart-base"; +import { IReadonlyTheme } from "@microsoft/sp-component-base"; + +import * as strings from "DashboardWebPartStrings"; +import { + PropertyFieldListPicker, + PropertyFieldListPickerOrderBy, + PropertyFieldTextWithCallout, +} from "@pnp/spfx-property-controls"; +import { CalloutTriggers } from "@pnp/spfx-property-controls/lib/common/callout/Callout"; +import { ListSubscriptionFactory } from "@microsoft/sp-list-subscription"; +import { IAppContext } from "./models/IAppContext"; +import { AppContext } from "./hooks/AppContext"; +import { Dashboard } from "./components/Dashboard"; +import { ConsoleListener, Logger } from "@pnp/logging"; +import { SPFx, spfi } from "@pnp/sp"; +import SPService from "../../common/services/SPService"; + +export interface IDashboardWebPartProps { + title: string; + description: string; + siteUrl: string; + libraryId: string; +} +const LOG_SOURCE: string = "DashboardWebPart"; +export default class DashboardWebPart extends BaseClientSideWebPart { + private _isDarkTheme: boolean = false; + private _environmentMessage: string = ""; + + public render(): void { + console.log(this._isDarkTheme); + console.log(this._environmentMessage); + // One main context that will hold all necessary context, properties for your webpart + const appContext: IAppContext = { + webpartContext: this.context, + properties: this.properties, + listSubscriptionFactory: new ListSubscriptionFactory(this), + }; + const element: React.ReactElement = React.createElement( + AppContext.Provider, + { + value: { + appContext: appContext, + }, + }, + React.createElement(Dashboard) + ); + ReactDom.render(element, this.domElement); + } + + protected async onInit(): Promise { + // return this._getEnvironmentMessage().then((message) => { + // this._environmentMessage = message; + // }); + this._environmentMessage = await this._getEnvironmentMessage(); + // subscribe a listener + Logger.subscribe( + ConsoleListener(LOG_SOURCE, { warning: "#e36c0b", error: "#a80000" }) + ); + + //Init SharePoint Service + const sp = spfi().using(SPFx(this.context)); + SPService.Init(sp); + + return super.onInit(); + } + + private _getEnvironmentMessage(): Promise { + if (!!this.context.sdks.microsoftTeams) { + // running in Teams, office.com or Outlook + return this.context.sdks.microsoftTeams.teamsJs.app + .getContext() + .then((context) => { + let environmentMessage: string = ""; + switch (context.app.host.name) { + case "Office": // running in Office + environmentMessage = this.context.isServedFromLocalhost + ? strings.AppLocalEnvironmentOffice + : strings.AppOfficeEnvironment; + break; + case "Outlook": // running in Outlook + environmentMessage = this.context.isServedFromLocalhost + ? strings.AppLocalEnvironmentOutlook + : strings.AppOutlookEnvironment; + break; + case "Teams": // running in Teams + case "TeamsModern": + environmentMessage = this.context.isServedFromLocalhost + ? strings.AppLocalEnvironmentTeams + : strings.AppTeamsTabEnvironment; + break; + default: + environmentMessage = strings.UnknownEnvironment; + } + + return environmentMessage; + }); + } + + return Promise.resolve( + this.context.isServedFromLocalhost + ? strings.AppLocalEnvironmentSharePoint + : strings.AppSharePointEnvironment + ); + } + + protected onThemeChanged(currentTheme: IReadonlyTheme | undefined): void { + if (!currentTheme) { + return; + } + + this._isDarkTheme = !!currentTheme.isInverted; + const { semanticColors } = currentTheme; + + if (semanticColors) { + this.domElement.style.setProperty( + "--bodyText", + semanticColors.bodyText || null + ); + this.domElement.style.setProperty("--link", semanticColors.link || null); + this.domElement.style.setProperty( + "--linkHovered", + semanticColors.linkHovered || null + ); + } + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse("1.0"); + } + + protected onPropertyPaneFieldChanged( + propertyPath: string, + oldValue: any, + newValue: any + ): void { + if (propertyPath === "libraryId" && newValue) { + // // push new list value + // super.onPropertyPaneFieldChanged(propertyPath, oldValue, newValue); + // // refresh the item selector control by repainting the property pane + this.context.propertyPane.refresh(); + // // re-render the web part as clearing the loading indicator removes the web part body + this.render(); + } else { + //super.onPropertyPaneFieldChanged(propertyPath, oldValue, oldValue); + } + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + header: { + description: strings.PropertyPaneDescription, + }, + groups: [ + { + groupName: "Header", + groupFields: [ + PropertyPaneTextField("title", { + label: "Title", + }), + PropertyPaneTextField("description", { + label: strings.DescriptionFieldLabel, + }), + ], + }, + { + groupName: "Settings", + groupFields: [ + PropertyFieldTextWithCallout("siteUrl", { + calloutTrigger: CalloutTriggers.Click, + key: "siteUrlFieldId", + label: "Site URL", + calloutContent: React.createElement( + "span", + {}, + "URL of the site where the document library to show documents from is located. Leave empty to connect to a document library from the current site" + ), + calloutWidth: 250, + value: this.properties.siteUrl, + }), + PropertyFieldListPicker("libraryId", { + label: "Select a document library", + selectedList: this.properties.libraryId, + includeHidden: false, + orderBy: PropertyFieldListPickerOrderBy.Title, + disabled: false, + onPropertyChange: this.onPropertyPaneFieldChanged.bind(this), + properties: this.properties, + context: this.context as any, + deferredValidationTime: 0, + key: "listPickerFieldId", + webAbsoluteUrl: this.properties.siteUrl, + baseTemplate: 100, + }), + ], + }, + ], + }, + ], + }; + } +} diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/assets/custom.d.ts b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/assets/custom.d.ts new file mode 100644 index 000000000..8e94061ce --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/assets/custom.d.ts @@ -0,0 +1,20 @@ +declare module "*.svg" { + import * as React from "react"; + + export const ReactComponent: React.FunctionComponent< + React.SVGProps & { title?: string } + >; + + const src: string; + export default src; +} +declare module "*.png" { + import * as React from "react"; + + export const ReactComponent: React.FunctionComponent< + React.SVGProps & { title?: string } + >; + + const src: string; + export default src; +} diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/assets/icon_service.png b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/assets/icon_service.png new file mode 100644 index 0000000000000000000000000000000000000000..b4a1cfe613039dba698cfeac375dc757e4fda524 GIT binary patch literal 71327 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 z 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�Gp~kbx)oU28ew4C2+WtKA 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 G`2PSf1J4)$ literal 0 HcmV?d00001 diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/assets/welcome-light.png b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/assets/welcome-light.png new file mode 100644 index 0000000000000000000000000000000000000000..69eb3b48cd83031f106df4b4df127c749657e319 GIT binary patch literal 12816 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 literal 0 HcmV?d00001 diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/Dashboard.module.scss b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/Dashboard.module.scss new file mode 100644 index 000000000..f67239d8b --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/Dashboard.module.scss @@ -0,0 +1,66 @@ +@import "~@fluentui/react/dist/sass/References.scss"; + +.root { + box-sizing: border-box; + -webkit-box-flex: 0; + flex-grow: 0; + overflow: hidden; + padding: 1em; + color: "[theme:bodyText, default: #323130]"; + color: var(--bodyText); + &.teams { + font-family: $ms-font-family-fallbacks; + } + + .container { + outline: 0px; + -webkit-tap-highlight-color: transparent; + display: block; + text-decoration: none; + color: rgb(0, 0, 0); + box-sizing: border-box; + border-radius: 0.5rem; + box-shadow: + rgba(0, 0, 0, 0.05) 0px 0.0625rem 0.1875rem, + rgba(0, 0, 0, 0.05) 0px 0.625rem 0.9375rem -0.3125rem, + rgba(0, 0, 0, 0.04) 0px 0.4375rem 0.4375rem -0.3125rem; + position: relative; + overflow: hidden; + background-color: rgb(255, 255, 255); + padding: 1rem; + } + :global { + .ant-avatar-image { + width: 60px; + height: 60px; + background: inherit; + } + } +} + +.welcome { + text-align: center; +} + +.welcomeImage { + width: 100%; + max-width: 420px; +} + +.links { + a { + text-decoration: none; + color: "[theme:link, default:#03787c]"; + color: var( + --link + ); // note: CSS Custom Properties support is limited to modern browsers only + + &:hover { + text-decoration: underline; + color: "[theme:linkHovered, default: #014446]"; + color: var( + --linkHovered + ); // note: CSS Custom Properties support is limited to modern browsers only + } + } +} diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/Dashboard.tsx b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/Dashboard.tsx new file mode 100644 index 000000000..1b08410c0 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/Dashboard.tsx @@ -0,0 +1,33 @@ +import * as React from "react"; +import styles from "./Dashboard.module.scss"; +import { AppContext } from "../hooks/AppContext"; +import { WebPartTitle } from "./webPartTitle"; +import SupportTickets from "./SupportTickets/SupportTickets"; +import { Placeholder } from "@pnp/spfx-controls-react/lib/Placeholder"; + +export const Dashboard: React.FunctionComponent = () => { + const { appContext } = React.useContext(AppContext); + const needsConfiguration: boolean = !appContext.properties.libraryId; + return ( +
+
+ + {needsConfiguration && ( + { + appContext.webpartContext.propertyPane.open(); + }} + /> + )} + {!needsConfiguration &&
{}
} +
+
+ ); +}; diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/IDashboardProps.ts b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/IDashboardProps.ts new file mode 100644 index 000000000..ec055a289 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/IDashboardProps.ts @@ -0,0 +1,37 @@ +import { DisplayMode } from "@microsoft/sp-core-library"; +import { ListSubscriptionFactory } from "@microsoft/sp-list-subscription"; + +export interface IDashboardProps { + /** + * Web part display mode + */ + displayMode: DisplayMode; + /** + * ID of the list to retrieve documents from. Undefined, if no library + * has been selected + */ + libraryId?: string; + /** + * Instance of the ListSubscriptionFactory to use to create a list + * subscription + */ + listSubscriptionFactory: ListSubscriptionFactory; + /** + * Event handler after clicking the 'Configure' button in the Placeholder + * component + */ + onConfigure: () => void; + /** + * URL of the site where the selected library is located. Undefined, if the + * selected library is in the current site + */ + siteUrl?: string; + /** + * Web part title to show in the title + */ + title: string; + /** + * Web part description to show in the header + */ + description: string; +} diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/SupportTickets/SupportTickets.tsx b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/SupportTickets/SupportTickets.tsx new file mode 100644 index 000000000..eb553d3f5 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/SupportTickets/SupportTickets.tsx @@ -0,0 +1,171 @@ +import { Guid } from "@microsoft/sp-core-library"; +import { IListSubscription } from "@microsoft/sp-list-subscription"; +import * as React from "react"; +import { useContext, useEffect, useState } from "react"; +import { AppContext } from "../../hooks/AppContext"; +import SPService from "../../../../common/services/SPService"; +import { MessageBar, MessageBarType, Spinner } from "@fluentui/react"; +//import TicketItem from "./TicketItem"; +import { Avatar, List, Skeleton, Space, Tag, Typography } from "antd"; +import defaultIcon from "../../assets/icon_service.png"; + +const { Text, Paragraph } = Typography; +interface ITicketResponse { + loading: boolean; + error: any; + value: any[]; +} +const SupportTickets = (): JSX.Element => { + const { appContext } = useContext(AppContext); + const [tickets, setTickets] = useState({ + loading: true, + error: null, + value: [], + }); + + const loadTickets = async () => { + try { + const tickets = await SPService.getTicketsAsync( + appContext.properties.libraryId + ); + setTickets({ + ...tickets, + loading: false, + value: tickets, + }); + } catch (error) { + console.log("loadTickets -> error", error); + setTickets({ + ...tickets, + loading: false, + error: error, + }); + } + }; + + // subscribe to list + useEffect(() => { + let listSub: IListSubscription; + console.log("Subscribing"); + const subscribeForTicketList = async () => { + listSub = await appContext.listSubscriptionFactory.createSubscription({ + listId: Guid.parse(appContext.properties.libraryId), + callbacks: { + notification: async () => { + console.log("Something changed in Ticket list - Reload"); + await loadTickets(); + }, + }, + }); + }; + subscribeForTicketList(); + + return () => { + console.log("Remove subscription"); + appContext.listSubscriptionFactory.deleteSubscription(listSub); + }; + }, []); + + useEffect(() => { + loadTickets(); + }, []); + + if (tickets.loading) + return ( + <> + + + ); + + if (tickets.error) + return ( + <> + + Something went wrong + + + ); + + return ( +
+ + {"My requests"} +
+ } + renderItem={(item) => ( + + + {item.Status} + + , + ]} + > + + } + title={ + +
{item.Title} + + {item.Priority} + + + } + description={ + + {item.Description} + + {item?.DateReported + ? convertDateToDaysAgo(item.DateReported) + : null} + + + } + /> + + + )} + /> + + ); + + function convertDateToDaysAgo(dateString: string) { + const date = new Date(dateString); + const today = new Date(); + const differenceInMilliseconds = today.getTime() - date.getTime(); + const daysAgo = Math.floor( + differenceInMilliseconds / (1000 * 60 * 60 * 24) + ); + return `${daysAgo}d ago`; + } +}; + +export default SupportTickets; diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/SupportTickets/TicketItem.tsx b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/SupportTickets/TicketItem.tsx new file mode 100644 index 000000000..7d319a6bb --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/SupportTickets/TicketItem.tsx @@ -0,0 +1,88 @@ +import * as React from "react"; + +import styled from "styled-components"; + +const TicketCard = styled.div` + display: flex; + flex-direction: row; + width: 100%; + margin: 10px 0; + border-radius: 5px; + box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.15); + background-color: #fff; + padding: 10px; +`; + +const IconContainer = styled.div` + display: flex; + justify-content: center; + width: 150px; + height: 150px; + background-color: #f5f5f5; +`; + +const TicketInfo = styled.div` + display: flex; + flex-direction: column; + padding: 10px; +`; + +const TicketHeader = styled.div` + display: flex; + justify-content: space-between; + padding: 10px 0; +`; + +const TicketTitle = styled.h4` + font-size: 16px; + font-weight: 600; + margin: 0px; +`; + +const TicketStatus = styled.span` + font-size: 14px; + color: #999; +`; + +const TicketDescription = styled.p` + font-size: 14px; + margin: 0; +`; + +const TicketPriority = styled.span` + font-size: 12px; + color: #999; +`; + +interface ITaskListProps { + title: string; + icon: string; + status: string; + description: string; + priority: string; +} + +const TicketItem = ({ + title, + icon, + status, + description, + priority, +}: ITaskListProps) => { + return ( + + + {title} + + + + {title} + {status} + + {description} + {priority} + + + ); +}; +export default TicketItem; diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/webPartTitle/WebPartTitle.module.scss b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/webPartTitle/WebPartTitle.module.scss new file mode 100644 index 000000000..27d2bb2a0 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/webPartTitle/WebPartTitle.module.scss @@ -0,0 +1,43 @@ +.webPartHeader { + border-top: 0px; + margin-bottom: 10px; + border-bottom: 0.0625rem solid rgb(222, 226, 230); + .webPartTitle { + margin-bottom: 5px; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + h2 { + margin: 0; + flex-grow: 1; + display: flex; + align-items: flex-start; + color: #183453; + font-family: "Segoe UI"; + font-size: 1.875rem; + line-height: 1.55; + text-decoration: none; + font-weight: 500; + } + } + + .webpartDescription { + margin-bottom: 5px; + margin-top: 0px; + font-size: 0.85rem; + } + + // View mode + span { + // Nothing at the moment + + a:link { + text-decoration: none; + } + } + + .moreLink { + margin-bottom: 11px; + } +} diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/webPartTitle/WebPartTitle.tsx b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/webPartTitle/WebPartTitle.tsx new file mode 100644 index 000000000..5ade0ec4b --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/webPartTitle/WebPartTitle.tsx @@ -0,0 +1,62 @@ +import * as React from "react"; +import type { IReadonlyTheme } from "@microsoft/sp-component-base"; +import styles from "./WebPartTitle.module.scss"; + +export interface IWebPartTitleProps { + title?: string; + titleIcon?: string; + description?: string; + className?: string; + placeholder?: string; + moreLink?: JSX.Element | (() => React.ReactNode); + themeVariant?: IReadonlyTheme; +} + +/** + * Web Part Title component + */ +export class WebPartTitle extends React.Component { + /** + * Constructor + */ + constructor(props: IWebPartTitleProps) { + super(props); + } + + /** + * Default React component render method + */ + public render(): React.ReactElement { + const color: string = + (!!this.props.themeVariant && + this.props.themeVariant?.semanticColors?.bodyText) || + ""; + + if (this.props.title || this.props.titleIcon || this.props.description) { + return ( +
+
+

{this.props.title && this.props.title}

+
+ {this.props.description && ( +
+ {this.props.description && this.props.description} +
+ )} + {this.props.moreLink && ( + + {typeof this.props.moreLink === "function" + ? this.props.moreLink() + : this.props.moreLink} + + )} +
+ ); + } + return <>; + } +} diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/webPartTitle/index.ts b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/webPartTitle/index.ts new file mode 100644 index 000000000..1bc3908d8 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/components/webPartTitle/index.ts @@ -0,0 +1 @@ +export * from "./WebPartTitle"; diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/hooks/AppContext.ts b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/hooks/AppContext.ts new file mode 100644 index 000000000..425fac772 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/hooks/AppContext.ts @@ -0,0 +1,6 @@ +import { createContext } from "react"; +import { IAppContext } from "../models/IAppContext"; + +export const AppContext = createContext<{ + appContext: IAppContext; +}>({ appContext: {} as IAppContext }); diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/loc/en-us.js b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/loc/en-us.js new file mode 100644 index 000000000..3b25e74a7 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/loc/en-us.js @@ -0,0 +1,16 @@ +define([], function() { + return { + "PropertyPaneDescription": "Description", + "BasicGroupName": "Group Name", + "DescriptionFieldLabel": "Description Field", + "AppLocalEnvironmentSharePoint": "The app is running on your local environment as SharePoint web part", + "AppLocalEnvironmentTeams": "The app is running on your local environment as Microsoft Teams app", + "AppLocalEnvironmentOffice": "The app is running on your local environment in office.com", + "AppLocalEnvironmentOutlook": "The app is running on your local environment in Outlook", + "AppSharePointEnvironment": "The app is running on SharePoint page", + "AppTeamsTabEnvironment": "The app is running in Microsoft Teams", + "AppOfficeEnvironment": "The app is running in office.com", + "AppOutlookEnvironment": "The app is running in Outlook", + "UnknownEnvironment": "The app is running in an unknown environment" + } +}); \ No newline at end of file diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/loc/mystrings.d.ts b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/loc/mystrings.d.ts new file mode 100644 index 000000000..5d6891ce8 --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/loc/mystrings.d.ts @@ -0,0 +1,19 @@ +declare interface IDashboardWebPartStrings { + PropertyPaneDescription: string; + BasicGroupName: string; + DescriptionFieldLabel: string; + AppLocalEnvironmentSharePoint: string; + AppLocalEnvironmentTeams: string; + AppLocalEnvironmentOffice: string; + AppLocalEnvironmentOutlook: string; + AppSharePointEnvironment: string; + AppTeamsTabEnvironment: string; + AppOfficeEnvironment: string; + AppOutlookEnvironment: string; + UnknownEnvironment: string; +} + +declare module 'DashboardWebPartStrings' { + const strings: IDashboardWebPartStrings; + export = strings; +} diff --git a/samples/react-realtime-incidentdashboard/src/webparts/dashboard/models/IAppContext.ts b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/models/IAppContext.ts new file mode 100644 index 000000000..8ca6a9bde --- /dev/null +++ b/samples/react-realtime-incidentdashboard/src/webparts/dashboard/models/IAppContext.ts @@ -0,0 +1,9 @@ +import { ListSubscriptionFactory } from "@microsoft/sp-list-subscription"; +import { WebPartContext } from "@microsoft/sp-webpart-base"; +import { IDashboardWebPartProps } from "../DashboardWebPart"; + +export interface IAppContext { + webpartContext: WebPartContext; + properties: IDashboardWebPartProps; + listSubscriptionFactory: ListSubscriptionFactory; +} diff --git a/samples/react-realtime-incidentdashboard/teams/d04b2052-c243-49d8-ab15-d537e9f1ad1c_color.png b/samples/react-realtime-incidentdashboard/teams/d04b2052-c243-49d8-ab15-d537e9f1ad1c_color.png new file mode 100644 index 0000000000000000000000000000000000000000..0e1f764fa8df4791a61c71b4f011c26f9083ee52 GIT binary patch literal 10248 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 KtK_^>#Qy@$+e&%> literal 0 HcmV?d00001 diff --git a/samples/react-realtime-incidentdashboard/teams/d04b2052-c243-49d8-ab15-d537e9f1ad1c_outline.png b/samples/react-realtime-incidentdashboard/teams/d04b2052-c243-49d8-ab15-d537e9f1ad1c_outline.png new file mode 100644 index 0000000000000000000000000000000000000000..e8cb4b6ba4f726d47a2e274f16b6069b9a8041cc GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z%|CHbgX^da?eHs6`1kLARhjOac zf3;y1Iq~M{LLS3g_M2bU{+PBvomV=FH7$YTy5I%1<5B$=?>3fqI5P%5iajq7)W9SX p;gpazd1JnvZNlx8HB0WjVJ`J~Q+P@%pA+aZ22WQ%mvv4FO#n^cR9FB2 literal 0 HcmV?d00001 diff --git a/samples/react-realtime-incidentdashboard/tsconfig.json b/samples/react-realtime-incidentdashboard/tsconfig.json new file mode 100644 index 000000000..680fb40cb --- /dev/null +++ b/samples/react-realtime-incidentdashboard/tsconfig.json @@ -0,0 +1,26 @@ +{ + "extends": "./node_modules/@microsoft/rush-stack-compiler-4.7/includes/tsconfig-web.json", + "compilerOptions": { + "target": "es5", + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "jsx": "react", + "declaration": true, + "sourceMap": true, + "experimentalDecorators": true, + "skipLibCheck": true, + "outDir": "lib", + "inlineSources": false, + "noImplicitAny": true, + + "typeRoots": ["./node_modules/@types", "./node_modules/@microsoft"], + "types": ["webpack-env"], + "lib": ["es5", "dom", "es2015.collection", "es2015.promise"] + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "src/webparts/dashboard/assets/custom.d.ts" + ] +}