diff --git a/12-loops-conditionals/index.html b/12-loops-conditionals/index.html new file mode 100644 index 0000000..79b6461 --- /dev/null +++ b/12-loops-conditionals/index.html @@ -0,0 +1,14 @@ + + + + + + + Document + + + + + + + diff --git a/12-loops-conditionals/index.js b/12-loops-conditionals/index.js new file mode 100644 index 0000000..8800356 --- /dev/null +++ b/12-loops-conditionals/index.js @@ -0,0 +1,87 @@ + + + +// let answer = confirm('Are u hungry?'); +// console.log('answer: ', answer); + +// let foodType = prompt('What u wanna eat?', 'pizza'); + +// console.log('foodType: ', foodType); + +// let age = parseInt(prompt('how old are u?'), 10); + +// let adult = age > 18; + +// let isIvan = true; + + +// let msg = age > 17 ? 'u got beer' : 'no beer'; + + +// console.log(msg); + +// let product = prompt('u got?'); + +// switch (product) { +// default: +// console.log('0grn'); +// break; +// case 'cola': +// case 'cola': +// case 'cola': +// case 'cola': +// case 'milk': +// console.log('20grn'); +// break; +// case 'bread': +// console.log('10grn'); +// break; +// } + + +let isIvan = true; +let isVlad = true; + +let age = 18; + +// let a = 0 +// let b = 5 + +// || повертає перше позитивне +// && повертає перше хибне + 10 || 15 +let condition = ('hi' && 10) || 15; + + + + + +// let answer = ''; + +// while (answer !== 'cursor') { +// answer = prompt('what programming school is the best?') +// if (answer === 'logos') { +// continue; +// } +// console.log('answer: ', answer); +// } + +// console.log('right answer') + + + +let str = 'hello'; + +let lCounter = 0; + +for (var i = 0; i < str.length; i++) { + console.log('i: ', i, str[i]); + if (str[i] === 'l') { + lCounter++; + } +} + + +// console.log('lCounter: ', lCounter); + + diff --git a/21-function/index.html b/21-function/index.html new file mode 100644 index 0000000..79b6461 --- /dev/null +++ b/21-function/index.html @@ -0,0 +1,14 @@ + + + + + + + Document + + + + + + + diff --git a/21-function/index.js b/21-function/index.js new file mode 100644 index 0000000..e908e09 --- /dev/null +++ b/21-function/index.js @@ -0,0 +1,133 @@ + +// function isIvan(name) { +// if (name === 'Ivan' || name === 'ivan' || +// name === 'іван' || name === 'Іван') { +// return true; +// } else { +// return false; +// } +// } + +// const userName = 'Іван'; + +// if (isIvan(userName)) { +// console.log('hi Ivan'); +// } + + + + +// const sayHiUser = (name) => { +// console.log('Hello ' + name); +// return 'done'; +// } + +// const result = sayHiUser('Ivan'); +// console.log('result: ', result); + +// const isIvan = name => name === 'Ivan'; + +// const ivan = isIvan('ddd'); +// console.log('ivan: ', ivan); + + +(function() { + var a = 'dfd'; + var b = 'ddf'; + // console.log('bla bla'); +})(); + + +// let bar = 1; + +// function foo() { +// console.log('bar: ', bar); +// bar = 2; + +// function inner() { +// console.log('bar: ', bar); +// bar = 3; +// } + + +// inner(); +// } +// foo(); +// bar = 4; +// console.log('bar: ', bar); + + + + + +// const pure = a => a + 3; + +function removeA(str) { + let pureStr = ''; + for(let i = 0; i < str.length; i++) { + if (str[i] !== 'a') { + pureStr += str[i]; + } + } + return pureStr; +} + +function removeARecursion(str) { + const index = str.indexOf('a'); + return index === -1 ? str : + removeARecursion(str.substr(0, index) + str.substr(index + 1)) + + // const index = str.indexOf('a'); + // if (index !== -1) { + // let temp = str.substr(0, index) + str.substr(index + 1); + // return removeARecursion(temp); + // } else { + // return str; + // } +} + +const result = removeARecursion('ivan and ivan'); +// console.log('result: ', result); + + + +function square(x) { + return x * x; +} + + +function pow(n, exp) { + if (exp === 0) return 1; + let result = n; + for (let i = 1; i < exp; i++) { + result *= n; + } + + return result; +} + +// console.log( pow(2, 2) ); + + +function isPalindrome(str) { + let result = true; + const halfLength = Math.floor(str.length / 2); + + for (let i = 0; i < halfLength; i++) { + const leftChar = str[i]; + const rightChar = str[str.length - (i + 1)]; + + if (leftChar !== rightChar) { + return false; + } + } + + return result; +} + +const isPalindromeCope = str => str.split('').reverse().join('') === str; + + +console.log( isPalindrome('madam') ); + +let even = 10 % 2 === 0; diff --git a/32-objects/index.html b/32-objects/index.html new file mode 100644 index 0000000..79b6461 --- /dev/null +++ b/32-objects/index.html @@ -0,0 +1,14 @@ + + + + + + + Document + + + + + + + diff --git a/32-objects/index.js b/32-objects/index.js new file mode 100644 index 0000000..820d8ac --- /dev/null +++ b/32-objects/index.js @@ -0,0 +1,254 @@ + +let key = 'age'; + +// let tel = 9999; + + +let user = { + hello: function() { + console.log('hello'); + }, + buy() { + console.log('buy'); + }, + 10: 'number', + '12': 'number', + 'first name': 'ivan', + [key]: 22, + ['hello' + 'afsd']: 'dfdf', + // tel +}; + + +user.tel = '00000'; +delete user.tel; +// user['hello'](); +// user.buy(); + + + + + +function addContact(book) { + let name = prompt('name'); + if (name in book) { + console.log('already exists'); + return; + } + let tel = prompt('tel'); + + book[name] = tel; + console.log(' book: ', book); +} + +// addContact(contactsBook); + +// console.log('contactsBook: ', contactsBook); + +let user1 = {name: 'ivan'}; + +let user2 = user1; + +let a = 2120; +let b = a; + +// console.log('user1: ', user1); +// console.log('user2: ', user2); + +// user2.name = 'vlad'; + +// console.log('user1: ', user1); +// console.log('user2: ', user2); + + +// console.log({} === {}); +// console.log(user1 === user2); + +const str = {name: 'ivan'}; +str.name = 222 +// console.log('str: ', str); + + + + + + +let mainBook = { + IVAN: 12312, + vlad: 99999, + innerBook: { + littleIvan: 555 + } +}; +let ivanaBook = { + IVAN: 666, +}; + +let copyBook = {...mainBook}; + +// let copyBook = Object.assign({}, mainBook); + + +let defaultCar = { + capacity: '1.2L', + color: 'blue', + wheelsAmount: 4 +} + +function configureCar(options) { + let car = Object.assign({}, defaultCar, options); + return car; +} + + +let ivanCar = configureCar({color: 'black', wheelsAmount: 3}); +// console.log(ivanCar === defaultCar); + +// console.log('ivanCar: ', ivanCar); +// console.log('defaultCar: ', defaultCar); + + + +user = { + name: 'ihor', + age: 30, + lastName: 'Borodin' +}; + +// let { name, age } = user; + +let arr = ['valera']; + +// let [name, age = 20] = arr; + + +function helloUser({name, age}) { + console.log(`hello ${name} ${age}`) +} + +// helloUser(user); + + +function getContact() { + let name = prompt('name'); + let tel = prompt('tel'); + return [name, tel, 3, 324, 21312]; +} + +// let [name, tel, ...restData] = getContact(); +// console.log('restData: ', restData); +// console.log('name, tel: ', name, tel); + + +// let [...restData] = [...someData] + + +// let contactBook = { +// ivan: 12312, +// vlad: 99999, +// }; + +// for (key in contactBook) { +// console.log('key: ', key); +// } + +// Object.entries(contactBook).forEach(([key, val]) => { +// console.log('key, val: ', key, val); +// }) + +let users = [ + {name: 'ivan', id: 'adf8f32h32fh9832'}, + {name: 'vlad', id: 'adf8f32h32fh9833'}, + {name: 'ihor', id: 'adf8f32h32fh9834'}, +]; + +let ihor = users.find(user => { + return user.id === 'adf8f32h32fh9834'; +}) +// console.log('ihor: ', ihor); + + +// let usersObj = { +// adf8f32h32fh9832: {name: 'ivan', id: 'adf8f32h32fh9832'}, +// adf8f32h32fh9833: {name: 'vlad', id: 'adf8f32h32fh9833'}, +// adf8f32h32fh9834: {name: 'ihor', id: 'adf8f32h32fh9834'}, +// }; + +// console.log(usersObj['adf8f32h32fh9834']); + +let usersObj = users.reduce((acc, user) => { + acc[user.id] = user; + return acc; +}, {}) + +// console.log('usersObj: ', usersObj); + + + +user = { + firstName: 'ivan', + lastName: 'vorobev', + fullName() { + console.log(this.firstName + ' ' + this.lastName); + } +}; + +// user.fullName(); + + +let contactBook = { + ivan: 12312, + vlad: 99999, + ihor: 324132, + valera: 53453, + test() { + // console.log(this) + }, + getRecordsAmount() { + return Object.keys(this).length - 1; + }, + search(str) { + let keys = Object.keys(this); + let result = keys.filter(key => { + return key.includes(str); + }); + + return result; + } +}; + + +// console.log(this); +contactBook.test(); + +function generateCombinations(word) { + let result = []; + word = word.split(''); + for (let i = 0; i < 1; i++) { + let letter = word[0]; + let copy = [...word] + copy.shift(); + for (let j = i; j < word.length; j++) { + copy.splice(j + 1, 0, letter); + result.push(copy); + copy.splice(j + 1, 1); + // console.log(copy); + } + } + // console.log(result); +} + +generateCombinations("man"); + +function getModa(...arr) { + // console.log('arr: ', arr); + let result = {}; + arr.forEach(n => { + result[n] = result[n] + 1; + }); +} + +getModa(6, 2, 55, 11, 78, 2, 55, 77, 57, 87, 23, 2, 56, 3, 2); + + +// console.log(contactBook.search('i')); diff --git a/41-closure/index.html b/41-closure/index.html new file mode 100644 index 0000000..a0a8756 --- /dev/null +++ b/41-closure/index.html @@ -0,0 +1,15 @@ + + + + + + + Document + + + + + + + + diff --git a/41-closure/index.js b/41-closure/index.js new file mode 100644 index 0000000..e505334 --- /dev/null +++ b/41-closure/index.js @@ -0,0 +1,122 @@ +// let a = 'a'; + +// function foo() { +// console.log(a); +// console.log(b); +// } + +// function bar() { +// let b = 'b'; +// foo(); +// } + +// bar(); + + +function createFunc() { + let msg = 'hello'; + + return function() { + console.log('print msg: ', msg); + } +} + + +let func = createFunc(); + +function createCounter() { + let counter = 0; + + return function() { + counter++; + console.log('counter: ', counter); + } +} + +let count = createCounter(); + +// count(); +// count(); + +let count2 = createCounter(); + +// count2(); + + + +function ownForEach(arr, callback) { + for (let i = 0; i < arr.length; i++) { + callback(arr[i]); + } +} + +let group = { + name: 'PPZ45', + students: ['Ihor', 'Vlad', 'Ivan'], + printStudents() { + + this.students.forEach((studentName) => { + console.log(this.name, studentName); + }); + } +}; + +// group.printStudents(); + + + +function printName(startStr, endStr) { + console.log(startStr, this.firstName, this.lastName, endStr); +} + +let user1 = { + firstName: 'Ivan', + lastName: 'Horovec', +} + +let user2 = { + firstName: 'Anton', + lastName: 'Borovec', +} + +// printName.apply(user1, ['Hi', '!!!']); +// printName.apply(user2, ['buy', '!!!']); + +// let printUser1Name = printName.bind(user1, 'hello'); +// printUser1Name('!!'); + + +function multiply(a, b) { + return a * b; +} +let double = multiply.bind(null, 2); +// console.log(double(5)); + + +let double2 = (n) => { + return multiply(2, n); +} + +// console.log(double2(11)); + + +function hello(msg) { + console.log('hi', msg); +} + +// setTimeout(hello, 1000, 'whats up'); +let timeout = setTimeout(group.printStudents, 3000, 'you'); +// clearTimeout(timeout); + + + + + +// let interval = setInterval(hello, 1000, 'ola'); + +// setTimeout(function() { + +// clearInterval(interval) +// }, 5000); + + diff --git a/41-closure/index0.js b/41-closure/index0.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/41-closure/index0.js @@ -0,0 +1 @@ + diff --git a/42-class/index.html b/42-class/index.html new file mode 100644 index 0000000..fcbc152 --- /dev/null +++ b/42-class/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/42-class/index.js b/42-class/index.js new file mode 100644 index 0000000..73353ca --- /dev/null +++ b/42-class/index.js @@ -0,0 +1,181 @@ + + +let user = { + firstName: 'ivan', + lastName: 'bbbadsas', + getName() { + return this.firstName + ' ' + this.lastName; + } +} + +// console.log('user: ', user); + + +// console.log('old user', user); +// console.log(user.getName()); + +class User { + constructor(name, birthYear) { + this.name = name; + this.birthYear = birthYear; + } + + get age() { + return 2020 - this.birthYear; + } + + get name() { + return this.firstName + ' ' + this.lastName; + } + + set name(value) { + if (value.length < 4) { + console.log('sorry name is too short'); + return; + } + + [this.firstName, this.lastName] = value.split(' '); + } + + testMethod() { + console.log('heelloo'); + } +} + + + +let ivan = new User('ivan anonym', 1990); +// console.log('ivan: ', ivan); +// console.log('ivan: ', ivan); +// console.log('ivan age: ', ivan.age); +ivan.birthYear = 2000; +// console.log('ivan: ', ivan); +// console.log('ivan age: ', ivan.age); + + + +function OldUser(name) { + this.name = name; +} + +OldUser.prototype.testMethod = function() { + console.log('heelloo'); +} + +let ihor = new OldUser('ihor'); +// ihor.testMethod(); +// console.log('ihor: ', ihor); + + +String.prototype.split = function() { + console.log('hello Ivan'); +} + + +class Human { + constructor(name, age) { + this.name = name; + this.age = age; + } + + getInfo() { + return this.name + ' ' + this.age; + } +} + +class SuperHero extends Human { + constructor(name, age, superPower) { + super(name, age); + this.superPower = superPower; + + this._weakness = superPower + age + 'vvvvaddde'; + } + + static fight(hero1, hero2) { + if (hero1.superPower.length > hero2.superPower.length) { + return 'hero ' + hero1.name + ' wwon'; + } else { + return 'hero ' + hero2.name + ' wwon'; + } + } + + getInfo() { + return super.getInfo() + ' ' + this.superPower; + } + + useSuperPower() { + console.log(this.superPower + ' completed'); + this._privetPower(); + } + + _privetPower() { + + } +} + +// let human = new Human('Oleh', 29); +// console.log('human: ', human); +// console.log( human.getInfo() ); + +let student = new SuperHero('IvanStudent', 18, 'vyzhyty na stypendiyu'); +let ironIvan = new SuperHero('IvanStark', 39, 'dofiga babla'); + +console.log( + SuperHero.fight(student, ironIvan) +); + + +class ContactBook { + static sos = 911; + + constructor() { + this.numberList = {}; + this._countryCode = '+38'; + } + + getNumber(name) { + return this.numberList[name] || 'no such contact'; + } + + addNumber(name, tel) { + if (name in this.numberList) { + console.log('already exists'); + return; + } + + if (!tel.includes(this._countryCode)) { + tel = this._countryCode + tel; + } + + if (this._checkTelDuplication(tel)) return; + + this.numberList[name] = tel + } + + _checkTelDuplication(tel) { + if (Object.values(this.numberList).includes(tel)) { + console.log('tel already exist'); + return true; + } else return false; + } + + get amount() { + return Object.keys(this.numberList).length; + } +} + +console.log('ContactBook.sos: ', ContactBook.sos); + +let book = new ContactBook(); + +book.addNumber('Ivan Grygorovych', '3423414534'); +book.addNumber('Ivan Vasylovych', '+383423414534'); + +console.log('book: ', book); +console.log(book.getNumber('Ivan Grygorovych')); + +console.log(book.getNumber('asdfasdfs')); + +console.log(book.amount); + + diff --git a/51-dom/index.html b/51-dom/index.html new file mode 100644 index 0000000..5d5cd80 --- /dev/null +++ b/51-dom/index.html @@ -0,0 +1,46 @@ + + + + + + + Document + + + + +
+

