├── Workshops ├── README.md ├── Workshops-2015 │ ├── forum-live │ │ ├── public │ │ │ ├── doncho.minkov │ │ │ ├── templates │ │ │ │ ├── message-add.handlebars │ │ │ │ ├── thread-details.handlebars │ │ │ │ ├── thread-add.handlebars │ │ │ │ ├── threads.handlebars │ │ │ │ └── login.handlebars │ │ │ └── js │ │ │ │ └── templates.js │ │ ├── .bowerrc │ │ ├── package.json │ │ ├── bower.json │ │ └── utils │ │ │ └── user-authentication.js │ ├── shop-app │ │ ├── app │ │ │ ├── templates │ │ │ │ ├── home.handlebars │ │ │ │ ├── login-logout.handlebars │ │ │ │ ├── login-old.handlebars │ │ │ │ ├── login.handlebars │ │ │ │ └── shops.handlebars │ │ │ └── scripts │ │ │ │ ├── converter.js │ │ │ │ ├── notifier.js │ │ │ │ └── templates.js │ │ ├── favicon.ico │ │ ├── package.json │ │ └── bower.json │ └── forum-workshop-template │ │ ├── .bowerrc │ │ ├── public │ │ └── index.html │ │ ├── package.json │ │ ├── bower.json │ │ └── utils │ │ └── user-authentication.js ├── Workshops-2017 │ ├── LiveDemo_2-May-2017_Self_Manager │ │ ├── .jshintrc │ │ ├── public │ │ │ ├── templates │ │ │ │ ├── users.handlebars │ │ │ │ ├── home.handlebars │ │ │ │ ├── todo-add.handlebars │ │ │ │ ├── todos.handlebars │ │ │ │ ├── register.handlebars │ │ │ │ └── events.handlebars │ │ │ ├── controllers │ │ │ │ ├── homeController.js │ │ │ │ ├── notificationsController.js │ │ │ │ └── helpers │ │ │ │ │ └── controller-helpers.js │ │ │ ├── css │ │ │ │ └── main.css │ │ │ └── app │ │ │ │ ├── templates.js │ │ │ │ └── json-requester.js │ │ ├── utils │ │ │ ├── id-generator.js │ │ │ ├── authorized-user.js │ │ │ └── auth-key-generator.js │ │ ├── polyfills │ │ │ └── array.js │ │ ├── package.json │ │ ├── app.js │ │ ├── LICENSE │ │ └── routers │ │ │ └── categoriesRouter.js │ ├── Workshop_25-April-2017_Self_Manager │ │ ├── .jshintrc │ │ ├── .bowerrc │ │ ├── utils │ │ │ ├── id-generator.js │ │ │ ├── authorized-user.js │ │ │ └── auth-key-generator.js │ │ ├── package.json │ │ ├── polyfills │ │ │ └── array.js │ │ ├── app.js │ │ ├── LICENSE │ │ └── routers │ │ │ └── categoriesRouter.js │ └── LiveDemo_20-April-2017_Fortune_Cookies │ │ ├── .jshintrc │ │ ├── public │ │ ├── js │ │ │ ├── controllers │ │ │ │ ├── myCookie.js │ │ │ │ └── home.js │ │ │ ├── templates.js │ │ │ ├── data.js │ │ │ ├── requester.js │ │ │ ├── app.js │ │ │ └── system-config.js │ │ ├── templates │ │ │ ├── auth.handlebars │ │ │ └── home.handlebars │ │ ├── css │ │ │ └── main.css │ │ └── index.html │ │ ├── utils │ │ └── authorize-user.js │ │ ├── controllers │ │ ├── categories-controller.js │ │ └── my-cookies-controller.js │ │ └── package.json └── Workshops-2016 │ ├── 03. Unit-testing │ ├── .bowerrc │ ├── public │ │ ├── js │ │ │ └── templates.js │ │ ├── templates │ │ │ ├── cookie-add.html │ │ │ ├── login.html │ │ │ └── home.html │ │ └── css │ │ │ └── main.css │ ├── utils │ │ └── authorize-user.js │ ├── controllers │ │ ├── categories-controller.js │ │ └── my-cookies-controller.js │ ├── bower.json │ └── package.json │ ├── 02. Creating-SPA-apps │ ├── .bowerrc │ ├── public │ │ ├── js │ │ │ └── templates.js │ │ ├── templates │ │ │ ├── cookie-add.html │ │ │ ├── login.html │ │ │ └── home.html │ │ └── css │ │ │ └── main.css │ ├── utils │ │ └── authorize-user.js │ ├── controllers │ │ ├── categories-controller.js │ │ └── my-cookies-controller.js │ ├── bower.json │ └── package.json │ └── 01. HTTP & AJAX Workshop - Forum │ ├── .bowerrc │ ├── bower.json │ ├── package.json │ └── utils │ └── user-authentication.js ├── Sample Exams ├── README.md ├── self manager │ ├── .jshintrc │ ├── .bowerrc │ ├── public │ │ ├── templates │ │ │ ├── users.handlebars │ │ │ ├── home.handlebars │ │ │ ├── todo-add.handlebars │ │ │ ├── todos.handlebars │ │ │ ├── register.handlebars │ │ │ ├── events.handlebars │ │ │ └── event-add.handlebars │ │ ├── controllers │ │ │ ├── homeController.js │ │ │ ├── notificationsController.js │ │ │ ├── helpers │ │ │ │ └── controller-helpers.js │ │ │ └── usersController.js │ │ ├── css │ │ │ └── main.css │ │ └── app │ │ │ ├── templates.js │ │ │ └── json-requester.js │ ├── utils │ │ ├── id-generator.js │ │ ├── authorized-user.js │ │ └── auth-key-generator.js │ ├── package.json │ ├── polyfills │ │ └── array.js │ ├── bower.json │ ├── app.js │ ├── LICENSE │ └── routers │ │ └── categoriesRouter.js ├── Exam 2015 - Fortune Cookies │ ├── .jshintrc │ ├── solution-doncho │ │ ├── categories │ │ ├── .bowerrc │ │ ├── utils │ │ │ └── authorize-user.js │ │ ├── public │ │ │ ├── templates │ │ │ │ ├── home.handlebars │ │ │ │ ├── register.handlebars │ │ │ │ ├── cookie-add.handlebars │ │ │ │ └── my-cookie.handlebars │ │ │ ├── js │ │ │ │ ├── app │ │ │ │ │ ├── polyfills │ │ │ │ │ │ └── array.js │ │ │ │ │ ├── templates.js │ │ │ │ │ ├── json-requester.js │ │ │ │ │ └── validator.js │ │ │ │ └── controllers │ │ │ │ │ ├── users.js │ │ │ │ │ └── helpers │ │ │ │ │ └── controller-helpers.js │ │ │ └── css │ │ │ │ └── main.css │ │ ├── controllers │ │ │ ├── categories-controller.js │ │ │ └── my-cookies-controller.js │ │ ├── package.json │ │ └── bower.json │ └── template │ │ ├── utils │ │ └── authorize-user.js │ │ ├── bower.json │ │ ├── controllers │ │ ├── categories-controller.js │ │ └── my-cookies-controller.js │ │ └── package.json └── Exam 2014 - Crowd Share │ ├── crowd-share-rest-api │ ├── public │ │ ├── css │ │ │ └── site.css │ │ ├── js │ │ │ ├── notifier.js │ │ │ ├── validator.js │ │ │ ├── templates.js │ │ │ ├── templates │ │ │ │ ├── login.handlebars │ │ │ │ ├── register.handlebars │ │ │ │ └── posts.handlebars │ │ │ ├── app.js │ │ │ └── cookie.js │ │ ├── package.json │ │ └── bower.json │ ├── start-server.txt │ ├── .npmignore │ ├── package.json │ ├── app.js │ ├── config │ │ ├── routes.js │ │ └── config.js │ └── app │ │ └── data │ │ └── data.js │ ├── Crowd-Share-Services.docx │ ├── Crowd-Share-Services.md │ └── Crowd-Share-Description.docx ├── Additional-Resources └── README.md ├── Topics ├── 07. Web Storages │ ├── homework │ │ └── README.md │ ├── imgs │ │ └── cookie-monster.png │ └── demos │ │ ├── scripts │ │ └── web-storage-objects.js │ │ ├── 4. web-storages-save-objects.html │ │ ├── 1. cookies.html │ │ └── 3. session-storage.html ├── 06. Handlebars │ ├── demos │ │ └── simple-SPA │ │ │ ├── .bowerrc │ │ │ ├── public │ │ │ ├── templates │ │ │ │ ├── alert.handlebars │ │ │ │ ├── gallery.handlebars │ │ │ │ └── threads.handlebars │ │ │ ├── package.json │ │ │ └── scripts │ │ │ │ ├── system-config.js │ │ │ │ └── template-loader.js │ │ │ ├── bower.json │ │ │ ├── package.json │ │ │ └── utils │ │ │ └── user-authentication.js │ └── homework │ │ └── README.md ├── 04. Module loaders │ ├── demos │ │ ├── live-demo │ │ │ ├── app │ │ │ │ └── main.js │ │ │ ├── package.json │ │ │ └── index.html │ │ ├── 2. loopgifs-demo │ │ │ ├── lib │ │ │ │ ├── display-gifs.js │ │ │ │ ├── main.js │ │ │ │ ├── extract-gifs.js │ │ │ │ └── reddit-api.js │ │ │ ├── package.json │ │ │ └── index.html │ │ ├── 1. markdown-component │ │ │ ├── app │ │ │ │ └── app.js │ │ │ ├── package.json │ │ │ └── index.html │ │ ├── 4. persons │ │ │ ├── app-modules │ │ │ │ ├── seed-data.js │ │ │ │ ├── utils.js │ │ │ │ ├── data.js │ │ │ │ ├── person-component.js │ │ │ │ └── main.js │ │ │ ├── package.json │ │ │ ├── bower.json │ │ │ └── index.html │ │ ├── 3. live-demo │ │ │ ├── config.js │ │ │ ├── app │ │ │ │ ├── storage.js │ │ │ │ └── db.js │ │ │ ├── package.json │ │ │ ├── index.html │ │ │ ├── bower.json │ │ │ └── README.md │ │ └── cheat-sheet.txt │ └── imgs │ │ └── AMD.png ├── 08. Unit Testing Basics │ ├── demos │ │ ├── live-demo-28-september │ │ │ ├── demo.js │ │ │ ├── package.json │ │ │ ├── index.html │ │ │ └── cart.js │ │ ├── html-reporter │ │ │ ├── sum.js │ │ │ ├── bower.json │ │ │ ├── index.html │ │ │ └── package.json │ │ ├── live-demo │ │ │ ├── app │ │ │ │ └── app.js │ │ │ ├── package.json │ │ │ ├── bower.json │ │ │ └── index.html │ │ └── other-reporters │ │ │ ├── app │ │ │ └── app.js │ │ │ ├── package.json │ │ │ ├── tests │ │ │ └── tests-sum.js │ │ │ └── results.html │ ├── open.js │ └── package.json ├── 03. Consuming Web Services │ └── demos │ │ ├── data.json │ │ ├── partials │ │ └── details.html │ │ ├── server │ │ ├── package.json │ │ ├── tools │ │ │ ├── id-generator.js │ │ │ └── validator.js │ │ └── app.js │ │ ├── 1. using-xhr-object.html │ │ ├── bower.json │ │ ├── 5. http-requst-method.html │ │ ├── 2. using-xhr-ready-states.html │ │ ├── 8. jquery-load.html │ │ ├── README.md │ │ ├── package.json │ │ ├── 3. http-status-codes.html │ │ ├── 4. http-response.html │ │ └── 6. jquery-ajax.html ├── 02. HTTP and AJAX │ ├── imgs │ │ ├── rss.png │ │ ├── xml.png │ │ ├── json.png │ │ ├── client.png │ │ ├── server.png │ │ ├── arrow-left.png │ │ ├── arrow-right.png │ │ └── origin-policy.png │ └── slides │ │ ├── demo.rar │ │ ├── imgs │ │ ├── rss.png │ │ ├── xml.png │ │ ├── client.png │ │ ├── json.png │ │ ├── server.png │ │ ├── arrow-left.png │ │ ├── arrow-right.png │ │ └── origin-policy.png │ │ ├── lib │ │ ├── font │ │ │ ├── league-gothic │ │ │ │ ├── LICENSE │ │ │ │ ├── league-gothic.eot │ │ │ │ ├── league-gothic.ttf │ │ │ │ ├── league-gothic.woff │ │ │ │ └── league-gothic.css │ │ │ └── source-sans-pro │ │ │ │ ├── source-sans-pro-italic.eot │ │ │ │ ├── source-sans-pro-italic.ttf │ │ │ │ ├── source-sans-pro-italic.woff │ │ │ │ ├── source-sans-pro-regular.eot │ │ │ │ ├── source-sans-pro-regular.ttf │ │ │ │ ├── source-sans-pro-regular.woff │ │ │ │ ├── source-sans-pro-semibold.eot │ │ │ │ ├── source-sans-pro-semibold.ttf │ │ │ │ ├── source-sans-pro-semibold.woff │ │ │ │ ├── source-sans-pro-semibolditalic.eot │ │ │ │ ├── source-sans-pro-semibolditalic.ttf │ │ │ │ └── source-sans-pro-semibolditalic.woff │ │ └── js │ │ │ └── html5shiv.js │ │ ├── css │ │ └── imgs │ │ │ ├── logo.png │ │ │ └── dark-bg.png │ │ ├── plugin │ │ ├── markdown │ │ │ └── example.md │ │ └── multiplex │ │ │ └── client.js │ │ └── demo │ │ ├── word │ │ ├── webSettings.xml │ │ ├── _rels │ │ │ └── document.xml.rels │ │ └── fontTable.xml │ │ ├── _rels │ │ └── .rels │ │ ├── docProps │ │ ├── app.xml │ │ └── core.xml │ │ └── [Content_Types].xml ├── 00. Course Introduction │ └── imgs │ │ ├── pic24.png │ │ ├── pic25.png │ │ ├── pic35.png │ │ ├── pic36.png │ │ ├── pic37.png │ │ ├── pic38.png │ │ ├── pic39.png │ │ ├── pic40.png │ │ ├── pic41.png │ │ └── pic42.png ├── 01. Promises and asynchronous programming │ ├── imgs │ │ ├── pyr-1.png │ │ ├── why-so-asynchronous.jpg │ │ ├── i_eat_ajax_for_breakfast.jpg │ │ └── javascript-promises-2-638.jpg │ ├── demos │ │ ├── 3. function-generators │ │ │ ├── 3.1. function-generators.js │ │ │ └── 3.2. advanced-function-generators.js │ │ ├── 2. promises │ │ │ ├── 2.7. geolocation-promises.html │ │ │ ├── 2.6. primes-promises.html │ │ │ ├── 2.1. promise-creation.js │ │ │ ├── 2.3. promise-composition.js │ │ │ ├── 2.4. promise-all.js │ │ │ ├── 2.5. promise-race.js │ │ │ └── 2.2. promise-chaining.js │ │ ├── 1. callbacks │ │ │ ├── 1.4. geolocation-heavy-callbacks.html │ │ │ ├── 1.3. primes-callbacks.html │ │ │ └── 1.1. simple-callback.html │ │ └── 4. async operations │ │ │ └── 4.1. async-operations.js │ └── homework │ │ └── README.md ├── 09. Unit testing - Spies and Mocks with Sinon │ └── demos │ │ ├── spies │ │ ├── package.json │ │ └── test.js │ │ └── live-demo │ │ ├── package.json │ │ ├── mocks.js │ │ ├── spies.js │ │ └── stubs.js └── 05. Routing │ └── demos │ ├── sample-routes │ ├── js │ │ ├── system-config.js │ │ └── main.js │ ├── package.json │ └── index.html │ └── getting-query-params │ ├── js │ ├── system-config.js │ └── main.js │ ├── package.json │ └── index.html └── LICENSE /Workshops/README.md: -------------------------------------------------------------------------------- 1 | # Workshops -------------------------------------------------------------------------------- /Sample Exams/README.md: -------------------------------------------------------------------------------- 1 | # Sample Exams -------------------------------------------------------------------------------- /Additional-Resources/README.md: -------------------------------------------------------------------------------- 1 | # Additional Resources 2 | -------------------------------------------------------------------------------- /Sample Exams/self manager/.jshintrc: -------------------------------------------------------------------------------- 1 | {"esnext":true} 2 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/forum-live/public/doncho.minkov: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/.jshintrc: -------------------------------------------------------------------------------- 1 | {"esnext": true} 2 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/solution-doncho/categories: -------------------------------------------------------------------------------- 1 | [null] -------------------------------------------------------------------------------- /Topics/07. Web Storages/homework/README.md: -------------------------------------------------------------------------------- 1 | # Web Storages homework 2 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/public/css/site.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Sample Exams/self manager/.bowerrc: -------------------------------------------------------------------------------- 1 | {"directory": "public/bower_components"} 2 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/shop-app/app/templates/home.handlebars: -------------------------------------------------------------------------------- 1 |

Im Home!

