From 54c2275b1f8c893abf7fe3f3456001852490baae Mon Sep 17 00:00:00 2001 From: Vesa Juvonen Date: Thu, 23 Feb 2017 18:19:44 +0200 Subject: [PATCH] Updated tutorial code samples to GA level --- .../documentcardexample-webpart/.editorconfig | 25 +++ .../.gitattributes | 1 + .../documentcardexample-webpart/.gitignore | 32 ++++ .../documentcardexample-webpart/.npmignore | 14 ++ .../.vscode/settings.json | 3 + .../documentcardexample-webpart/.yo-rc.json | 8 + .../documentcardexample-webpart/README.md | 26 +++ .../config/config.json | 13 ++ .../config/copy-assets.json | 3 + .../config/deploy-azure-storage.json | 6 + .../config/package-solution.json | 10 ++ .../config/serve.json | 9 ++ .../config/tslint.json | 46 ++++++ .../config/write-manifests.json | 3 + .../documentcardexample-webpart/gulpfile.js | 6 + .../documentcardexample-webpart/package.json | 34 ++++ .../DocumentCardExampleWebPart.manifest.json | 20 +++ .../DocumentCardExampleWebPart.ts | 54 +++++++ .../IDocumentCardExampleWebPartProps.ts | 3 + .../documentCardExample/avatar-kat.png | Bin 0 -> 82239 bytes .../DocumentCardExample.module.scss | 52 ++++++ .../components/DocumentCardExample.tsx | 40 +++++ .../components/IDocumentCardExampleProps.ts | 3 + .../documentCardExample/document-preview.png | Bin 0 -> 29938 bytes .../webparts/documentCardExample/icon-ppt.png | Bin 0 -> 943 bytes .../webparts/documentCardExample/loc/en-us.js | 7 + .../documentCardExample/loc/mystrings.d.ts | 10 ++ .../tests/DocumentCardExample.test.ts | 9 ++ .../documentcardexample-webpart/tsconfig.json | 17 ++ .../typings/@ms/odsp.d.ts | 8 + .../typings/tsd.d.ts | 1 + tutorials/hello-world-sp/.editorconfig | 25 +++ tutorials/hello-world-sp/.gitattributes | 1 + tutorials/hello-world-sp/.gitignore | 32 ++++ tutorials/hello-world-sp/.npmignore | 14 ++ .../hello-world-sp/.vscode/settings.json | 3 + tutorials/hello-world-sp/.yo-rc.json | 8 + tutorials/hello-world-sp/README.md | 26 +++ tutorials/hello-world-sp/config/config.json | 13 ++ .../hello-world-sp/config/copy-assets.json | 3 + .../config/deploy-azure-storage.json | 6 + .../config/package-solution.json | 10 ++ tutorials/hello-world-sp/config/serve.json | 9 ++ tutorials/hello-world-sp/config/tslint.json | 46 ++++++ .../config/write-manifests.json | 3 + tutorials/hello-world-sp/gulpfile.js | 6 + tutorials/hello-world-sp/package.json | 27 ++++ .../helloWorld/HelloWorld.module.scss | 80 ++++++++++ .../HelloWorldWebPart.manifest.json | 24 +++ .../webparts/helloWorld/HelloWorldWebPart.ts | 149 ++++++++++++++++++ .../helloWorld/IHelloWorldWebPartProps.ts | 7 + .../src/webparts/helloWorld/MockHttpClient.ts | 14 ++ .../src/webparts/helloWorld/loc/en-us.js | 7 + .../webparts/helloWorld/loc/mystrings.d.ts | 10 ++ .../helloWorld/tests/HelloWorld.test.ts | 9 ++ tutorials/hello-world-sp/tsconfig.json | 17 ++ .../hello-world-sp/typings/@ms/odsp.d.ts | 8 + tutorials/hello-world-sp/typings/tsd.d.ts | 1 + tutorials/helloworld-webpart/.editorconfig | 25 +++ tutorials/helloworld-webpart/.gitattributes | 1 + tutorials/helloworld-webpart/.gitignore | 32 ++++ tutorials/helloworld-webpart/.npmignore | 14 ++ .../helloworld-webpart/.vscode/settings.json | 3 + tutorials/helloworld-webpart/.yo-rc.json | 8 + tutorials/helloworld-webpart/README.md | 26 +++ .../helloworld-webpart/config/config.json | 13 ++ .../config/copy-assets.json | 3 + .../config/deploy-azure-storage.json | 6 + .../config/package-solution.json | 10 ++ .../helloworld-webpart/config/serve.json | 9 ++ .../helloworld-webpart/config/tslint.json | 46 ++++++ .../config/write-manifests.json | 3 + tutorials/helloworld-webpart/gulpfile.js | 6 + tutorials/helloworld-webpart/package.json | 27 ++++ .../helloWorld/HelloWorld.module.scss | 52 ++++++ .../HelloWorldWebPart.manifest.json | 24 +++ .../webparts/helloWorld/HelloWorldWebPart.ts | 82 ++++++++++ .../helloWorld/IHelloWorldWebPartProps.ts | 7 + .../src/webparts/helloWorld/loc/en-us.js | 7 + .../webparts/helloWorld/loc/mystrings.d.ts | 10 ++ .../helloWorld/tests/HelloWorld.test.ts | 9 ++ tutorials/helloworld-webpart/tsconfig.json | 17 ++ .../helloworld-webpart/typings/@ms/odsp.d.ts | 8 + tutorials/helloworld-webpart/typings/tsd.d.ts | 1 + tutorials/jquery-webpart/.editorconfig | 25 +++ tutorials/jquery-webpart/.gitattributes | 1 + tutorials/jquery-webpart/.gitignore | 32 ++++ tutorials/jquery-webpart/.npmignore | 14 ++ .../jquery-webpart/.vscode/settings.json | 3 + tutorials/jquery-webpart/.yo-rc.json | 8 + tutorials/jquery-webpart/README.md | 26 +++ tutorials/jquery-webpart/config/config.json | 16 ++ .../jquery-webpart/config/copy-assets.json | 3 + .../config/deploy-azure-storage.json | 6 + .../config/package-solution.json | 10 ++ tutorials/jquery-webpart/config/serve.json | 9 ++ tutorials/jquery-webpart/config/tslint.json | 46 ++++++ .../config/write-manifests.json | 3 + tutorials/jquery-webpart/gulpfile.js | 6 + tutorials/jquery-webpart/package.json | 31 ++++ .../webparts/jQuery/IJQueryWebPartProps.ts | 3 + .../src/webparts/jQuery/JQuery.module.scss | 52 ++++++ .../jQuery/JQueryWebPart.manifest.json | 20 +++ .../src/webparts/jQuery/JQueryWebPart.ts | 63 ++++++++ .../webparts/jQuery/MyAccordionTemplate.ts | 51 ++++++ .../src/webparts/jQuery/loc/en-us.js | 7 + .../src/webparts/jQuery/loc/mystrings.d.ts | 10 ++ .../src/webparts/jQuery/tests/JQuery.test.ts | 9 ++ tutorials/jquery-webpart/tsconfig.json | 17 ++ .../jquery-webpart/typings/@ms/odsp.d.ts | 8 + tutorials/jquery-webpart/typings/tsd.d.ts | 1 + 111 files changed, 1950 insertions(+) create mode 100644 tutorials/documentcardexample-webpart/.editorconfig create mode 100644 tutorials/documentcardexample-webpart/.gitattributes create mode 100644 tutorials/documentcardexample-webpart/.gitignore create mode 100644 tutorials/documentcardexample-webpart/.npmignore create mode 100644 tutorials/documentcardexample-webpart/.vscode/settings.json create mode 100644 tutorials/documentcardexample-webpart/.yo-rc.json create mode 100644 tutorials/documentcardexample-webpart/README.md create mode 100644 tutorials/documentcardexample-webpart/config/config.json create mode 100644 tutorials/documentcardexample-webpart/config/copy-assets.json create mode 100644 tutorials/documentcardexample-webpart/config/deploy-azure-storage.json create mode 100644 tutorials/documentcardexample-webpart/config/package-solution.json create mode 100644 tutorials/documentcardexample-webpart/config/serve.json create mode 100644 tutorials/documentcardexample-webpart/config/tslint.json create mode 100644 tutorials/documentcardexample-webpart/config/write-manifests.json create mode 100644 tutorials/documentcardexample-webpart/gulpfile.js create mode 100644 tutorials/documentcardexample-webpart/package.json create mode 100644 tutorials/documentcardexample-webpart/src/webparts/documentCardExample/DocumentCardExampleWebPart.manifest.json create mode 100644 tutorials/documentcardexample-webpart/src/webparts/documentCardExample/DocumentCardExampleWebPart.ts create mode 100644 tutorials/documentcardexample-webpart/src/webparts/documentCardExample/IDocumentCardExampleWebPartProps.ts create mode 100644 tutorials/documentcardexample-webpart/src/webparts/documentCardExample/avatar-kat.png create mode 100644 tutorials/documentcardexample-webpart/src/webparts/documentCardExample/components/DocumentCardExample.module.scss create mode 100644 tutorials/documentcardexample-webpart/src/webparts/documentCardExample/components/DocumentCardExample.tsx create mode 100644 tutorials/documentcardexample-webpart/src/webparts/documentCardExample/components/IDocumentCardExampleProps.ts create mode 100644 tutorials/documentcardexample-webpart/src/webparts/documentCardExample/document-preview.png create mode 100644 tutorials/documentcardexample-webpart/src/webparts/documentCardExample/icon-ppt.png create mode 100644 tutorials/documentcardexample-webpart/src/webparts/documentCardExample/loc/en-us.js create mode 100644 tutorials/documentcardexample-webpart/src/webparts/documentCardExample/loc/mystrings.d.ts create mode 100644 tutorials/documentcardexample-webpart/src/webparts/documentCardExample/tests/DocumentCardExample.test.ts create mode 100644 tutorials/documentcardexample-webpart/tsconfig.json create mode 100644 tutorials/documentcardexample-webpart/typings/@ms/odsp.d.ts create mode 100644 tutorials/documentcardexample-webpart/typings/tsd.d.ts create mode 100644 tutorials/hello-world-sp/.editorconfig create mode 100644 tutorials/hello-world-sp/.gitattributes create mode 100644 tutorials/hello-world-sp/.gitignore create mode 100644 tutorials/hello-world-sp/.npmignore create mode 100644 tutorials/hello-world-sp/.vscode/settings.json create mode 100644 tutorials/hello-world-sp/.yo-rc.json create mode 100644 tutorials/hello-world-sp/README.md create mode 100644 tutorials/hello-world-sp/config/config.json create mode 100644 tutorials/hello-world-sp/config/copy-assets.json create mode 100644 tutorials/hello-world-sp/config/deploy-azure-storage.json create mode 100644 tutorials/hello-world-sp/config/package-solution.json create mode 100644 tutorials/hello-world-sp/config/serve.json create mode 100644 tutorials/hello-world-sp/config/tslint.json create mode 100644 tutorials/hello-world-sp/config/write-manifests.json create mode 100644 tutorials/hello-world-sp/gulpfile.js create mode 100644 tutorials/hello-world-sp/package.json create mode 100644 tutorials/hello-world-sp/src/webparts/helloWorld/HelloWorld.module.scss create mode 100644 tutorials/hello-world-sp/src/webparts/helloWorld/HelloWorldWebPart.manifest.json create mode 100644 tutorials/hello-world-sp/src/webparts/helloWorld/HelloWorldWebPart.ts create mode 100644 tutorials/hello-world-sp/src/webparts/helloWorld/IHelloWorldWebPartProps.ts create mode 100644 tutorials/hello-world-sp/src/webparts/helloWorld/MockHttpClient.ts create mode 100644 tutorials/hello-world-sp/src/webparts/helloWorld/loc/en-us.js create mode 100644 tutorials/hello-world-sp/src/webparts/helloWorld/loc/mystrings.d.ts create mode 100644 tutorials/hello-world-sp/src/webparts/helloWorld/tests/HelloWorld.test.ts create mode 100644 tutorials/hello-world-sp/tsconfig.json create mode 100644 tutorials/hello-world-sp/typings/@ms/odsp.d.ts create mode 100644 tutorials/hello-world-sp/typings/tsd.d.ts create mode 100644 tutorials/helloworld-webpart/.editorconfig create mode 100644 tutorials/helloworld-webpart/.gitattributes create mode 100644 tutorials/helloworld-webpart/.gitignore create mode 100644 tutorials/helloworld-webpart/.npmignore create mode 100644 tutorials/helloworld-webpart/.vscode/settings.json create mode 100644 tutorials/helloworld-webpart/.yo-rc.json create mode 100644 tutorials/helloworld-webpart/README.md create mode 100644 tutorials/helloworld-webpart/config/config.json create mode 100644 tutorials/helloworld-webpart/config/copy-assets.json create mode 100644 tutorials/helloworld-webpart/config/deploy-azure-storage.json create mode 100644 tutorials/helloworld-webpart/config/package-solution.json create mode 100644 tutorials/helloworld-webpart/config/serve.json create mode 100644 tutorials/helloworld-webpart/config/tslint.json create mode 100644 tutorials/helloworld-webpart/config/write-manifests.json create mode 100644 tutorials/helloworld-webpart/gulpfile.js create mode 100644 tutorials/helloworld-webpart/package.json create mode 100644 tutorials/helloworld-webpart/src/webparts/helloWorld/HelloWorld.module.scss create mode 100644 tutorials/helloworld-webpart/src/webparts/helloWorld/HelloWorldWebPart.manifest.json create mode 100644 tutorials/helloworld-webpart/src/webparts/helloWorld/HelloWorldWebPart.ts create mode 100644 tutorials/helloworld-webpart/src/webparts/helloWorld/IHelloWorldWebPartProps.ts create mode 100644 tutorials/helloworld-webpart/src/webparts/helloWorld/loc/en-us.js create mode 100644 tutorials/helloworld-webpart/src/webparts/helloWorld/loc/mystrings.d.ts create mode 100644 tutorials/helloworld-webpart/src/webparts/helloWorld/tests/HelloWorld.test.ts create mode 100644 tutorials/helloworld-webpart/tsconfig.json create mode 100644 tutorials/helloworld-webpart/typings/@ms/odsp.d.ts create mode 100644 tutorials/helloworld-webpart/typings/tsd.d.ts create mode 100644 tutorials/jquery-webpart/.editorconfig create mode 100644 tutorials/jquery-webpart/.gitattributes create mode 100644 tutorials/jquery-webpart/.gitignore create mode 100644 tutorials/jquery-webpart/.npmignore create mode 100644 tutorials/jquery-webpart/.vscode/settings.json create mode 100644 tutorials/jquery-webpart/.yo-rc.json create mode 100644 tutorials/jquery-webpart/README.md create mode 100644 tutorials/jquery-webpart/config/config.json create mode 100644 tutorials/jquery-webpart/config/copy-assets.json create mode 100644 tutorials/jquery-webpart/config/deploy-azure-storage.json create mode 100644 tutorials/jquery-webpart/config/package-solution.json create mode 100644 tutorials/jquery-webpart/config/serve.json create mode 100644 tutorials/jquery-webpart/config/tslint.json create mode 100644 tutorials/jquery-webpart/config/write-manifests.json create mode 100644 tutorials/jquery-webpart/gulpfile.js create mode 100644 tutorials/jquery-webpart/package.json create mode 100644 tutorials/jquery-webpart/src/webparts/jQuery/IJQueryWebPartProps.ts create mode 100644 tutorials/jquery-webpart/src/webparts/jQuery/JQuery.module.scss create mode 100644 tutorials/jquery-webpart/src/webparts/jQuery/JQueryWebPart.manifest.json create mode 100644 tutorials/jquery-webpart/src/webparts/jQuery/JQueryWebPart.ts create mode 100644 tutorials/jquery-webpart/src/webparts/jQuery/MyAccordionTemplate.ts create mode 100644 tutorials/jquery-webpart/src/webparts/jQuery/loc/en-us.js create mode 100644 tutorials/jquery-webpart/src/webparts/jQuery/loc/mystrings.d.ts create mode 100644 tutorials/jquery-webpart/src/webparts/jQuery/tests/JQuery.test.ts create mode 100644 tutorials/jquery-webpart/tsconfig.json create mode 100644 tutorials/jquery-webpart/typings/@ms/odsp.d.ts create mode 100644 tutorials/jquery-webpart/typings/tsd.d.ts diff --git a/tutorials/documentcardexample-webpart/.editorconfig b/tutorials/documentcardexample-webpart/.editorconfig new file mode 100644 index 000000000..8ffcdc4ec --- /dev/null +++ b/tutorials/documentcardexample-webpart/.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/tutorials/documentcardexample-webpart/.gitattributes b/tutorials/documentcardexample-webpart/.gitattributes new file mode 100644 index 000000000..212566614 --- /dev/null +++ b/tutorials/documentcardexample-webpart/.gitattributes @@ -0,0 +1 @@ +* text=auto \ No newline at end of file diff --git a/tutorials/documentcardexample-webpart/.gitignore b/tutorials/documentcardexample-webpart/.gitignore new file mode 100644 index 000000000..b19bbe123 --- /dev/null +++ b/tutorials/documentcardexample-webpart/.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/tutorials/documentcardexample-webpart/.npmignore b/tutorials/documentcardexample-webpart/.npmignore new file mode 100644 index 000000000..2c93a9384 --- /dev/null +++ b/tutorials/documentcardexample-webpart/.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/tutorials/documentcardexample-webpart/.vscode/settings.json b/tutorials/documentcardexample-webpart/.vscode/settings.json new file mode 100644 index 000000000..0c4a6693f --- /dev/null +++ b/tutorials/documentcardexample-webpart/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "vsicons.presets.angular": false +} \ No newline at end of file diff --git a/tutorials/documentcardexample-webpart/.yo-rc.json b/tutorials/documentcardexample-webpart/.yo-rc.json new file mode 100644 index 000000000..502a2442a --- /dev/null +++ b/tutorials/documentcardexample-webpart/.yo-rc.json @@ -0,0 +1,8 @@ +{ + "@microsoft/generator-sharepoint": { + "libraryName": "documentcardexample-webpart", + "framework": "react", + "version": "1.0.0", + "libraryId": "60bf8034-93ae-469c-8ce1-07c7c1307f9f" + } +} \ No newline at end of file diff --git a/tutorials/documentcardexample-webpart/README.md b/tutorials/documentcardexample-webpart/README.md new file mode 100644 index 000000000..a025fd363 --- /dev/null +++ b/tutorials/documentcardexample-webpart/README.md @@ -0,0 +1,26 @@ +## documentcardexample-webpart + +This is where you include your WebPart documentation. + +### Building the code + +```bash +git clone the repo +npm i +npm i -g gulp +gulp +``` + +This package produces the following: + +* lib/* - intermediate-stage commonjs build artifacts +* dist/* - the bundled script, along with other resources +* deploy/* - all resources which should be uploaded to a CDN. + +### Build options + +gulp clean - TODO +gulp test - TODO +gulp serve - TODO +gulp bundle - TODO +gulp package-solution - TODO diff --git a/tutorials/documentcardexample-webpart/config/config.json b/tutorials/documentcardexample-webpart/config/config.json new file mode 100644 index 000000000..448d5df91 --- /dev/null +++ b/tutorials/documentcardexample-webpart/config/config.json @@ -0,0 +1,13 @@ +{ + "entries": [ + { + "entry": "./lib/webparts/documentCardExample/DocumentCardExampleWebPart.js", + "manifest": "./src/webparts/documentCardExample/DocumentCardExampleWebPart.manifest.json", + "outputPath": "./dist/document-card-example.bundle.js" + } + ], + "externals": {}, + "localizedResources": { + "documentCardExampleStrings": "webparts/documentCardExample/loc/{locale}.js" + } +} diff --git a/tutorials/documentcardexample-webpart/config/copy-assets.json b/tutorials/documentcardexample-webpart/config/copy-assets.json new file mode 100644 index 000000000..6aca63656 --- /dev/null +++ b/tutorials/documentcardexample-webpart/config/copy-assets.json @@ -0,0 +1,3 @@ +{ + "deployCdnPath": "temp/deploy" +} diff --git a/tutorials/documentcardexample-webpart/config/deploy-azure-storage.json b/tutorials/documentcardexample-webpart/config/deploy-azure-storage.json new file mode 100644 index 000000000..807b34c5b --- /dev/null +++ b/tutorials/documentcardexample-webpart/config/deploy-azure-storage.json @@ -0,0 +1,6 @@ +{ + "workingDir": "./temp/deploy/", + "account": "", + "container": "documentcardexample-webpart", + "accessKey": "" +} \ No newline at end of file diff --git a/tutorials/documentcardexample-webpart/config/package-solution.json b/tutorials/documentcardexample-webpart/config/package-solution.json new file mode 100644 index 000000000..df123127d --- /dev/null +++ b/tutorials/documentcardexample-webpart/config/package-solution.json @@ -0,0 +1,10 @@ +{ + "solution": { + "name": "documentcardexample-webpart-client-side-solution", + "id": "60bf8034-93ae-469c-8ce1-07c7c1307f9f", + "version": "1.0.0.0" + }, + "paths": { + "zippedPackage": "solution/documentcardexample-webpart.sppkg" + } +} diff --git a/tutorials/documentcardexample-webpart/config/serve.json b/tutorials/documentcardexample-webpart/config/serve.json new file mode 100644 index 000000000..087899637 --- /dev/null +++ b/tutorials/documentcardexample-webpart/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/tutorials/documentcardexample-webpart/config/tslint.json b/tutorials/documentcardexample-webpart/config/tslint.json new file mode 100644 index 000000000..3c085daaf --- /dev/null +++ b/tutorials/documentcardexample-webpart/config/tslint.json @@ -0,0 +1,46 @@ +{ + // 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, + "prefer-const": true + } + } +} \ No newline at end of file diff --git a/tutorials/documentcardexample-webpart/config/write-manifests.json b/tutorials/documentcardexample-webpart/config/write-manifests.json new file mode 100644 index 000000000..0a4bafb06 --- /dev/null +++ b/tutorials/documentcardexample-webpart/config/write-manifests.json @@ -0,0 +1,3 @@ +{ + "cdnBasePath": "" +} \ No newline at end of file diff --git a/tutorials/documentcardexample-webpart/gulpfile.js b/tutorials/documentcardexample-webpart/gulpfile.js new file mode 100644 index 000000000..7d36ddb1c --- /dev/null +++ b/tutorials/documentcardexample-webpart/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/tutorials/documentcardexample-webpart/package.json b/tutorials/documentcardexample-webpart/package.json new file mode 100644 index 000000000..ab573fa58 --- /dev/null +++ b/tutorials/documentcardexample-webpart/package.json @@ -0,0 +1,34 @@ +{ + "name": "documentcardexample-webpart", + "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/react": "0.14.46", + "@types/react-addons-shallow-compare": "0.14.17", + "@types/react-addons-test-utils": "0.14.15", + "@types/react-addons-update": "0.14.14", + "@types/react-dom": "0.14.18", + "@types/webpack-env": ">=1.12.1 <1.14.0", + "react": "15.4.2", + "react-dom": "15.4.2" + }, + "devDependencies": { + "@microsoft/sp-build-web": "~1.0.0", + "@microsoft/sp-module-interfaces": "~1.0.0", + "@microsoft/sp-webpart-workbench": "~1.0.0", + "gulp": "~3.9.1", + "@types/chai": ">=3.4.34 <3.6.0", + "@types/mocha": ">=2.2.33 <2.6.0" + }, + "scripts": { + "build": "gulp bundle", + "clean": "gulp clean", + "test": "gulp test" + } +} diff --git a/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/DocumentCardExampleWebPart.manifest.json b/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/DocumentCardExampleWebPart.manifest.json new file mode 100644 index 000000000..bef87e488 --- /dev/null +++ b/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/DocumentCardExampleWebPart.manifest.json @@ -0,0 +1,20 @@ +{ + "$schema": "../../../node_modules/@microsoft/sp-module-interfaces/lib/manifestSchemas/jsonSchemas/clientSideComponentManifestSchema.json", + + "id": "dc0d07e6-f119-4b26-b8de-23a16fa2a55a", + "alias": "DocumentCardExampleWebPart", + "componentType": "WebPart", + "version": "0.0.1", + "manifestVersion": 2, + + "preconfiguredEntries": [{ + "groupId": "dc0d07e6-f119-4b26-b8de-23a16fa2a55a", + "group": { "default": "Under Development" }, + "title": { "default": "DocumentCardExample" }, + "description": { "default": "DocumentCardExample description" }, + "officeFabricIconFontName": "Page", + "properties": { + "description": "DocumentCardExample" + } + }] +} diff --git a/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/DocumentCardExampleWebPart.ts b/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/DocumentCardExampleWebPart.ts new file mode 100644 index 000000000..997e4a605 --- /dev/null +++ b/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/DocumentCardExampleWebPart.ts @@ -0,0 +1,54 @@ +require('set-webpack-public-path!'); +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, + PropertyPaneTextField +} from '@microsoft/sp-webpart-base'; + +import * as strings from 'documentCardExampleStrings'; +import DocumentCardExample from './components/DocumentCardExample'; +import { IDocumentCardExampleProps } from './components/IDocumentCardExampleProps'; +import { IDocumentCardExampleWebPartProps } from './IDocumentCardExampleWebPartProps'; + +export default class DocumentCardExampleWebPart extends BaseClientSideWebPart { + + public render(): void { + const element: React.ReactElement = React.createElement( + DocumentCardExample, + { + description: this.properties.description + } + ); + + ReactDom.render(element, this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + header: { + description: strings.PropertyPaneDescription + }, + groups: [ + { + groupName: strings.BasicGroupName, + groupFields: [ + PropertyPaneTextField('description', { + label: strings.DescriptionFieldLabel + }) + ] + } + ] + } + ] + }; + } +} diff --git a/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/IDocumentCardExampleWebPartProps.ts b/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/IDocumentCardExampleWebPartProps.ts new file mode 100644 index 000000000..40525e9ce --- /dev/null +++ b/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/IDocumentCardExampleWebPartProps.ts @@ -0,0 +1,3 @@ +export interface IDocumentCardExampleWebPartProps { + description: string; +} diff --git a/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/avatar-kat.png b/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/avatar-kat.png new file mode 100644 index 0000000000000000000000000000000000000000..3ece38e5cdaa6357c30bc29025df5fbf230cf8e1 GIT binary patch literal 82239 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 { + public render(): JSX.Element { + const previewProps: IDocumentCardPreviewProps = { + previewImages: [ + { + previewImageSrc: String(require('document-preview.png')), + iconSrc: String(require('icon-ppt.png')), + width: 318, + height: 196, + accentColor: '#ce4b1f' + } + ], + }; + + return ( + + + + + + ); + } +} diff --git a/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/components/IDocumentCardExampleProps.ts b/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/components/IDocumentCardExampleProps.ts new file mode 100644 index 000000000..6ea4e5c9e --- /dev/null +++ b/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/components/IDocumentCardExampleProps.ts @@ -0,0 +1,3 @@ +export interface IDocumentCardExampleProps { + description: string; +} diff --git a/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/document-preview.png b/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/document-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5d1288832136918672725b7d5a392b0f863f53 GIT binary patch literal 29938 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