+ + title + + + 1 + +

+ +

Title 2

+

Title 3

+
+ +

+ + 0 + +

+ + + + + + diff --git a/51-dom/index.js b/51-dom/index.js new file mode 100644 index 0000000..17317b0 --- /dev/null +++ b/51-dom/index.js @@ -0,0 +1,92 @@ +// let h1 = { +// tagName: 'h1', +// id: 'main-title', +// textContent: 'title', +// parent: div +// }; + +// let div = { +// tagName: 'div', +// children: [h1] +// }; + + + +// let title = document.getElementById('main-title'); +// let title = document.querySelector('h1#main-title'); +// setTimeout(() => { +// title.textContent = 'not a title'; +// }, 3000); + +// let spanIndex = title.querySelector('#main-title > .index'); +// console.dir(spanIndex); + + +// let titles = document.querySelectorAll('.title')[0]; + +// titles.forEach((item) => { +// console.log('item: ', item); +// }); + +let titles = document.getElementsByClassName('title'); + +Array.from(titles).forEach((item, i) => { + item.textContent = 'ola ' + i; +}); + + +let counter = document.querySelector('.counter'); + +console.log('counter: ', counter); +// setInterval(() => { +// counter.innerText = +counter.innerText + 1; +// }, 1000); + +let sec = 0; +let color = ['red', 'blue', 'green']; +// setInterval(() => { +// let classIndex = sec % color.length; + +// counter.className = 'counter ' + color[classIndex]; +// counter.style.fontSize = 20 + sec + 'px'; +// counter.innerHTML = ++sec; +// }, 1000); + + +let title = document.querySelector('h1#main-title'); + +// title.innerHTML = `` + +// title.firstChild.value = '212312'; + +// setTimeout(() => { +// console.log(title.firstChild.value); +// }, 3000); + +console.log(title.getAttribute('custom-attr')); + + +// setTimeout(() => { +// title.style.backgroundColor = 'orange'; +// title.style.color = 'blue'; +// // console.log(title.style.cssText); +// }, 3000); + + +console.log( + parseInt(getComputedStyle(title)['font-size']) +); + + +let button = document.createElement('button'); + +button.innerText = 'click'; + +title.insertAdjacentHTML('beforebegin', ''); + +button.remove(); + + +title.innerHTML = title.innerHTML + ''; + + diff --git a/52-dom/index.css b/52-dom/index.css new file mode 100644 index 0000000..e8e0c7d --- /dev/null +++ b/52-dom/index.css @@ -0,0 +1,33 @@ +.button-wrap { + width: 100px; + height: 100px; + background-color: antiquewhite; + display: flex; + align-items: center; + justify-content: center; +} + + + +.mosaic { + flex-basis: 20px; + height: 20px; +} + + + +#div2 { + background: red; + width: 50px; + height: 50px; +} + +.wrapper { + display: flex; + flex-wrap: wrap; +} +.square { + background: blue; + width: 100px; + height: 100px; +} diff --git a/52-dom/index.html b/52-dom/index.html new file mode 100644 index 0000000..cd245b8 --- /dev/null +++ b/52-dom/index.html @@ -0,0 +1,52 @@ + + + + + + + Document + + + + + + +
+
+
+
+
+ +
+ link +
+ + +
+ +
+ + + + + diff --git a/52-dom/index.js b/52-dom/index.js new file mode 100644 index 0000000..304ee1b --- /dev/null +++ b/52-dom/index.js @@ -0,0 +1,81 @@ +// console.dir(btn); + +// btn.onclick = function() { +// console.log('click 1'); +// } + +// const btn = document.getElementById('button'); + +// function logClick(msg) { +// console.log(msg + ' click 2'); +// } + +// const logWrapper = logClick.bind(null, 'adsfdsf'); + +// document.getElementById('add') +// .addEventListener('click', function() { +// btn.addEventListener('click', logWrapper); +// }); + +// document.getElementById('remove') +// .addEventListener('click', function() { +// btn.removeEventListener('click', logWrapper); +// }); + + +// document.getElementById('click-once') +// .addEventListener('click', function(event) { +// this.textContent = 'dfsfs'; +// // console.log('event: ', event); +// console.log('Once'); +// }, { once: true }); + +// document.getElementById('click-once') +// .addEventListener('click', function(event) { +// // console.log('test1', event.target === this); +// // console.log('event1: ', event); +// console.log('btn click'); +// }); + +// document.querySelector('.container') +// .addEventListener('click', function(event) { +// // console.log('test2', event.target === this); +// // console.log('event2: ', event); +// console.log('container click'); +// }, { capture: true }); + + +let squares = document.getElementsByClassName('square'); + +[...squares].forEach(square => { + square.addEventListener('click', function(event) { + event.stopPropagation(); + this.style.background = 'red'; + }); +}) + +document.querySelector('.wrapper') + .addEventListener('click', function(event) { + // event.target.style.background = 'red'; + console.log('click'); + // console.log('event: ', event.target); + }); + +document.querySelector('.link') + .addEventListener('click', function(event) { + event.preventDefault(); + console.log('link click'); + }) + +document.getElementById('pass-input') + .addEventListener('keypress', function(event) { + console.log('keypress'); + if (this.value === 'ivan') { + this.after('access granted') + } + }); + +document.getElementById('pass-input') +.addEventListener('keydown', function(event) { + console.log('keydown'); +}); diff --git a/52-dom/sidebar.css b/52-dom/sidebar.css new file mode 100644 index 0000000..071fd52 --- /dev/null +++ b/52-dom/sidebar.css @@ -0,0 +1,38 @@ +body { + margin: 0; + height: 100vh; +} + +.menu-wrapper { + position: fixed; + top: 0; + left: 100px; + width: 100%; + height: 100%; + pointer-events: none; +} + +.menu { + position: fixed; + z-index: 100; + top: 0; + left: 0; + height: 100%; + width: 100px; + background: #ccc; + transform: translateX(-100%); + transition: transform .3s; +} + +.menu.menu--open { + transform: translateX(0); +} + +.menu.menu--open + .menu-wrapper { + pointer-events: auto; +} + +#open { + transition: all .3s; +} + diff --git a/52-dom/sidebar.html b/52-dom/sidebar.html new file mode 100644 index 0000000..4ccfd29 --- /dev/null +++ b/52-dom/sidebar.html @@ -0,0 +1,25 @@ + + + + + + + Document + + + + + + + + + + + + diff --git a/52-dom/sidebar.js b/52-dom/sidebar.js new file mode 100644 index 0000000..e663d8f --- /dev/null +++ b/52-dom/sidebar.js @@ -0,0 +1,23 @@ +const open = document.getElementById('open'); + +const menu = document.querySelector('.menu'); +const close = document.querySelector('#close'); +const wrapper = document.querySelector('.menu-wrapper'); + +function toggleMenu() { + menu.classList.toggle('menu--open'); +} + +open.addEventListener('click', toggleMenu); + +close.addEventListener('click', toggleMenu); + +wrapper.addEventListener('click', toggleMenu); + + + +// document.addEventListener('click', function(event) { +// if (event.target !== menu && menu.classList.contains('menu--open')) { +// menu.classList.remove('menu--open'); +// } +// }, {capture: true}); diff --git a/52-dom/square.css b/52-dom/square.css new file mode 100644 index 0000000..8329881 --- /dev/null +++ b/52-dom/square.css @@ -0,0 +1,22 @@ +body { + margin: 0; +} + +#square { + width: 140px; + height: 40px; + font-size: 20px; + color: white; + background-color: crimson; + border: none; + text-transform: uppercase; + letter-spacing: 4px; + font-weight: bold; + border-radius: 5px; + + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + transition: all .3s; +} diff --git a/52-dom/square.html b/52-dom/square.html new file mode 100644 index 0000000..cb4019e --- /dev/null +++ b/52-dom/square.html @@ -0,0 +1,16 @@ + + + + + + + Document + + + + + + + + + diff --git a/52-dom/square.js b/52-dom/square.js new file mode 100644 index 0000000..e77832a --- /dev/null +++ b/52-dom/square.js @@ -0,0 +1,56 @@ + +class Square { + constructor(arr = [2,56,6]) { + console.log(arr); + this.square = document.getElementById('square'); + + this.square.addEventListener('click', () => { + this._start(); + }, {once: true}); + } + + _start() { + console.log('click'); + this.square.style.width = '100px'; + this.square.style.height = '100px'; + this.square.textContent = ''; + setTimeout(() => { + this.square.style.transition = 'all 0s'; + }, 300) + + // requestAnimationFrame + const moveCallback = (event) => { + this._move(event); + }; + + this.square.addEventListener('mousedown', () => { + document.addEventListener('mousemove', moveCallback); + }); + + document.addEventListener('mouseup', () => { + document.removeEventListener('mousemove', moveCallback); + }); + } + + _move(event) { + if (window.innerHeight > event.y + 50 && 0 < event.y - 50) { + this.square.style.top = event.y + 'px'; + } + if (window.innerWidth > event.x + 50) { + this.square.style.left = event.x + 'px'; + } + } + +} + + + + + + + + +document.addEventListener('DOMContentLoaded', function() { + new Square(); +}); + diff --git a/52-dom/square2.html b/52-dom/square2.html new file mode 100644 index 0000000..d176b0d --- /dev/null +++ b/52-dom/square2.html @@ -0,0 +1,16 @@ + + + + + + + Document + + + + + + + + + diff --git a/52-dom/square2.js b/52-dom/square2.js new file mode 100644 index 0000000..c7944e9 --- /dev/null +++ b/52-dom/square2.js @@ -0,0 +1,56 @@ +const square = document.getElementById('square'); + +square.addEventListener('click', function() { + this.style.width = '100px'; + this.style.height = '100px'; + this.textContent = ''; + setTimeout(() => { + this.style.transition = 'all 0s'; + }, 300) + + init(); +}, { once: true }); + + +function moveSquare(event) { + let { x, y } = event; + + const halfSquare = 50; + if (x < halfSquare) x = halfSquare; + if (x > window.innerWidth - halfSquare) x = window.innerWidth - halfSquare; + square.style.left = x + 'px'; + + if (y < halfSquare) y = halfSquare; + if (y > window.innerHeight - halfSquare) y = window.innerHeight - halfSquare; + square.style.top = y + 'px'; +} + +function init() { + square.addEventListener('mousedown', function() { + document.addEventListener('mousemove', moveSquare); + }); + document.addEventListener('mouseup', function() { + document.removeEventListener('mousemove', moveSquare); + }); + + square.addEventListener('keydown', (event) => { + const leftCode = 37; + const upCode = 38; + const rightCode = 39; + const downCode = 40; + switch (event.keyCode) { + case leftCode: + moveSquare({x: square.offsetLeft - 20, y: square.offsetTop}); + break; + case upCode: + moveSquare({x: square.offsetLeft, y: square.offsetTop - 20}); + break; + case rightCode: + moveSquare({x: square.offsetLeft + 20, y: square.offsetTop}); + break; + case downCode: + moveSquare({x: square.offsetLeft, y: square.offsetTop + 20}); + break; + } + }) +} diff --git a/61-ajax/index.html b/61-ajax/index.html new file mode 100644 index 0000000..fc2deac --- /dev/null +++ b/61-ajax/index.html @@ -0,0 +1,72 @@ + + + + + + + Document + + +
+ +
+ +
+
+
+ + + + + + + + diff --git a/61-ajax/index.js b/61-ajax/index.js new file mode 100644 index 0000000..f1cba35 --- /dev/null +++ b/61-ajax/index.js @@ -0,0 +1,148 @@ +// let test = { +// marks: [1, 2, 5], +// msg: "hello" +// }; + +// console.log( JSON.parse(JSON.stringify(test)) ); +// let testCopy = JSON.parse(JSON.stringify(test)); + + +// const xhr = new XMLHttpRequest(); +// console.log('xhr: ', xhr); + +// xhr.open('GET', 'https://api.themoviedb.org/3/discover/movie?api_key=4adb59ec9a677a24e9098f3069908adb'); + +// xhr.send(); + +// xhr.onload = function() { +// console.log('response ', JSON.parse(xhr.response)); +// } + +let key = '?api_key=4adb59ec9a677a24e9098f3069908adb'; + +function getMovies() { + return axios.get('https://api.themoviedb.org/3/discover/movie' + key) +} + +function getCast(id) { + return axios.get(`https://api.themoviedb.org/3/movie/${id}/credits${key}`); +} + +function getActor(actorId) { + return axios.get(`https://api.themoviedb.org/3/person/${actorId}${key}`); +} + + +getMovies() + .then(res => { + return getCast(res.data.results[0].id); + }) + .then(res => { + let actorPromise1 = getActor(res.data.cast[0].id); + + let actorPromise2 = getActor(res.data.cast[1].id); + + return Promise.race([actorPromise1, actorPromise2]) + }).then(res => { + // console.log(res.data.name); + // console.log(arr[0].data.name + ' ' + arr[1].data.name); + }).catch(err => { + // console.log('err: ', err); + }) + + + + + + + +function getPromise() { + console.log('getpromise'); + return axios.get('https://api.themoviedb.org/3/discover/movie' + key); +} + + +// getPromise().then(() => { +// console.log('yeah promise 1 resolved'); +// getPromise().then(() => { +// console.log('yeah promise 2 resolved'); +// getPromise().then(() => { +// console.log('yeah promise 3 resolved'); +// }); +// }); +// }); + +// getPromise().then(getPromise).then(getPromise) +// .then(() => { +// console.log('yeah promise 3 resolved'); +// }); + +// ?api_key=4adb59ec9a677a24e9098f3069908adb +// https://image.tmdb.org/t/p/original/ + +// /movie/{movie_id} +// /movie/{movie_id}/credits +// /person/{person_id} +// /person/{person_id}/movie_credits + + +function lateLog(msg, ivan) { + const promise = new Promise((resolve, reject) => { + console.log('promise func'); + if (ivan === 'ivan') { + setTimeout(() => { + console.log(msg); + resolve('im done'); + }, 3000); + } else { + reject('only for ivan') + } + }); + + return promise; +} + + + +// lateLog('hey', 'vlad').then(res => { +// console.log('res: ', res); +// }).catch((err) => { +// console.log('err: ', err); +// }); + + + +async function getMoviesNew() { + try { + let res = await axios.get('https://api.themoviedb.org/3/discover/movie' + key); + console.log('res: ', res); + let credits = await getCast(res.data.results[0].id); + console.log('credits: ', credits); + + let [actor1, actor2] = await Promise.all([ + getActor(credits.data.cast[0].id), + getActor(credits.data.cast[1].id) + ]); + + console.log('actor1: ', actor1, actor2); + + } catch (err) { + console.log('err: ', err); + } +} + +getMoviesNew(); + +// let unknownString = '{}{}aasdf'; + +// console.log(1); + +// try { +// console.log('result: ', result); +// } catch (err) { +// console.log('hey user type normal json ', err); +// } finally { +// console.log('yes'); +// } + +// console.log(2); diff --git a/61-ajax/test.json b/61-ajax/test.json new file mode 100644 index 0000000..56bfe0a --- /dev/null +++ b/61-ajax/test.json @@ -0,0 +1,4 @@ +{ + "marks": [1, 2, 5], + "msg": "hello" +} diff --git a/62-ajax/index.css b/62-ajax/index.css new file mode 100644 index 0000000..0b10d41 --- /dev/null +++ b/62-ajax/index.css @@ -0,0 +1,65 @@ +form { + margin: 20px auto; +} + +.users { + display: flex; + flex-wrap: wrap; + justify-content:space-around +} + +.user { + flex-basis: 200px; + margin: 10px; + display: flex; + flex-direction: column; + align-items: center; + background-color: #f3f2ee; + text-align: center; + padding: 0 5px; + cursor: pointer; + box-shadow: 0 3px 5px 3px rgba(0,0,0,.13); +} +.user__img { + max-width: 100%; + max-height: 200px; +} +.details { + display: none; + position: fixed; + top: 0; + bottom: 0; + right: 0; + left: 0; + background-color: rgba(0,0,0, .5); + align-items: center; + justify-content: center; +} +.details.shown { + display: flex; +} +.details__content { + width: 400px; + min-height: 400px; + background-color: #fff; + box-shadow: 0 3px 5px 3px rgba(0,0,0,.13); + display: flex; + flex-direction: column; + align-items: center; + background-color: #f3f2ee; + text-align: center; + padding: 20px; +} + +.user__remove { + position: absolute; + top: 5px; + right: 5px; + border: none; + background: none; + font-weight: bold; + cursor: pointer; +} +.user__remove:hover { + background: #fdfdfd; +} diff --git a/62-ajax/index.html b/62-ajax/index.html new file mode 100644 index 0000000..79c45e7 --- /dev/null +++ b/62-ajax/index.html @@ -0,0 +1,56 @@ + + + + + + + Document + + + + +
+ + + + +
+ + + +
+
+ + +
+
+ +
+ + + + + + +
+
+
+ + + + + + + diff --git a/62-ajax/index.js b/62-ajax/index.js new file mode 100644 index 0000000..4c7e3d1 --- /dev/null +++ b/62-ajax/index.js @@ -0,0 +1,132 @@ +// GET ivan.com/users?limit=10&sort=last-name +// GET ivan.com/users/{id} +// path variable - :id {id} +// POST ivan.com/users - create user +// PUT ivan.com/users/{id} - update user +// DELETE ivan.com/users/{id} - delete user + + +// localStorage.setItem('user', JSON.stringify({name: 'ivan'})); +// sessionStorage.setItem('user', 'ivan'); + +// console.log(JSON.parse(localStorage.getItem('user'))); +async function a() { + try { + let res = await axios('https://jsonplaceholder.typicode.com/user'); + console.log('resa: ', res.data); + } catch(err) { + console.log('erra: ', err); + } +} + +async function f() { + try { + let res = await fetch('https://jsonplaceholder.typicode.com/user'); + console.log('res: ', res); + if (!res.ok) { + throw 'request failed ' + res.status; + } + let data = await res.json(); + console.log('resf: ', data); + } catch(err) { + console.log('errf: ', err); + } +} + + + + +const KEY = 'XHk1e8xUVoVSk1NXVDUnmJvkCrXbpSxLWmwW' +const BASE = 'https://gorest.co.in/public-api' + + +async function getUsers(nameFilter) { + try { + const config = { + headers: {'Authorization': 'Bearer ' + KEY}, + params: {first_name: nameFilter} + }; + + const res = await axios.get(BASE + '/users', config); + + return res.data.result; + } catch (err) { + console.log('something bad happened'); + return []; + } +} + +function renderUsers(users) { + const container = document.querySelector('.users'); + container.innerHTML = ''; + + users.forEach(user => { + const userDiv = document.createElement('div'); + userDiv.classList.add('user'); + {/* */} + userDiv.innerHTML = ` +