-------------------------------------------------------------------------------- /Workshops/Workshops-2015/forum-live/.bowerrc: -------------------------------------------------------------------------------- 1 | {"directory":"public/bower_components"} 2 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/.jshintrc: -------------------------------------------------------------------------------- 1 | {"esnext":true} 2 | -------------------------------------------------------------------------------- /Topics/06. Handlebars/demos/simple-SPA/.bowerrc: -------------------------------------------------------------------------------- 1 | {"directory":"public/bower_components"} 2 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/Workshop_25-April-2017_Self_Manager/.jshintrc: -------------------------------------------------------------------------------- 1 | {"esnext":true} 2 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/live-demo/app/main.js: -------------------------------------------------------------------------------- 1 | import 'github:guybedford/markdown-component' -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_20-April-2017_Fortune_Cookies/.jshintrc: -------------------------------------------------------------------------------- 1 | {"esnext": true} 2 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/start-server.txt: -------------------------------------------------------------------------------- 1 | npm install 2 | node app.js -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/demos/live-demo-28-september/demo.js: -------------------------------------------------------------------------------- 1 | let mocha = require('mocha'); 2 | -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/open.js: -------------------------------------------------------------------------------- 1 | require("openurl").open("http://localhost:8010/index.html"); 2 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/forum-workshop-template/.bowerrc: -------------------------------------------------------------------------------- 1 | {"directory":"public/bower_components"} 2 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/03. Unit-testing/.bowerrc: -------------------------------------------------------------------------------- 1 | {"directory": "public/bower_components"} 2 | 3 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/02. Creating-SPA-apps/.bowerrc: -------------------------------------------------------------------------------- 1 | {"directory": "public/bower_components"} 2 | 3 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/solution-doncho/.bowerrc: -------------------------------------------------------------------------------- 1 | {"directory": "public/bower_components"} 2 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/01. HTTP & AJAX Workshop - Forum/.bowerrc: -------------------------------------------------------------------------------- 1 | {"directory":"public/bower_components"} 2 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/Workshop_25-April-2017_Self_Manager/.bowerrc: -------------------------------------------------------------------------------- 1 | {"directory": "public/bower_components"} 2 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/.npmignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | public/components 3 | .sass-cache -------------------------------------------------------------------------------- /Topics/03. Consuming Web Services/demos/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "John Doe", 3 | "age": 23, 4 | "isCool": true 5 | } 6 | -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/imgs/rss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/imgs/rss.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/imgs/xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/imgs/xml.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/imgs/json.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/imgs/json.png -------------------------------------------------------------------------------- /Topics/04. Module loaders/imgs/AMD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/04. Module loaders/imgs/AMD.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/imgs/client.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/imgs/client.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/imgs/server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/imgs/server.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/demo.rar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/demo.rar -------------------------------------------------------------------------------- /Topics/06. Handlebars/demos/simple-SPA/public/templates/alert.handlebars: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/imgs/arrow-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/imgs/arrow-left.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/imgs/rss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/imgs/rss.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/imgs/xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/imgs/xml.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/league-gothic/LICENSE: -------------------------------------------------------------------------------- 1 | SIL Open Font License (OFL) 2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL 3 | -------------------------------------------------------------------------------- /Topics/00. Course Introduction/imgs/pic24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/00. Course Introduction/imgs/pic24.png -------------------------------------------------------------------------------- /Topics/00. Course Introduction/imgs/pic25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/00. Course Introduction/imgs/pic25.png -------------------------------------------------------------------------------- /Topics/00. Course Introduction/imgs/pic35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/00. Course Introduction/imgs/pic35.png -------------------------------------------------------------------------------- /Topics/00. Course Introduction/imgs/pic36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/00. Course Introduction/imgs/pic36.png -------------------------------------------------------------------------------- /Topics/00. Course Introduction/imgs/pic37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/00. Course Introduction/imgs/pic37.png -------------------------------------------------------------------------------- /Topics/00. Course Introduction/imgs/pic38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/00. Course Introduction/imgs/pic38.png -------------------------------------------------------------------------------- /Topics/00. Course Introduction/imgs/pic39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/00. Course Introduction/imgs/pic39.png -------------------------------------------------------------------------------- /Topics/00. Course Introduction/imgs/pic40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/00. Course Introduction/imgs/pic40.png -------------------------------------------------------------------------------- /Topics/00. Course Introduction/imgs/pic41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/00. Course Introduction/imgs/pic41.png -------------------------------------------------------------------------------- /Topics/00. Course Introduction/imgs/pic42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/00. Course Introduction/imgs/pic42.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/imgs/arrow-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/imgs/arrow-right.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/imgs/origin-policy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/imgs/origin-policy.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/imgs/client.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/imgs/client.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/imgs/json.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/imgs/json.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/imgs/server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/imgs/server.png -------------------------------------------------------------------------------- /Topics/07. Web Storages/imgs/cookie-monster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/07. Web Storages/imgs/cookie-monster.png -------------------------------------------------------------------------------- /Workshops/Workshops-2015/shop-app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Workshops/Workshops-2015/shop-app/favicon.ico -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/css/imgs/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/css/imgs/logo.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/css/imgs/dark-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/css/imgs/dark-bg.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/imgs/arrow-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/imgs/arrow-left.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/imgs/arrow-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/imgs/arrow-right.png -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/imgs/origin-policy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/imgs/origin-policy.png -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/Crowd-Share-Services.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Sample Exams/Exam 2014 - Crowd Share/Crowd-Share-Services.docx -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/Crowd-Share-Services.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Sample Exams/Exam 2014 - Crowd Share/Crowd-Share-Services.md -------------------------------------------------------------------------------- /Sample Exams/self manager/public/templates/users.handlebars: -------------------------------------------------------------------------------- 1 |

Users

2 | 8 | -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/imgs/pyr-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/01. Promises and asynchronous programming/imgs/pyr-1.png -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/Crowd-Share-Description.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Sample Exams/Exam 2014 - Crowd Share/Crowd-Share-Description.docx -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/league-gothic/league-gothic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/lib/font/league-gothic/league-gothic.eot -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/league-gothic/league-gothic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/lib/font/league-gothic/league-gothic.ttf -------------------------------------------------------------------------------- /Workshops/Workshops-2016/03. Unit-testing/public/js/templates.js: -------------------------------------------------------------------------------- 1 | let templates = { 2 | get: function(name) { 3 | let url = `/templates/${name}.html`; 4 | return requester.get(url); 5 | } 6 | }; -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_20-April-2017_Fortune_Cookies/public/js/controllers/myCookie.js: -------------------------------------------------------------------------------- 1 | import * as data from 'data'; 2 | 3 | export function get() { 4 | return data.getMyCookie('api/my-cookie'); 5 | } 6 | -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/league-gothic/league-gothic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/lib/font/league-gothic/league-gothic.woff -------------------------------------------------------------------------------- /Workshops/Workshops-2016/02. Creating-SPA-apps/public/js/templates.js: -------------------------------------------------------------------------------- 1 | let templates = { 2 | get: function(name) { 3 | let url = `/templates/${name}.html`; 4 | return requester.get(url); 5 | } 6 | }; -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/imgs/why-so-asynchronous.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/01. Promises and asynchronous programming/imgs/why-so-asynchronous.jpg -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/2. loopgifs-demo/lib/display-gifs.js: -------------------------------------------------------------------------------- 1 | export default (urls) => { 2 | var elem = document.querySelector('#gifs'); 3 | elem.innerHTML = urls.map(url => ``).join('\n') 4 | } -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/imgs/i_eat_ajax_for_breakfast.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/01. Promises and asynchronous programming/imgs/i_eat_ajax_for_breakfast.jpg -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/public/templates/users.handlebars: -------------------------------------------------------------------------------- 1 |

Users

2 | 8 | -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/imgs/javascript-promises-2-638.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/01. Promises and asynchronous programming/imgs/javascript-promises-2-638.jpg -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-italic.eot -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-italic.ttf -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-italic.woff -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-regular.eot -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-regular.ttf -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/1. markdown-component/app/app.js: -------------------------------------------------------------------------------- 1 | window.define = System.amdDefine; 2 | window.require = window.requirejs = System.amdRequire; 3 | 4 | import 'github:guybedford/markdown-component@0.1.0' 5 | import 'bootstrap' -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-regular.woff -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-semibold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-semibold.eot -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-semibold.ttf -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-semibold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-semibold.woff -------------------------------------------------------------------------------- /Workshops/Workshops-2016/03. Unit-testing/public/templates/cookie-add.html: -------------------------------------------------------------------------------- 1 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/demos/html-reporter/sum.js: -------------------------------------------------------------------------------- 1 | function sum(...numbers) { 2 | if (Array.isArray(numbers[0])) { 3 | numbers = numbers[0]; 4 | } 5 | return numbers.reduce(function(s, number) { 6 | return s + number; 7 | }, 0); 8 | } 9 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/02. Creating-SPA-apps/public/templates/cookie-add.html: -------------------------------------------------------------------------------- 1 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelerikAcademy/JavaScript-Applications/HEAD/Topics/02. HTTP and AJAX/slides/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/2. loopgifs-demo/lib/main.js: -------------------------------------------------------------------------------- 1 | import RedditApi from './reddit-api' 2 | import ExtractGifs from './extract-gifs' 3 | import DisplayGifs from './display-gifs' 4 | 5 | RedditApi.load() 6 | .then(ExtractGifs) 7 | .then(DisplayGifs) -------------------------------------------------------------------------------- /Sample Exams/self manager/utils/id-generator.js: -------------------------------------------------------------------------------- 1 | module.exports = function() { 2 | var diviser = 1000003; 3 | return (function() { 4 | return { 5 | next: function() { 6 | return (new Date()) % diviser; 7 | } 8 | }; 9 | }()); 10 | }; 11 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/public/js/notifier.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | export default { 4 | success: function(msg) { 5 | alert(msg); 6 | }, 7 | error: function(err) { 8 | alert('Error'); 9 | console.error(err); 10 | } 11 | } -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/4. persons/app-modules/seed-data.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import * as db from 'data'; 4 | 5 | export function seed() { 6 | db.add({ name: 'Pesho', age: 15 }); 7 | db.add({ name: 'Mariya', age: 33 }); 8 | db.add({ name: 'Gosho', age: 38 }); 9 | }; -------------------------------------------------------------------------------- /Workshops/Workshops-2015/forum-workshop-template/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Workshop: Simple Forum with Sammy.js, jQuery and Handlebars 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/forum-live/public/templates/message-add.handlebars: -------------------------------------------------------------------------------- 1 |

New Message

2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_20-April-2017_Fortune_Cookies/public/templates/auth.handlebars: -------------------------------------------------------------------------------- 1 | 2 | 3 | Log in 4 | Register 5 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_20-April-2017_Fortune_Cookies/public/templates/home.handlebars: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/2. loopgifs-demo/lib/extract-gifs.js: -------------------------------------------------------------------------------- 1 | export default (posts) => { 2 | return posts 3 | .filter(post => !post.data.over_18) 4 | .map(post => post.data.url) 5 | .filter(url => /gifv?$/.exec(url)) 6 | .map(url => url.replace(/v$/, '')) 7 | } -------------------------------------------------------------------------------- /Workshops/Workshops-2015/forum-live/public/templates/thread-details.handlebars: -------------------------------------------------------------------------------- 1 |

{{title}}