oR8+>e3zadF8k&4^$(MXPhIph#4=Im< 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 RO<@24002ovPDHLkV1fqw#J>Ol literal 0 HcmV?d00001 diff --git a/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/loc/en-us.js b/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/loc/en-us.js new file mode 100644 index 000000000..89f98bc1e --- /dev/null +++ b/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/loc/en-us.js @@ -0,0 +1,7 @@ +define([], function() { + return { + "PropertyPaneDescription": "Description", + "BasicGroupName": "Group Name", + "DescriptionFieldLabel": "Description Field" + } +}); \ No newline at end of file diff --git a/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/loc/mystrings.d.ts b/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/loc/mystrings.d.ts new file mode 100644 index 000000000..34f1bbaf9 --- /dev/null +++ b/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/loc/mystrings.d.ts @@ -0,0 +1,10 @@ +declare interface IDocumentCardExampleStrings { + PropertyPaneDescription: string; + BasicGroupName: string; + DescriptionFieldLabel: string; +} + +declare module 'documentCardExampleStrings' { + const strings: IDocumentCardExampleStrings; + export = strings; +} diff --git a/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/tests/DocumentCardExample.test.ts b/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/tests/DocumentCardExample.test.ts new file mode 100644 index 000000000..86ded8178 --- /dev/null +++ b/tutorials/documentcardexample-webpart/src/webparts/documentCardExample/tests/DocumentCardExample.test.ts @@ -0,0 +1,9 @@ +/// + +import { assert } from 'chai'; + +describe('DocumentCardExampleWebPart', () => { + it('should do something', () => { + assert.ok(true); + }); +}); diff --git a/tutorials/documentcardexample-webpart/tsconfig.json b/tutorials/documentcardexample-webpart/tsconfig.json new file mode 100644 index 000000000..0db3331d4 --- /dev/null +++ b/tutorials/documentcardexample-webpart/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "es5", + "forceConsistentCasingInFileNames": true, + "module": "commonjs", + "jsx": "react", + "declaration": true, + "sourceMap": true, + "types": [ + "es6-promise", + "es6-collections", + "webpack-env" + ], + "noUnusedLocals": true, + "noUnusedParameters": true + } +} diff --git a/tutorials/documentcardexample-webpart/typings/@ms/odsp.d.ts b/tutorials/documentcardexample-webpart/typings/@ms/odsp.d.ts new file mode 100644 index 000000000..2d2913e53 --- /dev/null +++ b/tutorials/documentcardexample-webpart/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/tutorials/documentcardexample-webpart/typings/tsd.d.ts b/tutorials/documentcardexample-webpart/typings/tsd.d.ts new file mode 100644 index 000000000..e7efdd728 --- /dev/null +++ b/tutorials/documentcardexample-webpart/typings/tsd.d.ts @@ -0,0 +1 @@ +/// diff --git a/tutorials/hello-world-sp/.editorconfig b/tutorials/hello-world-sp/.editorconfig new file mode 100644 index 000000000..8ffcdc4ec --- /dev/null +++ b/tutorials/hello-world-sp/.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/tutorials/hello-world-sp/.gitattributes b/tutorials/hello-world-sp/.gitattributes new file mode 100644 index 000000000..212566614 --- /dev/null +++ b/tutorials/hello-world-sp/.gitattributes @@ -0,0 +1 @@ +* text=auto \ No newline at end of file diff --git a/tutorials/hello-world-sp/.gitignore b/tutorials/hello-world-sp/.gitignore new file mode 100644 index 000000000..b19bbe123 --- /dev/null +++ b/tutorials/hello-world-sp/.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/tutorials/hello-world-sp/.npmignore b/tutorials/hello-world-sp/.npmignore new file mode 100644 index 000000000..2c93a9384 --- /dev/null +++ b/tutorials/hello-world-sp/.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/tutorials/hello-world-sp/.vscode/settings.json b/tutorials/hello-world-sp/.vscode/settings.json new file mode 100644 index 000000000..0c4a6693f --- /dev/null +++ b/tutorials/hello-world-sp/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "vsicons.presets.angular": false +} \ No newline at end of file diff --git a/tutorials/hello-world-sp/.yo-rc.json b/tutorials/hello-world-sp/.yo-rc.json new file mode 100644 index 000000000..5fe8fad4a --- /dev/null +++ b/tutorials/hello-world-sp/.yo-rc.json @@ -0,0 +1,8 @@ +{ + "@microsoft/generator-sharepoint": { + "libraryName": "helloworld-webpart", + "framework": "none", + "version": "1.0.0", + "libraryId": "da0e0e28-d643-4fa0-830e-78306f0c5760" + } +} \ No newline at end of file diff --git a/tutorials/hello-world-sp/README.md b/tutorials/hello-world-sp/README.md new file mode 100644 index 000000000..10ec0a62a --- /dev/null +++ b/tutorials/hello-world-sp/README.md @@ -0,0 +1,26 @@ +## helloworld-webpart + +This is where you include your WebPart documentation. + +### Building the code + +```bash +git clone the repo +npm i +npm i -g gulp +gulp +``` + +This package produces the following: + +* lib/* - intermediate-stage commonjs build artifacts +* dist/* - the bundled script, along with other resources +* deploy/* - all resources which should be uploaded to a CDN. + +### Build options + +gulp clean - TODO +gulp test - TODO +gulp serve - TODO +gulp bundle - TODO +gulp package-solution - TODO diff --git a/tutorials/hello-world-sp/config/config.json b/tutorials/hello-world-sp/config/config.json new file mode 100644 index 000000000..6e67e9c74 --- /dev/null +++ b/tutorials/hello-world-sp/config/config.json @@ -0,0 +1,13 @@ +{ + "entries": [ + { + "entry": "./lib/webparts/helloWorld/HelloWorldWebPart.js", + "manifest": "./src/webparts/helloWorld/HelloWorldWebPart.manifest.json", + "outputPath": "./dist/hello-world.bundle.js" + } + ], + "externals": {}, + "localizedResources": { + "helloWorldStrings": "webparts/helloWorld/loc/{locale}.js" + } +} diff --git a/tutorials/hello-world-sp/config/copy-assets.json b/tutorials/hello-world-sp/config/copy-assets.json new file mode 100644 index 000000000..6aca63656 --- /dev/null +++ b/tutorials/hello-world-sp/config/copy-assets.json @@ -0,0 +1,3 @@ +{ + "deployCdnPath": "temp/deploy" +} diff --git a/tutorials/hello-world-sp/config/deploy-azure-storage.json b/tutorials/hello-world-sp/config/deploy-azure-storage.json new file mode 100644 index 000000000..94295f751 --- /dev/null +++ b/tutorials/hello-world-sp/config/deploy-azure-storage.json @@ -0,0 +1,6 @@ +{ + "workingDir": "./temp/deploy/", + "account": "", + "container": "helloworld-webpart", + "accessKey": "" +} \ No newline at end of file diff --git a/tutorials/hello-world-sp/config/package-solution.json b/tutorials/hello-world-sp/config/package-solution.json new file mode 100644 index 000000000..868193e37 --- /dev/null +++ b/tutorials/hello-world-sp/config/package-solution.json @@ -0,0 +1,10 @@ +{ + "solution": { + "name": "helloworld-webpart-client-side-solution", + "id": "da0e0e28-d643-4fa0-830e-78306f0c5760", + "version": "1.0.0.0" + }, + "paths": { + "zippedPackage": "solution/helloworld-webpart.sppkg" + } +} diff --git a/tutorials/hello-world-sp/config/serve.json b/tutorials/hello-world-sp/config/serve.json new file mode 100644 index 000000000..087899637 --- /dev/null +++ b/tutorials/hello-world-sp/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/tutorials/hello-world-sp/config/tslint.json b/tutorials/hello-world-sp/config/tslint.json new file mode 100644 index 000000000..3c085daaf --- /dev/null +++ b/tutorials/hello-world-sp/config/tslint.json @@ -0,0 +1,46 @@ +{ + // 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, + "prefer-const": true + } + } +} \ No newline at end of file diff --git a/tutorials/hello-world-sp/config/write-manifests.json b/tutorials/hello-world-sp/config/write-manifests.json new file mode 100644 index 000000000..d497067be --- /dev/null +++ b/tutorials/hello-world-sp/config/write-manifests.json @@ -0,0 +1,3 @@ +{ + "cdnBasePath": "https://yourCDNUrl.azureedge.net/helloworld-webpart/" +} \ No newline at end of file diff --git a/tutorials/hello-world-sp/gulpfile.js b/tutorials/hello-world-sp/gulpfile.js new file mode 100644 index 000000000..7d36ddb1c --- /dev/null +++ b/tutorials/hello-world-sp/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/tutorials/hello-world-sp/package.json b/tutorials/hello-world-sp/package.json new file mode 100644 index 000000000..0ae8294d7 --- /dev/null +++ b/tutorials/hello-world-sp/package.json @@ -0,0 +1,27 @@ +{ + "name": "helloworld-webpart", + "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" + }, + "devDependencies": { + "@microsoft/sp-build-web": "~1.0.0", + "@microsoft/sp-module-interfaces": "~1.0.0", + "@microsoft/sp-webpart-workbench": "~1.0.0", + "gulp": "~3.9.1", + "@types/chai": ">=3.4.34 <3.6.0", + "@types/mocha": ">=2.2.33 <2.6.0" + }, + "scripts": { + "build": "gulp bundle", + "clean": "gulp clean", + "test": "gulp test" + } +} \ No newline at end of file diff --git a/tutorials/hello-world-sp/src/webparts/helloWorld/HelloWorld.module.scss b/tutorials/hello-world-sp/src/webparts/helloWorld/HelloWorld.module.scss new file mode 100644 index 000000000..e3c1efcf5 --- /dev/null +++ b/tutorials/hello-world-sp/src/webparts/helloWorld/HelloWorld.module.scss @@ -0,0 +1,80 @@ +.helloWorld { + .container { + max-width: 700px; + margin: 0px auto; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1); + } + + .row { + padding: 20px; + } + + .listItem { + max-width: 715px; + margin: 5px auto 5px auto; + box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1); + } + + .button { + // Our button + text-decoration: none; + height: 32px; + + // Primary Button + min-width: 80px; + background-color: #0078d7; + border-color: #0078d7; + color: #ffffff; + + // Basic Button + outline: transparent; + position: relative; + font-family: "Segoe UI WestEuropean","Segoe UI",-apple-system,BlinkMacSystemFont,Roboto,"Helvetica Neue",sans-serif; + -webkit-font-smoothing: antialiased; + font-size: 14px; + font-weight: 400; + border-width: 0; + text-align: center; + cursor: pointer; + display: inline-block; + padding: 0 16px; + + .label { + font-weight: 600; + font-size: 14px; + height: 32px; + line-height: 32px; + margin: 0 4px; + vertical-align: top; + display: inline-block; + } + } + + .list { + color: #333333; + font-family: 'Segoe UI Regular WestEuropean', 'Segoe UI', Tahoma, Arial, sans-serif; + font-size: 14px; + font-weight: normal; + box-sizing: border-box; + margin: 10; + padding: 10; + line-height: 50px; + list-style-type: none; + box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1); + } + + .listItem { + color: #333333; + vertical-align: center; + font-family: 'Segoe UI Regular WestEuropean', 'Segoe UI', Tahoma, Arial, sans-serif; + font-size: 14px; + font-weight: normal; + box-sizing: border-box; + margin: 0; + padding: 0; + box-shadow: none; + *zoom: 1; + padding: 9px 28px 3px; + position: relative; + } +} \ No newline at end of file diff --git a/tutorials/hello-world-sp/src/webparts/helloWorld/HelloWorldWebPart.manifest.json b/tutorials/hello-world-sp/src/webparts/helloWorld/HelloWorldWebPart.manifest.json new file mode 100644 index 000000000..2f85437a7 --- /dev/null +++ b/tutorials/hello-world-sp/src/webparts/helloWorld/HelloWorldWebPart.manifest.json @@ -0,0 +1,24 @@ +{ + "$schema": "../../../node_modules/@microsoft/sp-module-interfaces/lib/manifestSchemas/jsonSchemas/clientSideComponentManifestSchema.json", + + "id": "54c35872-b327-475c-b3ce-24beeb1124c1", + "alias": "HelloWorldWebPart", + "componentType": "WebPart", + "version": "0.0.1", + "manifestVersion": 2, + + "preconfiguredEntries": [{ + "groupId": "54c35872-b327-475c-b3ce-24beeb1124c1", + "group": { "default": "Under Development" }, + "title": { "default": "HelloWorld" }, + "description": { "default": "HelloWorld description" }, + "officeFabricIconFontName": "Page", + "properties": { + "description": "HelloWorld", + "test": "Multi-line text field", + "test1": true, + "test2": "2", + "test3": true + } + }] +} diff --git a/tutorials/hello-world-sp/src/webparts/helloWorld/HelloWorldWebPart.ts b/tutorials/hello-world-sp/src/webparts/helloWorld/HelloWorldWebPart.ts new file mode 100644 index 000000000..d6d0d8a61 --- /dev/null +++ b/tutorials/hello-world-sp/src/webparts/helloWorld/HelloWorldWebPart.ts @@ -0,0 +1,149 @@ +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, + PropertyPaneTextField, + PropertyPaneCheckbox, + PropertyPaneDropdown, + PropertyPaneToggle +} from '@microsoft/sp-webpart-base'; +import { escape } from '@microsoft/sp-lodash-subset'; + +import styles from './HelloWorld.module.scss'; +import * as strings from 'helloWorldStrings'; +import { IHelloWorldWebPartProps } from './IHelloWorldWebPartProps'; +import MockHttpClient from './MockHttpClient'; +import { + SPHttpClient +} from '@microsoft/sp-http'; +import { + Environment, + EnvironmentType +} from '@microsoft/sp-core-library'; + +export interface ISPLists { + value: ISPList[]; +} + +export interface ISPList { + Title: string; + Id: string; +} + +export default class HelloWorldWebPart extends BaseClientSideWebPart { + + public render(): void { + this.domElement.innerHTML = ` +

+ +
+
`; + + this._renderListAsync(); + } + + private _getMockListData(): Promise { + return MockHttpClient.get() + .then((data: ISPList[]) => { + var listData: ISPLists = { value: data }; + return listData; + }) as Promise; + } + + private _getListData(): Promise { + return this.context.spHttpClient.get(this.context.pageContext.web.absoluteUrl + `/_api/web/lists?$filter=Hidden eq false`, SPHttpClient.configurations.v1) + .then((response: Response) => { + return response.json(); + }); + } + + private _renderListAsync(): void { + // Local environment + if (Environment.type === EnvironmentType.Local) { + this._getMockListData().then((response) => { + this._renderList(response.value); + }); + } + else if (Environment.type == EnvironmentType.SharePoint || + Environment.type == EnvironmentType.ClassicSharePoint) { + this._getListData() + .then((response) => { + this._renderList(response.value); + }); + } + } + + private _renderList(items: ISPList[]): void { + let html: string = ''; + items.forEach((item: ISPList) => { + html += ` +
    +
  • + ${item.Title} +
  • +
`; + }); + + const listContainer: Element = this.domElement.querySelector('#spListContainer'); + listContainer.innerHTML = html; + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + header: { + description: strings.PropertyPaneDescription + }, + groups: [ + { + groupName: strings.BasicGroupName, + groupFields: [ + PropertyPaneTextField('description', { + label: 'Description' + }), + PropertyPaneTextField('test', { + label: 'Multi-line Text Field', + multiline: true + }), + PropertyPaneCheckbox('test1', { + text: 'Checkbox' + }), + PropertyPaneDropdown('test2', { + label: 'Dropdown', + options: [ + { key: '1', text: 'One' }, + { key: '2', text: 'Two' }, + { key: '3', text: 'Three' }, + { key: '4', text: 'Four' } + ] + }), + PropertyPaneToggle('test3', { + label: 'Toggle', + onText: 'On', + offText: 'Off' + }) + ] + } + ] + } + ] + }; + } +} diff --git a/tutorials/hello-world-sp/src/webparts/helloWorld/IHelloWorldWebPartProps.ts b/tutorials/hello-world-sp/src/webparts/helloWorld/IHelloWorldWebPartProps.ts new file mode 100644 index 000000000..f432fe573 --- /dev/null +++ b/tutorials/hello-world-sp/src/webparts/helloWorld/IHelloWorldWebPartProps.ts @@ -0,0 +1,7 @@ +export interface IHelloWorldWebPartProps { + description: string; + test: string; + test1: boolean; + test2: string; + test3: boolean; +} \ No newline at end of file diff --git a/tutorials/hello-world-sp/src/webparts/helloWorld/MockHttpClient.ts b/tutorials/hello-world-sp/src/webparts/helloWorld/MockHttpClient.ts new file mode 100644 index 000000000..c5cf45a47 --- /dev/null +++ b/tutorials/hello-world-sp/src/webparts/helloWorld/MockHttpClient.ts @@ -0,0 +1,14 @@ +import { ISPList } from './HelloWorldWebPart'; + +export default class MockHttpClient { + + private static _items: ISPList[] = [{ Title: 'Mock List', Id: '1' }, + { Title: 'Mock List 2', Id: '2' }, + { Title: 'Mock List 3', Id: '3' }]; + + public static get(): Promise { + return new Promise((resolve) => { + resolve(MockHttpClient._items); + }); + } +} \ No newline at end of file diff --git a/tutorials/hello-world-sp/src/webparts/helloWorld/loc/en-us.js b/tutorials/hello-world-sp/src/webparts/helloWorld/loc/en-us.js new file mode 100644 index 000000000..89f98bc1e --- /dev/null +++ b/tutorials/hello-world-sp/src/webparts/helloWorld/loc/en-us.js @@ -0,0 +1,7 @@ +define([], function() { + return { + "PropertyPaneDescription": "Description", + "BasicGroupName": "Group Name", + "DescriptionFieldLabel": "Description Field" + } +}); \ No newline at end of file diff --git a/tutorials/hello-world-sp/src/webparts/helloWorld/loc/mystrings.d.ts b/tutorials/hello-world-sp/src/webparts/helloWorld/loc/mystrings.d.ts new file mode 100644 index 000000000..bb9d32ed5 --- /dev/null +++ b/tutorials/hello-world-sp/src/webparts/helloWorld/loc/mystrings.d.ts @@ -0,0 +1,10 @@ +declare interface IHelloWorldStrings { + PropertyPaneDescription: string; + BasicGroupName: string; + DescriptionFieldLabel: string; +} + +declare module 'helloWorldStrings' { + const strings: IHelloWorldStrings; + export = strings; +} diff --git a/tutorials/hello-world-sp/src/webparts/helloWorld/tests/HelloWorld.test.ts b/tutorials/hello-world-sp/src/webparts/helloWorld/tests/HelloWorld.test.ts new file mode 100644 index 000000000..1937b6928 --- /dev/null +++ b/tutorials/hello-world-sp/src/webparts/helloWorld/tests/HelloWorld.test.ts @@ -0,0 +1,9 @@ +/// + +import { assert } from 'chai'; + +describe('HelloWorldWebPart', () => { + it('should do something', () => { + assert.ok(true); + }); +}); diff --git a/tutorials/hello-world-sp/tsconfig.json b/tutorials/hello-world-sp/tsconfig.json new file mode 100644 index 000000000..0db3331d4 --- /dev/null +++ b/tutorials/hello-world-sp/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "es5", + "forceConsistentCasingInFileNames": true, + "module": "commonjs", + "jsx": "react", + "declaration": true, + "sourceMap": true, + "types": [ + "es6-promise", + "es6-collections", + "webpack-env" + ], + "noUnusedLocals": true, + "noUnusedParameters": true + } +} diff --git a/tutorials/hello-world-sp/typings/@ms/odsp.d.ts b/tutorials/hello-world-sp/typings/@ms/odsp.d.ts new file mode 100644 index 000000000..2d2913e53 --- /dev/null +++ b/tutorials/hello-world-sp/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/tutorials/hello-world-sp/typings/tsd.d.ts b/tutorials/hello-world-sp/typings/tsd.d.ts new file mode 100644 index 000000000..e7efdd728 --- /dev/null +++ b/tutorials/hello-world-sp/typings/tsd.d.ts @@ -0,0 +1 @@ +/// diff --git a/tutorials/helloworld-webpart/.editorconfig b/tutorials/helloworld-webpart/.editorconfig new file mode 100644 index 000000000..8ffcdc4ec --- /dev/null +++ b/tutorials/helloworld-webpart/.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/tutorials/helloworld-webpart/.gitattributes b/tutorials/helloworld-webpart/.gitattributes new file mode 100644 index 000000000..212566614 --- /dev/null +++ b/tutorials/helloworld-webpart/.gitattributes @@ -0,0 +1 @@ +* text=auto \ No newline at end of file diff --git a/tutorials/helloworld-webpart/.gitignore b/tutorials/helloworld-webpart/.gitignore new file mode 100644 index 000000000..b19bbe123 --- /dev/null +++ b/tutorials/helloworld-webpart/.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/tutorials/helloworld-webpart/.npmignore b/tutorials/helloworld-webpart/.npmignore new file mode 100644 index 000000000..2c93a9384 --- /dev/null +++ b/tutorials/helloworld-webpart/.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/tutorials/helloworld-webpart/.vscode/settings.json b/tutorials/helloworld-webpart/.vscode/settings.json new file mode 100644 index 000000000..0c4a6693f --- /dev/null +++ b/tutorials/helloworld-webpart/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "vsicons.presets.angular": false +} \ No newline at end of file diff --git a/tutorials/helloworld-webpart/.yo-rc.json b/tutorials/helloworld-webpart/.yo-rc.json new file mode 100644 index 000000000..7da6ac2f9 --- /dev/null +++ b/tutorials/helloworld-webpart/.yo-rc.json @@ -0,0 +1,8 @@ +{ + "@microsoft/generator-sharepoint": { + "libraryName": "helloworld-webpart", + "framework": "none", + "version": "1.0.0", + "libraryId": "07e47f56-46a7-45ef-927c-210939ed441b" + } +} \ No newline at end of file diff --git a/tutorials/helloworld-webpart/README.md b/tutorials/helloworld-webpart/README.md new file mode 100644 index 000000000..10ec0a62a --- /dev/null +++ b/tutorials/helloworld-webpart/README.md @@ -0,0 +1,26 @@ +## helloworld-webpart + +This is where you include your WebPart documentation. + +### Building the code + +```bash +git clone the repo +npm i +npm i -g gulp +gulp +``` + +This package produces the following: + +* lib/* - intermediate-stage commonjs build artifacts +* dist/* - the bundled script, along with other resources +* deploy/* - all resources which should be uploaded to a CDN. + +### Build options + +gulp clean - TODO +gulp test - TODO +gulp serve - TODO +gulp bundle - TODO +gulp package-solution - TODO diff --git a/tutorials/helloworld-webpart/config/config.json b/tutorials/helloworld-webpart/config/config.json new file mode 100644 index 000000000..6e67e9c74 --- /dev/null +++ b/tutorials/helloworld-webpart/config/config.json @@ -0,0 +1,13 @@ +{ + "entries": [ + { + "entry": "./lib/webparts/helloWorld/HelloWorldWebPart.js", + "manifest": "./src/webparts/helloWorld/HelloWorldWebPart.manifest.json", + "outputPath": "./dist/hello-world.bundle.js" + } + ], + "externals": {}, + "localizedResources": { + "helloWorldStrings": "webparts/helloWorld/loc/{locale}.js" + } +} diff --git a/tutorials/helloworld-webpart/config/copy-assets.json b/tutorials/helloworld-webpart/config/copy-assets.json new file mode 100644 index 000000000..6aca63656 --- /dev/null +++ b/tutorials/helloworld-webpart/config/copy-assets.json @@ -0,0 +1,3 @@ +{ + "deployCdnPath": "temp/deploy" +} diff --git a/tutorials/helloworld-webpart/config/deploy-azure-storage.json b/tutorials/helloworld-webpart/config/deploy-azure-storage.json new file mode 100644 index 000000000..94295f751 --- /dev/null +++ b/tutorials/helloworld-webpart/config/deploy-azure-storage.json @@ -0,0 +1,6 @@ +{ + "workingDir": "./temp/deploy/", + "account": "", + "container": "helloworld-webpart", + "accessKey": "" +} \ No newline at end of file diff --git a/tutorials/helloworld-webpart/config/package-solution.json b/tutorials/helloworld-webpart/config/package-solution.json new file mode 100644 index 000000000..07b9b5cc9 --- /dev/null +++ b/tutorials/helloworld-webpart/config/package-solution.json @@ -0,0 +1,10 @@ +{ + "solution": { + "name": "helloworld-webpart-client-side-solution", + "id": "07e47f56-46a7-45ef-927c-210939ed441b", + "version": "1.0.0.0" + }, + "paths": { + "zippedPackage": "solution/helloworld-webpart.sppkg" + } +} diff --git a/tutorials/helloworld-webpart/config/serve.json b/tutorials/helloworld-webpart/config/serve.json new file mode 100644 index 000000000..087899637 --- /dev/null +++ b/tutorials/helloworld-webpart/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/tutorials/helloworld-webpart/config/tslint.json b/tutorials/helloworld-webpart/config/tslint.json new file mode 100644 index 000000000..3c085daaf --- /dev/null +++ b/tutorials/helloworld-webpart/config/tslint.json @@ -0,0 +1,46 @@ +{ + // 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, + "prefer-const": true + } + } +} \ No newline at end of file diff --git a/tutorials/helloworld-webpart/config/write-manifests.json b/tutorials/helloworld-webpart/config/write-manifests.json new file mode 100644 index 000000000..0a4bafb06 --- /dev/null +++ b/tutorials/helloworld-webpart/config/write-manifests.json @@ -0,0 +1,3 @@ +{ + "cdnBasePath": "" +} \ No newline at end of file diff --git a/tutorials/helloworld-webpart/gulpfile.js b/tutorials/helloworld-webpart/gulpfile.js new file mode 100644 index 000000000..7d36ddb1c --- /dev/null +++ b/tutorials/helloworld-webpart/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/tutorials/helloworld-webpart/package.json b/tutorials/helloworld-webpart/package.json new file mode 100644 index 000000000..0ae8294d7 --- /dev/null +++ b/tutorials/helloworld-webpart/package.json @@ -0,0 +1,27 @@ +{ + "name": "helloworld-webpart", + "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" + }, + "devDependencies": { + "@microsoft/sp-build-web": "~1.0.0", + "@microsoft/sp-module-interfaces": "~1.0.0", + "@microsoft/sp-webpart-workbench": "~1.0.0", + "gulp": "~3.9.1", + "@types/chai": ">=3.4.34 <3.6.0", + "@types/mocha": ">=2.2.33 <2.6.0" + }, + "scripts": { + "build": "gulp bundle", + "clean": "gulp clean", + "test": "gulp test" + } +} \ No newline at end of file diff --git a/tutorials/helloworld-webpart/src/webparts/helloWorld/HelloWorld.module.scss b/tutorials/helloworld-webpart/src/webparts/helloWorld/HelloWorld.module.scss new file mode 100644 index 000000000..8f3144d1b --- /dev/null +++ b/tutorials/helloworld-webpart/src/webparts/helloWorld/HelloWorld.module.scss @@ -0,0 +1,52 @@ +.helloWorld { + .container { + max-width: 700px; + margin: 0px auto; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1); + } + + .row { + padding: 20px; + } + + .listItem { + max-width: 715px; + margin: 5px auto 5px auto; + box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1); + } + + .button { + // Our button + text-decoration: none; + height: 32px; + + // Primary Button + min-width: 80px; + background-color: #0078d7; + border-color: #0078d7; + color: #ffffff; + + // Basic Button + outline: transparent; + position: relative; + font-family: "Segoe UI WestEuropean","Segoe UI",-apple-system,BlinkMacSystemFont,Roboto,"Helvetica Neue",sans-serif; + -webkit-font-smoothing: antialiased; + font-size: 14px; + font-weight: 400; + border-width: 0; + text-align: center; + cursor: pointer; + display: inline-block; + padding: 0 16px; + + .label { + font-weight: 600; + font-size: 14px; + height: 32px; + line-height: 32px; + margin: 0 4px; + vertical-align: top; + display: inline-block; + } + } +} \ No newline at end of file diff --git a/tutorials/helloworld-webpart/src/webparts/helloWorld/HelloWorldWebPart.manifest.json b/tutorials/helloworld-webpart/src/webparts/helloWorld/HelloWorldWebPart.manifest.json new file mode 100644 index 000000000..8eb45a1f1 --- /dev/null +++ b/tutorials/helloworld-webpart/src/webparts/helloWorld/HelloWorldWebPart.manifest.json @@ -0,0 +1,24 @@ +{ + "$schema": "../../../node_modules/@microsoft/sp-module-interfaces/lib/manifestSchemas/jsonSchemas/clientSideComponentManifestSchema.json", + + "id": "f170ff98-632b-4fb4-adee-4ab14f430aac", + "alias": "HelloWorldWebPart", + "componentType": "WebPart", + "version": "0.0.1", + "manifestVersion": 2, + + "preconfiguredEntries": [{ + "groupId": "f170ff98-632b-4fb4-adee-4ab14f430aac", + "group": { "default": "Under Development" }, + "title": { "default": "HelloWorld" }, + "description": { "default": "HelloWorld description" }, + "officeFabricIconFontName": "Page", + "properties": { + "description": "HelloWorld", + "test": "Multi-line text field", + "test1": true, + "test2": "2", + "test3": true + } + }] +} diff --git a/tutorials/helloworld-webpart/src/webparts/helloWorld/HelloWorldWebPart.ts b/tutorials/helloworld-webpart/src/webparts/helloWorld/HelloWorldWebPart.ts new file mode 100644 index 000000000..97bfa7345 --- /dev/null +++ b/tutorials/helloworld-webpart/src/webparts/helloWorld/HelloWorldWebPart.ts @@ -0,0 +1,82 @@ +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, + PropertyPaneTextField, + PropertyPaneCheckbox, + PropertyPaneDropdown, + PropertyPaneToggle +} from '@microsoft/sp-webpart-base'; +import { escape } from '@microsoft/sp-lodash-subset'; + +import styles from './HelloWorld.module.scss'; +import * as strings from 'helloWorldStrings'; +import { IHelloWorldWebPartProps } from './IHelloWorldWebPartProps'; + +export default class HelloWorldWebPart extends BaseClientSideWebPart { + + public render(): void { + this.domElement.innerHTML = ` +
+
+
+
+ Welcome to SharePoint! +

Customize SharePoint experiences using Web Parts.

+

${escape(this.properties.description)}

+ + Learn more + +
+
+
+
`; + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + header: { + description: strings.PropertyPaneDescription + }, + groups: [ + { + groupName: strings.BasicGroupName, + groupFields: [ + PropertyPaneTextField('description', { + label: 'Description' + }), + PropertyPaneTextField('test', { + label: 'Multi-line Text Field', + multiline: true + }), + PropertyPaneCheckbox('test1', { + text: 'Checkbox' + }), + PropertyPaneDropdown('test2', { + label: 'Dropdown', + options: [ + { key: '1', text: 'One' }, + { key: '2', text: 'Two' }, + { key: '3', text: 'Three' }, + { key: '4', text: 'Four' } + ] + }), + PropertyPaneToggle('test3', { + label: 'Toggle', + onText: 'On', + offText: 'Off' + }) + ] + } + ] + } + ] + }; + } +} diff --git a/tutorials/helloworld-webpart/src/webparts/helloWorld/IHelloWorldWebPartProps.ts b/tutorials/helloworld-webpart/src/webparts/helloWorld/IHelloWorldWebPartProps.ts new file mode 100644 index 000000000..f432fe573 --- /dev/null +++ b/tutorials/helloworld-webpart/src/webparts/helloWorld/IHelloWorldWebPartProps.ts @@ -0,0 +1,7 @@ +export interface IHelloWorldWebPartProps { + description: string; + test: string; + test1: boolean; + test2: string; + test3: boolean; +} \ No newline at end of file diff --git a/tutorials/helloworld-webpart/src/webparts/helloWorld/loc/en-us.js b/tutorials/helloworld-webpart/src/webparts/helloWorld/loc/en-us.js new file mode 100644 index 000000000..89f98bc1e --- /dev/null +++ b/tutorials/helloworld-webpart/src/webparts/helloWorld/loc/en-us.js @@ -0,0 +1,7 @@ +define([], function() { + return { + "PropertyPaneDescription": "Description", + "BasicGroupName": "Group Name", + "DescriptionFieldLabel": "Description Field" + } +}); \ No newline at end of file diff --git a/tutorials/helloworld-webpart/src/webparts/helloWorld/loc/mystrings.d.ts b/tutorials/helloworld-webpart/src/webparts/helloWorld/loc/mystrings.d.ts new file mode 100644 index 000000000..bb9d32ed5 --- /dev/null +++ b/tutorials/helloworld-webpart/src/webparts/helloWorld/loc/mystrings.d.ts @@ -0,0 +1,10 @@ +declare interface IHelloWorldStrings { + PropertyPaneDescription: string; + BasicGroupName: string; + DescriptionFieldLabel: string; +} + +declare module 'helloWorldStrings' { + const strings: IHelloWorldStrings; + export = strings; +} diff --git a/tutorials/helloworld-webpart/src/webparts/helloWorld/tests/HelloWorld.test.ts b/tutorials/helloworld-webpart/src/webparts/helloWorld/tests/HelloWorld.test.ts new file mode 100644 index 000000000..1937b6928 --- /dev/null +++ b/tutorials/helloworld-webpart/src/webparts/helloWorld/tests/HelloWorld.test.ts @@ -0,0 +1,9 @@ +/// + +import { assert } from 'chai'; + +describe('HelloWorldWebPart', () => { + it('should do something', () => { + assert.ok(true); + }); +}); diff --git a/tutorials/helloworld-webpart/tsconfig.json b/tutorials/helloworld-webpart/tsconfig.json new file mode 100644 index 000000000..0db3331d4 --- /dev/null +++ b/tutorials/helloworld-webpart/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "es5", + "forceConsistentCasingInFileNames": true, + "module": "commonjs", + "jsx": "react", + "declaration": true, + "sourceMap": true, + "types": [ + "es6-promise", + "es6-collections", + "webpack-env" + ], + "noUnusedLocals": true, + "noUnusedParameters": true + } +} diff --git a/tutorials/helloworld-webpart/typings/@ms/odsp.d.ts b/tutorials/helloworld-webpart/typings/@ms/odsp.d.ts new file mode 100644 index 000000000..2d2913e53 --- /dev/null +++ b/tutorials/helloworld-webpart/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/tutorials/helloworld-webpart/typings/tsd.d.ts b/tutorials/helloworld-webpart/typings/tsd.d.ts new file mode 100644 index 000000000..e7efdd728 --- /dev/null +++ b/tutorials/helloworld-webpart/typings/tsd.d.ts @@ -0,0 +1 @@ +/// diff --git a/tutorials/jquery-webpart/.editorconfig b/tutorials/jquery-webpart/.editorconfig new file mode 100644 index 000000000..8ffcdc4ec --- /dev/null +++ b/tutorials/jquery-webpart/.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/tutorials/jquery-webpart/.gitattributes b/tutorials/jquery-webpart/.gitattributes new file mode 100644 index 000000000..212566614 --- /dev/null +++ b/tutorials/jquery-webpart/.gitattributes @@ -0,0 +1 @@ +* text=auto \ No newline at end of file diff --git a/tutorials/jquery-webpart/.gitignore b/tutorials/jquery-webpart/.gitignore new file mode 100644 index 000000000..b19bbe123 --- /dev/null +++ b/tutorials/jquery-webpart/.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/tutorials/jquery-webpart/.npmignore b/tutorials/jquery-webpart/.npmignore new file mode 100644 index 000000000..2c93a9384 --- /dev/null +++ b/tutorials/jquery-webpart/.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/tutorials/jquery-webpart/.vscode/settings.json b/tutorials/jquery-webpart/.vscode/settings.json new file mode 100644 index 000000000..0c4a6693f --- /dev/null +++ b/tutorials/jquery-webpart/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "vsicons.presets.angular": false +} \ No newline at end of file diff --git a/tutorials/jquery-webpart/.yo-rc.json b/tutorials/jquery-webpart/.yo-rc.json new file mode 100644 index 000000000..97a684078 --- /dev/null +++ b/tutorials/jquery-webpart/.yo-rc.json @@ -0,0 +1,8 @@ +{ + "@microsoft/generator-sharepoint": { + "libraryName": "jquery-webpart", + "framework": "none", + "version": "1.0.0", + "libraryId": "ec87e2dd-2df4-46e8-beac-eb8a53f0a85a" + } +} \ No newline at end of file diff --git a/tutorials/jquery-webpart/README.md b/tutorials/jquery-webpart/README.md new file mode 100644 index 000000000..ad2d34294 --- /dev/null +++ b/tutorials/jquery-webpart/README.md @@ -0,0 +1,26 @@ +## jquery-webpart + +This is where you include your WebPart documentation. + +### Building the code + +```bash +git clone the repo +npm i +npm i -g gulp +gulp +``` + +This package produces the following: + +* lib/* - intermediate-stage commonjs build artifacts +* dist/* - the bundled script, along with other resources +* deploy/* - all resources which should be uploaded to a CDN. + +### Build options + +gulp clean - TODO +gulp test - TODO +gulp serve - TODO +gulp bundle - TODO +gulp package-solution - TODO diff --git a/tutorials/jquery-webpart/config/config.json b/tutorials/jquery-webpart/config/config.json new file mode 100644 index 000000000..eddaee0b5 --- /dev/null +++ b/tutorials/jquery-webpart/config/config.json @@ -0,0 +1,16 @@ +{ + "entries": [ + { + "entry": "./lib/webparts/jQuery/JQueryWebPart.js", + "manifest": "./src/webparts/jQuery/JQueryWebPart.manifest.json", + "outputPath": "./dist/j-query.bundle.js" + } + ], + "externals": { + "jquery": "node_modules/jquery/dist/jquery.min.js", + "jqueryui": "node_modules/jqueryui/jquery-ui.min.js" + }, + "localizedResources": { + "jQueryStrings": "webparts/jQuery/loc/{locale}.js" + } +} \ No newline at end of file diff --git a/tutorials/jquery-webpart/config/copy-assets.json b/tutorials/jquery-webpart/config/copy-assets.json new file mode 100644 index 000000000..6aca63656 --- /dev/null +++ b/tutorials/jquery-webpart/config/copy-assets.json @@ -0,0 +1,3 @@ +{ + "deployCdnPath": "temp/deploy" +} diff --git a/tutorials/jquery-webpart/config/deploy-azure-storage.json b/tutorials/jquery-webpart/config/deploy-azure-storage.json new file mode 100644 index 000000000..764fa7799 --- /dev/null +++ b/tutorials/jquery-webpart/config/deploy-azure-storage.json @@ -0,0 +1,6 @@ +{ + "workingDir": "./temp/deploy/", + "account": "", + "container": "jquery-webpart", + "accessKey": "" +} \ No newline at end of file diff --git a/tutorials/jquery-webpart/config/package-solution.json b/tutorials/jquery-webpart/config/package-solution.json new file mode 100644 index 000000000..8d714f870 --- /dev/null +++ b/tutorials/jquery-webpart/config/package-solution.json @@ -0,0 +1,10 @@ +{ + "solution": { + "name": "jquery-webpart-client-side-solution", + "id": "ec87e2dd-2df4-46e8-beac-eb8a53f0a85a", + "version": "1.0.0.0" + }, + "paths": { + "zippedPackage": "solution/jquery-webpart.sppkg" + } +} diff --git a/tutorials/jquery-webpart/config/serve.json b/tutorials/jquery-webpart/config/serve.json new file mode 100644 index 000000000..087899637 --- /dev/null +++ b/tutorials/jquery-webpart/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/tutorials/jquery-webpart/config/tslint.json b/tutorials/jquery-webpart/config/tslint.json new file mode 100644 index 000000000..3c085daaf --- /dev/null +++ b/tutorials/jquery-webpart/config/tslint.json @@ -0,0 +1,46 @@ +{ + // 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, + "prefer-const": true + } + } +} \ No newline at end of file diff --git a/tutorials/jquery-webpart/config/write-manifests.json b/tutorials/jquery-webpart/config/write-manifests.json new file mode 100644 index 000000000..0a4bafb06 --- /dev/null +++ b/tutorials/jquery-webpart/config/write-manifests.json @@ -0,0 +1,3 @@ +{ + "cdnBasePath": "" +} \ No newline at end of file diff --git a/tutorials/jquery-webpart/gulpfile.js b/tutorials/jquery-webpart/gulpfile.js new file mode 100644 index 000000000..7d36ddb1c --- /dev/null +++ b/tutorials/jquery-webpart/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/tutorials/jquery-webpart/package.json b/tutorials/jquery-webpart/package.json new file mode 100644 index 000000000..b26cf9ebb --- /dev/null +++ b/tutorials/jquery-webpart/package.json @@ -0,0 +1,31 @@ +{ + "name": "jquery-webpart", + "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/jquery": "^2.0.40", + "@types/jqueryui": "^1.11.32", + "@types/webpack-env": ">=1.12.1 <1.14.0", + "jquery": "^3.1.1", + "jqueryui": "^1.11.1" + }, + "devDependencies": { + "@microsoft/sp-build-web": "~1.0.0", + "@microsoft/sp-module-interfaces": "~1.0.0", + "@microsoft/sp-webpart-workbench": "~1.0.0", + "gulp": "~3.9.1", + "@types/chai": ">=3.4.34 <3.6.0", + "@types/mocha": ">=2.2.33 <2.6.0" + }, + "scripts": { + "build": "gulp bundle", + "clean": "gulp clean", + "test": "gulp test" + } +} diff --git a/tutorials/jquery-webpart/src/webparts/jQuery/IJQueryWebPartProps.ts b/tutorials/jquery-webpart/src/webparts/jQuery/IJQueryWebPartProps.ts new file mode 100644 index 000000000..b2cacc5f9 --- /dev/null +++ b/tutorials/jquery-webpart/src/webparts/jQuery/IJQueryWebPartProps.ts @@ -0,0 +1,3 @@ +export interface IJQueryWebPartProps { + description: string; +} diff --git a/tutorials/jquery-webpart/src/webparts/jQuery/JQuery.module.scss b/tutorials/jquery-webpart/src/webparts/jQuery/JQuery.module.scss new file mode 100644 index 000000000..8f3144d1b --- /dev/null +++ b/tutorials/jquery-webpart/src/webparts/jQuery/JQuery.module.scss @@ -0,0 +1,52 @@ +.helloWorld { + .container { + max-width: 700px; + margin: 0px auto; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1); + } + + .row { + padding: 20px; + } + + .listItem { + max-width: 715px; + margin: 5px auto 5px auto; + box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1); + } + + .button { + // Our button + text-decoration: none; + height: 32px; + + // Primary Button + min-width: 80px; + background-color: #0078d7; + border-color: #0078d7; + color: #ffffff; + + // Basic Button + outline: transparent; + position: relative; + font-family: "Segoe UI WestEuropean","Segoe UI",-apple-system,BlinkMacSystemFont,Roboto,"Helvetica Neue",sans-serif; + -webkit-font-smoothing: antialiased; + font-size: 14px; + font-weight: 400; + border-width: 0; + text-align: center; + cursor: pointer; + display: inline-block; + padding: 0 16px; + + .label { + font-weight: 600; + font-size: 14px; + height: 32px; + line-height: 32px; + margin: 0 4px; + vertical-align: top; + display: inline-block; + } + } +} \ No newline at end of file diff --git a/tutorials/jquery-webpart/src/webparts/jQuery/JQueryWebPart.manifest.json b/tutorials/jquery-webpart/src/webparts/jQuery/JQueryWebPart.manifest.json new file mode 100644 index 000000000..d6c08d54c --- /dev/null +++ b/tutorials/jquery-webpart/src/webparts/jQuery/JQueryWebPart.manifest.json @@ -0,0 +1,20 @@ +{ + "$schema": "../../../node_modules/@microsoft/sp-module-interfaces/lib/manifestSchemas/jsonSchemas/clientSideComponentManifestSchema.json", + + "id": "96e61911-7af4-45d3-b228-165b9bdb5f69", + "alias": "JQueryWebPart", + "componentType": "WebPart", + "version": "0.0.1", + "manifestVersion": 2, + + "preconfiguredEntries": [{ + "groupId": "96e61911-7af4-45d3-b228-165b9bdb5f69", + "group": { "default": "Under Development" }, + "title": { "default": "jQuery" }, + "description": { "default": "jQuery Web Part" }, + "officeFabricIconFontName": "Page", + "properties": { + "description": "jQuery" + } + }] +} diff --git a/tutorials/jquery-webpart/src/webparts/jQuery/JQueryWebPart.ts b/tutorials/jquery-webpart/src/webparts/jQuery/JQueryWebPart.ts new file mode 100644 index 000000000..5a69fce34 --- /dev/null +++ b/tutorials/jquery-webpart/src/webparts/jQuery/JQueryWebPart.ts @@ -0,0 +1,63 @@ +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, + PropertyPaneTextField +} from '@microsoft/sp-webpart-base'; + +import * as strings from 'jQueryStrings'; +import { IJQueryWebPartProps } from './IJQueryWebPartProps'; +import MyAccordionTemplate from './MyAccordionTemplate'; +import * as jQuery from 'jquery'; +import 'jqueryui'; +import { SPComponentLoader } from '@microsoft/sp-loader'; + +export default class JQueryWebPart extends BaseClientSideWebPart { + + public constructor() { + super(); + + SPComponentLoader.loadCss('//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css'); + } + + public render(): void { + this.domElement.innerHTML = MyAccordionTemplate.templateHtml; + + const accordionOptions: JQueryUI.AccordionOptions = { + animate: true, + collapsible: false, + icons: { + header: 'ui-icon-circle-arrow-e', + activeHeader: 'ui-icon-circle-arrow-s' + } + }; + + jQuery('.accordion', this.domElement).accordion(accordionOptions); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + header: { + description: strings.PropertyPaneDescription + }, + groups: [ + { + groupName: strings.BasicGroupName, + groupFields: [ + PropertyPaneTextField('description', { + label: strings.DescriptionFieldLabel + }) + ] + } + ] + } + ] + }; + } +} diff --git a/tutorials/jquery-webpart/src/webparts/jQuery/MyAccordionTemplate.ts b/tutorials/jquery-webpart/src/webparts/jQuery/MyAccordionTemplate.ts new file mode 100644 index 000000000..bbbac5f11 --- /dev/null +++ b/tutorials/jquery-webpart/src/webparts/jQuery/MyAccordionTemplate.ts @@ -0,0 +1,51 @@ +export default class MyAccordionTemplate { + public static templateHtml: string = ` +
+

Section 1

+
+

+ Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer + ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit + amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut + odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate. +

+
+

Section 2

+
+

+ Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet + purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor + velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In + suscipit faucibus urna. +

+
+

Section 3

+
+

+ Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. + Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero + ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis + lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. +

+
    +
  • List item one
  • +
  • List item two
  • +
  • List item three
  • +
+
+

Section 4

+
+

+ Cras dictum. Pellentesque habitant morbi tristique senectus et netus + et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in + faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia + mauris vel est. +

+

+ Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. + Class aptent taciti sociosqu ad litora torquent per conubia nostra, per + inceptos himenaeos. +

+
+
`; +} \ No newline at end of file diff --git a/tutorials/jquery-webpart/src/webparts/jQuery/loc/en-us.js b/tutorials/jquery-webpart/src/webparts/jQuery/loc/en-us.js new file mode 100644 index 000000000..89f98bc1e --- /dev/null +++ b/tutorials/jquery-webpart/src/webparts/jQuery/loc/en-us.js @@ -0,0 +1,7 @@ +define([], function() { + return { + "PropertyPaneDescription": "Description", + "BasicGroupName": "Group Name", + "DescriptionFieldLabel": "Description Field" + } +}); \ No newline at end of file diff --git a/tutorials/jquery-webpart/src/webparts/jQuery/loc/mystrings.d.ts b/tutorials/jquery-webpart/src/webparts/jQuery/loc/mystrings.d.ts new file mode 100644 index 000000000..1759d4d90 --- /dev/null +++ b/tutorials/jquery-webpart/src/webparts/jQuery/loc/mystrings.d.ts @@ -0,0 +1,10 @@ +declare interface IJQueryStrings { + PropertyPaneDescription: string; + BasicGroupName: string; + DescriptionFieldLabel: string; +} + +declare module 'jQueryStrings' { + const strings: IJQueryStrings; + export = strings; +} diff --git a/tutorials/jquery-webpart/src/webparts/jQuery/tests/JQuery.test.ts b/tutorials/jquery-webpart/src/webparts/jQuery/tests/JQuery.test.ts new file mode 100644 index 000000000..fd373d889 --- /dev/null +++ b/tutorials/jquery-webpart/src/webparts/jQuery/tests/JQuery.test.ts @@ -0,0 +1,9 @@ +/// + +import { assert } from 'chai'; + +describe('JQueryWebPart', () => { + it('should do something', () => { + assert.ok(true); + }); +}); diff --git a/tutorials/jquery-webpart/tsconfig.json b/tutorials/jquery-webpart/tsconfig.json new file mode 100644 index 000000000..0db3331d4 --- /dev/null +++ b/tutorials/jquery-webpart/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "es5", + "forceConsistentCasingInFileNames": true, + "module": "commonjs", + "jsx": "react", + "declaration": true, + "sourceMap": true, + "types": [ + "es6-promise", + "es6-collections", + "webpack-env" + ], + "noUnusedLocals": true, + "noUnusedParameters": true + } +} diff --git a/tutorials/jquery-webpart/typings/@ms/odsp.d.ts b/tutorials/jquery-webpart/typings/@ms/odsp.d.ts new file mode 100644 index 000000000..2d2913e53 --- /dev/null +++ b/tutorials/jquery-webpart/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/tutorials/jquery-webpart/typings/tsd.d.ts b/tutorials/jquery-webpart/typings/tsd.d.ts new file mode 100644 index 000000000..e7efdd728 --- /dev/null +++ b/tutorials/jquery-webpart/typings/tsd.d.ts @@ -0,0 +1 @@ +///