• Урок 1. 00:01:58
    What are we going to build for the Code4Startup clone
  • Урок 2. 00:05:50
    Setting up & Installation
  • Урок 3. 00:00:49
    What are we going to build in this task
  • Урок 4. 00:08:26
    Creating a new project with MaterializedCss installed
  • Урок 5. 00:15:08
    Creating layout in Material Design styles
  • Урок 6. 00:01:32
    What are we going to build in this task
  • Урок 7. 00:14:22
    Creating basic authentication system
  • Урок 8. 00:16:00
    Adding custom field to User object
  • Урок 9. 00:16:09
    Working with Gravatar and Notification
  • Урок 10. 00:17:37
    Transactional emails with Mandrill (OLD)
  • Урок 11. 00:00:43
    What are we going to build in this task
  • Урок 12. 00:24:46
    Authenticate with Google
  • Урок 13. 00:12:00
    Authenticate with Facebook
  • Урок 14. 00:09:34
    Authenticate with Github
  • Урок 15. 00:00:33
    What are we going to build in this task
  • Урок 16. 00:04:13
    Creating our basic Dashboard
  • Урок 17. 00:03:20
    New theme to our Dashboard
  • Урок 18. 00:00:57
    What are we going to build in this task
  • Урок 19. 00:04:24
    Associations between Project & Task
  • Урок 20. 00:10:37
    Models for Project & Task
  • Урок 21. 00:08:47
    Function to upload image
  • Урок 22. 00:14:12
    Controllers, Views for Project & Task
  • Урок 23. 00:00:54
    What are we going to build in this task
  • Урок 24. 00:07:18
    Creating Markdown function
  • Урок 25. 00:06:30
    Creating friendly URLs
  • Урок 26. 00:00:29
    What are we going to build in this task
  • Урок 27. 00:15:41
    Drag and Drop in Dashboard
  • Урок 28. 00:16:36
    Wistia player and functioning buttons
  • Урок 29. 00:00:45
    What are we going to build in this task
  • Урок 30. 00:04:49
    Understanding has_many through association
  • Урок 31. 00:07:56
    Creating Subscription
  • Урок 32. 00:12:59
    Updating Project Controller
  • Урок 33. 00:07:40
    Updating Task Controller
  • Урок 34. 00:13:03
    Creating My Projects page
  • Урок 35. 00:01:03
    What are we going to build in this task
  • Урок 36. 00:20:50
    Creating Review
  • Урок 37. 00:08:49
    Adding Stars selection
  • Урок 38. 00:06:51
    Adding relative time stamp
  • Урок 39. 00:00:36
    What are we going to build in this task
  • Урок 40. 00:10:13
    Adding Tabs
  • Урок 41. 00:07:24
    Changing Datatype in Rails
  • Урок 42. 00:00:47
    What are we going to build in this task
  • Урок 43. 00:18:31
    Creating chargeable courses with Stripe
  • Урок 44. 00:11:51
    Emailing Receipt
  • Урок 45. 00:03:29
    Setting Environment Variables
  • Урок 46. 00:09:21
    Private data with environment variables
  • Урок 47. 00:08:12
    Adding dynamic Open Graph
  • Урок 48. 00:04:42
    Adding Social sharing bar
  • Урок 49. 00:06:01
    Adding Discussion component
  • Урок 50. 00:01:56
    Adding Google Analytics
  • Урок 51. 00:05:30
    Adding Real-time chat component
"use strict"; (function () { localStorage.removeItem('less'); var lessons = []; var list = document.querySelectorAll('.lessons-item'); if (list) { Array.prototype.forEach.call(list, function (element) { element.addEventListener('click', function (e) { var index = e.currentTarget.getAttribute('data-index'); if(myPlayer === undefined) { localStorage.setItem('less', index); playerb.dispatchEvent(new Event('click')); } else { myPlayer.api("find","c598"+index); myPlayer.api('play'); } }) }); } var playerb = document.querySelector('.player-play') if (playerb) { playerb.addEventListener('click', function () { axios.get('/course/598/lessons').then(function (_ref) { playerb.classList.add('player-play_active'); lessons = _ref.data; loadPlayer(); }).catch(function (error) { alert(error); }); }, {once: true}); } if(typeof window.URLSearchParams) { var searchParams = new URLSearchParams(location.search); if(searchParams.has('lesson')) { var l = String(Number(searchParams.get("lesson"))); addClassToLastVideo(l); } } function addClassToLastVideo(num) { localStorage.setItem('less', num); var element = document.querySelector('.lessons-item[data-index="'+num+'"]'); if(element) { setTimeout(function (){ document.getElementById('player').scrollIntoView({block: "center", behavior: "smooth"}); }, 1000) element.classList.add('lessons-item_active'); if(element.closest('body').clientWidth > 991) { element.closest('.lessons-list').scrollTop = element.offsetTop; } } } function loadPlayer() { var myScript = document.createElement("script"); myScript.setAttribute("src", "/libraries/playerjsa.js?ver=796e277f"); myScript.setAttribute("type", "text/javascript"); myScript.addEventListener("load", scriptLoaded, false); document.body.insertBefore(myScript, document.querySelector('.footer')); } function scriptLoaded() { ichp(lessons); } var myPlayer; var player = document.getElementById("player"); function ichp(playList) { myPlayer = new Playerjs({id: "player", file: playList, autoplay: 1, lang: 'ru'}); } if (player) { player.addEventListener("error", function (e) { console.log(e); }); player.addEventListener("play", function (e) { var playlistId = myPlayer.api('playlist_id'); var currentLess = playlistId.substring(String('c598').length); setActiveLesson(currentLess, e.target.closest('body').clientWidth); try { var link = String(window.location.origin) + String(window.location.pathname) + '?lesson=' + String(currentLess); window.history.replaceState(null, null, link); } catch (e) { console.error(e); } }) player.addEventListener("init", function () { var less = localStorage.getItem('less'); if(less) { myPlayer.api("find","c598"+less); myPlayer.api('play'); localStorage.removeItem('less'); } }); } function setActiveLesson(num, width) { if (list && list.length) { Array.prototype.forEach.call(list, function (element) { if(element.getAttribute('data-index') === num) { element.classList.add('lessons-item_active'); if(width > 991) { element.closest('.lessons-list').scrollTop = element.offsetTop; } } else { element.classList.remove('lessons-item_active'); } }); } } window.playerWideMode = false; window.PlayerWideMode = function(){ if(playerWideMode){ document.querySelector(".player").classList.remove('player-full'); } else { document.querySelector(".player").classList.add('player-full'); } window.playerWideMode = !window.playerWideMode; } })();