From 5c8f6a644d70af220a2272bf1576c92a0227d19b Mon Sep 17 00:00:00 2001 From: Ravi Kumar Bomma Date: Fri, 21 Jul 2017 23:28:04 +0530 Subject: [PATCH] Added spfx sample for Employee Spotlight webpart (#244) Added the sample webpart code to display the Employee Spotlight details from a configured list using javascript and SharePoint framework --- samples/js-employee-spotlight/.editorconfig | 25 + samples/js-employee-spotlight/.gitattributes | 1 + samples/js-employee-spotlight/.gitignore | 32 ++ samples/js-employee-spotlight/.npmignore | 14 + samples/js-employee-spotlight/.yo-rc.json | 8 + samples/js-employee-spotlight/README.md | 79 +++ .../assets/Employee-spotlight-options.png | Bin 0 -> 21167 bytes .../assets/Employee-spotlight-priview.png | Bin 0 -> 77692 bytes .../js-employee-spotlight/config/config.json | 14 + .../config/copy-assets.json | 3 + .../config/deploy-azure-storage.json | 6 + .../config/package-solution.json | 10 + .../js-employee-spotlight/config/serve.json | 9 + .../js-employee-spotlight/config/tslint.json | 45 ++ .../config/write-manifests.json | 3 + samples/js-employee-spotlight/gulpfile.js | 6 + samples/js-employee-spotlight/package.json | 29 ++ .../EmployeeSpotlight.module.scss | 82 +++ .../EmployeeSpotlightWebPart.manifest.json | 23 + .../EmployeeSpotlightWebPart.ts | 467 ++++++++++++++++++ .../src/webparts/employeeSpotlight/Helper.ts | 42 ++ .../IEmployeeSpotlightWebPartProps.ts | 13 + .../webparts/employeeSpotlight/loc/en-us.js | 15 + .../employeeSpotlight/loc/mystrings.d.ts | 18 + .../tests/EmployeeSpotlight.test.ts | 9 + samples/js-employee-spotlight/tsconfig.json | 15 + .../typings/@ms/odsp.d.ts | 8 + .../js-employee-spotlight/typings/tsd.d.ts | 1 + 28 files changed, 977 insertions(+) create mode 100644 samples/js-employee-spotlight/.editorconfig create mode 100644 samples/js-employee-spotlight/.gitattributes create mode 100644 samples/js-employee-spotlight/.gitignore create mode 100644 samples/js-employee-spotlight/.npmignore create mode 100644 samples/js-employee-spotlight/.yo-rc.json create mode 100644 samples/js-employee-spotlight/README.md create mode 100644 samples/js-employee-spotlight/assets/Employee-spotlight-options.png create mode 100644 samples/js-employee-spotlight/assets/Employee-spotlight-priview.png create mode 100644 samples/js-employee-spotlight/config/config.json create mode 100644 samples/js-employee-spotlight/config/copy-assets.json create mode 100644 samples/js-employee-spotlight/config/deploy-azure-storage.json create mode 100644 samples/js-employee-spotlight/config/package-solution.json create mode 100644 samples/js-employee-spotlight/config/serve.json create mode 100644 samples/js-employee-spotlight/config/tslint.json create mode 100644 samples/js-employee-spotlight/config/write-manifests.json create mode 100644 samples/js-employee-spotlight/gulpfile.js create mode 100644 samples/js-employee-spotlight/package.json create mode 100644 samples/js-employee-spotlight/src/webparts/employeeSpotlight/EmployeeSpotlight.module.scss create mode 100644 samples/js-employee-spotlight/src/webparts/employeeSpotlight/EmployeeSpotlightWebPart.manifest.json create mode 100644 samples/js-employee-spotlight/src/webparts/employeeSpotlight/EmployeeSpotlightWebPart.ts create mode 100644 samples/js-employee-spotlight/src/webparts/employeeSpotlight/Helper.ts create mode 100644 samples/js-employee-spotlight/src/webparts/employeeSpotlight/IEmployeeSpotlightWebPartProps.ts create mode 100644 samples/js-employee-spotlight/src/webparts/employeeSpotlight/loc/en-us.js create mode 100644 samples/js-employee-spotlight/src/webparts/employeeSpotlight/loc/mystrings.d.ts create mode 100644 samples/js-employee-spotlight/src/webparts/employeeSpotlight/tests/EmployeeSpotlight.test.ts create mode 100644 samples/js-employee-spotlight/tsconfig.json create mode 100644 samples/js-employee-spotlight/typings/@ms/odsp.d.ts create mode 100644 samples/js-employee-spotlight/typings/tsd.d.ts diff --git a/samples/js-employee-spotlight/.editorconfig b/samples/js-employee-spotlight/.editorconfig new file mode 100644 index 000000000..8ffcdc4ec --- /dev/null +++ b/samples/js-employee-spotlight/.editorconfig @@ -0,0 +1,25 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + + +[*] + +# change these settings to your own preference +indent_style = space +indent_size = 2 + +# we recommend you to keep these unchanged +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[{package,bower}.json] +indent_style = space +indent_size = 2 \ No newline at end of file diff --git a/samples/js-employee-spotlight/.gitattributes b/samples/js-employee-spotlight/.gitattributes new file mode 100644 index 000000000..212566614 --- /dev/null +++ b/samples/js-employee-spotlight/.gitattributes @@ -0,0 +1 @@ +* text=auto \ No newline at end of file diff --git a/samples/js-employee-spotlight/.gitignore b/samples/js-employee-spotlight/.gitignore new file mode 100644 index 000000000..b19bbe123 --- /dev/null +++ b/samples/js-employee-spotlight/.gitignore @@ -0,0 +1,32 @@ +# Logs +logs +*.log +npm-debug.log* + +# Dependency directories +node_modules + +# Build generated files +dist +lib +solution +temp +*.sppkg + +# 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 diff --git a/samples/js-employee-spotlight/.npmignore b/samples/js-employee-spotlight/.npmignore new file mode 100644 index 000000000..2c93a9384 --- /dev/null +++ b/samples/js-employee-spotlight/.npmignore @@ -0,0 +1,14 @@ +# Folders +.vscode +coverage +node_modules +sharepoint +src +temp + +# Files +*.csproj +.git* +.yo-rc.json +gulpfile.js +tsconfig.json diff --git a/samples/js-employee-spotlight/.yo-rc.json b/samples/js-employee-spotlight/.yo-rc.json new file mode 100644 index 000000000..5cee07c27 --- /dev/null +++ b/samples/js-employee-spotlight/.yo-rc.json @@ -0,0 +1,8 @@ +{ + "@microsoft/generator-sharepoint": { + "libraryName": "js-employee-spotlight", + "framework": "none", + "version": "1.0.2", + "libraryId": "d57c7f34-22d4-45b5-9c26-441ef9fef48a" + } +} \ No newline at end of file diff --git a/samples/js-employee-spotlight/README.md b/samples/js-employee-spotlight/README.md new file mode 100644 index 000000000..249ce800c --- /dev/null +++ b/samples/js-employee-spotlight/README.md @@ -0,0 +1,79 @@ +# Display Employee Spotlight JavaScript Client-Side Web Part + +## Summary +Simple Web Part that demonstrates the use of SharePoint Framework for show casing Employee Spotlight. The web part pulls data from a configured list and User Profile service. + The properties pane for this web part has 5 canscading dropdowns. + - A drop down list of sites(webs) in the current site collection. + - A drop down list of list titles in the selected site(web). + - 3 drop downs with list of field names from selected list, which includes + * Name(Person or Group Column). + * Splotlight Description (Multiline - Enriched text Column). + * Expiry date for Spotlight event (DateTime Column with Date only option). + - The properties pane also has options for following slider effects. + * Background color - A color picker to choose Slider background color + * Font color - A color picker to choose Slider font color + * Set Auto slide - A switch to enable/disable auto slide for slider + * Slider Speed - A Slider control to select slider speed from 0sec - 7sec with 0.5sec as a step. + +![Screeshot of the Employee Spotlight web part options](./assets/Employee-spotlight-options.png). + + Once the user selects all the configuration details, the web part displays the spotlight details from the configured list. + +![Screeshot of the Employee Spotlight web part](./assets/Employee-spotlight-priview.png). + +> Data is displayed only when hosted in SharePoint. No mock data included at this point for local testing. + +## Used SharePoint Framework Version +![drop](https://img.shields.io/badge/drop-GA-green.svg) + +## Applies to +* [SharePoint Framework Developer](http://dev.office.com/sharepoint/docs/spfx/sharepoint-framework-overview) +* [Office 365 developer tenant](http://dev.office.com/sharepoint/docs/spfx/set-up-your-developer-tenant) + + +## Solution + +Solution|Author(s) +--------|--------- +js-employee-spotlight| SPS (Strategic Products and Services) + + +## Version history + +Version|Date|Comments +-------|----|-------- +1.0|June 12, 2017|Initial release + + +## Disclaimer +**THIS CODE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.** + + +--- + +## Minimal Path to Awesome + +- Clone this repository +- in the command line run: + - `npm install` + - `tsd install` + - `gulp serve` + - `Open the workbench on your Office 365 Developer tenant` + - Basic functionality can be tested locally, data is only shown when used in context of SharePoint + +## Features +The js-employee-spotlight web part displays the content of the list specified in the web part properties pane, The list should have the 3 mandatory fields. + +This Web Part illustrates the following concepts on top of the SharePoint Framework: + +* Using a dynamic drop down box in the web part properties pane to display cascading dropdowns, which contains + - the titles webs in current sitecollection + - titles of the lists in the selected web + - fields of a selected list +* Use of a third party control(sp-client-custom-fields) for selecting webpart foregroud and background colors. +* Use of switch, slider controls to configure slider speed and auto scrolling. +* Using a javascript slider. +* Fetching the user details from User Profile service like user designation, user profile image. +* Logging. +* Rendering error messages. + diff --git a/samples/js-employee-spotlight/assets/Employee-spotlight-options.png b/samples/js-employee-spotlight/assets/Employee-spotlight-options.png new file mode 100644 index 0000000000000000000000000000000000000000..9ca484c82a79578128f26dc10cd5296628844635 GIT binary patch literal 21167 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�N1^|j>bhRS9tOi}61h(GWi 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�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�#0ueksm8??NpDlIZQuK(N11q$b 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 OE?Amc!E21&", + "container": "js-employee-spotlight", + "accessKey": "" +} \ No newline at end of file diff --git a/samples/js-employee-spotlight/config/package-solution.json b/samples/js-employee-spotlight/config/package-solution.json new file mode 100644 index 000000000..a839f4fe5 --- /dev/null +++ b/samples/js-employee-spotlight/config/package-solution.json @@ -0,0 +1,10 @@ +{ + "solution": { + "name": "Employee Spotlight-v1", + "id": "d57c7f34-22d4-45b5-9c26-441ef9fef482", + "version": "2.0.0.0" + }, + "paths": { + "zippedPackage": "solution/EmployeeSpotlight-v1.sppkg" + } +} \ No newline at end of file diff --git a/samples/js-employee-spotlight/config/serve.json b/samples/js-employee-spotlight/config/serve.json new file mode 100644 index 000000000..087899637 --- /dev/null +++ b/samples/js-employee-spotlight/config/serve.json @@ -0,0 +1,9 @@ +{ + "port": 4321, + "initialPage": "https://localhost:5432/workbench", + "https": true, + "api": { + "port": 5432, + "entryPath": "node_modules/@microsoft/sp-webpart-workbench/lib/api/" + } +} diff --git a/samples/js-employee-spotlight/config/tslint.json b/samples/js-employee-spotlight/config/tslint.json new file mode 100644 index 000000000..1e8687a2b --- /dev/null +++ b/samples/js-employee-spotlight/config/tslint.json @@ -0,0 +1,45 @@ +{ + // Display errors as warnings + "displayAsWarning": true, + // The TSLint task may have been configured with several custom lint rules + // before this config file is read (for example lint rules from the tslint-microsoft-contrib + // project). If true, this flag will deactivate any of these rules. + "removeExistingRules": true, + // When true, the TSLint task is configured with some default TSLint "rules.": + "useDefaultConfigAsBase": false, + // Since removeExistingRules=true and useDefaultConfigAsBase=false, there will be no lint rules + // which are active, other than the list of rules below. + "lintConfig": { + // Opt-in to Lint rules which help to eliminate bugs in JavaScript + "rules": { + "class-name": false, + "export-name": false, + "forin": false, + "label-position": false, + "member-access": true, + "no-arg": false, + "no-console": false, + "no-construct": false, + "no-duplicate-case": true, + "no-duplicate-variable": true, + "no-eval": false, + "no-function-expression": true, + "no-internal-module": true, + "no-shadowed-variable": true, + "no-switch-case-fall-through": true, + "no-unnecessary-semicolons": true, + "no-unused-expression": true, + "no-unused-imports": true, + "no-use-before-declare": true, + "no-with-statement": true, + "semicolon": true, + "trailing-comma": false, + "typedef": false, + "typedef-whitespace": false, + "use-named-parameter": true, + "valid-typeof": true, + "variable-name": false, + "whitespace": false + } + } +} \ No newline at end of file diff --git a/samples/js-employee-spotlight/config/write-manifests.json b/samples/js-employee-spotlight/config/write-manifests.json new file mode 100644 index 000000000..8cd429ad9 --- /dev/null +++ b/samples/js-employee-spotlight/config/write-manifests.json @@ -0,0 +1,3 @@ +{ + "cdnBasePath": "" +} \ No newline at end of file diff --git a/samples/js-employee-spotlight/gulpfile.js b/samples/js-employee-spotlight/gulpfile.js new file mode 100644 index 000000000..7d36ddb1c --- /dev/null +++ b/samples/js-employee-spotlight/gulpfile.js @@ -0,0 +1,6 @@ +'use strict'; + +const gulp = require('gulp'); +const build = require('@microsoft/sp-build-web'); + +build.initialize(gulp); diff --git a/samples/js-employee-spotlight/package.json b/samples/js-employee-spotlight/package.json new file mode 100644 index 000000000..e356bd6a4 --- /dev/null +++ b/samples/js-employee-spotlight/package.json @@ -0,0 +1,29 @@ +{ + "name": "js-employee-spotlight", + "version": "0.0.1", + "private": true, + "engines": { + "node": ">=0.10.0" + }, + "dependencies": { + "@microsoft/sp-client-base": "~1.0.0", + "@microsoft/sp-core-library": "~1.0.0", + "@microsoft/sp-webpart-base": "~1.0.0", + "@types/webpack-env": ">=1.12.1 <1.14.0", + "sp-client-custom-fields": "^1.3.4" + }, + "devDependencies": { + "@microsoft/sp-build-web": "~1.0.1", + "@microsoft/sp-module-interfaces": "~1.0.0", + "@microsoft/sp-webpart-workbench": "~1.0.0", + "@types/chai": ">=3.4.34 <3.6.0", + "@types/mocha": ">=2.2.33 <2.6.0", + "gulp": "~3.9.1", + "gulp-util": "^3.0.8" + }, + "scripts": { + "build": "gulp bundle", + "clean": "gulp clean", + "test": "gulp test" + } +} diff --git a/samples/js-employee-spotlight/src/webparts/employeeSpotlight/EmployeeSpotlight.module.scss b/samples/js-employee-spotlight/src/webparts/employeeSpotlight/EmployeeSpotlight.module.scss new file mode 100644 index 000000000..4eb6dfb51 --- /dev/null +++ b/samples/js-employee-spotlight/src/webparts/employeeSpotlight/EmployeeSpotlight.module.scss @@ -0,0 +1,82 @@ + * { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box!important; + } + * { + box-sizing: border-box + } + /* Slideshow container */ + + .containers { + max-width: 1000px; + min-width: 350px; + min-height: 160px; + position: relative; + margin: auto; + overflow: hidden; + } + + .mySlides { + display: none; + transition: 1s all ease-in-out; + -webkit-animation: slideIn 1s forwards; + -moz-animation: slideIn 1s forwards; + animation: slideIn 1s forwards; + } + + /* Next & previous buttons */ + .prev{ + left:0; + border-radius: 0 3px 3px 0; + } + .prev, + .next { + cursor: pointer; + position: absolute; + top: 50%; + width: auto; + margin-top: -22px; + padding: 8px; + color: white; + font-weight: bold; + font-size: 18px; + transition: 0.6s all ease; + } + /* Position the "next button" to the right */ + + .next { + right: 0; + border-radius: 3px 0 0 3px; + } + /* On hover, add a black background color with a little bit see-through */ + + .prev:hover, + .next:hover { + background-color: rgba(0, 0, 0, 0.8); + } + + @-webkit-keyframes slideIn { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(900px); + } + } + @-moz-keyframes slideIn { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(900px); + } + } + @keyframes slideIn { + 0% { + transform: translateX(-900px); + } + 100% { + transform: translateX(0); + } + } \ No newline at end of file diff --git a/samples/js-employee-spotlight/src/webparts/employeeSpotlight/EmployeeSpotlightWebPart.manifest.json b/samples/js-employee-spotlight/src/webparts/employeeSpotlight/EmployeeSpotlightWebPart.manifest.json new file mode 100644 index 000000000..dbbf75730 --- /dev/null +++ b/samples/js-employee-spotlight/src/webparts/employeeSpotlight/EmployeeSpotlightWebPart.manifest.json @@ -0,0 +1,23 @@ +{ + "$schema": "../../../node_modules/@microsoft/sp-module-interfaces/lib/manifestSchemas/jsonSchemas/clientSideComponentManifestSchema.json", + + "id": "54d10877-595f-464d-81f0-19fb840c766f", + "alias": "EmployeeSpotlightWebPart", + "componentType": "WebPart", + "version": "0.0.1", + "manifestVersion": 2, + + "preconfiguredEntries": [{ + "groupId": "54d10877-595f-464d-81f0-19fb840c766f", + "group": { "default": "SPFx Webparts" }, + "title": { "default": "Employee Spotlight" }, + "description": { "default": "This webpart shows the employee spotlight information." }, + "officeFabricIconFontName": "Page", + "properties": { + "description": "Employee Spotlight", + "spotlightBGColor": "#3f0d3e", + "spotlightFontColor": "#ffffff", + "enabledSpotlightAutoPlay": true + } + }] +} \ No newline at end of file diff --git a/samples/js-employee-spotlight/src/webparts/employeeSpotlight/EmployeeSpotlightWebPart.ts b/samples/js-employee-spotlight/src/webparts/employeeSpotlight/EmployeeSpotlightWebPart.ts new file mode 100644 index 000000000..080c38092 --- /dev/null +++ b/samples/js-employee-spotlight/src/webparts/employeeSpotlight/EmployeeSpotlightWebPart.ts @@ -0,0 +1,467 @@ +/** + * @file + * Spotlight Web Part with SharePoint Framework + * Author: SPS-COM + * Copyright (c) 2017 + */ +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, + IPropertyPaneDropdownOption, + PropertyPaneDropdown, + PropertyPaneToggle, + PropertyPaneSlider +} from '@microsoft/sp-webpart-base'; +import { SPComponentLoader } from '@microsoft/sp-loader'; +import { SPHttpClient } from '@microsoft/sp-http'; +import { + Environment, + EnvironmentType +} from '@microsoft/sp-core-library'; +import { PropertyFieldColorPickerMini } from 'sp-client-custom-fields/lib/PropertyFieldColorPickerMini'; +import * as jQuery from 'jquery'; +import * as _ from "lodash"; +import styles from './EmployeeSpotlight.module.scss'; +import * as strings from 'employeeSpotlightStrings'; +import { IEmployeeSpotlightWebPartProps } from './IEmployeeSpotlightWebPartProps'; +import { SliderHelper } from './Helper'; + +/** + * An interface to hold the key and value. + */ +export interface ResponceDetails { + title: string; + id: string; +} + +/** + * An interface to hold the ResponceDetails collection. + */ +export interface ResponceCollection { + value: ResponceDetails[]; +} + +/** + * An interface to hold the SpotlightDetails. + */ +export interface SpotlightDetails { + userDisplayName: string; + userEmail: string; + userProfilePic: string; + description: string; + designation?: string; +} + +/** + * A class that contains spotlight webpart operations and corresponding properties to hold the data. + */ +export default class EmployeeSpotlightWebPart extends BaseClientSideWebPart { + private spotlightListFieldOptions: IPropertyPaneDropdownOption[] = []; + private spotlightListOptions: IPropertyPaneDropdownOption[] = []; + private siteOptions: IPropertyPaneDropdownOption[] = []; + private defaultProfileImageUrl: string = "/_layouts/15/userphoto.aspx?size=L"; + private helper: SliderHelper = new SliderHelper(); + private sliderControl: any = null; + /** + * Constructor of SpotlightWebpart class. + */ + public constructor() { + super(); + + SPComponentLoader.loadScript('https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js', { globalExportsName: 'jQuery' }); + // Next button functionality + jQuery(document).on("click", "." + styles.next, (event) => { + event.preventDefault(); //prevent default action of + this.helper.moveSlides(1); + }); + + // Previous button functionality + jQuery(document).on("click", "." + styles.prev, (event) => { + event.preventDefault(); //prevent default action of + this.helper.moveSlides(-1); + }); + + // start and stop slider on hover + jQuery(document).ready(() => { + jQuery(document).on('mouseenter', '.' + styles.containers, () => { + if (this.properties.enabledSpotlightAutoPlay) + clearInterval(this.sliderControl); + }).on('mouseleave', '.' + styles.containers, () => { + var carouselSpeed: number = this.properties.spotlightSliderSpeed * 1000; + if (carouselSpeed && this.properties.enabledSpotlightAutoPlay) + this.sliderControl = setInterval(this.helper.startAutoPlay, carouselSpeed); + }); + }); + } + + /** + * A starting point for application. + */ + public render(): void { + this.domElement.innerHTML = `
`; + this._renderSpotlightTemplateAsync(); + this._renderSpotlightDataAsync(); + } + + /** + * Builds the spotlight details collection with necessary details. + */ + private _renderSpotlightTemplateAsync(): void { + if (Environment.type == EnvironmentType.SharePoint || Environment.type == EnvironmentType.ClassicSharePoint) { + this._getSiteCollectionRootWeb().then((response) => { + this.properties.spotlightSiteCollectionURL = response['Url']; + }); + if (this.properties.spotlightSiteURL && this.properties.spotlightListName && this.properties.spotlightEmployeeEmailColumn && this.properties.spotlightDescriptionColumn) { + let spotlightDataCollection: SpotlightDetails[] = []; + this._getSpotlightListData(this.properties.spotlightSiteURL, this.properties.spotlightListName, this.properties.spotlightEmployeeExpirationDateColumn, this.properties.spotlightEmployeeEmailColumn, this.properties.spotlightDescriptionColumn) + .then((listDataResponse) => { + var spotlightListData = listDataResponse.value; + if (spotlightListData) { + debugger; + for (var key in listDataResponse.value) { + var email = listDataResponse.value[key][this.properties.spotlightEmployeeEmailColumn]["EMail"]; + var id = listDataResponse.value[key]["ID"]; + this._getUserImage(email) + .then((response) => { + spotlightListData.forEach((item: ResponceDetails) => { + let userSpotlightDetails: SpotlightDetails = { userDisplayName: "", userEmail: "", userProfilePic: "", description: "" }; + if (item[this.properties.spotlightEmployeeEmailColumn]["EMail"] == response["Email"]) { + var userName = item[this.properties.spotlightEmployeeEmailColumn]; + var description = item[this.properties.spotlightDescriptionColumn]; + var userDescription = ""; + try { + userDescription = $(description).text(); + } + catch (err) { + userDescription = description; + } + if (userDescription.length > 140) { + var displayFormUrl = this.properties.spotlightSiteURL + '/Lists/' + this.properties.spotlightListName + '/DispForm.aspx?ID=' + id; + userDescription = userDescription.substring(0, 140) + `  ReadMore...`; + } + var displayName = response["DisplayName"]; + var designationProperty = _.filter(response["UserProfileProperties"], { Key: "SPS-JobTitle" })[0]; + var designation = designationProperty["Value"] ? designationProperty["Value"] : ""; + // uses default image if user image not exist + var profilePicture = response["PictureUrl"] != null && response["PictureUrl"] != undefined ? (response["PictureUrl"]).replace("MThumb", "LThumb") : this.defaultProfileImageUrl; + // var profilePicture = response["PictureUrl"] != null && response["PictureUrl"] != undefined ? (response["PictureUrl"]) : this.defaultProfileImageUrl; + profilePicture = '/_layouts/15/userphoto.aspx?accountname=' + displayName + '&size=M&url=' + profilePicture.split("?")[0]; + userSpotlightDetails = { + userDisplayName: response["DisplayName"], + userEmail: response["Email"], + userProfilePic: profilePicture, + description: userDescription, + designation: designation + }; + spotlightDataCollection.push(userSpotlightDetails); + } + }); + this._addSpotlightTemplateContent(spotlightDataCollection); + if (this.sliderControl == null && this.properties && this.properties.enabledSpotlightAutoPlay) { + setTimeout(this.helper.moveSlides(), 2000); + this.sliderControl = setInterval(this.helper.startAutoPlay, this.properties.spotlightSliderSpeed * 1000); + } + }); + } + } + }); + } + } + } + + /** + * Renders the webpart html with the given spotlight details collection. + * @param spotlightDetails - a collection of spotlight details. + */ + private _addSpotlightTemplateContent(spotlightDetails: SpotlightDetails[]): void { + this.domElement.innerHTML = ''; + var innerContent: string = ''; + for (let i: number = 0; i < spotlightDetails.length; i++) { + innerContent += ` +
+
+
+ +
+
+
${spotlightDetails[i].userDisplayName}
+
${spotlightDetails[i].designation}
+

${spotlightDetails[i].description}

+
+
+
`; + } + this.domElement.innerHTML += + `
+ ` + innerContent + ` + + +
`; + } + + /** + * A generic utility function to execute the rest api call and return the corresponding result as a promise. + * @param url - The string containing api url. + */ + private _callAPI(url: string): Promise { + return this.context.spHttpClient.get(url, SPHttpClient.configurations.v1).then((response) => { + return response.json(); + }); + } + + /** + * Returns a promise that returns user image url and name. + * @param email - The string containing user email id. + */ + private _getUserImage(email: string): Promise { + return this._callAPI(this.properties.spotlightSiteCollectionURL + "/_api/SP.UserProfiles.PeopleManager/GetPropertiesFor(accountName=@v)?@v='i:0%23.f|membership|" + email + "'"); + } + + /** + * Returns a promise that returns sitecollection rootweb url. + */ + private _getSiteCollectionRootWeb(): Promise { + return this._callAPI(this.context.pageContext.web.absoluteUrl + `/_api/Site/RootWeb?$select=Title,Url`); + } + + /** + * Returns a promise that returns all the subsite names from the given sitecollection. + * @param spotlightSiteCollectionURL - The string containing user email id. + */ + private _getAllSubsites(spotlightSiteCollectionURL: string): Promise { + return this._callAPI(spotlightSiteCollectionURL + `/_api/web/webs?$select=Title,Url`); + } + + /** + * Returns a promise that returns all the list names in corresponding site. + * @param siteUrl - The string containing site url. + */ + private _getAllLists(siteUrl: string): Promise { + if (siteUrl != "" && siteUrl != undefined) { + return this._callAPI(siteUrl + `/_api/web/lists?$orderby=Id desc&$filter=Hidden eq false and BaseTemplate eq 100`); + } + } + + /** + * Returns a promise that returns spotlight list field names. + * @param siteUrl - The string containing site url. + * @param spotlightListName - The string containing spotlight list name. + */ + private _getSpotlightListFields(siteUrl: string, spotlightListName: string): Promise { + if (siteUrl != "" && spotlightListName != "" && siteUrl != undefined && spotlightListName != undefined) { + return this._callAPI(siteUrl + `/_api/web/lists/GetByTitle('${spotlightListName}')/Fields?$orderby=Id desc&$filter=Hidden eq false and ReadOnlyField eq false`); + } + } + + /** + * Loads all the subsites in the current sitecollection and initiates the corresponding dropdown values loading. + */ + private _renderSpotlightDataAsync(): void { + this._getSiteCollectionRootWeb() + .then((response) => { + this.properties.spotlightSiteCollectionURL = response['Url']; + this._getAllSubsites(response['Url']) + .then((sitesResponse) => { + this.siteOptions = this._getDropDownCollection(sitesResponse, 'Url', 'Title'); + this.context.propertyPane.refresh(); + if (this.properties.spotlightSiteURL != "") { + this._loadAllListsDropDown(this.properties.spotlightSiteURL); + } + if (this.properties.spotlightListName != "") { + this._loadSpotlightListFieldsDropDown(this.properties.spotlightSiteURL, this.properties.spotlightListName); + } + }); + }); + } + + /** + * Loads all the list names in the selected site for spotlight list dropdown. + * @param siteUrl - The string containing site url. + */ + private _loadAllListsDropDown(siteUrl: string): void { + this._getAllLists(siteUrl) + .then((response) => { + this.spotlightListOptions = this._getDropDownCollection(response, 'Title', 'Title'); + this.context.propertyPane.refresh(); + }); + } + + /** + * Loads the spotlight list fields for fields dropdown. + * @param siteUrl - The string containing site url. + * @param spotlightListName - The string containing spotlight list name. + */ + private _loadSpotlightListFieldsDropDown(siteUrl: string, spotlightListName: string): void { + this._getSpotlightListFields(siteUrl, spotlightListName) + .then((response) => { + this.spotlightListFieldOptions = this._getDropDownCollection(response, 'Title', 'Title'); + this.context.propertyPane.refresh(); + }); + } + + /** + * Returns the dropdown key and values collection. + * @param response - The collection containing keys and values. + * @param key - The string containing key. + * @param text - The string containing value. + */ + private _getDropDownCollection(response: ResponceCollection, key: string, text: string): IPropertyPaneDropdownOption[] { + var dropdownOptions: IPropertyPaneDropdownOption[] = []; + if (key == 'Url') + dropdownOptions.push({ key: this.context.pageContext.web.absoluteUrl, text: 'This Site' }); + for (var itemKey in response.value) { + dropdownOptions.push({ key: response.value[itemKey][key], text: response.value[itemKey][text] }); + } + return dropdownOptions; + } + + /** + * Returns a promise that returns spotlight list items. + * @param siteUrl - The string containing site url. + * @param spotlightListName - The string containing spotlight list name. + */ + private _getSpotlightListData(siteUrl: string, spotlightListName: string, expiryDateColumn: string, emailColumn: string, descriptionColumn: string): Promise { + if (siteUrl != "" && spotlightListName != "") { + var today: Date = new Date(); + var dd: any = today.getDate(); + var mm: any = today.getMonth() + 1; //January is 0! + var yyyy: any = today.getFullYear(); + dd = (dd < 10) ? '0' + dd : dd; + mm = (mm < 10) ? '0' + mm : mm; + var dateString: string = `${yyyy}-${mm}-${dd}`; + emailColumn = emailColumn.replace(" ", "_x0020_"); + descriptionColumn = descriptionColumn.replace(" ", "_x0020_"); + expiryDateColumn = expiryDateColumn.replace(" ", "_x0020_"); + return this._callAPI(siteUrl + `/_api/web/lists/GetByTitle('${spotlightListName}')/items?$select=ID,${descriptionColumn},${emailColumn}/EMail&$expand=${emailColumn}/Id&$orderby=Id desc&$filter=${expiryDateColumn} ge '${dateString}'`); + } + } + + /** + * Validates the Property pane fields for null checks + * @param value - The string value of the field to be validated. + */ + private _validateFiledValue(value: string): string { + var validationMessage: string = ''; + if (value === null || value.trim().length === 0) { + validationMessage = 'Please select a value'; + } + return validationMessage; + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + /** + * Builds the Propertypane with specific configurations. + */ + protected onPropertyPaneConfigurationStart(): void { + // Stops execution, if the list values already exists + if (this.spotlightListOptions.length > 0) return; + // Calls function to append the list names to dropdown + this._renderSpotlightTemplateAsync(); + } + + /** + * Triggers foreach Property pane value update and loads the corresponding details. + * @param propertyPath - The string containing property path. + * @param oldValue - The string containing old value of property. + * @param newValue - The string containing new value of property. + */ + protected onPropertyPaneFieldChanged(propertyPath: string, oldValue: any, newValue: any): void { + switch (propertyPath) { + case "spotlightSiteURL": + this.properties.spotlightListName = ""; + this._loadAllListsDropDown(this.properties.spotlightSiteURL); + break; + case "spotlightListName": + this.properties.spotlightEmployeeEmailColumn = ""; + this.properties.spotlightDescriptionColumn = ""; + this._loadSpotlightListFieldsDropDown(this.properties.spotlightSiteURL, this.properties.spotlightListName); + break; + default: + break; + } + } + + /** + * Retuns the property pane configuration. + */ + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + groups: [ + { + groupName: strings.propertyPaneHeading, + groupFields: [ + PropertyPaneDropdown('spotlightSiteURL', { + label: strings.selectSiteLableMessage, + options: this.siteOptions, + selectedKey: this._validateFiledValue.bind(this) + }), + PropertyPaneDropdown('spotlightListName', { + label: strings.selectListLableMessage, + options: this.spotlightListOptions, + selectedKey: this._validateFiledValue.bind(this) + }), + PropertyPaneDropdown('spotlightEmployeeEmailColumn', { + label: strings.employeeEmailcolumnLableMessage, + options: this.spotlightListFieldOptions, + selectedKey: this._validateFiledValue.bind(this) + }), + PropertyPaneDropdown('spotlightDescriptionColumn', { + label: strings.descriptioncolumnLableMessage, + options: this.spotlightListFieldOptions, + selectedKey: this._validateFiledValue.bind(this) + }), + PropertyPaneDropdown('spotlightEmployeeExpirationDateColumn', { + label: strings.expirationDateColumnLableMessage, + options: this.spotlightListFieldOptions, + selectedKey: this._validateFiledValue.bind(this) + }) + ] + }, + { + groupName: strings.effectsGroupName, + groupFields: [ + PropertyFieldColorPickerMini('spotlightBGColor', { + label: strings.spotlightBGColorLableMessage, + initialColor: this.properties.spotlightBGColor, + disabled: false, + onPropertyChange: this.onPropertyPaneFieldChanged.bind(this), + properties: this.properties, + onGetErrorMessage: null, + deferredValidationTime: 0, + key: 'spotlightBGColorFieldId' + }), + PropertyFieldColorPickerMini('spotlightFontColor', { + label: strings.spotlightFontColorLableMessage, + initialColor: this.properties.spotlightFontColor, + disabled: false, + onPropertyChange: this.onPropertyPaneFieldChanged.bind(this), + properties: this.properties, + onGetErrorMessage: null, + deferredValidationTime: 0, + key: 'spotlightFontColorFieldId' + }), + PropertyPaneToggle('enabledSpotlightAutoPlay', { + label: strings.enableAutoSlideLableMessage + }), + PropertyPaneSlider('spotlightSliderSpeed', { + label: strings.carouselSpeedLableMessage, + min: 0, + max: 7, + value: 3, + showValue: true, + step: 0.5 + }) + ] + } + ] + } + ] + }; + } +} \ No newline at end of file diff --git a/samples/js-employee-spotlight/src/webparts/employeeSpotlight/Helper.ts b/samples/js-employee-spotlight/src/webparts/employeeSpotlight/Helper.ts new file mode 100644 index 000000000..d31e5292b --- /dev/null +++ b/samples/js-employee-spotlight/src/webparts/employeeSpotlight/Helper.ts @@ -0,0 +1,42 @@ +import styles from './EmployeeSpotlight.module.scss'; + +export class SliderHelper { + public static slideIndex: number = 0; + // /** + // * Constructor of helper class. + // */ + public constructor() { + SliderHelper.slideIndex = 0; + } + + /** + * auto play slider + */ + public startAutoPlay(): void { + var slides = document.getElementsByClassName(styles.mySlides); + debugger; + if (slides.length > 0) { + for (var i: number = 0; i < slides.length; i++) { + slides[i].style.display = SliderHelper.slideIndex == i ? "block" : "none"; + } + SliderHelper.slideIndex = (++SliderHelper.slideIndex) >= slides.length ? 0 : SliderHelper.slideIndex; + } + } + + /** + * move slide + * @param n - slide index. + */ + public moveSlides(n: number = 0): boolean { + SliderHelper.slideIndex += n; + var slides = (document.getElementsByClassName(styles.mySlides)); + if (slides.length > 0) { + if (SliderHelper.slideIndex >= slides.length) { SliderHelper.slideIndex = 0; } + if (SliderHelper.slideIndex < 0) { SliderHelper.slideIndex = slides.length - 1; } + for (var i: number = 0; i < slides.length; i++) { + slides[i].style.display = SliderHelper.slideIndex == i ? "block" : "none"; + } + } + return true; + } +} \ No newline at end of file diff --git a/samples/js-employee-spotlight/src/webparts/employeeSpotlight/IEmployeeSpotlightWebPartProps.ts b/samples/js-employee-spotlight/src/webparts/employeeSpotlight/IEmployeeSpotlightWebPartProps.ts new file mode 100644 index 000000000..f0b0b98da --- /dev/null +++ b/samples/js-employee-spotlight/src/webparts/employeeSpotlight/IEmployeeSpotlightWebPartProps.ts @@ -0,0 +1,13 @@ +export interface IEmployeeSpotlightWebPartProps { + description: string; + spotlightSiteCollectionURL: string; + spotlightSiteURL: string; + spotlightListName: string; + spotlightEmployeeEmailColumn: string; + spotlightEmployeeExpirationDateColumn: string; + spotlightBGColor:string; + spotlightFontColor:string; + spotlightDescriptionColumn: string; + spotlightSliderSpeed: number; + enabledSpotlightAutoPlay: boolean; +} diff --git a/samples/js-employee-spotlight/src/webparts/employeeSpotlight/loc/en-us.js b/samples/js-employee-spotlight/src/webparts/employeeSpotlight/loc/en-us.js new file mode 100644 index 000000000..d9989972c --- /dev/null +++ b/samples/js-employee-spotlight/src/webparts/employeeSpotlight/loc/en-us.js @@ -0,0 +1,15 @@ +define([], function() { + return { + "propertyPaneHeading": "Spotlight Configuration", + "selectSiteLableMessage": "Select Site", + "selectListLableMessage": "Select List Name", + "employeeEmailcolumnLableMessage": "Select Employee Name column", + "descriptioncolumnLableMessage": "Select Description column", + "expirationDateColumnLableMessage": "Select ExpiryDate column", + "effectsGroupName": "Slider Effects", + "spotlightBGColorLableMessage": "Background Color", + "spotlightFontColorLableMessage": "Font Color", + "enableAutoSlideLableMessage": "Enable auto slide", + "carouselSpeedLableMessage": "Slider speed(in seconds)" + } +}); \ No newline at end of file diff --git a/samples/js-employee-spotlight/src/webparts/employeeSpotlight/loc/mystrings.d.ts b/samples/js-employee-spotlight/src/webparts/employeeSpotlight/loc/mystrings.d.ts new file mode 100644 index 000000000..a56357c87 --- /dev/null +++ b/samples/js-employee-spotlight/src/webparts/employeeSpotlight/loc/mystrings.d.ts @@ -0,0 +1,18 @@ +declare interface IEmployeeSpotlightStrings { + propertyPaneHeading: string; + selectSiteLableMessage: string; + selectListLableMessage: string; + employeeEmailcolumnLableMessage: string; + descriptioncolumnLableMessage: string; + expirationDateColumnLableMessage: string; + effectsGroupName: string; + spotlightBGColorLableMessage:string; + spotlightFontColorLableMessage:string; + enableAutoSlideLableMessage: string; + carouselSpeedLableMessage: string; +} + +declare module 'employeeSpotlightStrings' { + const strings: IEmployeeSpotlightStrings; + export = strings; +} diff --git a/samples/js-employee-spotlight/src/webparts/employeeSpotlight/tests/EmployeeSpotlight.test.ts b/samples/js-employee-spotlight/src/webparts/employeeSpotlight/tests/EmployeeSpotlight.test.ts new file mode 100644 index 000000000..4d315a54c --- /dev/null +++ b/samples/js-employee-spotlight/src/webparts/employeeSpotlight/tests/EmployeeSpotlight.test.ts @@ -0,0 +1,9 @@ +/// + +import { assert } from 'chai'; + +describe('EmployeeSpotlightWebPart', () => { + it('should do something', () => { + assert.ok(true); + }); +}); diff --git a/samples/js-employee-spotlight/tsconfig.json b/samples/js-employee-spotlight/tsconfig.json new file mode 100644 index 000000000..5fa39c930 --- /dev/null +++ b/samples/js-employee-spotlight/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "es5", + "forceConsistentCasingInFileNames": true, + "module": "commonjs", + "jsx": "react", + "declaration": true, + "sourceMap": true, + "types": [ + "es6-promise", + "es6-collections", + "webpack-env" + ] + } +} diff --git a/samples/js-employee-spotlight/typings/@ms/odsp.d.ts b/samples/js-employee-spotlight/typings/@ms/odsp.d.ts new file mode 100644 index 000000000..2d2913e53 --- /dev/null +++ b/samples/js-employee-spotlight/typings/@ms/odsp.d.ts @@ -0,0 +1,8 @@ +// Type definitions for Microsoft ODSP projects +// Project: ODSP + +/* Global definition for UNIT_TEST builds + Code that is wrapped inside an if(UNIT_TEST) {...} + block will not be included in the final bundle when the + --ship flag is specified */ +declare const UNIT_TEST: boolean; \ No newline at end of file diff --git a/samples/js-employee-spotlight/typings/tsd.d.ts b/samples/js-employee-spotlight/typings/tsd.d.ts new file mode 100644 index 000000000..e7efdd728 --- /dev/null +++ b/samples/js-employee-spotlight/typings/tsd.d.ts @@ -0,0 +1 @@ +///