${user.first_name} ${user.last_name}

+
${user.email}
+ `; + container.append(userDiv); + }) +} + +function createUser(fname, lname, email) { + const config = { + method: 'POST', + headers: {'Authorization': 'Bearer ' + KEY}, + data: { + first_name: fname, + last_name: lname, + email, + gender: 'male' + } + }; + + return axios(BASE + '/users', config).catch((err) => { + console.log('errr', err); + }) +} + +function filterInit() { + document.filterForm.elements.filterApply.addEventListener('click', async function(event) { + const val = document.filterForm.elements.filterInput.value; + if (!val) return; + + const users = await getUsers(val); + document.filterForm.elements.filterInput.value = ''; + renderUsers(users); + }); +} + + +function createInit() { + const fnameEl = document.querySelector('#fname'); + const lnameEl = document.querySelector('#lname'); + const emailEl = document.querySelector('#email'); + const btnCreate = document.querySelector('#create'); + + btnCreate.addEventListener('click', () => { + if (fnameEl.value && lnameEl.value && emailEl.value) { + createUser(fnameEl.value, lnameEl.value, emailEl.value) + .then(() => { + fnameEl.value = ''; + lnameEl.value = ''; + emailEl.value = ''; + }); + } + }); +} + + +filterInit(); +createInit(); +getUsers().then((users) => { + renderUsers(users); +}); +// getUsers().then(renderUsers) + + + + diff --git a/71-generators/index.html b/71-generators/index.html new file mode 100644 index 0000000..c5b81ee --- /dev/null +++ b/71-generators/index.html @@ -0,0 +1,14 @@ + + + + + + + Document + + + + + + + diff --git a/71-generators/index.js b/71-generators/index.js new file mode 100644 index 0000000..bb47b18 --- /dev/null +++ b/71-generators/index.js @@ -0,0 +1,148 @@ +// const now = new Date(2020, 1, 11, 11, 11, 11, 222); +// const now = new Date('2019-01-11T10:10:11.111Z'); +// const now = new Date(); + +// timestamp +// console.log('now: ', now.getTime()); +// console.log('now: ', Date.now()); + +// console.log( now.getDay() ); // нд 0, пн - 1\ +// now.setDate(now.getDate() - 1); +// now.setFullYear(2000); +// console.log( now.getDay() ); +// console.log('now: ', now); +// console.log( now.getMonth() ); + +// console.log( +// now.toLocaleString('ua', {year: 'numeric'}) + ' ' + +// now.toLocaleString('ua', {month: 'long'}) +// ); + + +const now = new Date(); + +const past = new Date('2010-10-10') + +function isAdult(birthday) { + let minDate = new Date(); + minDate.setFullYear(minDate.getFullYear() - 18); + return Date.parse(birthday) <= minDate; +} + +// console.log( isAdult('2005-10-10') ); + +// console.log(performance.now()); + +// for (let i = 0; i < 100000; i++) { +// isAdult('2005-10-10'); +// } +// console.log(Date.now()); + + +// let ivan = {name: 'ivan'}; + +// let obj = {}; +// obj[ivan] = 'hey'; +// console.log('obj: ', obj); + +// let map = new Map(); +// map.set(ivan, 'hey').set('test', 'hello'); + +// console.log('map: ', map); + +// let set = new Set(['adsf', '34', ivan, ivan]); + +// console.log('set: ', set); + +// let arr = [1, 45, 1, 55]; +// arr = [...new Set(arr)]; +// console.log('arr: ', arr); + + +function call(func, context) { + const symbKey = Symbol(); + context[symbKey] = func; + context[symbKey](); + delete context[symbKey]; +} + +function printName() { + console.log(this.name); +} + + + +let user = { name: 'ivan', uniqukey: 'haha' }; + +// call(printName, user); + + +// let symbol1 = Symbol('test'); + +// console.log(Symbol.for('test') === Symbol.for('test')); + +// console.log('user: ', user); +// console.log('symbol: ', symbol1); + +let range = { + from: 0, + to: 10, + [Symbol.iterator]() { + console.log('hey'); + let to = this.to; + let i = this.from; + return { + next() { + let done = i === to; + i++; + return { done, value: i - 1 }; + } + }; + } +}; + +let range2 = { + from: 0, + to: 10, + *[Symbol.iterator]() { + for (let i = this.from; i <= this.to; i++) { + yield i; + } + } +}; + +// for (key of range2) { +// console.log('key: ', key); +// } + + +function* test() { + let input = yield 1; + console.log('input: ', input); + yield 2; + yield 3; +} + +const gen = test(); +// gen.next().value; +// gen.next('hello').value; + +function lateLog(msg) { + setTimeout(() => { + console.log(msg); + }, 100) +} + + +function* counter() { + let i = 0; + while(true) { + yield i++; + } +} + +let count = counter(); +console.log(count.next().value); +console.log(count.next().value); +console.log(count.next().value); +console.log(count.next().value);