2 | Add new message 3 | {{#messages}} 4 |

{{text}}

5 | by {{user.username}} 6 | {{/messages}} 7 | -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/js/html5shiv.js: -------------------------------------------------------------------------------- 1 | document.createElement('header'); 2 | document.createElement('nav'); 3 | document.createElement('section'); 4 | document.createElement('article'); 5 | document.createElement('aside'); 6 | document.createElement('footer'); 7 | document.createElement('hgroup'); -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/3. live-demo/config.js: -------------------------------------------------------------------------------- 1 | System.config({ 2 | transpiler: "babel", 3 | babelOptions: { 4 | optional: [ 5 | "runtime" 6 | ] 7 | }, 8 | map: { 9 | babel: 'node_modules/babel-core/browser.js', 10 | jquery: 'bower_components/jquery/dist/jquery.js' 11 | } 12 | }); -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/utils/id-generator.js: -------------------------------------------------------------------------------- 1 | module.exports = function() { 2 | var diviser = 1000003; 3 | return (function() { 4 | return { 5 | next: function() { 6 | return (new Date()) % diviser; 7 | } 8 | }; 9 | }()); 10 | }; 11 | -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/demos/live-demo/app/app.js: -------------------------------------------------------------------------------- 1 | function sum(numArr) { 2 | if (!numArr) { 3 | throw Error(); 4 | } 5 | 6 | var result = 0; 7 | result = numArr.reduce(function(sum, num) { 8 | return sum + num; 9 | }, 0); 10 | 11 | return result; 12 | } 13 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/Workshop_25-April-2017_Self_Manager/utils/id-generator.js: -------------------------------------------------------------------------------- 1 | module.exports = function() { 2 | var diviser = 1000003; 3 | return (function() { 4 | return { 5 | next: function() { 6 | return (new Date()) % diviser; 7 | } 8 | }; 9 | }()); 10 | }; 11 | -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/demos/other-reporters/app/app.js: -------------------------------------------------------------------------------- 1 | function sum(numbers) { 2 | // if (!(Array.isArray(numbers))) { 3 | // numbers = [].slice.call(arguments, 0); 4 | // } 5 | return numbers.reduce(function(s, n) { 6 | return s + n; 7 | }, 0); 8 | } 9 | 10 | module.exports = sum; 11 | -------------------------------------------------------------------------------- /Topics/03. Consuming Web Services/demos/partials/details.html: -------------------------------------------------------------------------------- 1 |

Hi, I am Partial!

2 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laboriosam ipsa ut, vel perferendis perspiciatis. Praesentium, sit culpa nostrum recusandae, sequi hic. Possimus veritatis provident sequi dolore porro illum, labore eius! 3 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "crowd-share", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "start": "node app.js" 7 | }, 8 | "dependencies": { 9 | "express": "~3.3.4" 10 | }, 11 | "devDependencies": { 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/template/utils/authorize-user.js: -------------------------------------------------------------------------------- 1 | module.exports = function(app, db) { 2 | app.use('/api', function(req, res, next) { 3 | var authKey = req.headers['x-auth-key']; 4 | req.user = db('users').find({ 5 | authKey: authKey 6 | }); 7 | next(); 8 | }); 9 | }; 10 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/solution-doncho/utils/authorize-user.js: -------------------------------------------------------------------------------- 1 | module.exports = function(app, db) { 2 | app.use('/api', function(req, res, next) { 3 | var authKey = req.headers['x-auth-key']; 4 | req.user = db('users').find({ 5 | authKey: authKey 6 | }); 7 | next(); 8 | }); 9 | }; 10 | -------------------------------------------------------------------------------- /Sample Exams/self manager/public/controllers/homeController.js: -------------------------------------------------------------------------------- 1 | var homeController = function() { 2 | 3 | function all(context) { 4 | templates.get('home') 5 | .then(function(template) { 6 | context.$element().html(template()); 7 | }); 8 | } 9 | 10 | return { 11 | all: all 12 | }; 13 | }(); 14 | -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/demos/3. function-generators/3.1. function-generators.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | function* idMaker(){ 3 | var index = 0; 4 | while(true) 5 | yield index++; 6 | } 7 | 8 | var gen = idMaker(); 9 | console.log(gen.next().value); // 0 10 | }()); 11 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_20-April-2017_Fortune_Cookies/public/css/main.css: -------------------------------------------------------------------------------- 1 | .list-cookie img { 2 | width: 100px; 3 | } 4 | 5 | .hidden { 6 | display: none; 7 | } 8 | 9 | header .btn { 10 | float: right; 11 | } 12 | 13 | header { 14 | padding: 10px; 15 | } 16 | 17 | .nav li { 18 | diplay: inline; 19 | } 20 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/shop-app/app/scripts/converter.js: -------------------------------------------------------------------------------- 1 | export default { 2 | dbShopToShopVM: function(dbShop){ 3 | var owner = dbShop.get('owner'); 4 | return { 5 | id: dbShop.id, 6 | name: dbShop.get('name'), 7 | ownerId: owner ? owner.id : null 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_20-April-2017_Fortune_Cookies/utils/authorize-user.js: -------------------------------------------------------------------------------- 1 | module.exports = function(app, db) { 2 | app.use('/api', function(req, res, next) { 3 | var authKey = req.headers['x-auth-key']; 4 | req.user = db('users').find({ 5 | authKey: authKey 6 | }); 7 | next(); 8 | }); 9 | }; 10 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/shop-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "shop-app", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "babel-core": "^5.8.23" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/public/controllers/homeController.js: -------------------------------------------------------------------------------- 1 | var homeController = function() { 2 | 3 | function all(context) { 4 | templates.get('home') 5 | .then(function(template) { 6 | context.$element().html(template()); 7 | }); 8 | } 9 | 10 | return { 11 | all: all 12 | }; 13 | }(); 14 | -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/demos/live-demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "live-demo", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "sinon": "^1.16.1" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Sample Exams/self manager/utils/authorized-user.js: -------------------------------------------------------------------------------- 1 | const AUTH_KEY_HEADER_NAME = 'x-auth-key'; 2 | module.exports = function(app, db) { 3 | app.use(function(req, res, next) { 4 | var authKey = req.headers[AUTH_KEY_HEADER_NAME]; 5 | var user = db('users').find({ 6 | authKey: authKey 7 | }); 8 | req.user = user || null; 9 | next(); 10 | }); 11 | }; 12 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/shop-app/app/templates/login-logout.handlebars: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/03. Unit-testing/utils/authorize-user.js: -------------------------------------------------------------------------------- 1 | /* globals module */ 2 | "use strict"; 3 | 4 | module.exports = function(app, db) { 5 | app.use("/api", function(req, res, next) { 6 | var authKey = req.headers["x-auth-key"]; 7 | req.user = db("users").find({ 8 | authKey: authKey 9 | }); 10 | next(); 11 | }); 12 | }; -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/public/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "public", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "babel-core": "^5.8.23" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/demos/2. promises/2.7. geolocation-promises.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 |
9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/02. Creating-SPA-apps/utils/authorize-user.js: -------------------------------------------------------------------------------- 1 | /* globals module */ 2 | "use strict"; 3 | 4 | module.exports = function(app, db) { 5 | app.use("/api", function(req, res, next) { 6 | var authKey = req.headers["x-auth-key"]; 7 | req.user = db("users").find({ 8 | authKey: authKey 9 | }); 10 | next(); 11 | }); 12 | }; -------------------------------------------------------------------------------- /Topics/09. Unit testing - Spies and Mocks with Sinon/demos/spies/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "spies", 3 | "version": "1.0.0", 4 | "description": "Sinon spies", 5 | "main": "test.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "sinon": "^1.17.6" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/forum-live/public/templates/thread-add.handlebars: -------------------------------------------------------------------------------- 1 |
2 | Add Thread 3 |
4 | 7 |
8 | 9 |
10 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/shop-app/app/scripts/notifier.js: -------------------------------------------------------------------------------- 1 | export default { 2 | success: function(msg) { 3 | document.location.reload(true); 4 | alert(msg); 5 | // TODO: popup success 6 | }, 7 | error: function(msg) { 8 | alert('An error occurred. Check the console for details'); 9 | console.log(msg); 10 | // TODO: popup error 11 | } 12 | } -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/demos/1. callbacks/1.4. geolocation-heavy-callbacks.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 |
9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/demos/4. async operations/4.1. async-operations.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | function* powGenerator() { 3 | var result = Math.pow(yield "a", yield "b"); 4 | return result; 5 | } 6 | 7 | var g = powGenerator(); 8 | console.log(g.next().value); 9 | console.log(g.next(10).value); 10 | console.log(g.next(2).value); 11 | }()); 12 | -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/demos/live-demo-28-september/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "live-demo-28-september", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "mocha -R spec ./tests.js" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "chai": "^3.5.0", 13 | "mocha": "^3.1.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/template/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Forture-Cookies-Sep-2015", 3 | "version": "0.0.0", 4 | "authors": [ 5 | "DonchoMinkov " 6 | ], 7 | "license": "MIT", 8 | "ignore": [ 9 | "**/.*", 10 | "node_modules", 11 | "bower_components", 12 | "public/bower_components", 13 | "test", 14 | "tests" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /Sample Exams/self manager/public/templates/home.handlebars: -------------------------------------------------------------------------------- 1 |

Welcome to the

2 | Self manager 3 | 4 |

This is yet another web app for time management

5 |

Why is this app useless?

6 | 11 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/utils/authorized-user.js: -------------------------------------------------------------------------------- 1 | const AUTH_KEY_HEADER_NAME = 'x-auth-key'; 2 | module.exports = function(app, db) { 3 | app.use(function(req, res, next) { 4 | var authKey = req.headers[AUTH_KEY_HEADER_NAME]; 5 | var user = db('users').find({ 6 | authKey: authKey 7 | }); 8 | req.user = user || null; 9 | next(); 10 | }); 11 | }; 12 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/public/js/validator.js: -------------------------------------------------------------------------------- 1 | export default { 2 | lenght: function (text, min, max){ 3 | return new Promise(function(resolve, reject) { 4 | if (text.length >= min && text.length <= max) { 5 | resolve('OK'); 6 | } else { 7 | reject('Text too long'); 8 | } 9 | }); 10 | } 11 | } -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/lib/font/league-gothic/league-gothic.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'League Gothic'; 3 | src: url('league-gothic.eot'); 4 | src: url('league-gothic.eot?#iefix') format('embedded-opentype'), 5 | url('league-gothic.woff') format('woff'), 6 | url('league-gothic.ttf') format('truetype'); 7 | 8 | font-weight: normal; 9 | font-style: normal; 10 | } -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/3. live-demo/app/storage.js: -------------------------------------------------------------------------------- 1 | export default { 2 | get: function (storageType) { 3 | var storage = storageType === 'local' ? localStorage : sessionStorage; 4 | return { 5 | save: function (key, value) { 6 | storage.setItem(key, JSON.stringify(value)); 7 | }, 8 | load: function (key) { 9 | return JSON.parse(storage.getItem(key)); 10 | } 11 | }; 12 | } 13 | } -------------------------------------------------------------------------------- /Workshops/Workshops-2017/Workshop_25-April-2017_Self_Manager/utils/authorized-user.js: -------------------------------------------------------------------------------- 1 | const AUTH_KEY_HEADER_NAME = 'x-auth-key'; 2 | module.exports = function(app, db) { 3 | app.use(function(req, res, next) { 4 | var authKey = req.headers[AUTH_KEY_HEADER_NAME]; 5 | var user = db('users').find({ 6 | authKey: authKey 7 | }); 8 | req.user = user || null; 9 | next(); 10 | }); 11 | }; 12 | -------------------------------------------------------------------------------- /Topics/05. Routing/demos/sample-routes/js/system-config.js: -------------------------------------------------------------------------------- 1 | SystemJS.config({ 2 | transpiler: 'plugin-babel', 3 | map: { 4 | 'plugin-babel': './node_modules/systemjs-plugin-babel/plugin-babel.js', 5 | 'systemjs-babel-build': './node_modules/systemjs-plugin-babel/systemjs-babel-browser.js', 6 | // app start script 7 | 'main': './js/main.js', 8 | 'jquery': './node_modules/jquery/dist/jquery.min.js' 9 | } 10 | }); -------------------------------------------------------------------------------- /Topics/05. Routing/demos/getting-query-params/js/system-config.js: -------------------------------------------------------------------------------- 1 | SystemJS.config({ 2 | transpiler: 'plugin-babel', 3 | map: { 4 | 'plugin-babel': './node_modules/systemjs-plugin-babel/plugin-babel.js', 5 | 'systemjs-babel-build': './node_modules/systemjs-plugin-babel/systemjs-babel-browser.js', 6 | // app start script 7 | 'main': './js/main.js', 8 | 'jquery': './node_modules/jquery/dist/jquery.min.js' 9 | } 10 | }); -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/plugin/markdown/example.md: -------------------------------------------------------------------------------- 1 | # Markdown Demo 2 | 3 | 4 | 5 | ## External 1.1 6 | 7 | Content 1.1 8 | 9 | Note: This will only appear in the speaker notes window. 10 | 11 | 12 | ## External 1.2 13 | 14 | Content 1.2 15 | 16 | 17 | 18 | ## External 2 19 | 20 | Content 2.1 21 | 22 | 23 | 24 | ## External 3.1 25 | 26 | Content 3.1 27 | 28 | 29 | ## External 3.2 30 | 31 | Content 3.2 32 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/solution-doncho/public/templates/home.handlebars: -------------------------------------------------------------------------------- 1 |

Welcome to the

2 | Self manager 3 | 4 |

This is yet another web app for time management

5 |

Why is this app useless?

6 | 11 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/4. persons/app-modules/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | export function clone(obj) { 4 | return JSON.parse(JSON.stringify(obj)); 5 | } 6 | 7 | export function* idGenerator() { 8 | let currentId = 0; 9 | 10 | while(true) { 11 | yield currentId; 12 | currentId += 1; 13 | } 14 | } 15 | 16 | export function helloPopup() { 17 | alert('hello') 18 | } 19 | 20 | // export { clone } -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/public/templates/home.handlebars: -------------------------------------------------------------------------------- 1 |

Welcome to the

2 | Self manager 3 | 4 |

This is yet another web app for time management

5 |

Why is this app useless?

6 | 11 | -------------------------------------------------------------------------------- /Topics/09. Unit testing - Spies and Mocks with Sinon/demos/live-demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "live-demo", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "mocks.js", 6 | "dependencies": { 7 | "chai": "^3.5.0", 8 | "sinon": "^1.17.6" 9 | }, 10 | "devDependencies": {}, 11 | "scripts": { 12 | "test": "echo \"Error: no test specified\" && exit 1" 13 | }, 14 | "author": "", 15 | "license": "ISC" 16 | } 17 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/forum-live/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "research-simple-forum", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Doncho Minkov (DonchoMinkov@gmail.com)", 10 | "license": "MIT", 11 | "dependencies": { 12 | "body-parser": "^1.13.3", 13 | "express": "^4.13.3" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Sample Exams/self manager/utils/auth-key-generator.js: -------------------------------------------------------------------------------- 1 | const chars = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM!@#$%^&*()_+-=', 2 | length = 60; 3 | 4 | function get(id) { 5 | var authKey = ''; 6 | authKey += id; 7 | while (authKey.length < length) { 8 | var index = (Math.random() * chars.length) | 0; 9 | authKey += chars[index]; 10 | } 11 | return authKey; 12 | } 13 | 14 | module.exports = { 15 | get:get 16 | }; 17 | -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/demos/2. promises/2.6. primes-promises.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/4. persons/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "systemjs-demo", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "live-server", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "systemjs": "^0.19.38", 14 | "systemjs-plugin-babel": "0.0.15" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Topics/06. Handlebars/demos/simple-SPA/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "research-simple-forum", 3 | "version": "0.0.0", 4 | "authors": [ 5 | "Doncho Minkov " 6 | ], 7 | "license": "MIT", 8 | "ignore": [ 9 | "**/.*", 10 | "node_modules", 11 | "bower_components", 12 | "test", 13 | "tests" 14 | ], 15 | "dependencies": { 16 | "bootstrap": "~3.3.5", 17 | "jquery": "~2.1.4" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/forum-workshop-template/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "research-simple-forum", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Doncho Minkov (DonchoMinkov@gmail.com)", 10 | "license": "MIT", 11 | "dependencies": { 12 | "body-parser": "^1.13.3", 13 | "express": "^4.13.3" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/demos/1. callbacks/1.3. primes-callbacks.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'), 2 | config = require('./config/config'), 3 | //serves as a database, all data is saved in memory 4 | data = require('./app/data/data'); 5 | 6 | var app = express(); 7 | 8 | require('./config/express')(app, config); 9 | require('./config/routes')(app, data, config); 10 | 11 | app.listen(config.port); 12 | 13 | console.log('Server running on port ' + config.port); -------------------------------------------------------------------------------- /Topics/03. Consuming Web Services/demos/server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node app.js" 8 | }, 9 | "author": "Doncho Minkov (donchominkov@gmail.com)", 10 | "license": "ISC", 11 | "dependencies": { 12 | "body-parser": "^1.15.2", 13 | "cors": "^2.8.1", 14 | "express": "^4.14.0" 15 | } 16 | } -------------------------------------------------------------------------------- /Topics/05. Routing/demos/sample-routes/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sample-routes", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "jquery": "^3.1.0", 13 | "navigo": "^2.3.1", 14 | "systemjs": "^0.19.38", 15 | "systemjs-plugin-babel": "0.0.15" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/forum-live/public/templates/threads.handlebars: -------------------------------------------------------------------------------- 1 |

Threads

2 | Add 3 | {{#if this}} 4 | {{#each this}} 5 |

{{title}}

6 | created 7 | {{postDate}} 8 | 9 |
created by{{user.username}} 10 | {{/each}} 11 | {{else}} 12 |

No threads

13 | {{/if}} 14 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/01. HTTP & AJAX Workshop - Forum/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "research-simple-forum", 3 | "version": "0.0.0", 4 | "authors": [ 5 | "Doncho Minkov " 6 | ], 7 | "license": "MIT", 8 | "ignore": [ 9 | "**/.*", 10 | "node_modules", 11 | "bower_components", 12 | "test", 13 | "tests" 14 | ], 15 | "dependencies": { 16 | "bootstrap": "~3.3.5", 17 | "jquery": "~2.1.4" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/public/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "public", 3 | "version": "0.0.0", 4 | "license": "MIT", 5 | "ignore": [ 6 | "**/.*", 7 | "node_modules", 8 | "bower_components", 9 | "test", 10 | "tests" 11 | ], 12 | "dependencies": { 13 | "handlebars": "~4.0.2", 14 | "jquery": "~2.1.4", 15 | "js-sha1": "~0.3.0", 16 | "sammy": "~0.7.6", 17 | "system.js": "~0.18.17" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/template/controllers/categories-controller.js: -------------------------------------------------------------------------------- 1 | var _ = require('lodash'); 2 | 3 | module.exports = function(db) { 4 | 5 | function get(req, res) { 6 | var categories = _.chain(db('cookies')) 7 | .map(function(cookie) { 8 | return cookie.category; 9 | }).uniq() 10 | .value(); 11 | res.json({ 12 | result: categories 13 | }); 14 | } 15 | 16 | return { 17 | get: get 18 | }; 19 | }; 20 | -------------------------------------------------------------------------------- /Topics/03. Consuming Web Services/demos/1. using-xhr-object.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Consuming Remote Data: Using xhr 6 | 7 | 8 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Topics/05. Routing/demos/getting-query-params/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sample-routes", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "jquery": "^3.1.0", 13 | "navigo": "^2.3.1", 14 | "systemjs": "^0.19.38", 15 | "systemjs-plugin-babel": "0.0.15" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Topics/06. Handlebars/demos/simple-SPA/public/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "public", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "handlebars": "^4.0.5", 13 | "navigo": "^2.3.1", 14 | "systemjs": "^0.19.38", 15 | "systemjs-plugin-babel": "0.0.15" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/homework/README.md: -------------------------------------------------------------------------------- 1 | # Promises and Asynchronous Programming 2 | ## Homework Assignments 3 | 4 | ### Task 1. GeoLocation 5 | - Write script that gets the users location and renders a image with the map of that location. 6 | - Use ES2015 `Promise` 7 | 8 | ### Task 2. Popup then load 9 | - Write script that shows a message in a popup `
` and after 2 seconds redirects to a different site. 10 | - Use `setTimeout` within a `Promise` -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/live-demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "jspm": { 3 | "directories": {}, 4 | "dependencies": { 5 | "bootstrap": "github:twbs/bootstrap@^3.3.5", 6 | "guybedford/markdown-component": "github:guybedford/markdown-component@^0.1.0" 7 | }, 8 | "devDependencies": { 9 | "babel": "npm:babel-core@^5.1.13", 10 | "babel-runtime": "npm:babel-runtime@^5.1.13", 11 | "core-js": "npm:core-js@^0.9.4" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/demos/live-demo-28-september/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/utils/auth-key-generator.js: -------------------------------------------------------------------------------- 1 | const chars = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM!@#$%^&*()_+-=', 2 | length = 60; 3 | 4 | function get(id) { 5 | var authKey = ''; 6 | authKey += id; 7 | while (authKey.length < length) { 8 | var index = (Math.random() * chars.length) | 0; 9 | authKey += chars[index]; 10 | } 11 | return authKey; 12 | } 13 | 14 | module.exports = { 15 | get:get 16 | }; 17 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/solution-doncho/controllers/categories-controller.js: -------------------------------------------------------------------------------- 1 | var _ = require('lodash'); 2 | 3 | module.exports = function(db) { 4 | 5 | function get(req, res) { 6 | var categories = _.chain(db('cookies')) 7 | .map(function(cookie) { 8 | return cookie.category; 9 | }).uniq() 10 | .value(); 11 | res.json({ 12 | result: categories 13 | }); 14 | } 15 | 16 | return { 17 | get: get 18 | }; 19 | }; 20 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/3. live-demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "live-demo", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "app/app.js", 6 | "dependencies": { 7 | "babel-core": "^5.8.22", 8 | "http-server": "^0.8.0" 9 | }, 10 | "devDependencies": {}, 11 | "scripts": { 12 | "start": "iojs ./node_modules/http-server/bin/http-server -p 8888" 13 | }, 14 | "author": "Doncho Minkov ", 15 | "license": "ISC" 16 | } 17 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/Workshop_25-April-2017_Self_Manager/utils/auth-key-generator.js: -------------------------------------------------------------------------------- 1 | const chars = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM!@#$%^&*()_+-=', 2 | length = 60; 3 | 4 | function get(id) { 5 | var authKey = ''; 6 | authKey += id; 7 | while (authKey.length < length) { 8 | var index = (Math.random() * chars.length) | 0; 9 | authKey += chars[index]; 10 | } 11 | return authKey; 12 | } 13 | 14 | module.exports = { 15 | get:get 16 | }; 17 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/1. markdown-component/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "jspm": { 3 | "directories": {}, 4 | "dependencies": { 5 | "bootstrap": "github:twbs/bootstrap@^3.3.5", 6 | "guybedford/markdown-component": "github:guybedford/markdown-component@^0.1.0" 7 | }, 8 | "devDependencies": { 9 | "babel": "npm:babel-core@^5.1.13", 10 | "babel-runtime": "npm:babel-runtime@^5.1.13", 11 | "core-js": "npm:core-js@^0.9.4" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/forum-live/public/templates/login.handlebars: -------------------------------------------------------------------------------- 1 |

Login/Register Form

2 | 3 | 4 |
5 | 6 | 7 |
8 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_20-April-2017_Fortune_Cookies/controllers/categories-controller.js: -------------------------------------------------------------------------------- 1 | var _ = require('lodash'); 2 | 3 | module.exports = function(db) { 4 | 5 | function get(req, res) { 6 | var categories = _.chain(db('cookies')) 7 | .map(function(cookie) { 8 | return cookie.category; 9 | }).uniq() 10 | .value(); 11 | res.json({ 12 | result: categories 13 | }); 14 | } 15 | 16 | return { 17 | get: get 18 | }; 19 | }; 20 | -------------------------------------------------------------------------------- /Topics/06. Handlebars/demos/simple-SPA/public/scripts/system-config.js: -------------------------------------------------------------------------------- 1 | SystemJS.config({ 2 | // tell SystemJS which transpiler to use 3 | transpiler: 'plugin-babel', 4 | // tell SystemJS where to look for the dependencies 5 | map: { 6 | 'plugin-babel': 7 | './node_modules/systemjs-plugin-babel/plugin-babel.js', 8 | 'systemjs-babel-build': 9 | './node_modules/systemjs-plugin-babel/systemjs-babel-browser.js', 10 | // app start script 11 | 'main': './scripts/main.js' 12 | } 13 | }); -------------------------------------------------------------------------------- /Topics/09. Unit testing - Spies and Mocks with Sinon/demos/live-demo/mocks.js: -------------------------------------------------------------------------------- 1 | let sinon = require('sinon'); 2 | 3 | let mock = sinon.mock(Math); 4 | 5 | mock.expects("abs").atLeast(10); 6 | 7 | let randomExpectation = mock.expects("random") 8 | randomExpectation.atLeast(2) 9 | .atMost(4); 10 | 11 | Math.random(); 12 | Math.random(); 13 | Math.random(); 14 | Math.random(); 15 | 16 | randomExpectation.verify(); 17 | try { 18 | mock.verify(); 19 | } 20 | catch(e) { 21 | console.log(e); 22 | } 23 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/01. HTTP & AJAX Workshop - Forum/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "research-simple-forum", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node app.js" 9 | }, 10 | "author": "Doncho Minkov (DonchoMinkov@gmail.com)", 11 | "license": "MIT", 12 | "dependencies": { 13 | "body-parser": "^1.13.3", 14 | "express": "^4.13.3" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Topics/03. Consuming Web Services/demos/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "consuming-remote-data-demos", 3 | "version": "0.0.0", 4 | "homepage": "https://github.com/telerikacademy/javascript-applications", 5 | "license": "MIT", 6 | "ignore": [ 7 | "**/.*", 8 | "node_modules", 9 | "bower_components", 10 | "test", 11 | "tests" 12 | ], 13 | "authors": [ 14 | "Doncho Minkov (donchominkov@gmail.com)" 15 | ], 16 | "dependencies": { 17 | "jquery": "~2.1.4" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/4. persons/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "systemjs-demo", 3 | "description": "", 4 | "main": "index.js", 5 | "authors": [ 6 | "az" 7 | ], 8 | "license": "ISC", 9 | "keywords": [ 10 | "we", 11 | "are", 12 | "cool" 13 | ], 14 | "homepage": "", 15 | "ignore": [ 16 | "**/.*", 17 | "node_modules", 18 | "bower_components", 19 | "test", 20 | "tests" 21 | ], 22 | "dependencies": { 23 | "jquery": "^3.1.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/plugin/multiplex/client.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | var multiplex = Reveal.getConfig().multiplex; 3 | var socketId = multiplex.id; 4 | var socket = io.connect(multiplex.url); 5 | 6 | socket.on(multiplex.id, function(data) { 7 | // ignore data from sockets that aren't ours 8 | if (data.socketId !== socketId) { return; } 9 | if( window.location.host === 'localhost:1947' ) return; 10 | 11 | Reveal.slide(data.indexh, data.indexv, data.indexf, 'remote'); 12 | }); 13 | }()); 14 | -------------------------------------------------------------------------------- /Topics/03. Consuming Web Services/demos/5. http-requst-method.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Consuming Remote Data: Method for sending requests 7 | 8 | 9 | 10 | 11 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/forum-workshop-template/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "research-simple-forum", 3 | "version": "0.0.0", 4 | "authors": [ 5 | "Doncho Minkov " 6 | ], 7 | "license": "MIT", 8 | "ignore": [ 9 | "**/.*", 10 | "node_modules", 11 | "bower_components", 12 | "test", 13 | "tests" 14 | ], 15 | "dependencies": { 16 | "bootstrap": "~3.3.5", 17 | "handlebars": "~3.0.3", 18 | "jquery": "~2.1.4", 19 | "sammy": "~0.7.6" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/03. Unit-testing/public/templates/login.html: -------------------------------------------------------------------------------- 1 |
2 | 6 |
7 | 11 |
12 | 13 | 14 |
-------------------------------------------------------------------------------- /Workshops/Workshops-2017/Workshop_25-April-2017_Self_Manager/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "self-manager", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node app.js" 8 | }, 9 | "author": "Doncho Minkov (DonchoMinkov@gmail.com)", 10 | "license": "MIT", 11 | "dependencies": { 12 | "body-parser": "^1.13.3", 13 | "express": "^4.13.3", 14 | "lodash": "^3.10.1", 15 | "lowdb": "^0.10.2", 16 | "underscore-db": "^0.9.0" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/02. Creating-SPA-apps/public/templates/login.html: -------------------------------------------------------------------------------- 1 |
2 | 6 |
7 | 11 |
12 | 13 | 14 |
-------------------------------------------------------------------------------- /Workshops/Workshops-2016/03. Unit-testing/controllers/categories-controller.js: -------------------------------------------------------------------------------- 1 | /* globals require module */ 2 | "use strict"; 3 | 4 | var _ = require("lodash"); 5 | 6 | module.exports = function(db) { 7 | function get(req, res) { 8 | var categories = 9 | _.chain(db("cookies")) 10 | .map(cookie => cookie.category) 11 | .uniq() 12 | .value(); 13 | 14 | res.json({ 15 | result: categories 16 | }); 17 | } 18 | 19 | return {get }; 20 | }; -------------------------------------------------------------------------------- /Topics/03. Consuming Web Services/demos/server/tools/id-generator.js: -------------------------------------------------------------------------------- 1 | /* globals module*/ 2 | "use strict"; 3 | 4 | function* idGenerator() { 5 | var lastId = 0; 6 | 7 | while (true) { 8 | yield lastId += 1; 9 | } 10 | } 11 | 12 | 13 | let m = { 14 | get: function() { 15 | let idGenInstance = idGenerator(); 16 | return { 17 | next: function() { 18 | return idGenInstance.next().value; 19 | } 20 | }; 21 | } 22 | }; 23 | 24 | module.exports = m; -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/demos/html-reporter/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mocha-html-reporter", 3 | "version": "0.0.0", 4 | "homepage": "https://github.com/telerikacademy/javascript-applications", 5 | "authors": [ 6 | "Doncho Minkov " 7 | ], 8 | "license": "MIT", 9 | "ignore": [ 10 | "**/.*", 11 | "node_modules", 12 | "bower_components", 13 | "test", 14 | "tests" 15 | ], 16 | "dependencies": { 17 | "chai": "~3.2.0", 18 | "mocha": "~2.3.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/02. Creating-SPA-apps/controllers/categories-controller.js: -------------------------------------------------------------------------------- 1 | /* globals require module */ 2 | "use strict"; 3 | 4 | var _ = require("lodash"); 5 | 6 | module.exports = function(db) { 7 | function get(req, res) { 8 | var categories = 9 | _.chain(db("cookies")) 10 | .map(cookie => cookie.category) 11 | .uniq() 12 | .value(); 13 | 14 | res.json({ 15 | result: categories 16 | }); 17 | } 18 | 19 | return {get }; 20 | }; -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/solution-doncho/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fortune-cookies", 3 | "version": "1.0.0", 4 | "description": "## App description", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node app.js" 8 | }, 9 | "author": "Doncho Minkov (donchominkov@gmail.com)", 10 | "license": "MIT", 11 | "dependencies": { 12 | "body-parser": "^1.13.3", 13 | "express": "^4.13.3", 14 | "lodash": "^3.10.1", 15 | "lowdb": "^0.10.2", 16 | "underscore-db": "^0.9.0" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/demo/word/webSettings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Sample Exams/self manager/public/css/main.css: -------------------------------------------------------------------------------- 1 | html { 2 | min-height: 100%; 3 | position: relative; 4 | } 5 | body { 6 | margin-bottom: 60px; 7 | } 8 | .footer { 9 | background-color: #f5f5f5; 10 | bottom: 0; 11 | height: 60px; 12 | position: absolute; 13 | width: 100%; 14 | } 15 | body > .container { 16 | padding: 60px 15px 0; 17 | } 18 | .container .text-muted { 19 | margin: 20px 0; 20 | } 21 | .footer > .container { 22 | padding-left: 15px; 23 | padding-right: 15px; 24 | } 25 | code { 26 | font-size: 80%; 27 | } 28 | -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/demos/live-demo/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "live-demo", 3 | "version": "0.0.0", 4 | "homepage": "https://github.com/TelerikAcademy/JavaScript-Applications", 5 | "authors": [ 6 | "evlogihr " 7 | ], 8 | "license": "MIT", 9 | "ignore": [ 10 | "**/.*", 11 | "node_modules", 12 | "bower_components", 13 | "test", 14 | "tests" 15 | ], 16 | "dependencies": { 17 | "chai": "~3.2.0", 18 | "mocha": "~2.3.0", 19 | "sinon-chai": "~2.8.0" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Topics/06. Handlebars/demos/simple-SPA/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "research-simple-forum", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node app.js" 9 | }, 10 | "author": "Doncho Minkov (DonchoMinkov@gmail.com)", 11 | "license": "MIT", 12 | "dependencies": { 13 | "body-parser": "^1.13.3", 14 | "express": "^4.13.3", 15 | "systemjs": "^0.19.38", 16 | "systemjs-plugin-babel": "0.0.15" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/02. Creating-SPA-apps/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Forture-Cookies-Sep-2015", 3 | "version": "0.0.0", 4 | "authors": [ 5 | "DonchoMinkov " 6 | ], 7 | "license": "MIT", 8 | "ignore": [ 9 | "**/.*", 10 | "node_modules", 11 | "bower_components", 12 | "public/bower_components", 13 | "test", 14 | "tests" 15 | ], 16 | "dependencies": { 17 | "jquery": "^3.1.1", 18 | "navigo": "^3.0.0", 19 | "handlebars": "^4.0.5", 20 | "bootstrap": "^3.3.7" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/demos/2. promises/2.1. promise-creation.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | var promise = new Promise(function(resolve, reject) { 3 | setTimeout(function() { 4 | resolve({id: 5, decription: 'some data'}) 5 | // reject('something very bad happened') 6 | }, 2000); 7 | }); 8 | 9 | promise 10 | .then(function(data) { 11 | console.log(data); 12 | }) 13 | .catch(function(error) { 14 | console.log(error); 15 | }); 16 | }()); 17 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/02. Creating-SPA-apps/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fortune-cookies", 3 | "version": "1.0.0", 4 | "description": "## App description", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node app.js" 8 | }, 9 | "author": "Doncho Minkov (donchominkov@gmail.com)", 10 | "license": "MIT", 11 | "dependencies": { 12 | "body-parser": "^1.13.3", 13 | "cors": "^2.8.1", 14 | "express": "^4.13.3", 15 | "lodash": "^3.10.1", 16 | "lowdb": "^0.10.2", 17 | "underscore-db": "^0.9.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/template/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fortune-cookies", 3 | "version": "1.0.0", 4 | "description": "## App description", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Doncho Minkov (donchominkov@gmail.com)", 10 | "license": "MIT", 11 | "dependencies": { 12 | "body-parser": "^1.13.3", 13 | "express": "^4.13.3", 14 | "lodash": "^3.10.1", 15 | "lowdb": "^0.10.2", 16 | "underscore-db": "^0.9.0" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/3. live-demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | System.js Live Demo 6 | 7 | 8 |

Demo with System.js, localStorage and jQuery

9 |
10 | 11 | 12 | 18 | 19 | -------------------------------------------------------------------------------- /Topics/06. Handlebars/homework/README.md: -------------------------------------------------------------------------------- 1 | # Homework: SPA Routing & Handlebars 2 | 3 | - Re-write the [01. HTTP & AJAX Workshop - Forum](https://github.com/TelerikAcademy/JavaScript-Applications/blob/master/Workshop/01.%20HTTP%20%26%20AJAX%20Workshop%20-%20Forum/README.md) using SPA Routing and Handlebars for the different components loading the UI (as shown in the [video](https://telerikacademy.com/Courses/LectureResources/Video/8726/%D0%92%D0%B8%D0%B4%D0%B5%D0%BE-21-%D1%81%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B2%D1%80%D0%B8-%D0%95%D0%B2%D0%BB%D0%BE%D0%B3%D0%B8) from the lecture) -------------------------------------------------------------------------------- /Sample Exams/self manager/public/templates/todo-add.handlebars: -------------------------------------------------------------------------------- 1 |
2 | Add new Todo 3 |
4 | 7 | 8 |
9 |
10 | 11 | 12 |
13 | 14 |
15 | -------------------------------------------------------------------------------- /Sample Exams/self manager/public/templates/todos.handlebars: -------------------------------------------------------------------------------- 1 |

TODOs

2 | Add new 3 | {{#each this}} 4 |

{{category}}

5 | {{#each items}} 6 |
7 | 15 |
16 | {{/each}} 17 | {{/each}} 18 | -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/demos/html-reporter/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/3. live-demo/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "System.js-localstorage-jquery-demo", 3 | "version": "1.0.0", 4 | "homepage": "https://github.com/TelerikAcademy/JavaScript-Applications", 5 | "authors": [ 6 | "Doncho Minkov " 7 | ], 8 | "license": "MIT", 9 | "ignore": [ 10 | "**/.*", 11 | "node_modules", 12 | "bower_components", 13 | "test", 14 | "tests" 15 | ], 16 | "main": "app.js", 17 | "dependencies": { 18 | "jquery": "~2.1.4", 19 | "system.js": "~0.18.11" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/shop-app/app/scripts/templates.js: -------------------------------------------------------------------------------- 1 | import 'jquery' 2 | 3 | export default { 4 | load: function(name) { 5 | var url = 'app/templates/' + name + '.handlebars'; 6 | 7 | return new Promise(function(resolve, reject) { 8 | $.ajax({ 9 | url: url, 10 | success: function(data) { 11 | resolve(data); 12 | }, 13 | error: function(err) { 14 | reject(err); 15 | } 16 | }) 17 | }); 18 | } 19 | } -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/public/css/main.css: -------------------------------------------------------------------------------- 1 | html { 2 | min-height: 100%; 3 | position: relative; 4 | } 5 | body { 6 | margin-bottom: 60px; 7 | } 8 | .footer { 9 | background-color: #f5f5f5; 10 | bottom: 0; 11 | height: 60px; 12 | position: absolute; 13 | width: 100%; 14 | } 15 | body > .container { 16 | padding: 60px 15px 0; 17 | } 18 | .container .text-muted { 19 | margin: 20px 0; 20 | } 21 | .footer > .container { 22 | padding-left: 15px; 23 | padding-right: 15px; 24 | } 25 | code { 26 | font-size: 80%; 27 | } 28 | -------------------------------------------------------------------------------- /Sample Exams/self manager/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "self-manager", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node app.js", 8 | "postinstall": "./node_modules/bower/bin/bower install" 9 | }, 10 | "author": "Doncho Minkov (DonchoMinkov@gmail.com)", 11 | "license": "MIT", 12 | "dependencies": { 13 | "body-parser": "^1.13.3", 14 | "bower": "^1.5.2", 15 | "express": "^4.13.3", 16 | "lodash": "^3.10.1", 17 | "lowdb": "^0.10.2", 18 | "underscore-db": "^0.9.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/demos/2. promises/2.3. promise-composition.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | var promise1, promise2; 3 | promise1 = new Promise(function (resolve, reject) { 4 | setTimeout(function () { 5 | resolve('one'); 6 | }, 3000); 7 | }); 8 | 9 | promise2 = new Promise(function (resolve, reject) { 10 | setTimeout(function () { 11 | resolve(promise1); 12 | }, 2000); 13 | }); 14 | 15 | promise2.then(function (data) { 16 | console.log(data); // 'one' 17 | }); 18 | }()); -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/3. live-demo/README.md: -------------------------------------------------------------------------------- 1 | #Demo with System.js, jQuery and localStorage 2 | 3 | For the demo to work, perform the following: 4 | 5 | 1. Open a Terminal/CMD to the folder of the demo 6 | 2. Run `$ npm install` 7 | * That will create a folder **node_modules**, containing `http-server` and `babel-core` 8 | 3. Run `$ bower install` 9 | * That will create a folder **bower_components**, containing `jquery` and `system.js` 10 | 4. Run `$ npm start` 11 | 5. Navigate in a browser to [http://localhost:8888](http://localhost:8888) 12 | 6. That's it -------------------------------------------------------------------------------- /Topics/07. Web Storages/demos/scripts/web-storage-objects.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | if (!Storage.prototype.setObject) { 3 | Storage.prototype.setObject = function setObject(key, obj) { 4 | var jsonObj = JSON.stringify(obj); 5 | this.setItem(key, jsonObj); 6 | }; 7 | } 8 | if (!Storage.prototype.getObject) { 9 | Storage.prototype.getObject = function getObject(key) { 10 | var jsonObj = this.getItem(key); 11 | var obj = JSON.parse(jsonObj); 12 | return obj; 13 | }; 14 | } 15 | })(); 16 | -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/demos/live-demo-28-september/cart.js: -------------------------------------------------------------------------------- 1 | function validateName(name) { 2 | if(typeof name !== 'string') { 3 | throw 'Name is not a string'; 4 | } 5 | if(name.length === 0) { 6 | throw 'Name should not be an empty string'; 7 | } 8 | } 9 | 10 | class ShoppingCart { 11 | constructor(name) { 12 | validateName(name); 13 | this._name = name; 14 | } 15 | 16 | get name() { 17 | return this._name; 18 | } 19 | set name(name) { 20 | validateName(name); 21 | this._name = name; 22 | } 23 | } 24 | 25 | module.exports = { 26 | ShoppingCart 27 | }; 28 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/public/templates/todo-add.handlebars: -------------------------------------------------------------------------------- 1 |
2 | Add new Todo 3 |
4 | 7 | 8 |
9 |
10 | 11 | 12 |
13 | 14 |
15 | -------------------------------------------------------------------------------- /Topics/03. Consuming Web Services/demos/2. using-xhr-ready-states.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Consuming Remote Data: On readyState changed 6 | 7 | 8 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/2. loopgifs-demo/lib/reddit-api.js: -------------------------------------------------------------------------------- 1 | import jsonp from 'jsonp' 2 | 3 | class RedditApi { 4 | constructor () { 5 | this.redditURl = 'https://www.reddit.com/r/perfectloops/top.json?sort=top&t=week&jsonp=callbackFunction'; 6 | }; 7 | load() { 8 | return new Promise ((resolve, reject) => { 9 | jsonp(this.redditURl, {param: 'jsonp'}, (err, data) => { 10 | err ? reject(err) : resolve(data.data.children); 11 | }) 12 | } 13 | ) 14 | } 15 | } 16 | 17 | export default new RedditApi(); -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/demos/other-reporters/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mocha-other-reporters", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1" 7 | }, 8 | "author": "Doncho Minkov (DonchoMinkov@gmail.com)", 9 | "license": "MIT", 10 | "dependencies": { 11 | "chai": "^3.2.0", 12 | "istanbul": "^0.3.19", 13 | "mocha": "^2.3.0" 14 | }, 15 | "directories": { 16 | "test": "tests" 17 | }, 18 | "devDependencies": { 19 | "mocha": "^2.3.0" 20 | }, 21 | "description": "" 22 | } 23 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/public/templates/todos.handlebars: -------------------------------------------------------------------------------- 1 |

TODOs

2 | Add new 3 | {{#each this}} 4 |

{{category}}

5 | {{#each items}} 6 |
7 | 15 |
16 | {{/each}} 17 | {{/each}} 18 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/live-demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 14 | 15 | 16 | 17 | # Markdown component 18 | * First Point 19 | * Second point 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Topics/03. Consuming Web Services/demos/8. jquery-load.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Consuming Remote Data: $(selector).load(url) 7 | 8 | 9 | 10 |
11 | 12 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/4. persons/app-modules/data.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { clone, idGenerator as createIdGenerator } from 'utils'; 4 | 5 | const records = [], 6 | idGen = createIdGenerator(); 7 | 8 | function add(person) { 9 | const clonedPerson = clone(person); 10 | clonedPerson.id = idGen.next().value; 11 | records.push(clonedPerson); 12 | } 13 | 14 | function findById(id) { 15 | const result = records.find(r => r.id === id); 16 | return clone(result); 17 | } 18 | 19 | function all() { 20 | return clone(records); 21 | } 22 | 23 | export { add, all, findById as byId } -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/demo/_rels/.rels: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/forum-live/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "research-simple-forum", 3 | "version": "0.0.0", 4 | "authors": [ 5 | "Doncho Minkov " 6 | ], 7 | "license": "MIT", 8 | "ignore": [ 9 | "**/.*", 10 | "node_modules", 11 | "bower_components", 12 | "test", 13 | "tests" 14 | ], 15 | "dependencies": { 16 | "bootstrap": "~3.3.5", 17 | "handlebars": "~3.0.3", 18 | "jquery": "~2.1.4", 19 | "moment": "~2.10.6", 20 | "sammy": "~0.7.6", 21 | "sha1": "http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha1.js" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/demos/2. promises/2.4. promise-all.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | var promise1, promise2; 3 | 4 | promise1 = new Promise(function (resolve, reject) { 5 | setTimeout(function () { 6 | resolve('from promise 1'); 7 | }, 2000); 8 | }); 9 | 10 | promise2 = new Promise(function (resolve, reject) { 11 | resolve('from promise 2'); 12 | }); 13 | 14 | Promise.all([promise1, promise2]) 15 | .then(function (results) { 16 | // results is an array of the responses 17 | console.log(results); 18 | }); 19 | }()); -------------------------------------------------------------------------------- /Workshops/Workshops-2015/forum-live/utils/user-authentication.js: -------------------------------------------------------------------------------- 1 | var db = require('../db/db') 2 | 3 | module.exports = function(app) { 4 | app.use('/', function(req, res, next) { 5 | var authKey = req.headers['x-authkey']; 6 | if (!authKey) { 7 | req.user = null; 8 | next(); 9 | return; 10 | } 11 | db.users.find({ 12 | authKey: authKey 13 | }) 14 | .then(function(users) { 15 | var user = users[0] || null; 16 | req.user = user; 17 | next(); 18 | }, function(err) { 19 | res.status(404) 20 | .json(err); 21 | }); 22 | }); 23 | }; 24 | -------------------------------------------------------------------------------- /Topics/06. Handlebars/demos/simple-SPA/utils/user-authentication.js: -------------------------------------------------------------------------------- 1 | var db = require('../db/db') 2 | 3 | module.exports = function(app) { 4 | app.use('/', function(req, res, next) { 5 | var authKey = req.headers['x-authkey']; 6 | if (!authKey) { 7 | req.user = null; 8 | next(); 9 | return; 10 | } 11 | db.users.find({ 12 | authKey: authKey 13 | }) 14 | .then(function(users) { 15 | var user = users[0] || null; 16 | req.user = user; 17 | next(); 18 | }, function(err) { 19 | res.status(404) 20 | .json(err); 21 | }); 22 | }); 23 | }; 24 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/forum-live/public/js/templates.js: -------------------------------------------------------------------------------- 1 | var templates = (function() { 2 | var handlebars = window.handlebars || window.Handlebars, 3 | Handlebars = window.handlebars || window.Handlebars; 4 | 5 | function get(name) { 6 | var promise = new Promise(function(resolve, reject) { 7 | var url = `/templates/${name}.handlebars`; 8 | console.log(url); 9 | $.get(url, function(templateHtml) { 10 | var template = handlebars.compile(templateHtml); 11 | resolve(template); 12 | }); 13 | }); 14 | return promise; 15 | } 16 | 17 | return { 18 | get 19 | }; 20 | }()); 21 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/03. Unit-testing/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Forture-Cookies-Sep-2015", 3 | "version": "0.0.0", 4 | "authors": [ 5 | "DonchoMinkov " 6 | ], 7 | "license": "MIT", 8 | "ignore": [ 9 | "**/.*", 10 | "node_modules", 11 | "bower_components", 12 | "public/bower_components", 13 | "test", 14 | "tests" 15 | ], 16 | "dependencies": { 17 | "jquery": "^3.1.1", 18 | "navigo": "^3.0.0", 19 | "handlebars": "^4.0.5", 20 | "bootstrap": "^3.3.7" 21 | }, 22 | "devDependencies": { 23 | "mocha": "^3.1.0", 24 | "chai": "^3.5.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/shop-app/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "shop-app", 3 | "version": "0.0.1", 4 | "homepage": "https://github.com/TelerikAcademy/JavaScript-Applications", 5 | "authors": [ 6 | "evlogihr " 7 | ], 8 | "moduleType": [ 9 | "es6" 10 | ], 11 | "license": "MIT", 12 | "ignore": [ 13 | "**/.*", 14 | "node_modules", 15 | "bower_components", 16 | "test", 17 | "tests" 18 | ], 19 | "dependencies": { 20 | "bootstrap": "~3.3.5", 21 | "handlebars": "~4.0.1", 22 | "jquery": "~2.1.4", 23 | "sammy": "~0.7.6", 24 | "system.js": "~0.18.17" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/4. persons/app-modules/person-component.js: -------------------------------------------------------------------------------- 1 | import 'jquery'; 2 | import * as db from 'data'; 3 | 4 | export function attachEvents() { 5 | $('#btn-add').on('click', function () { 6 | const newPerson = { 7 | name: $('#person-name').val(), 8 | age: $('#person-age').val() 9 | }; 10 | 11 | db.add(newPerson); 12 | }); 13 | 14 | $('#btn-all').on('click', function () { 15 | console.log('all people'); 16 | const peopleHtml = db.all().map(p => `
  • ${p.name} - ${p.age}
  • `); 17 | 18 | $('#list-all').html(peopleHtml.join('')); 19 | }); 20 | } -------------------------------------------------------------------------------- /Workshops/Workshops-2015/forum-workshop-template/utils/user-authentication.js: -------------------------------------------------------------------------------- 1 | var db = require('../db/db') 2 | 3 | module.exports = function(app) { 4 | app.use('/', function(req, res, next) { 5 | var authKey = req.headers['x-authkey']; 6 | if (!authKey) { 7 | req.user = null; 8 | next(); 9 | return; 10 | } 11 | db.users.find({ 12 | authKey: authKey 13 | }) 14 | .then(function(users) { 15 | var user = users[0] || null; 16 | req.user = user; 17 | next(); 18 | }, function(err) { 19 | res.status(404) 20 | .json(err); 21 | }); 22 | }); 23 | }; 24 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/03. Unit-testing/public/css/main.css: -------------------------------------------------------------------------------- 1 | #page { 2 | text-align: center 3 | } 4 | 5 | #main-nav { 6 | text-align: center; 7 | display: inline-block; 8 | margin: 0 auto; 9 | } 10 | 11 | .list-cookies { 12 | list-style-type: none; 13 | } 14 | 15 | .list-cookies li { 16 | margin-top: 50px; 17 | } 18 | 19 | .list-cookies li img { 20 | height: 350px 21 | } 22 | 23 | #page .hidden-when-not-logged-in { 24 | display: none; 25 | } 26 | 27 | #page.logged-in .hidden-when-not-logged-in { 28 | display: initial; 29 | } 30 | 31 | #page.logged-in .visible-when-not-logged-in { 32 | display: none; 33 | } -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/public/js/templates.js: -------------------------------------------------------------------------------- 1 | import 'jquery' 2 | import Handlebars from 'handlebars' 3 | 4 | export default { 5 | load: function(name) { 6 | var url = 'js/templates/' + name + '.handlebars'; 7 | 8 | return new Promise(function(resolve, reject) { 9 | $.ajax({ 10 | url: url, 11 | success: function(data) { 12 | resolve(Handlebars.compile(data)); 13 | }, 14 | error: function(err) { 15 | reject(err); 16 | } 17 | }) 18 | }); 19 | } 20 | } -------------------------------------------------------------------------------- /Workshops/Workshops-2016/02. Creating-SPA-apps/public/css/main.css: -------------------------------------------------------------------------------- 1 | #page { 2 | text-align: center 3 | } 4 | 5 | #main-nav { 6 | text-align: center; 7 | display: inline-block; 8 | margin: 0 auto; 9 | } 10 | 11 | .list-cookies { 12 | list-style-type: none; 13 | } 14 | 15 | .list-cookies li { 16 | margin-top: 50px; 17 | } 18 | 19 | .list-cookies li img { 20 | height: 350px 21 | } 22 | 23 | #page .hidden-when-not-logged-in { 24 | display: none; 25 | } 26 | 27 | #page.logged-in .hidden-when-not-logged-in { 28 | display: initial; 29 | } 30 | 31 | #page.logged-in .visible-when-not-logged-in { 32 | display: none; 33 | } -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_20-April-2017_Fortune_Cookies/public/js/controllers/home.js: -------------------------------------------------------------------------------- 1 | import * as data from 'data'; 2 | import { load as loadTemplate } from 'templates'; 3 | 4 | /* 5 | import homeTemplate from 'homeTemplate!text'; 6 | const template = Handlebars.compile(homeTemplate); 7 | */ 8 | 9 | const $appContainer = $('#app-container'); 10 | 11 | export function get(params) { 12 | const { category } = params; 13 | 14 | Promise.all([ 15 | loadTemplate('home'), 16 | data.getCookies() 17 | ]) 18 | .then(([template, cookies]) => { 19 | console.log(cookies); 20 | $appContainer.html(template(cookies)); 21 | }); 22 | } 23 | -------------------------------------------------------------------------------- /Topics/03. Consuming Web Services/demos/server/app.js: -------------------------------------------------------------------------------- 1 | /* globals require console*/ 2 | 3 | "use strict"; 4 | 5 | let express = require("express"), 6 | bodyParser = require("body-parser"), 7 | cors = require("cors"); 8 | 9 | let app = express(); 10 | let peopleControllers = require("./controllers/people"); 11 | 12 | app.use(bodyParser.json()); 13 | app.use(cors()); 14 | 15 | app.get("/api/people", peopleControllers.getAll) 16 | .get("/api/people/:id", peopleControllers.getById) 17 | .post("/api/people", peopleControllers.addNew); 18 | 19 | app.listen(8886, function() { 20 | console.log("Server is running at http://localhost:8886"); 21 | }); -------------------------------------------------------------------------------- /Workshops/Workshops-2016/01. HTTP & AJAX Workshop - Forum/utils/user-authentication.js: -------------------------------------------------------------------------------- 1 | var db = require('../db/db') 2 | 3 | module.exports = function(app) { 4 | app.use('/', function(req, res, next) { 5 | var authKey = req.headers['x-authkey']; 6 | if (!authKey) { 7 | req.user = null; 8 | next(); 9 | return; 10 | } 11 | db.users.find({ 12 | authKey: authKey 13 | }) 14 | .then(function(users) { 15 | var user = users[0] || null; 16 | req.user = user; 17 | next(); 18 | }, function(err) { 19 | res.status(404) 20 | .json(err); 21 | }); 22 | }); 23 | }; 24 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_20-April-2017_Fortune_Cookies/public/js/templates.js: -------------------------------------------------------------------------------- 1 | import { get as getRequest } from 'requester'; 2 | // import { Handlebars } from 'handlebars'; // FIX ME 3 | 4 | const cacheObj = {}; 5 | 6 | export function load(templateName) { 7 | if(cacheObj.hasOwnProperty(templateName)) { 8 | return Promise.resolve(cacheObj[templateName]); 9 | } 10 | 11 | return getRequest(`templates/${templateName}.handlebars`) 12 | .then(template => { 13 | const compiledTemplate = Handlebars.compile(template); 14 | cacheObj[templateName] = compiledTemplate; 15 | return Promise.resolve(compiledTemplate); 16 | }); 17 | } 18 | -------------------------------------------------------------------------------- /Sample Exams/self manager/public/templates/register.handlebars: -------------------------------------------------------------------------------- 1 |
    2 | Register a new User 3 | 4 |
    5 |
    6 |
    7 | 8 | 9 |
    10 |
    11 | 12 | 13 |
    14 | 15 |
    16 |
    17 |
    18 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/cheat-sheet.txt: -------------------------------------------------------------------------------- 1 | * Install jspm 2 | * npm install jspm -g 3 | * install jspn github:guybedford/markdown-component 4 | * import 'github:guybedford/markdown-component@0.1.0' 5 | * jspm install bootstrap 6 | * import 'bootstrap' 7 | 8 | 9 | 10 | # GIFS 11 | https://www.reddit.com/r/perfectloops/top?sort=top&t=week 12 | * npm init 13 | * jspm init 14 | * git --version 15 | * install git bash if no git 16 | * mkdir app 17 | * jspm install npm:jsonp 18 | * To not blacklist anything: 19 | 20 | ``` 21 | "babelOptions": { 22 | "blacklist": [] 23 | } 24 | ``` 25 | 26 | * index.html 27 | * jspm bundle-sfx --minify lib/main 28 | 29 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/03. Unit-testing/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fortune-cookies", 3 | "version": "1.0.0", 4 | "description": "## App description", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node app.js" 8 | }, 9 | "author": "Doncho Minkov (donchominkov@gmail.com)", 10 | "license": "MIT", 11 | "dependencies": { 12 | "body-parser": "^1.13.3", 13 | "cors": "^2.8.1", 14 | "express": "^4.13.3", 15 | "lodash": "^3.10.1", 16 | "lowdb": "^0.10.2", 17 | "underscore-db": "^0.9.0" 18 | }, 19 | "devDependencies": { 20 | "chai": "^3.5.0", 21 | "mocha": "^3.1.0", 22 | "sinon": "^1.17.6" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/config/routes.js: -------------------------------------------------------------------------------- 1 | module.exports = function (app, data, config) { 2 | var posts = require('../app/controllers/posts')(data); 3 | var users = require('../app/controllers/users')(data); 4 | 5 | app.get('/post', posts.get); 6 | app.post('/post', posts.createNew); 7 | 8 | app.post('/user', users.register); 9 | app.post('/auth', users.login); 10 | app.put('/user', users.logout); 11 | app.get('/user', users.all); 12 | 13 | app.get('/', function(req, res) { 14 | require('fs').readFile(config.root + '/public/index.html', 'utf8', function(err, text){ 15 | res.send(text); 16 | }); 17 | }); 18 | }; -------------------------------------------------------------------------------- /Topics/03. Consuming Web Services/demos/README.md: -------------------------------------------------------------------------------- 1 | #Consuming Remote Data Demos 2 | 3 | ##Running the Demos 4 | * Install [JavaScript I/O](https://iojs.org/en/index.html) 5 | * Run in Terminal/CMD `$ npm install` 6 | * Run in Terminal/CMD `$ npm start` 7 | * Go to http://localhost:8887 and run demos from there 8 | 9 | ##Running Demos 8 and 9 10 | * Install [JavaScript I/O](https://iojs.org/en/index.html) 11 | * Run in Terminal/CMD `$ npm install` 12 | * Run in Terminal/CMD `$ npm start` 13 | * Run in another Terminal/CMD `$ cd server` 14 | * Run in Terminal/CMD `$ npm install` 15 | * Run in Terminal/CMD `$ npm start` 16 | * Go to http://localhost:8887 and run demos 8 and 9 from there 17 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/2. loopgifs-demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jspm-demo", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "jspm": { 12 | "directories": {}, 13 | "dependencies": { 14 | "jsonp": "npm:jsonp@^0.2.0", 15 | "traceur": "github:jmcriffey/bower-traceur@^0.0.91" 16 | }, 17 | "devDependencies": { 18 | "babel": "npm:babel-core@^5.1.13", 19 | "babel-runtime": "npm:babel-runtime@^5.1.13", 20 | "core-js": "npm:core-js@^0.9.4" 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/4. persons/app-modules/main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import 'jquery'; 4 | 5 | const startButton = 6 | $('
    16 | 17 | 18 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/public/js/templates/login.handlebars: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |
    7 | 10 |
    11 | -------------------------------------------------------------------------------- /Topics/09. Unit testing - Spies and Mocks with Sinon/demos/live-demo/spies.js: -------------------------------------------------------------------------------- 1 | let sinon = require('sinon'); 2 | 3 | 4 | let spyFunction = sinon.spy(); 5 | 6 | spyFunction(); 7 | spyFunction(2, 3, 4); 8 | spyFunction(7, 6, [1, 'asdf', {}]); 9 | 10 | 11 | function sum(...numbers) { 12 | if(numbers.length === 0) { 13 | throw 'No numbers'; 14 | } 15 | 16 | return numbers.reduce((a, b) => a + b); 17 | } 18 | 19 | let s = sum(1, 6, 8, 9, 13); 20 | console.log(s); 21 | 22 | let sumSpied = sinon.spy(sum); 23 | 24 | let obj = {}; 25 | 26 | sumSpied(4, 3, 2, 1); 27 | try { 28 | sumSpied(); 29 | } 30 | catch(e) {} 31 | 32 | sumSpied(1); 33 | 34 | console.log(sumSpied.calledWithExactly(4, 3, 2, 1)); 35 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/public/templates/register.handlebars: -------------------------------------------------------------------------------- 1 |
    2 | Register a new User 3 | 4 |
    5 |
    6 |
    7 | 8 | 9 |
    10 |
    11 | 12 | 13 |
    14 | 15 |
    16 |
    17 |
    18 | -------------------------------------------------------------------------------- /Sample Exams/self manager/public/templates/events.handlebars: -------------------------------------------------------------------------------- 1 | 10 |

    Events

    11 | Add new 12 | {{#each this}} 13 |

    {{category}}

    14 | {{#each items}} 15 |
    16 |

    {{title}} 17 | X 18 |

    19 | {{timeRemaining}}, on 20 | {{date}} 21 |

    {{description}}

    22 |
    23 | {{/each}} 24 | {{/each}} 25 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/shop-app/app/templates/login-old.handlebars: -------------------------------------------------------------------------------- 1 |

    Login

    2 | 3 |
    4 |
    5 | 6 | 7 |
    8 |
    9 | 10 | 11 |
    12 | 13 | 14 |
    -------------------------------------------------------------------------------- /Sample Exams/self manager/polyfills/array.js: -------------------------------------------------------------------------------- 1 | if (!Array.prototype.find) { 2 | Array.prototype.find = function(predicate) { 3 | if (this === null) { 4 | throw new TypeError('Array.prototype.find called on null or undefined'); 5 | } 6 | if (typeof predicate !== 'function') { 7 | throw new TypeError('predicate must be a function'); 8 | } 9 | var list = Object(this); 10 | var length = list.length >>> 0; 11 | var thisArg = arguments[1]; 12 | var value; 13 | 14 | for (var i = 0; i < length; i++) { 15 | value = list[i]; 16 | if (predicate.call(thisArg, value, i, list)) { 17 | return value; 18 | } 19 | } 20 | return undefined; 21 | }; 22 | } 23 | -------------------------------------------------------------------------------- /Sample Exams/self manager/public/app/templates.js: -------------------------------------------------------------------------------- 1 | var templates = function() { 2 | var handlebars = window.handlebars || window.Handlebars, 3 | Handlebars = window.handlebars || window.Handlebars, 4 | cache = {}; 5 | 6 | function get(name) { 7 | var promise = new Promise(function(resolve, reject) { 8 | if (cache[name]) { 9 | resolve(cache[name]); 10 | return; 11 | } 12 | var url = `templates/${name}.handlebars`; 13 | $.get(url, function(html) { 14 | var template = handlebars.compile(html); 15 | cache[name] = template; 16 | resolve(template); 17 | }); 18 | }); 19 | return promise; 20 | } 21 | 22 | return { 23 | get: get 24 | }; 25 | }(); 26 | -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/demos/1. callbacks/1.1. simple-callback.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
    9 | 10 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/demo/docProps/app.xml: -------------------------------------------------------------------------------- 1 | 2 | 0119Microsoft Office Word011falsefalse9falsefalse15.0000 -------------------------------------------------------------------------------- /Topics/05. Routing/demos/sample-routes/js/main.js: -------------------------------------------------------------------------------- 1 | import { jquery } from 'jquery' 2 | 3 | $(() => { 4 | const result = $('#result'), 5 | router = new Navigo(null, false); 6 | 7 | function print(text) { 8 | result.text(JSON.stringify(text)); 9 | } 10 | 11 | router 12 | .on('test', (params) => { 13 | print(params); 14 | }) 15 | //.on('book/:id/note/:noteId', print) // order matters 16 | .on({ 17 | //'book/:id/note/:noteId' : print // order does not matter 18 | 'book/:id': params => print(params), 19 | //'book/:id/note/:noteId' : print 20 | '*': () => print('home') // all routs lead to home page 21 | }) 22 | .on('book/:id/note/:noteId', print) 23 | .resolve(); 24 | }) -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/public/templates/events.handlebars: -------------------------------------------------------------------------------- 1 | 10 |

    Events

    11 | Add new 12 | {{#each this}} 13 |

    {{category}}

    14 | {{#each items}} 15 |
    16 |

    {{title}} 17 | X 18 |

    19 | {{timeRemaining}}, on 20 | {{date}} 21 |

    {{description}}

    22 |
    23 | {{/each}} 24 | {{/each}} 25 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/polyfills/array.js: -------------------------------------------------------------------------------- 1 | if (!Array.prototype.find) { 2 | Array.prototype.find = function(predicate) { 3 | if (this === null) { 4 | throw new TypeError('Array.prototype.find called on null or undefined'); 5 | } 6 | if (typeof predicate !== 'function') { 7 | throw new TypeError('predicate must be a function'); 8 | } 9 | var list = Object(this); 10 | var length = list.length >>> 0; 11 | var thisArg = arguments[1]; 12 | var value; 13 | 14 | for (var i = 0; i < length; i++) { 15 | value = list[i]; 16 | if (predicate.call(thisArg, value, i, list)) { 17 | return value; 18 | } 19 | } 20 | return undefined; 21 | }; 22 | } 23 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/Workshop_25-April-2017_Self_Manager/polyfills/array.js: -------------------------------------------------------------------------------- 1 | if (!Array.prototype.find) { 2 | Array.prototype.find = function(predicate) { 3 | if (this === null) { 4 | throw new TypeError('Array.prototype.find called on null or undefined'); 5 | } 6 | if (typeof predicate !== 'function') { 7 | throw new TypeError('predicate must be a function'); 8 | } 9 | var list = Object(this); 10 | var length = list.length >>> 0; 11 | var thisArg = arguments[1]; 12 | var value; 13 | 14 | for (var i = 0; i < length; i++) { 15 | value = list[i]; 16 | if (predicate.call(thisArg, value, i, list)) { 17 | return value; 18 | } 19 | } 20 | return undefined; 21 | }; 22 | } 23 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_20-April-2017_Fortune_Cookies/public/js/requester.js: -------------------------------------------------------------------------------- 1 | function request(url, type, body, headers) { 2 | const promise = new Promise((resolve, reject) => $.ajax({ 3 | url, 4 | type, 5 | contentType: 'application/json', 6 | headers, 7 | data: body, 8 | success: resolve, 9 | error: reject 10 | })); 11 | 12 | return promise; 13 | } 14 | 15 | export function get(url, headers = {}) { 16 | return request(url, 'GET', '', headers); 17 | } 18 | 19 | export function post(url, body, headers = {}) { 20 | return request(url, 'POST', JSON.stringify(body), headers); 21 | } 22 | 23 | export function put(url, body, headers = {}) { 24 | return request(url, 'PUT', JSON.stringify(body), headers); 25 | } 26 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/solution-doncho/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Forture-Cookies-Sep-2015", 3 | "version": "0.0.0", 4 | "authors": [ 5 | "AzSymDoncho az_sym@minkov.it>" 6 | ], 7 | "license": "MIT", 8 | "ignore": [ 9 | "**/.*", 10 | "node_modules", 11 | "bower_components", 12 | "public/bower_components", 13 | "test", 14 | "tests" 15 | ], 16 | "dependencies": { 17 | "bootstrap": "~3.3.5", 18 | "handlebars": "~4.0.2", 19 | "jquery": "~2.1.4", 20 | "jquery-ui": "~1.11.4", 21 | "lodash": "~3.10.1", 22 | "moment": "~2.10.6", 23 | "sammy": "~0.7.6", 24 | "sha1": "http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha1.js", 25 | "toastr": "~2.1.2" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/solution-doncho/public/js/app/polyfills/array.js: -------------------------------------------------------------------------------- 1 | if (!Array.prototype.find) { 2 | Array.prototype.find = function(predicate) { 3 | if (this === null) { 4 | throw new TypeError('Array.prototype.find called on null or undefined'); 5 | } 6 | if (typeof predicate !== 'function') { 7 | throw new TypeError('predicate must be a function'); 8 | } 9 | var list = Object(this); 10 | var length = list.length >>> 0; 11 | var thisArg = arguments[1]; 12 | var value; 13 | 14 | for (var i = 0; i < length; i++) { 15 | value = list[i]; 16 | if (predicate.call(thisArg, value, i, list)) { 17 | return value; 18 | } 19 | } 20 | return undefined; 21 | }; 22 | } 23 | -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/demos/2. promises/2.5. promise-race.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | function getCourse(courseId) { 3 | var courses = { 4 | 1: { name: 'JavaScript Fundamentals'}, 5 | 2: { name: 'JavaScript OOP'}, 6 | 3: { name: 'JavaScript UI & DOM'}, 7 | 4: { name: 'JavaScript Applications'}, 8 | }; 9 | return Promise.resolve(courses[courseId]); 10 | } 11 | 12 | var courseIds = [1,2,3,4]; 13 | var promises = []; 14 | for (var i=0;i 2 | evlogievlogi22015-08-24T17:51:00Z2015-08-24T17:51:00Z -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/public/app/templates.js: -------------------------------------------------------------------------------- 1 | var templates = function() { 2 | var handlebars = window.handlebars || window.Handlebars, 3 | Handlebars = window.handlebars || window.Handlebars, 4 | cache = {}; 5 | 6 | function get(name) { 7 | var promise = new Promise(function(resolve, reject) { 8 | if (cache[name]) { 9 | resolve(cache[name]); 10 | return; 11 | } 12 | var url = `templates/${name}.handlebars`; 13 | $.get(url, function(html) { 14 | var template = handlebars.compile(html); 15 | cache[name] = template; 16 | resolve(template); 17 | }); 18 | }); 19 | return promise; 20 | } 21 | 22 | return { 23 | get: get 24 | }; 25 | }(); 26 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/shop-app/app/templates/login.handlebars: -------------------------------------------------------------------------------- 1 |
    2 | 3 | 16 | 17 |
    -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/demos/live-demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
    8 | 9 | 10 | 11 | 12 | 13 | 17 | 18 | 19 | 22 | 23 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/public/js/app.js: -------------------------------------------------------------------------------- 1 | import 'sammy' 2 | import 'jquery' 3 | import usersController from 'js/controllers/usersController.js' 4 | import postsController from 'js/controllers/postsController.js' 5 | 6 | var containerId = '#main'; 7 | var sammyApp = Sammy(containerId, function() { 8 | this.get('#/', function() { 9 | this.redirect('#/posts'); 10 | }); 11 | 12 | this.get('#/register', usersController.register); 13 | this.get('#/login', usersController.login); 14 | this.get('#/logout', usersController.logout); 15 | 16 | this.get('#/posts', postsController.all); 17 | this.get('#/posts/:size/:page', postsController.all); 18 | this.get('#/post/new', postsController.add); 19 | }); 20 | 21 | sammyApp.run('#/'); -------------------------------------------------------------------------------- /Topics/06. Handlebars/demos/simple-SPA/public/scripts/template-loader.js: -------------------------------------------------------------------------------- 1 | // import { Handlebars } from '../node_modules/handlebars/dist/handlebars.js'; 2 | 3 | const templateLoader = (() => { 4 | const templatesCache = {}; 5 | 6 | function get(templateName) { 7 | return new Promise((resolve, reject) => { 8 | if (templatesCache[templateName]) { 9 | resolve(Handlebars.compile(templatesCache[templateName])); 10 | } 11 | 12 | $.get(`./templates/${templateName}.handlebars`, template => { 13 | templatesCache[templateName] = template; 14 | resolve(Handlebars.compile(template)); 15 | }) 16 | }) 17 | } 18 | 19 | return { get }; 20 | })(); 21 | 22 | export { templateLoader }; -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/demos/html-reporter/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mocha-html-reporter", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "dependencies": { 6 | "istanbul": "^0.3.19", 7 | "sinon": "^1.16.1" 8 | }, 9 | "devDependencies": {}, 10 | "scripts": { 11 | "test": "echo \"Error: no test specified\" && exit 1" 12 | }, 13 | "author": "Doncho Minkov (DonchoMinkov@gmail.com)", 14 | "license": "MIT", 15 | "repository": { 16 | "type": "git", 17 | "url": "git://github.com/telerikacademy/javascript-applications.git" 18 | }, 19 | "bugs": { 20 | "url": "https://github.com/telerikacademy/javascript-applications/issues" 21 | }, 22 | "homepage": "https://github.com/telerikacademy/javascript-applications#readme", 23 | "description": "" 24 | } 25 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_20-April-2017_Fortune_Cookies/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fortune-cookies", 3 | "version": "1.0.0", 4 | "description": "## App description", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node app.js" 8 | }, 9 | "author": "Doncho Minkov (donchominkov@gmail.com)", 10 | "license": "MIT", 11 | "dependencies": { 12 | "body-parser": "^1.13.3", 13 | "bootstrap": "^3.3.7", 14 | "cryptojs": "^2.5.3", 15 | "express": "^4.13.3", 16 | "handlebars": "^4.0.6", 17 | "jquery": "^3.2.1", 18 | "lodash": "^3.10.1", 19 | "lowdb": "^0.10.2", 20 | "systemjs": "^0.20.12", 21 | "systemjs-plugin-babel": "0.0.21", 22 | "systemjs-plugin-text": "0.0.9", 23 | "toastr": "^2.1.2", 24 | "underscore-db": "^0.9.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Workshops/Workshops-2015/shop-app/app/templates/shops.handlebars: -------------------------------------------------------------------------------- 1 |

    Shops

    2 | 3 | 4 | 5 | 6 | 10 | 11 | 12 | 13 | 14 | {{#shops}} 15 | 16 | 17 | 23 | 24 | {{/shops}} 25 | 26 |
    7 | 8 | 9 |
    {{name}} 18 | Info 19 | {{#if iAmOwner}} 20 | 21 | {{/if}} 22 |
    -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/2. loopgifs-demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Loop GIFs 6 | 19 | 20 | 21 |
    22 |

    GIFS GO HERE!!

    23 |
    24 | 25 | 26 | 27 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Topics/03. Consuming Web Services/demos/3. http-status-codes.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Consuming Remote Data: Using xhr 6 | 7 | 8 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/demos/other-reporters/tests/tests-sum.js: -------------------------------------------------------------------------------- 1 | let expect = require('chai').expect, 2 | sum = require('../app/app'); 3 | 4 | describe('#sum', function() { 5 | it('expect sum(1,2,3) to equal 6', function() { 6 | const actual = sum(1, 2, 3), 7 | expected = 6; 8 | expect(actual).to.equal(expected); 9 | }) 10 | it('expect sum([1,2,3]) to equal 6', function() { 11 | const actual = sum([1, 2, 3]), 12 | expected = 6; 13 | expect(actual).to.equal(expected); 14 | }) 15 | it('expect sum() to equal 0', function() { 16 | const actual = sum(), 17 | expected = 0; 18 | expect(actual).to.equal(expected); 19 | }) 20 | it('expect sum([]) to equal 0', function() { 21 | const actual = sum([]), 22 | expected = 0; 23 | expect(actual).to.equal(expected); 24 | }) 25 | }); 26 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/03. Unit-testing/public/templates/home.html: -------------------------------------------------------------------------------- 1 |

    Cookies!

    2 |
      3 | {{#each result}} 4 |
    • 5 |

      {{text}}

      6 | Likes: {{likes}} 7 | Dislikes: {{dislikes}} 8 |
      9 | 10 | 11 |
      12 |
      13 |

      Category: {{category}}

      14 |
      15 | 16 |
      17 |
    • 18 | {{/each}} 19 |
    -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/config/config.js: -------------------------------------------------------------------------------- 1 | var path = require('path'), 2 | rootPath = path.normalize(__dirname + '/..'), 3 | env = process.env.NODE_ENV || 'development'; 4 | 5 | var config = { 6 | development: { 7 | root: rootPath, 8 | app: { 9 | name: 'crowd-share' 10 | }, 11 | port: 3000, 12 | db: 'mongodb://localhost/crowd-share-development' 13 | }, 14 | 15 | test: { 16 | root: rootPath, 17 | app: { 18 | name: 'crowd-share' 19 | }, 20 | port: 3000, 21 | db: 'mongodb://localhost/crowd-share-test' 22 | }, 23 | 24 | production: { 25 | root: rootPath, 26 | app: { 27 | name: 'crowd-share' 28 | }, 29 | port: 3000, 30 | db: 'mongodb://localhost/crowd-share-production' 31 | } 32 | }; 33 | 34 | module.exports = config[env]; 35 | -------------------------------------------------------------------------------- /Workshops/Workshops-2016/02. Creating-SPA-apps/public/templates/home.html: -------------------------------------------------------------------------------- 1 |

    Cookies!

    2 |
      3 | {{#each result}} 4 |
    • 5 |

      {{text}}

      6 | Likes: {{likes}} 7 | Dislikes: {{dislikes}} 8 |
      9 | 10 | 11 |
      12 |
      13 |

      Category: {{category}}

      14 |
      15 | 16 |
      17 |
    • 18 | {{/each}} 19 |
    -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/demo/word/_rels/document.xml.rels: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Sample Exams/self manager/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vouchers-app", 3 | "version": "0.0.0", 4 | "homepage": "https://github.com/telerikacademy/javascript-applications", 5 | "authors": [ 6 | "Doncho Minkov " 7 | ], 8 | "license": "MIT", 9 | "ignore": [ 10 | "**/.*", 11 | "node_modules", 12 | "bower_components", 13 | "test", 14 | "tests" 15 | ], 16 | "dependencies": { 17 | "bootstrap": "~3.3.5", 18 | "cryptojslib": "~3.1.2", 19 | "handlebars": "~4.0.0", 20 | "jquery": "~2.1.4", 21 | "jquery-ui": "jqueryui#~1.11.4", 22 | "jt.timepicker": "jquery-timepicker-jt#~1.8.1", 23 | "lodash": "~3.10.1", 24 | "moment": "~2.10.6", 25 | "sammy": "~0.7.6", 26 | "sha1": "http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha1.js", 27 | "toastr": "~2.1.2" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/public/js/templates/register.handlebars: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
    12 | 15 |
    16 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/1. markdown-component/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Markdown component 6 | 7 | 8 | 11 | 12 | 13 |
    14 | 15 | # This is markdown component 16 | 17 | It parses markdown with web components and ES6 modules 18 | 19 | ```javascript 20 | System.import('se6').then(function(modules) { 21 | // yay 22 | }); 23 | ``` 24 | 25 |
    26 |
    27 | 28 |
    29 | 30 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_20-April-2017_Fortune_Cookies/public/js/app.js: -------------------------------------------------------------------------------- 1 | import 'jquery'; 2 | 3 | import { MyRouter } from 'myRouter'; 4 | import * as homeController from 'homeController'; 5 | import * as myCookieController from 'myCookieController'; 6 | import * as userController from 'userController'; 7 | 8 | const router = new MyRouter(); 9 | 10 | router 11 | .on('', () => location.hash = '#/home') // fix later 12 | .on('/', () => location.hash = '#/home') 13 | .on('/home', homeController.get) 14 | .on('/home/:category', homeController.get) 15 | .on('/my-cookie', myCookieController.get) 16 | .on('/auth', userController.get) 17 | .on('/login', userController.login) 18 | .on('/register', userController.register) 19 | .on('/logout', userController.logout); 20 | 21 | $(window).on('load', () => router.navigate()); 22 | $(window).on('hashchange', () => router.navigate()); 23 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/solution-doncho/public/templates/cookie-add.handlebars: -------------------------------------------------------------------------------- 1 |
    2 | Add new Cookie 3 |
    4 |
    5 | 8 | 9 |
    10 |
    11 | 12 | 13 |
    14 |
    15 | 16 | 17 |
    18 | 19 |
    20 | 21 |
    22 | -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/demos/2. promises/2.2. promise-chaining.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | function getOrder(orderId) { 3 | //return Promise.reject('no connection!'); 4 | return Promise.resolve({userId:35}); 5 | } 6 | function getUser(userId) { 7 | //return Promise.reject('no connection!'); 8 | return Promise.resolve({companyId:18}); 9 | } 10 | function getCompany(companyId) { 11 | //return Promise.reject('no connection!'); 12 | return Promise.resolve({name:'Telerik Academy'}); 13 | } 14 | 15 | getOrder(3).then(function(order){ 16 | return getUser(order.userId); 17 | }).then(function(user){ 18 | return getCompany(user.companyId); 19 | }).then(function(company){ 20 | console.log(company.name); 21 | }).catch(function(error){ 22 | console.log(error); 23 | }); 24 | }()); -------------------------------------------------------------------------------- /Topics/09. Unit testing - Spies and Mocks with Sinon/demos/spies/test.js: -------------------------------------------------------------------------------- 1 | let sinon = require('sinon'); 2 | 3 | let spyFunction = sinon.spy(); 4 | 5 | console.log(spyFunction.called); // should be false 6 | spyFunction(); 7 | console.log(spyFunction.called); // should be true 8 | 9 | 10 | 11 | 12 | 13 | function sum(...numbers) { 14 | return numbers.reduce((a, b) => a + b); 15 | } 16 | 17 | let sumSpied = sinon.spy(sum); 18 | 19 | let s = sumSpied(1, 6, 3, 7); 20 | console.log(s); // 1 + 6 + 3 + 7 = 17 21 | 22 | console.log(sumSpied.getCall(0).args[0], 23 | sumSpied.getCall(0).args[1], 24 | sumSpied.getCall(0).args[2], 25 | sumSpied.getCall(0).args[3]); 26 | 27 | 28 | 29 | 30 | 31 | sinon.spy(console, "log"); 32 | 33 | const before = console.log.called; 34 | console.log('Calling console.log()'); 35 | const after= console.log.called; 36 | console.log(before); 37 | console.log(after); 38 | 39 | console.log.restore(); 40 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "self-manager", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node app.js" 8 | }, 9 | "author": "Doncho Minkov (DonchoMinkov@gmail.com)", 10 | "license": "MIT", 11 | "dependencies": { 12 | "body-parser": "^1.13.3", 13 | "bootstrap": "^3.3.7", 14 | "crypto-js": "^3.1.9-1", 15 | "express": "^4.13.3", 16 | "handlebars": "^4.0.7", 17 | "jquery": "^3.2.1", 18 | "jquery-ui": "^1.12.1", 19 | "lodash": "^3.10.1", 20 | "lowdb": "^0.10.2", 21 | "moment": "^2.18.1", 22 | "sammy": "^0.7.6", 23 | "sha1": "^1.1.1", 24 | "toastr": "^2.1.2", 25 | "underscore-db": "^0.9.0" 26 | }, 27 | "devDependencies": { 28 | "chai": "^3.5.0", 29 | "mocha": "^3.3.0", 30 | "sinon": "^2.2.0", 31 | "sinon-chai": "^2.10.0" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Topics/03. Consuming Web Services/demos/4. http-response.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Consuming Remote Data: Using xhr 6 | 7 | 8 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Sample Exams/self manager/public/controllers/notificationsController.js: -------------------------------------------------------------------------------- 1 | var notificationsController = (function() { 2 | 3 | function all(context) { 4 | var notifications; 5 | data.notifications.get() 6 | .then(function(resNotifications) { 7 | notifications = resNotifications; 8 | 9 | return templates.get('notifications'); 10 | }) 11 | .then(function(template) { 12 | context.$element().html(template(notifications)); 13 | 14 | $('.btn-confirm').on('click', function() { 15 | var senderId = $(this).parents('.notification-box').attr('data-sender-id'); 16 | data.friends.confirm(senderId) 17 | .then(function(msg) { 18 | toastr.success(msg.message); 19 | }); 20 | }); 21 | }) 22 | .catch(function(err) { 23 | console.log(err); 24 | }); 25 | } 26 | 27 | return { 28 | all: all 29 | }; 30 | }()); 31 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/3. live-demo/app/db.js: -------------------------------------------------------------------------------- 1 | import storageLoader from './storage.js'; 2 | import './array-polyfills.js'; 3 | 4 | var storage = storageLoader.get('local'); 5 | 6 | let storageKey = 'data-items'; 7 | let items = storage.load(storageKey) || []; 8 | 9 | let idGenetaror = function () { 10 | let id = 0; 11 | return { 12 | next: function () { 13 | return id += 1; 14 | } 15 | } 16 | }(); 17 | 18 | function add(item) { 19 | item.id = idGenetaror.next(); 20 | items.push(item); 21 | storage.save(storageKey, items); 22 | } 23 | 24 | function all() { 25 | return items.slice(); 26 | } 27 | 28 | function removeById(id){ 29 | var itemToDeleteIndex = items.findIndex((item) => { 30 | return item.id === id 31 | }); 32 | if(itemToDeleteIndex<0){ 33 | throw new Error('Invalid id'); 34 | } 35 | items.splice(itemToDeleteIndex, 1); 36 | storage.save(storageKey, items); 37 | } 38 | 39 | export default { 40 | add, all,removeById 41 | }; -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simple-spa-apps-with-sammyjs-and-jquery", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "dependencies": { 7 | "http-server": "^0.8.0", 8 | "openurl": "^1.1.0" 9 | }, 10 | "devDependencies": {}, 11 | "scripts": { 12 | "start": "node ./node_modules/http-server/bin/http-server -p 8010" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/TelerikAcademy/JavaScript-Applications.git" 17 | }, 18 | "keywords": [ 19 | "sammy.js", 20 | "jquery", 21 | "spa", 22 | "single-page-applications" 23 | ], 24 | "author": "Doncho Minkov (DonchoMinkov@gmail.com)", 25 | "license": "MIT", 26 | "bugs": { 27 | "url": "https://github.com/TelerikAcademy/JavaScript-Applications/issues" 28 | }, 29 | "homepage": "https://github.com/TelerikAcademy/JavaScript-Applications#readme" 30 | } 31 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/public/controllers/notificationsController.js: -------------------------------------------------------------------------------- 1 | var notificationsController = (function() { 2 | 3 | function all(context) { 4 | var notifications; 5 | data.notifications.get() 6 | .then(function(resNotifications) { 7 | notifications = resNotifications; 8 | 9 | return templates.get('notifications'); 10 | }) 11 | .then(function(template) { 12 | context.$element().html(template(notifications)); 13 | 14 | $('.btn-confirm').on('click', function() { 15 | var senderId = $(this).parents('.notification-box').attr('data-sender-id'); 16 | data.friends.confirm(senderId) 17 | .then(function(msg) { 18 | toastr.success(msg.message); 19 | }); 20 | }); 21 | }) 22 | .catch(function(err) { 23 | console.log(err); 24 | }); 25 | } 26 | 27 | return { 28 | all: all 29 | }; 30 | }()); 31 | -------------------------------------------------------------------------------- /Sample Exams/self manager/app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'), 2 | bodyParser = require('body-parser'), 3 | low = require('lowdb'); 4 | 5 | var app = express(), 6 | db = low('data/data.json'); 7 | 8 | db._.mixin(require('underscore-db')); 9 | 10 | app.use(bodyParser.json()); 11 | app.use(express.static('public')); 12 | 13 | var usersRouter = require('./routers/usersRouter')(db); 14 | var todosRouter = require('./routers/todosRouter')(db); 15 | var eventsRouter = require('./routers/eventsRouter')(db); 16 | var categoriesRouter = require('./routers/categoriesRouter')(db); 17 | 18 | require('./utils/authorized-user')(app, db); 19 | 20 | app.use('/api/users', usersRouter); 21 | app.use('/api/todos', todosRouter); 22 | app.use('/api/events', eventsRouter); 23 | app.use('/api/categories', categoriesRouter); 24 | 25 | var port = process.env.PORT || 3013; 26 | 27 | app.listen(port, function() { 28 | console.log('Server is running at http://localhost:' + port); 29 | }); 30 | -------------------------------------------------------------------------------- /Topics/07. Web Storages/demos/4. web-storages-save-objects.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | JavaScript APIs - local and session storage 4 | 5 | 6 | 7 | 8 | 33 | 34 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/public/js/cookie.js: -------------------------------------------------------------------------------- 1 | export default { 2 | set: function (cname, cvalue, exdays) { 3 | var d = new Date(); 4 | d.setTime(d.getTime() + (exdays*24*60*60*1000)); 5 | var expires = "expires=" + d.toUTCString(); 6 | document.cookie = cname + "=" + cvalue + "; " + expires; 7 | }, 8 | get: function (cname) { 9 | var name = cname + "="; 10 | var ca = document.cookie.split(';'); 11 | for(var i=0; iYour Hourly Cookie! 2 |
    3 |

    {{text}} 4 | 5 | 8 | 11 | 12 |

    13 | 14 | 15 |
    16 |

    17 | Category: {{category}} Date: 18 |

    19 |

    20 | {{shareDate}} 21 |

    22 |

    Likes: 23 | 24 | , Dislikes: 25 | {{dislikes}} 26 |

    27 |
    28 |
    29 | -------------------------------------------------------------------------------- /Topics/03. Consuming Web Services/demos/server/tools/validator.js: -------------------------------------------------------------------------------- 1 | const PERSON_MIN_NAME_LENGTH = 3, 2 | PERSON_MAX_NAME_LENGTH = 30, 3 | PERSON_MIN_AGE = 0, 4 | PERSON_MAX_AGE = 150; 5 | 6 | module.exports = { 7 | validatePerson: function(person) { 8 | if (typeof person !== 'object' || person === null) { 9 | return { 10 | err: 'Person cannot be null' 11 | }; 12 | } 13 | if (typeof person.name !== 'string' || 14 | person.name.length < PERSON_MIN_NAME_LENGTH || 15 | person.name.length > PERSON_MAX_NAME_LENGTH) { 16 | 17 | return { 18 | err: `Name must be a string with length between ${PERSON_MIN_NAME_LENGTH} and ${PERSON_MAX_NAME_LENGTH}` 19 | }; 20 | } 21 | 22 | if (typeof person.age !== 'number' || 23 | person.age < PERSON_MIN_AGE || 24 | person.age > PERSON_MAX_AGE) { 25 | return { 26 | err: `Age must be a number between ${PERSON_MIN_AGE} and ${PERSON_MAX_AGE}` 27 | }; 28 | } 29 | return null; 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/solution-doncho/public/js/controllers/users.js: -------------------------------------------------------------------------------- 1 | var controllers = controllers || {}; 2 | (function(scope) { 3 | 4 | function register(context) { 5 | templates.get('register') 6 | .then(function(template) { 7 | context.$element().html(template()); 8 | 9 | $('#btn-register').on('click', function() { 10 | var user = { 11 | username: $('#tb-reg-username').val(), 12 | password: $('#tb-reg-pass').val() 13 | }; 14 | 15 | data.users.register(user) 16 | .then(function() { 17 | toastr.success('User registered!'); 18 | setTimeout(function() { 19 | context.redirect('#/'); 20 | document.location.reload(true); 21 | }, 1000); 22 | }, function(err){ 23 | toastr.error(err); 24 | }); 25 | }); 26 | }); 27 | } 28 | 29 | scope.users = { 30 | register: register 31 | }; 32 | }(controllers)); 33 | -------------------------------------------------------------------------------- /Topics/07. Web Storages/demos/1. cookies.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | JavaScript APIs - Cookies 5 | 6 | 9 | 10 | 11 | 12 |

    Run on server! Starting it on file://... will not work

    13 | 14 | 15 | create cookie 16 | read cookie 17 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Topics/06. Handlebars/demos/simple-SPA/public/templates/threads.handlebars: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |

    Threads

    5 |
    6 | 7 |
    8 | {{#result}} 9 |
    10 | 11 |
    12 | {{/result}} 13 | 14 | 23 |
    24 | 25 |
    26 |
    -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/public/js/templates/posts.handlebars: -------------------------------------------------------------------------------- 1 |
    2 | 11 | 12 | 19 | 20 | 21 |
    22 | 23 |
    24 | {{#posts}} 25 |
    26 | {{id}} - {{title}}: "{{body}}" by {{user.username}} 27 |
    28 | {{/posts}} 29 |
    30 | 31 |
    32 | 33 | 34 | 35 |
    -------------------------------------------------------------------------------- /Topics/05. Routing/demos/getting-query-params/js/main.js: -------------------------------------------------------------------------------- 1 | import { jquery } from 'jquery' 2 | 3 | $(() => { 4 | let result = $('#result'), 5 | router = new Navigo(null, false); 6 | 7 | function print(obj) { 8 | console.log(JSON.stringify(obj)); 9 | } 10 | 11 | router 12 | .on('test/?:query', (params) => { 13 | print(params); 14 | print(getQueryParams(params.query)); 15 | }) 16 | .on('book/:id/note/:noteId/?:query', (params) => print(params)) 17 | .on('book/:id/note/:noteId', print) 18 | .on({ 19 | 'book/:id/?:query': params => { 20 | print(params); 21 | print(getQueryParams(params.query)) 22 | }, 23 | 'book/:id': params => print(params), 24 | '*': () => print('home') 25 | }).resolve(); 26 | 27 | 28 | function getQueryParams(query) { 29 | let hash, vars = {}, 30 | hashes = query.substr(1) 31 | .split('&').forEach(val => { 32 | hash = val.split('='); 33 | vars[hash[0]] = hash[1]; 34 | }); 35 | return vars; 36 | } 37 | 38 | }) -------------------------------------------------------------------------------- /Workshops/Workshops-2017/Workshop_25-April-2017_Self_Manager/app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'), 2 | bodyParser = require('body-parser'), 3 | low = require('lowdb'); 4 | 5 | var app = express(), 6 | db = low('data/data.json'); 7 | 8 | db._.mixin(require('underscore-db')); 9 | 10 | app.use(bodyParser.json()); 11 | app.use(express.static('public')); 12 | app.use('/libs', express.static('node_modules')); 13 | 14 | var usersRouter = require('./routers/usersRouter')(db); 15 | var todosRouter = require('./routers/todosRouter')(db); 16 | var eventsRouter = require('./routers/eventsRouter')(db); 17 | var categoriesRouter = require('./routers/categoriesRouter')(db); 18 | 19 | require('./utils/authorized-user')(app, db); 20 | 21 | app.use('/api/users', usersRouter); 22 | app.use('/api/todos', todosRouter); 23 | app.use('/api/events', eventsRouter); 24 | app.use('/api/categories', categoriesRouter); 25 | 26 | var port = process.env.PORT || 3013; 27 | 28 | app.listen(port, function() { 29 | console.log('Server is running at http://localhost:' + port); 30 | }); 31 | -------------------------------------------------------------------------------- /Topics/08. Unit Testing Basics/demos/other-reporters/results.html: -------------------------------------------------------------------------------- 1 |
    2 |

    #sum

    3 |
    4 |
    expect sum(1,2,3) to equal 6
    5 |
    var actual = sum(1, 2, 3),
     6 |   expected = 6;
     7 | expect(actual).to.equal(expected);
    8 |
    TypeError: undefined is not a function
    9 |
    expect sum([1,2,3]) to equal 6
    10 |
    var actual = sum([1, 2, 3]),
    11 |   expected = 6;
    12 | expect(actual).to.equal(expected);
    13 |
    expect sum() to equal 0
    14 |
    var actual = sum(),
    15 |   expected = 0;
    16 | expect(actual).to.equal(expected);
    17 |
    TypeError: Cannot read property 'reduce' of undefined
    18 |
    expect sum([]) to equal 0
    19 |
    var actual = sum([]),
    20 |   expected = 0;
    21 | expect(actual).to.equal(expected);
    22 |
    23 |
    24 | -------------------------------------------------------------------------------- /Topics/05. Routing/demos/sample-routes/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 |

    Static paths

    19 | Test
    20 | Settings
    21 | Quit
    22 |
    23 |

    Dynamic paths

    24 | Book1
    25 | Book2
    26 | Note1
    27 | Note2
    28 |
    29 |

    Query strings

    30 | Test
    31 | Book1
    32 | Note1
    33 |
    34 |

    Output

    35 |
    36 | 37 | 38 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/solution-doncho/public/css/main.css: -------------------------------------------------------------------------------- 1 | html { 2 | min-height: 100%; 3 | position: relative; 4 | } 5 | body { 6 | margin-bottom: 60px; 7 | } 8 | .footer { 9 | background-color: #f5f5f5; 10 | bottom: 0; 11 | height: 60px; 12 | position: absolute; 13 | width: 100%; 14 | } 15 | body > .container { 16 | padding: 60px 15px 0; 17 | } 18 | .container .text-muted { 19 | margin: 20px 0; 20 | } 21 | .footer > .container { 22 | padding-left: 15px; 23 | padding-right: 15px; 24 | } 25 | code { 26 | font-size: 80%; 27 | } 28 | .cookie-box { 29 | border-bottom: 1px solid gray; 30 | border-right: 1px solid gray; 31 | padding-right: 30px; 32 | padding-bottom: 30px; 33 | margin-left: 30px; 34 | } 35 | .cookie-box:nth-of-type(2n) { 36 | border-right: none; 37 | padding-right: 0; 38 | margin-left: 0 39 | } 40 | 41 | .cookie-box{ 42 | height: 300px; 43 | } 44 | 45 | .cookies-list img{ 46 | max-height: 280px !important; 47 | } 48 | 49 | img{ 50 | border-radius: 20px; 51 | } 52 | 53 | /*.cookies-list img{ 54 | height: 100px !important; 55 | }*/ 56 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2014 - Crowd Share/crowd-share-rest-api/app/data/data.js: -------------------------------------------------------------------------------- 1 | var data = {}; 2 | 3 | function saveValue(key, value){ 4 | if(!data[key]){ 5 | data[key] = { 6 | lastValueId: 0, 7 | values: [] 8 | }; 9 | } 10 | value.id = ++data[key].lastValueId; 11 | data[key].values.push(value); 12 | return this; 13 | } 14 | 15 | function getValues(key){ 16 | if(!data[key]){ 17 | return []; 18 | } 19 | return data[key].values.slice(0); 20 | } 21 | 22 | function findValueById(key, id){ 23 | if(!data[key]){ 24 | return null; 25 | } 26 | var values = data[key].values; 27 | for(var i = 0, len = values.length; i < len; i+=1){ 28 | if(values[i].id === id){ 29 | return values[i]; 30 | } 31 | } 32 | return null; 33 | } 34 | 35 | function updateValue(key, value){ 36 | values = data[key].values; 37 | for(var i = 0, len = values.length; i < len; i+=1){ 38 | if(values[i].id === value.id){ 39 | values[i] = value; 40 | } 41 | } 42 | return this; 43 | } 44 | 45 | module.exports = { 46 | save: saveValue, 47 | get: getValues, 48 | findById: findValueById, 49 | update: updateValue 50 | }; 51 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_20-April-2017_Fortune_Cookies/public/js/system-config.js: -------------------------------------------------------------------------------- 1 | System.config({ 2 | transpiler: 'plugin-babel', 3 | map: { 4 | // System.js files 5 | 'plugin-babel': 'libs/systemjs-plugin-babel/plugin-babel.js', 6 | 'systemjs-babel-build': 'libs/systemjs-plugin-babel/systemjs-babel-browser.js', 7 | 'text': 'libs/systemjs-plugin-text/text.js', 8 | 9 | // App files 10 | 'app': 'js/app.js', 11 | 'myRouter': 'js/myRouter.js', 12 | 'requester': 'js/requester.js', 13 | 'data': 'js/data.js', 14 | 'homeController': 'js/controllers/home.js', 15 | 'myCookieController': 'js/controllers/myCookie.js', 16 | 'userController': 'js/controllers/user.js', 17 | 'templates': 'js/templates.js', 18 | 19 | // templates 20 | // 'homeTemplate': 'templates/home.handlebars', 21 | 22 | // Library files 23 | 'jquery': 'libs/jquery/dist/jquery.min.js', 24 | 'handlebars': 'libs/handlebars/dist/handlebars.amd.js', 25 | 'cryptojs': 'libs/cryptojs/cryptojs.js', 26 | 'toastr': 'libs/toastr/build/toastr.min.js', 27 | } 28 | }); 29 | 30 | System.import('app'); 31 | -------------------------------------------------------------------------------- /Topics/01. Promises and asynchronous programming/demos/3. function-generators/3.2. advanced-function-generators.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | function* fibonacci(){ 3 | var fn1 = 1, fn2 = 1, currnet, reset; 4 | while (true){ 5 | current = fn2; 6 | fn2 = fn1; 7 | fn1 = fn1 + current; 8 | reset = yield current; 9 | if (reset){ 10 | fn1 = 1; 11 | fn2 = 1; 12 | } 13 | } 14 | } 15 | 16 | var sequence = fibonacci(); 17 | console.log(sequence.next().value); // 1 18 | console.log(sequence.next().value); // 1 19 | console.log(sequence.next().value); // 2 20 | console.log(sequence.next().value); // 3 21 | console.log(sequence.next().value); // 5 22 | console.log(sequence.next().value); // 8 23 | console.log(sequence.next().value); // 13 24 | console.log(sequence.next(true).value); // 1 25 | console.log(sequence.next().value); // 1 26 | console.log(sequence.next().value); // 2 27 | console.log(sequence.next().value); // 3 28 | }()); -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'), 2 | bodyParser = require('body-parser'), 3 | low = require('lowdb'); 4 | 5 | var app = express(), 6 | db = low('data/data.json'); 7 | 8 | db._.mixin(require('underscore-db')); 9 | 10 | app.use(bodyParser.json()); 11 | app.use(express.static('public')); 12 | app.use('/libs', express.static('node_modules')); 13 | // app.use('/tests/libs', express.static('node_modules')); 14 | 15 | var usersRouter = require('./routers/usersRouter')(db); 16 | var todosRouter = require('./routers/todosRouter')(db); 17 | var eventsRouter = require('./routers/eventsRouter')(db); 18 | var categoriesRouter = require('./routers/categoriesRouter')(db); 19 | 20 | require('./utils/authorized-user')(app, db); 21 | 22 | app.use('/api/users', usersRouter); 23 | app.use('/api/todos', todosRouter); 24 | app.use('/api/events', eventsRouter); 25 | app.use('/api/categories', categoriesRouter); 26 | 27 | var port = process.env.PORT || 3013; 28 | 29 | app.listen(port, function() { 30 | console.log('Server is running at http://localhost:' + port); 31 | }); 32 | -------------------------------------------------------------------------------- /Topics/05. Routing/demos/getting-query-params/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 |

    Static paths

    19 | Test
    20 | Settings
    21 | Quit
    22 |
    23 |

    Dynamic paths

    24 | Book1
    25 | Book2
    26 | Note1
    27 | Note2
    28 |
    29 |

    Query strings

    30 | Test
    31 | Book1
    32 | Note1
    33 |
    34 |

    Output

    35 |
    36 | 37 | 38 | -------------------------------------------------------------------------------- /Sample Exams/self manager/public/controllers/helpers/controller-helpers.js: -------------------------------------------------------------------------------- 1 | var controllerHelpers = function() { 2 | function groupByCategory(item) { 3 | return item.category; 4 | } 5 | 6 | function parseGroups(items, category) { 7 | return { 8 | category, 9 | items 10 | }; 11 | } 12 | 13 | function filterByCategory(category) { 14 | return function(group) { 15 | return group.category.toLowerCase() === category.toLowerCase(); 16 | }; 17 | } 18 | 19 | function fixDate_old(event) { 20 | return { 21 | title: event.title, 22 | date: moment(event.date).format('MMM Do YYYY, hh:mm'), 23 | timeRemaining: moment(event.date).fromNow(), 24 | description: event.description, 25 | category: event.category 26 | }; 27 | } 28 | 29 | function fixDate(item) { 30 | var newItem = Object.create(item); 31 | newItem.date = moment(item.date).format('MMM Do YYYY, hh:mm'); 32 | newItem.timeRemaining = moment(item.date).fromNow(); 33 | return newItem; 34 | } 35 | 36 | return { 37 | groupByCategory, parseGroups, filterByCategory, fixDate 38 | }; 39 | }(); 40 | -------------------------------------------------------------------------------- /Topics/07. Web Storages/demos/3. session-storage.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | JavaScript APIs - sessionStorage 5 | 22 | 36 | 37 | 38 |

    39 | 40 | 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Telerik Academy 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/solution-doncho/public/js/controllers/helpers/controller-helpers.js: -------------------------------------------------------------------------------- 1 | var controllerHelpers = function() { 2 | function groupByCategory(item) { 3 | return item.category; 4 | } 5 | 6 | function parseGroups(items, category) { 7 | return { 8 | category, 9 | items 10 | }; 11 | } 12 | 13 | function filterByCategory(category) { 14 | return function(group) { 15 | return group.category.toLowerCase() === category.toLowerCase(); 16 | }; 17 | } 18 | 19 | function fixDate_old(event) { 20 | return { 21 | title: event.title, 22 | date: moment(event.date).format('MMM Do YYYY, hh:mm'), 23 | timeRemaining: moment(event.date).fromNow(), 24 | description: event.description, 25 | category: event.category 26 | }; 27 | } 28 | 29 | function fixDate(item) { 30 | var newItem = Object.create(item); 31 | newItem.date = moment(item.date).format('MMM Do YYYY, hh:mm'); 32 | newItem.timeRemaining = moment(item.date).fromNow(); 33 | return newItem; 34 | } 35 | 36 | return { 37 | groupByCategory, parseGroups, filterByCategory, fixDate 38 | }; 39 | }(); 40 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/public/controllers/helpers/controller-helpers.js: -------------------------------------------------------------------------------- 1 | var controllerHelpers = function() { 2 | function groupByCategory(item) { 3 | return item.category; 4 | } 5 | 6 | function parseGroups(items, category) { 7 | return { 8 | category, 9 | items 10 | }; 11 | } 12 | 13 | function filterByCategory(category) { 14 | return function(group) { 15 | return group.category.toLowerCase() === category.toLowerCase(); 16 | }; 17 | } 18 | 19 | function fixDate_old(event) { 20 | return { 21 | title: event.title, 22 | date: moment(event.date).format('MMM Do YYYY, hh:mm'), 23 | timeRemaining: moment(event.date).fromNow(), 24 | description: event.description, 25 | category: event.category 26 | }; 27 | } 28 | 29 | function fixDate(item) { 30 | var newItem = Object.create(item); 31 | newItem.date = moment(item.date).format('MMM Do YYYY, hh:mm'); 32 | newItem.timeRemaining = moment(item.date).fromNow(); 33 | return newItem; 34 | } 35 | 36 | return { 37 | groupByCategory, parseGroups, filterByCategory, fixDate 38 | }; 39 | }(); 40 | -------------------------------------------------------------------------------- /Sample Exams/self manager/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Doncho Minkov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Topics/09. Unit testing - Spies and Mocks with Sinon/demos/live-demo/stubs.js: -------------------------------------------------------------------------------- 1 | let sinon = require('sinon'); 2 | 3 | console.log(Math.round(1.7)); 4 | console.log(Math.round(1.7)); 5 | console.log(Math.round(1.7)); 6 | 7 | sinon.stub(Math, "round") 8 | .returns(3) 9 | .onCall(835).returns(150); 10 | 11 | console.log(Math.round(3.2)); 12 | console.log(Math.round(12)); 13 | console.log(Math.round(32.12873)); 14 | console.log(Math.round(3.2)); 15 | console.log(Math.round(3.2)); 16 | 17 | console.log('Call count ' + Math.round.callCount); 18 | 19 | Math.round.restore(); 20 | console.log(Math.round(1.7)); 21 | 22 | let counter = (function() { 23 | let count = 0; 24 | 25 | return function() { 26 | return count += 1; 27 | }; 28 | }()); 29 | 30 | sinon.stub(Math, "random", counter); 31 | 32 | console.log("Random values here:"); 33 | console.log(Math.random()); 34 | console.log(Math.random()); 35 | console.log(Math.random()); 36 | console.log(Math.random()); 37 | console.log(Math.random()); 38 | 39 | Math.random.restore(); 40 | console.log(Math.random()); 41 | console.log(Math.random()); 42 | console.log(Math.random()); 43 | console.log(Math.random()); 44 | console.log(Math.random()); 45 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_20-April-2017_Fortune_Cookies/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Fortune cookies 7 | 8 | 9 | 10 | 11 | 12 |
    13 | 17 | 18 | Sign in / Register 19 | Logout 20 |
    21 | 22 |
    23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /Topics/03. Consuming Web Services/demos/6. jquery-ajax.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Consuming Remote Data: $.ajax() 7 | 8 | 9 | 10 |
    11 | 12 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Doncho Minkov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/Workshop_25-April-2017_Self_Manager/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Doncho Minkov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Sample Exams/self manager/public/app/json-requester.js: -------------------------------------------------------------------------------- 1 | var jsonRequester = (function() { 2 | 3 | function send(method, url, options) { 4 | options = options || {}; 5 | 6 | var headers = options.headers || {}, 7 | data = options.data || undefined; 8 | 9 | var promise = new Promise(function(resolve, reject) { 10 | $.ajax({ 11 | url: url, 12 | method: method, 13 | contentType: 'application/json', 14 | headers: headers, 15 | data: JSON.stringify(data), 16 | success: function(res) { 17 | resolve(res); 18 | }, 19 | error: function(err) { 20 | reject(err); 21 | } 22 | }); 23 | }); 24 | return promise; 25 | } 26 | 27 | function get(url, options) { 28 | return send('GET', url, options); 29 | } 30 | 31 | function post(url, options) { 32 | return send('POST', url, options); 33 | } 34 | 35 | function put(url, options) { 36 | return send('PUT', url, options); 37 | } 38 | 39 | function del(url, options) { 40 | return send('POST', url, options); 41 | } 42 | 43 | return { 44 | send: send, 45 | get: get, 46 | post: post, 47 | put: put, 48 | delete: del 49 | }; 50 | }()); 51 | -------------------------------------------------------------------------------- /Topics/04. Module loaders/demos/4. persons/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Systemjs demo 6 | 7 | 8 | 9 | 10 | 11 | 12 |
      13 | 14 | 31 | 32 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/solution-doncho/public/js/app/json-requester.js: -------------------------------------------------------------------------------- 1 | var jsonRequester = (function() { 2 | 3 | function send(method, url, options) { 4 | options = options || {}; 5 | 6 | var headers = options.headers || {}, 7 | data = options.data || undefined; 8 | 9 | var promise = new Promise(function(resolve, reject) { 10 | $.ajax({ 11 | url: url, 12 | method: method, 13 | contentType: 'application/json', 14 | headers: headers, 15 | data: JSON.stringify(data), 16 | success: function(res) { 17 | resolve(res); 18 | }, 19 | error: function(err) { 20 | reject(err); 21 | } 22 | }); 23 | }); 24 | return promise; 25 | } 26 | 27 | function get(url, options) { 28 | return send('GET', url, options); 29 | } 30 | 31 | function post(url, options) { 32 | return send('POST', url, options); 33 | } 34 | 35 | function put(url, options) { 36 | return send('PUT', url, options); 37 | } 38 | 39 | function del(url, options) { 40 | return send('POST', url, options); 41 | } 42 | 43 | return { 44 | send: send, 45 | get: get, 46 | post: post, 47 | put: put, 48 | delete: del 49 | }; 50 | }()); 51 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/public/app/json-requester.js: -------------------------------------------------------------------------------- 1 | var jsonRequester = (function() { 2 | 3 | function send(method, url, options) { 4 | options = options || {}; 5 | 6 | var headers = options.headers || {}, 7 | data = options.data || undefined; 8 | 9 | var promise = new Promise(function(resolve, reject) { 10 | $.ajax({ 11 | url: url, 12 | method: method, 13 | contentType: 'application/json', 14 | headers: headers, 15 | data: JSON.stringify(data), 16 | success: function(res) { 17 | resolve(res); 18 | }, 19 | error: function(err) { 20 | reject(err); 21 | } 22 | }); 23 | }); 24 | return promise; 25 | } 26 | 27 | function get(url, options) { 28 | return send('GET', url, options); 29 | } 30 | 31 | function post(url, options) { 32 | return send('POST', url, options); 33 | } 34 | 35 | function put(url, options) { 36 | return send('PUT', url, options); 37 | } 38 | 39 | function del(url, options) { 40 | return send('POST', url, options); 41 | } 42 | 43 | return { 44 | send: send, 45 | get: get, 46 | post: post, 47 | put: put, 48 | delete: del 49 | }; 50 | }()); 51 | -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/demo/word/fontTable.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Sample Exams/self manager/routers/categoriesRouter.js: -------------------------------------------------------------------------------- 1 | var express = require('express'), 2 | _ = require('lodash'); 3 | 4 | require('../polyfills/array'); 5 | 6 | module.exports = function(db) { 7 | var router = express.Router(); 8 | 9 | router.get('/', function(req, res) { 10 | var user = req.user; 11 | if (!user) { 12 | res.status(401) 13 | .json('Not authorized User'); 14 | return; 15 | } 16 | 17 | var categories = db('users') 18 | .map(function(user) { 19 | var todoCategories = []; 20 | if (user.todos) { 21 | todoCategories = user.todos.map(function(todo) { 22 | return todo.category; 23 | }); 24 | } 25 | var eventCategories = []; 26 | if (user.events) { 27 | eventCategories = user.events.map(function(event) { 28 | return event.category; 29 | }); 30 | } 31 | return todoCategories.concat(eventCategories); 32 | }); 33 | 34 | categories = _.chain(categories) 35 | .flatten(categories, true) 36 | .sortBy(function(cat) { 37 | return cat.toLowerCase(); 38 | }).uniq() 39 | .value(); 40 | 41 | res.json({ 42 | result: categories 43 | }); 44 | }); 45 | return router; 46 | }; 47 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/solution-doncho/public/js/app/validator.js: -------------------------------------------------------------------------------- 1 | var validator = (function() { 2 | 3 | function validateString(str, min, max, chars) { 4 | if (typeof str !== 'string' || str.length < min || str.length > max) { 5 | return { 6 | message: `Invalid: Length must be between ${min} and ${max}` 7 | }; 8 | } 9 | if (chars) { 10 | str = str.split(''); 11 | if (str.some(function(char) { 12 | return chars.indexOf(char) < 0; 13 | })) { 14 | return { 15 | message: `Invalid: Chars can be ${chars}` 16 | }; 17 | } 18 | } 19 | } 20 | 21 | function validateUrl(url) { 22 | 23 | if (!url || url.length === 0) { 24 | return; 25 | } 26 | //copied from http://stackoverflow.com/questions/5717093/check-if-a-javascript-string-is-an-url#answer-5717133 27 | var pattern = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/; 28 | if (!pattern.test(url)) { 29 | return { 30 | message: 'Invalid url' 31 | }; 32 | } 33 | } 34 | 35 | return { 36 | validateString: validateString, 37 | validateUrl: validateUrl 38 | }; 39 | }()); 40 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/LiveDemo_2-May-2017_Self_Manager/routers/categoriesRouter.js: -------------------------------------------------------------------------------- 1 | var express = require('express'), 2 | _ = require('lodash'); 3 | 4 | require('../polyfills/array'); 5 | 6 | module.exports = function(db) { 7 | var router = express.Router(); 8 | 9 | router.get('/', function(req, res) { 10 | var user = req.user; 11 | if (!user) { 12 | res.status(401) 13 | .json('Not authorized User'); 14 | return; 15 | } 16 | 17 | var categories = db('users') 18 | .map(function(user) { 19 | var todoCategories = []; 20 | if (user.todos) { 21 | todoCategories = user.todos.map(function(todo) { 22 | return todo.category; 23 | }); 24 | } 25 | var eventCategories = []; 26 | if (user.events) { 27 | eventCategories = user.events.map(function(event) { 28 | return event.category; 29 | }); 30 | } 31 | return todoCategories.concat(eventCategories); 32 | }); 33 | 34 | categories = _.chain(categories) 35 | .flatten(categories, true) 36 | .sortBy(function(cat) { 37 | return cat.toLowerCase(); 38 | }).uniq() 39 | .value(); 40 | 41 | res.json({ 42 | result: categories 43 | }); 44 | }); 45 | return router; 46 | }; 47 | -------------------------------------------------------------------------------- /Workshops/Workshops-2017/Workshop_25-April-2017_Self_Manager/routers/categoriesRouter.js: -------------------------------------------------------------------------------- 1 | var express = require('express'), 2 | _ = require('lodash'); 3 | 4 | require('../polyfills/array'); 5 | 6 | module.exports = function(db) { 7 | var router = express.Router(); 8 | 9 | router.get('/', function(req, res) { 10 | var user = req.user; 11 | if (!user) { 12 | res.status(401) 13 | .json('Not authorized User'); 14 | return; 15 | } 16 | 17 | var categories = db('users') 18 | .map(function(user) { 19 | var todoCategories = []; 20 | if (user.todos) { 21 | todoCategories = user.todos.map(function(todo) { 22 | return todo.category; 23 | }); 24 | } 25 | var eventCategories = []; 26 | if (user.events) { 27 | eventCategories = user.events.map(function(event) { 28 | return event.category; 29 | }); 30 | } 31 | return todoCategories.concat(eventCategories); 32 | }); 33 | 34 | categories = _.chain(categories) 35 | .flatten(categories, true) 36 | .sortBy(function(cat) { 37 | return cat.toLowerCase(); 38 | }).uniq() 39 | .value(); 40 | 41 | res.json({ 42 | result: categories 43 | }); 44 | }); 45 | return router; 46 | }; 47 | -------------------------------------------------------------------------------- /Topics/02. HTTP and AJAX/slides/demo/[Content_Types].xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Sample Exams/Exam 2015 - Fortune Cookies/template/controllers/my-cookies-controller.js: -------------------------------------------------------------------------------- 1 | var _ = require('lodash'); 2 | const PAGE_SIZE = 10, 3 | DEFAULT_COOKIE_IMAGE = 'https://dayinthelifeofapurpleminion.files.wordpress.com/2014/12/batman-exam.jpg'; 4 | 5 | 6 | module.exports = function(db) { 7 | 8 | function getRandomCookie() { 9 | var cookies = db('cookies').value(); 10 | var index = Math.floor(Math.random() * cookies.length); 11 | return cookies[index]; 12 | } 13 | 14 | function get(req, res) { 15 | var user = req.user; 16 | if (!user) { 17 | res.status(401) 18 | .json('User not authorized'); 19 | return; 20 | } 21 | var myCookie; 22 | 23 | if (user.myCookies) { 24 | myCookie = _.last(user.myCookies); 25 | var now = new Date().getHours(); 26 | var myCookieTime = myCookie.hours; 27 | if (myCookieTime !== now) { 28 | myCookie = getRandomCookie(); 29 | } 30 | } else { 31 | myCookie = getRandomCookie(); 32 | } 33 | 34 | user.myCookies = user.myCookies || []; 35 | 36 | myCookie.hours = new Date().getHours(); 37 | user.myCookies.push(myCookie); 38 | 39 | db.save(); 40 | 41 | res.json({ 42 | result: _.last(user.myCookies) 43 | }); 44 | } 45 | 46 | return { 47 | get: get 48 | }; 49 | }; 50 | -------------------------------------------------------------------------------- /Sample Exams/self manager/public/templates/event-add.handlebars: -------------------------------------------------------------------------------- 1 |
      2 | Add new Event 3 |
      4 | 7 | 8 |
      9 |
      10 | 11 | 12 |
      13 |
      14 | 15 | 16 |
      17 |
      18 | 21 |