HW14.js 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843
  1. // Переделайте задание createPerson на функцию конструктор Person.
  2. // Для этого методы и свойства заносите не в создаваемый объект, а в this внутри конструктора.
  3. {
  4. function Person(name, surName) {
  5. this.name = `${name}`
  6. this.surName = `${surName}`
  7. this.getFullName = function getFullName() {
  8. return `${this.name} ${this.fatherName || ''} ${this.surName}`
  9. }
  10. }
  11. const a = new Person("Вася", "Пупкин")
  12. const b = new Person("Анна", "Иванова")
  13. const c = new Person("Елизавета", "Петрова")
  14. console.log(a.getFullName()) //Вася Пупкин
  15. a.fatherName = 'Иванович' //Вася Иванович Пупкин
  16. console.log(a.getFullName())
  17. console.log(b.getFullName())
  18. console.log(c.name)//Анна Иванова
  19. }
  20. // Person Prototype
  21. // Переделайте предыдущее задание, вынеся методы в прототип.Для этого вместо присвоения в this занесите их в объект Person.prototype.После этой переделки все должно работать по старому:
  22. {
  23. function Person(name, surName) {
  24. this.name = name,
  25. this.surName = surName
  26. }
  27. Person.prototype.name = function () {
  28. return this.name
  29. }
  30. Person.prototype.surName = function () {
  31. return this.surName
  32. }
  33. Person.prototype.getFullName = function () {
  34. return `${this.name} ${this.fatherName || ''} ${this.surName}`
  35. }
  36. const a = new Person("Вася", "Пупкин")
  37. const b = new Person("Анна", "Иванова")
  38. const c = new Person("Елизавета", "Петрова")
  39. console.log(a.getFullName()) //Вася Пупкин
  40. a.fatherName = 'Иванович' //Вася Иванович Пупкин
  41. console.log(a.getFullName())
  42. console.log(b.getFullName())
  43. console.log(c.name)//Анна Иванова
  44. }
  45. // Store
  46. // Переделайте функцию createStore(та, которая хранилище Redux) на конструктор Store.Прототип не используйте; оставьте переменные state, cbs и reducer замкнутыми.Соответственно методы subscribe, dispatch и getState должны быть объявлены внутри функции - конструктора и не могут быть в прототипе.Проверьте переделанный конструктор на вашем ДЗ по ларьку;
  47. {
  48. function Store(reducer) {
  49. let state = reducer(undefined, {})
  50. let cbs = []
  51. let getState, dispatch, subscribe
  52. this.getState = () => state
  53. this.subscribe = cb => (cbs.push(cb),
  54. () => cbs = cbs.filter(c => c !== cb))
  55. this.dispatch = action => {
  56. const newState = reducer(state, action)
  57. if (newState !== state) {
  58. state = newState
  59. for (let cb of cbs) cb()
  60. }
  61. }
  62. }
  63. // ниже код ларька для проверки
  64. {
  65. // create Reduser
  66. function reducer(state, { type, ШО, СКОКА, БАБЛО, ШО_ДОБАВИТЬ, СКОКА_ДОБАВИТЬ, ЦЕНА_ДОБАВИТЬ }) {
  67. if (!state) {
  68. return {
  69. касса: 200,
  70. чай: 0,
  71. пиво: {
  72. amount: 110,
  73. price: 20
  74. },
  75. чипсы: {
  76. amount: 120,
  77. price: 30
  78. },
  79. сиги: {
  80. amount: 130,
  81. price: 50
  82. }
  83. }
  84. }
  85. if (type === 'КУПИТЬ' && СКОКА <= state[ШО].amount && БАБЛО === (СКОКА * state[ШО].price)) {
  86. return {
  87. ...state,
  88. [ШО]: {
  89. amount: state[ШО].amount - СКОКА,
  90. price: state[ШО].price
  91. },
  92. касса: state.касса + БАБЛО
  93. }
  94. }
  95. if (type === 'КУПИТЬ' && СКОКА <= state[ШО].amount && БАБЛО > (СКОКА * state[ШО].price)) {
  96. return {
  97. ...state,
  98. [ШО]: {
  99. amount: state[ШО].amount - СКОКА,
  100. price: state[ШО].price
  101. },
  102. касса: state.касса + (СКОКА * state[ШО].price),
  103. чай: state.чай + (БАБЛО - (СКОКА * state[ШО].price))
  104. }
  105. }
  106. if (type === 'ДОБАВИТЬ' && !(ШО_ДОБАВИТЬ in state) && state.касса >= (СКОКА_ДОБАВИТЬ * ЦЕНА_ДОБАВИТЬ)) {
  107. return {
  108. ...state,
  109. [ШО_ДОБАВИТЬ]: {
  110. amount: СКОКА_ДОБАВИТЬ,
  111. price: ЦЕНА_ДОБАВИТЬ
  112. },
  113. касса: state.касса - (СКОКА_ДОБАВИТЬ * ЦЕНА_ДОБАВИТЬ)
  114. }
  115. }
  116. if (type === 'ДОБАВИТЬ' && ШО_ДОБАВИТЬ in state && state.касса >= (СКОКА_ДОБАВИТЬ * ЦЕНА_ДОБАВИТЬ)) {
  117. return {
  118. ...state,
  119. [ШО_ДОБАВИТЬ]: {
  120. amount: state[ШО_ДОБАВИТЬ].amount + СКОКА_ДОБАВИТЬ,
  121. price: ЦЕНА_ДОБАВИТЬ
  122. },
  123. касса: state.касса - (СКОКА_ДОБАВИТЬ * ЦЕНА_ДОБАВИТЬ)
  124. }
  125. }
  126. return state
  127. }
  128. const store = new Store(reducer)
  129. // create divStore
  130. const divStore = document.createElement('div')
  131. divStore.style.cssText = `
  132. min-width: 700px;
  133. width: 50%;
  134. border: 1px solid #A9A9A9;
  135. border-radius: 8px;
  136. box-shadow: rgb(0 0 0 / 50%) 5px 5px 5px 0px;
  137. padding: 20px;`
  138. document.body.append(divStore)
  139. // create divStore title
  140. const divStoreitle = document.createElement('h1')
  141. divStoreitle.innerText = 'ЛАРЕК'
  142. divStoreitle.style.cssText = `
  143. text-align: center;`
  144. divStore.append(divStoreitle)
  145. // create Table of Store
  146. let table, col, row
  147. const createTable = () => {
  148. table = document.createElement('table')
  149. divStore.append(table)
  150. // create names of parametrs
  151. const params = []
  152. for (const child of Object.values(store.getState())) {
  153. for (const key of Object.keys(child)) {
  154. if (!params.includes(key)) {
  155. params.push(key);
  156. }
  157. }
  158. }
  159. // create Header of table
  160. row = document.createElement('tr')
  161. table.append(row)
  162. // create first cell in Header
  163. col = document.createElement('td')
  164. row.append(col)
  165. // create header names
  166. for (const key of params) {
  167. col = document.createElement('td')
  168. col.innerText = `${key}`
  169. col.style.cssText = `
  170. font-size: 1.5em;
  171. padding: 5px 10px;
  172. margin: 0 10px;
  173. text-align: center;
  174. background-color: #D9D9D9;`
  175. row.append(col)
  176. }
  177. // create table body
  178. for (const [key, values] of Object.entries(store.getState())) {
  179. if (key === 'касса') {
  180. row = document.createElement('tr')
  181. table.append(row)
  182. col = document.createElement('td')
  183. col.innerText = `${key.toUpperCase()}`
  184. col.style.cssText = `
  185. min-width: 150px;
  186. font-size: 2em;
  187. padding: 5px 10px;
  188. text-align: left`
  189. row.append(col)
  190. col = document.createElement('td')
  191. col.innerText = `${values}`
  192. col.style.cssText = `
  193. font-size: 2em;
  194. text-align: center;`
  195. row.append(col)
  196. } else if (key === 'чай') {
  197. row = document.createElement('tr')
  198. table.append(row)
  199. col = document.createElement('td')
  200. col.innerText = `На ${key.toUpperCase()} редюсеру-трудяге`
  201. col.style.cssText = `
  202. min-width: 150px;
  203. font-size: 1.5em;
  204. padding: 5px 10px;
  205. text-align: left`
  206. row.append(col)
  207. col = document.createElement('td')
  208. col.innerText = `${values}`
  209. col.style.cssText = `
  210. font-size: 1.5em;
  211. text-align: center;`
  212. row.append(col)
  213. } else {
  214. // рисуем строку заголовков
  215. row = document.createElement('tr')
  216. table.append(row)
  217. col = document.createElement('td')
  218. col.innerText = `${key.toUpperCase()}`
  219. col.style.cssText = `
  220. min-width: 150px;
  221. font-size: 2em;
  222. padding: 5px 10px;
  223. text-align: left`
  224. row.append(col)
  225. // рисуем строки значений для товаров
  226. for (const name of params) {
  227. col = document.createElement('td')
  228. col.innerText = `${(Object.keys(values)).includes(name) ? values[name] : ''}`
  229. col.style.cssText = `
  230. font-size: 1.5em;
  231. text-align: center`
  232. row.append(col)
  233. }
  234. }
  235. }
  236. return table
  237. }
  238. createTable()
  239. // start test in console.log
  240. store.subscribe(() => console.log(store.getState()))
  241. // create divWindow
  242. const divWindow = document.createElement('div')
  243. divWindow.style.cssText = `
  244. min-width: 700px;
  245. width: 50%;
  246. padding: 10px;
  247. margin-top: 30px;`
  248. document.body.append(divWindow)
  249. // create divWindow title
  250. const divWindowitle = document.createElement('h2')
  251. divWindowitle.innerText = 'Покупка в ларьке'
  252. divWindowitle.style.cssText = `
  253. text-align: center;`
  254. divWindow.append(divWindowitle)
  255. // create inputAmount
  256. const inputAmount = document.createElement('input')
  257. inputAmount.type = 'number'
  258. inputAmount.min = 0
  259. inputAmount.placeholder = 'Количество товара'
  260. divWindow.append(inputAmount)
  261. // ceate inputMoney
  262. const inputMoney = document.createElement('input')
  263. inputMoney.type = 'number'
  264. inputMoney.min = 0
  265. inputMoney.placeholder = 'Сумма, которую отдаете'
  266. divWindow.append(inputMoney)
  267. let selectProduct
  268. createListProduct = () => {
  269. // create selectProduct
  270. selectProduct = document.createElement('select')
  271. divWindow.insertBefore(selectProduct, inputMoney)
  272. for (let key of Object.keys(store.getState())) {
  273. if (key !== 'касса' && key !== 'чай') {
  274. let optionInput = document.createElement('option')
  275. optionInput.innerText = `${key}`
  276. selectProduct.append(optionInput)
  277. }
  278. }
  279. return selectProduct
  280. }
  281. createListProduct()
  282. // create buyButton
  283. const buyButton = document.createElement('button')
  284. buyButton.innerText = 'Купить'
  285. divWindow.append(buyButton)
  286. // create add div
  287. const divAdd = document.createElement('div')
  288. divAdd.style.cssText = `
  289. min-width: 700px;
  290. width: 50%;
  291. margin-top: 40px;`
  292. document.body.append(divAdd)
  293. // create add div title
  294. const divAddTitle = document.createElement('h2')
  295. divAddTitle.innerText = 'Пополнение ларька'
  296. divAddTitle.style.cssText = `
  297. text-align: center;`
  298. divAdd.append(divAddTitle)
  299. // create inputAddProduct
  300. const inputAddProduct = document.createElement('input')
  301. inputAddProduct.type = 'text'
  302. inputAddProduct.placeholder = 'Введите имя продукта'
  303. divAdd.append(inputAddProduct)
  304. // create inputAddAmount
  305. const inputAddAmount = document.createElement('input')
  306. inputAddAmount.type = 'number'
  307. inputAddAmount.min = 0
  308. inputAddAmount.placeholder = 'Введите количество продукта'
  309. divAdd.append(inputAddAmount)
  310. // create inputAddPrice
  311. const inputAddPrice = document.createElement('input')
  312. inputAddPrice.type = 'number'
  313. inputAddPrice.min = 0
  314. inputAddPrice.placeholder = 'Введите цену продукта'
  315. divAdd.append(inputAddPrice)
  316. // create addProductButton
  317. const addProductButton = document.createElement('button')
  318. addProductButton.innerText = 'Добавить продукт'
  319. divAdd.append(addProductButton)
  320. // mistake alert
  321. addProductButton.onclick = () => {
  322. if ((+inputAddAmount.value * +inputAddPrice.value) > store.getState().касса) {
  323. alert('В кассе нет столько денег! Давай торговаться?')
  324. }
  325. }
  326. // start addProductButton
  327. addProductButton.addEventListener('click', () => store.dispatch({ type: 'ДОБАВИТЬ', ШО_ДОБАВИТЬ: inputAddProduct.value, СКОКА_ДОБАВИТЬ: +inputAddAmount.value, ЦЕНА_ДОБАВИТЬ: +inputAddPrice.value }))
  328. // mistake alert
  329. buyButton.onclick = () => {
  330. if (+inputAmount.value > store.getState()[selectProduct.value].amount) {
  331. alert(`Количество товара, который вы хотите купить, больше, чем наличие на складе! На складе ${store.getState()[selectProduct.value].amount} единиц ${selectProduct.value}`)
  332. } else if (+inputMoney.value < (+inputAmount.value * store.getState()[selectProduct.value].price)) {
  333. alert(`Вы даете ${inputMoney.value}. А нужно ${+inputAmount.value * store.getState()[selectProduct.value].price}. Добавьте ${(+inputAmount.value * store.getState()[selectProduct.value].price) - +inputMoney.value}`)
  334. }
  335. }
  336. // start buyButton
  337. buyButton.addEventListener('click', () => store.dispatch({ type: 'КУПИТЬ', ШО: selectProduct.value, СКОКА: +inputAmount.value, БАБЛО: +inputMoney.value }))
  338. // Relaod table with new datas
  339. store.subscribe(() => {
  340. table.remove(),
  341. selectProduct.remove(),
  342. createTable(),
  343. createListProduct()
  344. })
  345. }
  346. }
  347. // Password
  348. // Напишите функцию конструктор Password, которая будет в родительском элементе создавать поле ввода для пароля и кнопку / иконку / чекбокс, который будет переключать режим просмотра пароля в поле ввода. (видимый пароль или нет, input type = 'text' или же input type = 'password')
  349. // Параметры:
  350. // parent - родительский элемент
  351. // open - стартовое состояние
  352. // Методы:
  353. // setValue / getValue - задают / читают значения
  354. // setOpen / getOpen - задают / читают открытость текста в поле ввода
  355. // Колбэки(функции обратного вызова, который возможно, будут заданы снаружи конструктора):
  356. // onChange - запускается по событию oninput в поле ввода, передает текст в колбэк
  357. // onOpenChange - запускается по изменению состояния открытости пароля
  358. {
  359. function Password(parent, open) {
  360. // create filed for password
  361. const inputPassword = document.createElement('input')
  362. inputPassword.type = 'password'
  363. inputPassword.placeholder = 'Insert password'
  364. parent.append(inputPassword)
  365. // create checkbox
  366. const inputCheckbox = document.createElement('input')
  367. inputCheckbox.type = 'checkbox'
  368. inputCheckbox.checked = false
  369. parent.append(inputCheckbox)
  370. // create getters
  371. this.getValue = () => inputPassword.value
  372. this.getOpen = () => inputCheckbox.checked
  373. // create setters
  374. this.setValue = (value) => inputPassword.value = value
  375. this.setOpen = (open) => {
  376. if (open === true) {
  377. inputPassword.type = 'text'
  378. inputCheckbox.checked = true
  379. }
  380. if (open === false) {
  381. inputPassword.type = 'password'
  382. inputCheckbox.checked = false
  383. }
  384. return inputPassword.type, inputCheckbox.checked
  385. }
  386. // starting onChange
  387. inputPassword.addEventListener('input', () => {
  388. this.onChange(inputPassword.value)
  389. })
  390. // starting onOpenChange + change inputPasswor hide/see
  391. inputCheckbox.addEventListener('change', () => {
  392. this.setOpen(inputCheckbox.checked),
  393. this.onOpenChange(inputCheckbox.checked)
  394. })
  395. }
  396. let p = new Password(document.body, true)
  397. p.onChange = data => console.log('onChange: ', data)
  398. p.onOpenChange = open => console.log('onOpenChange: ', open)
  399. p.setValue('qwerty')
  400. console.log(p.getValue())
  401. p.setOpen(false)
  402. console.log(p.getOpen())
  403. }
  404. // LoginForm
  405. // С помощью предыдущего кода Password сделайте форму логина, кнопка в которой будет активна только если и login и пароль не пусты.
  406. // WARNING! "С помощью предыдущего кода" значит что в коде формы логина вы используете объект, сконструированный конструктором Password - const password = new Password(........)
  407. {
  408. function Password(parent, open) {
  409. // create password fild
  410. const inputPassword = document.createElement('input')
  411. inputPassword.type = 'password'
  412. inputPassword.placeholder = 'Insert password'
  413. parent.append(inputPassword)
  414. // create checkbox
  415. const inputCheckbox = document.createElement('input')
  416. inputCheckbox.type = 'checkbox'
  417. inputCheckbox.checked = false
  418. parent.append(inputCheckbox)
  419. // create getters
  420. this.getValue = () => inputPassword.value
  421. this.getOpen = () => inputCheckbox.checked
  422. // create setters
  423. this.setValue = (value) => inputPassword.value = value
  424. this.setOpen = (open) => {
  425. if (open === true) {
  426. inputPassword.type = 'text'
  427. inputCheckbox.checked = true
  428. }
  429. if (open === false) {
  430. inputPassword.type = 'password'
  431. inputCheckbox.checked = false
  432. }
  433. return inputPassword.type, inputCheckbox.checked
  434. }
  435. // starting onChange
  436. inputPassword.addEventListener('input', () => {
  437. this.onChange(inputPassword.value)
  438. })
  439. // starting onOpenChange + change inputPasswor hide/see
  440. inputCheckbox.addEventListener('change', () => {
  441. this.setOpen(inputCheckbox.checked),
  442. this.onOpenChange(inputCheckbox.checked)
  443. })
  444. }
  445. function Login(parent) {
  446. // create login fild
  447. const inputLogin = document.createElement('input')
  448. inputLogin.type = 'text'
  449. inputLogin.placeholder = 'Insert login'
  450. parent.append(inputLogin)
  451. // create getters
  452. this.getValue = () => inputLogin.value
  453. // create setters
  454. this.setValue = (value) => inputLogin.value = value
  455. // starting onChange
  456. inputLogin.addEventListener('input', () => {
  457. this.onChange(inputLogin.value)
  458. })
  459. }
  460. // create form with password and login
  461. const form = document.createElement('form')
  462. document.body.append(form)
  463. const loginLabel = document.createElement('label')
  464. loginLabel.innerText = 'Login:'
  465. form.append(loginLabel)
  466. let breakSymbol = document.createElement('br')
  467. form.append(breakSymbol)
  468. const login = new Login(form)
  469. breakSymbol = document.createElement('br')
  470. form.append(breakSymbol)
  471. const passwordLabel = document.createElement('label')
  472. passwordLabel.innerText = 'Password:'
  473. form.append(passwordLabel)
  474. breakSymbol = document.createElement('br')
  475. form.append(breakSymbol)
  476. const password = new Password(form, true)
  477. breakSymbol = document.createElement('br')
  478. form.append(breakSymbol)
  479. const confirmBtn = document.createElement('button')
  480. confirmBtn.innerText = 'Confirm'
  481. confirmBtn.type = 'submit'
  482. confirmBtn.style.marginTop = '10px'
  483. confirmBtn.disabled = true
  484. form.append(confirmBtn)
  485. // change confirmBtn.disabled
  486. function checkButton() {
  487. if (login.getValue() !== '' && password.getValue() !== '') {
  488. confirmBtn.disabled = false
  489. } else {
  490. confirmBtn.disabled = true
  491. }
  492. return confirmBtn.disabled
  493. }
  494. checkButton()
  495. // listening password and login
  496. login.onChange = password.onChange = checkButton
  497. }
  498. // LoginForm Constructor
  499. // оформите предыдущую задачу как функцию - конструктор.Продумайте и предусмотрите геттеры, сеттеры и колбэки.
  500. {
  501. function LoginForm(parent) {
  502. function Password(parent, open) {
  503. // create password fild
  504. const inputPassword = document.createElement('input')
  505. inputPassword.type = 'password'
  506. inputPassword.placeholder = 'Insert password'
  507. parent.append(inputPassword)
  508. // create checkbox
  509. const inputCheckbox = document.createElement('input')
  510. inputCheckbox.type = 'checkbox'
  511. inputCheckbox.checked = false
  512. parent.append(inputCheckbox)
  513. // create getters
  514. this.getValue = () => inputPassword.value
  515. this.getOpen = () => inputCheckbox.checked
  516. // create setters
  517. this.setValue = (value) => inputPassword.value = value
  518. this.setOpen = (open) => {
  519. if (open === true) {
  520. inputPassword.type = 'text'
  521. inputCheckbox.checked = true
  522. }
  523. if (open === false) {
  524. inputPassword.type = 'password'
  525. inputCheckbox.checked = false
  526. }
  527. return inputPassword.type, inputCheckbox.checked
  528. }
  529. // starting onChange
  530. inputPassword.addEventListener('input', () => {
  531. this.onChange(inputPassword.value)
  532. })
  533. // starting onOpenChange + change inputPasswor hide/see
  534. inputCheckbox.addEventListener('change', () => {
  535. this.setOpen(inputCheckbox.checked),
  536. this.onOpenChange(inputCheckbox.checked)
  537. })
  538. }
  539. function Login(parent) {
  540. // create login fild
  541. const inputLogin = document.createElement('input')
  542. inputLogin.type = 'text'
  543. inputLogin.placeholder = 'Insert login'
  544. parent.append(inputLogin)
  545. // create getters
  546. this.getValue = () => inputLogin.value
  547. // create setters
  548. this.setValue = (value) => inputLogin.value = value
  549. // starting onChange
  550. inputLogin.addEventListener('input', () => {
  551. this.onChange(inputLogin.value)
  552. })
  553. }
  554. // create form with password and login
  555. const form = document.createElement('form')
  556. parent.append(form)
  557. const loginLabel = document.createElement('label')
  558. loginLabel.innerText = 'Login:'
  559. form.append(loginLabel)
  560. let breakSymbol = document.createElement('br')
  561. form.append(breakSymbol)
  562. const login = new Login(form)
  563. breakSymbol = document.createElement('br')
  564. form.append(breakSymbol)
  565. const passwordLabel = document.createElement('label')
  566. passwordLabel.innerText = 'Password:'
  567. form.append(passwordLabel)
  568. breakSymbol = document.createElement('br')
  569. form.append(breakSymbol)
  570. const password = new Password(form, true)
  571. breakSymbol = document.createElement('br')
  572. form.append(breakSymbol)
  573. const confirmBtn = document.createElement('button')
  574. confirmBtn.innerText = 'Confirm'
  575. confirmBtn.type = 'submit'
  576. confirmBtn.style.marginTop = '10px'
  577. confirmBtn.disabled = true
  578. form.append(confirmBtn)
  579. // change confirmBtn.disabled
  580. function checkButton() {
  581. if (login.getValue() !== '' && password.getValue() !== '') {
  582. confirmBtn.disabled = false
  583. } else {
  584. confirmBtn.disabled = true
  585. }
  586. return confirmBtn.disabled
  587. }
  588. checkButton()
  589. // listening password and login
  590. login.onChange = password.onChange = checkButton
  591. // create getters
  592. this.getPasswordValue = () => password.getValue()
  593. this.getPasswordOpen = () => password.getOpen()
  594. this.getLoginValue = () => login.getValue()
  595. this.getButtonStatus = () => confirmBtn.disabled
  596. // create setters
  597. this.setPasswordValue = (value) => password.setValue(value)
  598. this.setLoginValue = (value) => login.setValue(value)
  599. this.setPasswordOpen = (status) => password.setOpen(status)
  600. // create callbacks
  601. this.onOpenChange = open => password.onOpenChange = open
  602. }
  603. const loginForm = new LoginForm(document.body)
  604. loginForm.setPasswordValue('1q2w3e')
  605. console.log(loginForm.getPasswordValue())
  606. loginForm.setLoginValue('login')
  607. console.log(loginForm.getLoginValue())
  608. loginForm.setPasswordOpen(false)
  609. console.log(loginForm.getPasswordOpen())
  610. loginForm.onOpenChange(open => console.log(open))
  611. }
  612. // Password Verify - almost done
  613. // С помощью Password сделайте пару инпутов, которые проверяют введеный пароль(в двух полях ввода) на совпадение.Подсвечивайте поля красным цветом / бордером когда пароли не совпадают При открытом пароле в первом поле ввода(которое реализуется с помощью объекта класса Password второе поле вводы должно пропадать с экрана Таким образом:
  614. // Когда Password в скрытом режиме - появляется второй инпут(<input type='password'>) с паролем в скрытом режиме
  615. // Когда Password в открытом режиме - второй инпут пропадает
  616. {
  617. function Password(parent, open) {
  618. // create filed for password
  619. const inputPassword = document.createElement('input')
  620. inputPassword.type = 'password'
  621. inputPassword.placeholder = 'Insert password'
  622. parent.append(inputPassword)
  623. // create checkbox
  624. const inputCheckbox = document.createElement('input')
  625. inputCheckbox.type = 'checkbox'
  626. inputCheckbox.checked = false
  627. parent.append(inputCheckbox)
  628. // create getters
  629. this.getValue = () => inputPassword.value
  630. this.getOpen = () => inputCheckbox.checked
  631. // create setters
  632. this.setValue = (value) => inputPassword.value = value
  633. this.setOpen = (open) => {
  634. if (open === true) {
  635. inputPassword.type = 'text'
  636. inputCheckbox.checked = true
  637. }
  638. if (open === false) {
  639. inputPassword.type = 'password'
  640. inputCheckbox.checked = false
  641. }
  642. return inputPassword.type, inputCheckbox.checked
  643. }
  644. // starting onChange
  645. inputPassword.addEventListener('input', () => {
  646. this.onChange(inputPassword.value)
  647. })
  648. // starting onOpenChange + change inputPasswor hide/see
  649. inputCheckbox.addEventListener('change', () => {
  650. this.setOpen(inputCheckbox.checked),
  651. this.onOpenChange(inputCheckbox.checked)
  652. })
  653. // set background color
  654. this.setBackground = (value) => {
  655. inputPassword.style.backgroundColor = value
  656. }
  657. }
  658. function Checher(parent) {
  659. const passwordVerifyDiv = document.createElement('div')
  660. passwordVerifyDiv.style.backgroundColor = 'transparent'
  661. parent.append(passwordVerifyDiv)
  662. const mainDiv = document.createElement('div')
  663. passwordVerifyDiv.append(mainDiv)
  664. let main = new Password(mainDiv, true)
  665. const checkedDiv = document.createElement('div')
  666. checkedDiv.style.display = 'block'
  667. passwordVerifyDiv.append(checkedDiv)
  668. let checked = new Password(checkedDiv, true)
  669. main.onOpenChange = open => {
  670. !open ? checkedDiv.style.display = 'block' : checkedDiv.style.display = 'none'
  671. }
  672. function checker() {
  673. if (main.getValue() !== checked.getValue()) {
  674. main.setBackground('#FFAAAA')
  675. checked.setBackground('#FFAAAA')
  676. } else {
  677. main.setBackground('transparent')
  678. checked.setBackground('transparent')
  679. }
  680. return main.setBackground, checked.setBackground
  681. }
  682. checker()
  683. main.onChange = checked.onChange = checker
  684. }
  685. const checker = new Checher(document.body)
  686. }