Advertisement
Guest User

Untitled

a guest
Apr 12th, 2017
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 53.76 KB | None | 0 0
  1. var start = 0; //вопрос Дену: можно ли так?
  2. var MAX_ON_PAGE = 4;
  3. var USER_OK = "ок";
  4. var USER_NO_USER = "Пользователь с таким именем не зарегистрирован";
  5. var USER_INCORRECT_PASSWORD = "Неверный пароль";
  6. var filterState = 0;
  7. var user = {
  8. name: 'Пользователь',
  9. };
  10. var GLOBAL_TAGS;
  11. var GLOBAL_AUTHORS;
  12. var GLOBAL_ARTICLES;
  13.  
  14. //var user =null;
  15.  
  16. //вопрос Дену: useStrict;
  17. function fillArticlesStorage() {
  18. localStorage.clear('articles');
  19. localStorage.setItem('articles', JSON.stringify(articlesModule.GLOBAL_ARTICLES));
  20. }
  21.  
  22. const logIn = function () {
  23. if (user) {
  24. user = null;
  25. displayModule.userCheck();
  26. }
  27. else {
  28. displayModule.showLog();
  29. toMain = document.querySelectorAll(".to_main");
  30. toMain[0].addEventListener('click', function () {
  31. displayModule.showMainPage(GLOBAL_ARTICLES, GLOBAL_AUTHORS);
  32. displayModule.userCheck();
  33. });
  34. toMain[1].addEventListener('click', function (event) {
  35. var name = document.querySelector("#user_name").value;
  36. var password = document.querySelector("#password").value;
  37. var result = articlesModule.comparePassword(name, password);
  38. if (result === USER_OK) {
  39. user = {
  40. name: name
  41. }
  42. displayModule.userCheck();
  43. displayModule.showMainPage(GLOBAL_ARTICLES, GLOBAL_AUTHORS);
  44. }
  45. else {
  46. var h2 = document.querySelector('h2');
  47. h2.style.color = "red";
  48. h2.innerText = result;
  49. }
  50. })
  51. }
  52. };
  53. var articlesModule = (function () {
  54.  
  55. var filterConfig = {
  56. author: "",
  57. createdAt: "",
  58. tags: []
  59. };
  60.  
  61. var GLOBAL_ARTICLES = [
  62. {
  63. id: '1',
  64. title: '"Не получается купить проект". Город скорректировал подход к постройке футбольного стадиона',
  65. createdAt: new Date('2017-02-27T23:00:00'),
  66. summary: 'Подход к строительству Национального футбольного стадиона возле площади Ванеева снова корректируют. Вместо покупки проекта уже возведенной в Европе арены городские власти рассматривают вариант реализации всех стадий строительства собственными силами. Такой вывод можно сделать по итогами беседы TUT.BY с главой Минска Андреем Шорцем.',
  67. author: 'Станислав',
  68. content: 'Напомним, в прошлом году городские власти отказались от услуг китайской компании, которая должна была построить Национальный футбольный стадион рядом с существующим «Трактором». Тогда решили купить проект арены, которая уже работает в одной из европейских стран, и возвести ее за средства бюджета и Банка развития.Андрей Шорец говорит, что после этого они изучили несколько вариантов, включая стадион в Будапеште и домашнюю арену варшавской «Легии». ',
  69. tag: ['Строительство', 'Спорт']
  70. },
  71. {
  72. id: '2',
  73. title: 'В Минской области сотрудникам ГАИ пришлось стрелять по колесам двух автомобилей для остановки нарушителей',
  74. summary: 'В Минской области сотрудники ГАИ вынуждены были 2 и 3 марта стрелять по колесам автомобилей для остановки нарушителей, сообщили в УГАИ УВД Миноблисполкома.',
  75. createdAt: new Date('2017-03-03T14:00:00'),
  76. author: 'Дмитрий',
  77. content: 'Первый инцидент случился 2 марта около 19.20 на автодороге вблизи деревни Гольчицы Слуцкого района. Внимание сотрудников ОГАИ Слуцкого РОВД привлек автомобиль Toyota Camry, двигавшийся с неработающими фарами и без переднего регистрационного знака. Водитель Toyota попытался скрыться от ГАИ.Следует отметить, что водитель игнорировал многократные требования ГАИ об остановке, сирену и сигналы маячков красно-синего цвета. Не остановили его и предупредительные выстрелы в воздух. После этого сотрудником ГАИ были произведены прицельные выстрелы по колесам транспортного средства. Даже два простреленных задних колеса не образумили нарушителя — машина еще около километра продолжала движение на дисках колес без резины. Удалось задержать нарушителя на 65-м км автодороги Р-91. За рулем находился 42-летний местный житель в состоянии сильного алкогольного опьянения (3,2 промилле). С 2008 года он четырежды привлекался за управление транспортным средством в нетрезвом состоянии, в том числе в последний раз — в 2015 году.',
  78. tag: ['Проишествия', 'Авто']
  79. },
  80. {
  81. id: '3',
  82. title: 'В Литве установят сирены на случай чрезвычайных ситуаций на БелАЭС ',
  83. summary: 'Департамент пожарной безопасности и спасения (ДПБС) намерен оборудовать на юго-востоке Литвы предупредительные сирены, которые бы информировали население о возможной опасности в случае инцидентов на Островецкой АЭС в Беларуси,',
  84. createdAt: new Date('2017-02-15T14:00:00'),
  85. author: 'Владимир',
  86. content: 'Сирены собираются установить в Вильнюсе и Вильнюсском районе, Ширвинтском и Шальчининкском районах, всего в 150 местах, которые находятся от АЭС примерно в 50 километрах./nПо словам заместителя директора ДПБС Юриса Таргонскаса, сирены обойдутся в сумму до трех миллионов евро./n«Когда еще работала Игналинская атомная станция, у нас также вокруг была внедрена система предупреждения. Поскольку АЭС будет находиться недалеко от границы, зона воздействия будет на нашей территории, мы готовимся предупредить жителей», — сообщил он./nТаргонскас подчеркнул, что жителей будут предупреждать как в связи с радиоактивной опасностью, так и в случаях других происшествий. Сирены будут интегрированы в общую систему предупреждения, информирующую жителей телефонными сообщениями, если нужно — и через национальный транслятор./nВ департаменте надеются, что сирены появятся еще до запуска БелАЭС./nБелорусская АЭС строится по проекту АЭС-2006 с реакторами типа ВВЭР-1200. Стройплощадка находится в 18 км от Островца в Гродненской области в 50 километрах от столицы Литвы. АЭС будет состоять из двух энергоблоков суммарной мощностью до 2400 (2?1200) МВт. Первый энергоблок планируется ввести в эксплуатацию в 2019 году, второй — в 2020-м. Правительство Литвы утверждает, что БелАЭС возводится с нарушениями стандартов безопасности. Минск эти упреки отвергает.',
  87. tag: ['Беларусь', 'Литва']
  88. },
  89. {
  90. id: '4',
  91. title: 'Минтруда: в Беларуси пересмотрят назначение и выплату пособий на детей-инвалидов',
  92. summary: 'Система назначения и выплат пособий в Беларуси будет усовершенствована, сообщил на пресс-конференции заместитель министра труда и социальной защиты Александр Румак, передает БелаПАН.',
  93. createdAt: new Date('2017-03-06T11:15:00'),
  94. author: 'Иванов Иван',
  95. content: 'По его словам, подготовлен в новой редакции проект закона «О государственных пособиях семьям, воспитывающим детей». Документ был принят в первом чтении и сейчас готовится ко второму чтению в Палате представителей Национального собрания.\nКак заявил замминистра, новой редакцией предусматриваются определенные меры усиления социальной поддержки семей, воспитывающих детей-инвалидов.\n— В частности документ дает возможность родителям, осуществляющим уход за детьми-инвалидами, работать на 0,5 ставки с сохранением пособия по уходу, — пояснил Александр Румак.\nСейчас право на такое пособие имеют неработающие и не получающие пенсии мать, отец, усыновитель (удочеритель), опекун, попечитель или другое лицо, фактически осуществляющее уход за ребенком-инвалидом. Кроме того, пособие по уходу за ребенком-инвалидом в возрасте до 18 лет могут также получать мать, отец, усыновитель (удочеритель), опекун, попечитель, находящиеся в отпуске по уходу за ребенком до достижения им возраста 3 лет. Предполагается, что после вступления изменений в силу родители детей-инвалидов сохранят право на пособие при выходе на работу не более чем на 0,5 ставки или при работе на дому.\nАлександр Румак также рассказал, что семьям, в которых воспитываются дети с 3-й и 4-й степенями утраты здоровья, будут увеличены пособия. Представитель Минтруда отметил, что количество семей, воспитывающих двух и более детей, в Беларуси продолжает расти. «На сегодня 57,2% рожденных детей являются вторыми или последующими», — сказал он, добавив, что всего в центрах социального обслуживания находятся на учете 88,5 тысячи многодетных семей.',
  96. tag: ['Беларусь', 'Экономика']
  97. },
  98. {
  99. id: '5',
  100. title: 'В России создали лекарство от всех видов рака',
  101. summary: 'Российские СМИ сообщили о завершении доклинических испытаний лекарства, которой способно совершить революцию в онкологии.',
  102. createdAt: new Date('2017-02-28T11:55:00'),
  103. author: 'Виталий Олехнович',
  104. content: 'Лекарство удалось получить с помощью биотехнологий и эксперимента на МКС в 2015 году по выращиванию ' +
  105. 'сверхчистого кристалла. Лекарство было опробовано на мышах и крысах, у которых развивались меланомы и саркомы.' +
  106. 'Пациентам оно станет доступно через три-четыре года, пока пройдут все доклинические испытания.' +
  107. 'Впрочем, многое будет зависеть от финансирования программы.',
  108. tag: ['Россия', 'Наука']
  109. },
  110. {
  111. id: '6',
  112. title: 'Самые ожидаемые игры весны 2017 года',
  113. summary: 'Прошедшей зимой вышло не так уж много действительно интересных и громких проектов.' +
  114. 'Некоторые из игр вызвали разочарование, другие в целом оправдали ожидания.',
  115. createdAt: new Date('2017-02-28T11:55:00+03:00'),
  116. author: 'Onliner.by',
  117. content: 'The Last Guardian оказалась неплохим приключением (хоть и скучным) и привлекла к себе внимание, ' +
  118. 'кроме прочего, тем, что в разработке она находилась долгие девять лет. Resident Evil 7: Biohazard ' +
  119. 'восприняли кто как: некоторым страшилка показалась неканоничной, другим — свежей и интересной.',
  120. tag: ['Культура']
  121. },
  122. {
  123. id: "7",
  124. title: "Bloomberg представил топ-500 богатейших людей планеты. Белорусов среди них пока нет",
  125. summary: " Самый богатый белорус - это 40-летний создатель онлайн-игры World of Tanks Виктор Кислый",
  126. createdAt: new Date("2017-02-28T11:55:00"),
  127. author: "Дмитрий",
  128. content: "В феврале 2016-го пополнил список долларовых миллиардеров Bloomberg, но пока «отстает» от замыкающего " +
  129. "топ-500 96-летнего миллиардера из Саудовской Аравии Сулеймана аль Раджи более чем на 2 млрд долларов." +
  130. "Возглавил рейтинг основатель Microsoft Билл Гейтс (85,6 млрд долларов), на втором месте — американский бизнесмен " +
  131. "Уоррен Баффет (78,9 млрд), на третьем — глава Amazon Джефф Безос (73,5 млрд).",
  132. tag: ['Экономика']
  133. },
  134. {
  135. id: "8",
  136. title: "Российский хоккеист НХЛ хитро реализовал буллит без броска",
  137. summary: "Российский форвард «Тампы» Никита Кучеров принес победу своей команде в поединке против «Баффало», " +
  138. "хитро реализовав послематчевый буллит. Ему удалось отправить шайбу в сетку, даже не исполнив броска.",
  139. createdAt: new Date("2017-03-02T12:55:00"),
  140. author: "Станислав",
  141. content: "Сблизившись с голкипером, Никита Кучеров сделал обманное движение, как будто собираясь переложить шайбу" +
  142. "на неудобную сторону крюка, но не стал ее касаться, и снаряд неспешно проскользнул в сетку под " +
  143. "не ожидавшим такого трюка шведским вратарем Робином Ленером.",
  144. tag: ['Спорт']
  145. },
  146. {
  147. id: "9",
  148. title: 'Число крытых ледовых арен в Беларуси за 25 лет возросло почти в восемь раз',
  149. summary: 'Федерация хоккея Беларуси (ФХБ), одного из самых популярных видов спорта, отметила 6 марта четвертьвековой юбилей. За эти годы число крытых ледовых арен возросло почти в восемь раз — с четырех до 31, сообщает корреспондент БЕЛТА.',
  150. createdAt: new Date("2017-01-02T12:55:00"),
  151. author: 'Дмитрий',
  152. content: "Федерация была основана 6 марта 1992 года и является членом Международной федерации хоккея (ИИХФ) с 6 мая 1992-го.\n— Хоккей с шайбой по праву завоевал любовь и признание во всех уголках нашей страны, среди болельщиков разных возрастов и профессий, среди тех, кто беззаветно предан этой великой игре, и тех, кто только делает первые шаги на ледовых площадках, — отметил в своем поздравлении председатель ФХБ Игорь Рачковский.\nПервым председателем федерации был Евгений Анкуда, также ФХБ ранее возглавляли Лев Контарович, Юрий Бородич, Владимир Наумов и Евгений Ворсин.\nСамого значительного успеха за время выступлений на международных турнирах национальная сборная Беларуси добилась в 2002 году, когда заняла четвертое место на зимних Олимпийских играх в Солт-Лейк-Сити.\nВажнейшей вехой в развитии вида спорта стало проведение чемпионата мира в 2014 году, который с успехом прошел на двух ультрасовременных столичных ледовых стадионах — «Чижовка-Арене» и «Минск-Арене».\nТакже Беларусь подала совместную заявку с Латвией на проведение планетарного форума 2021 года.",
  153. tag: ['Спорт', 'Культура']
  154. },
  155. {
  156. id: "10",
  157. title: 'Проект "Копенгаген": дом в скандинавском стиле построили под Минском за 118 дней',
  158. summary: 'Перед архитектором этого дома стояла непростая задача — создать проект в современной стилистике,\nкоторый бы гармонично вписался в довольно узкий, вытянутый в длину участок с большим перепадом высот.\nОн должен быть функциональным, энергосберегающим и экологичным, иметь разумную стоимость и короткие сроки возведения. \nИ обязательно каркасным. И вот через 118 дней от момента начала работ на участке в деревне под Минском появился интересный\nобъект с оригинальным названием «Копенгаген».',
  159. createdAt: new Date("2017-01-02T13:55:00"),
  160. author: 'Анна',
  161. content: "Перед архитектором этого дома стояла непростая задача — создать проект в современной стилистике,\nкоторый бы гармонично вписался в довольно узкий, вытянутый в длину участок с большим перепадом высот.\nОн должен быть функциональным, энергосберегающим и экологичным, иметь разумную стоимость и короткие сроки возведения. \nИ обязательно каркасным. И вот через 118 дней от момента начала работ на участке в деревне под Минском появился интересный\nобъект с оригинальным названием «Копенгаген».",
  162. tag: ['Культура']
  163. },
  164. {
  165. id: "11",
  166. title: '"Папулярная навука па-беларуску" запрашае абмеркаваць тэму "Светлавая хваля',
  167. summary: 'Праект «Папулярная навука па-беларуску» запрашае 27 лютага правесці вечар разам. Новая тэма — «Оптыка. Светлавая хваля і яе прымяненне».Гэтым разам увага будзе скіравана на тлумачэнне звычайных светлавых з’яў, з якімі мы сустракаемся кожны дзень.Будзе прапанавана разабрацца, якую прыроду мае сонечны свет і што значыць «раскласці святло на спектр»а таксама разгледжана шкала электрамагнтных хваляў — дзе там ультарфіялет, а дзе інфрачырвонае выпраменьванне.Нагадаем пра з’явы інтэрферэнцыi і дыфракцыi (яны вывучаліся на мінулых лекцыях) і прадэманструем іх на практыцы.Будуць паказаны эксперыменты з лазерам і не толькі.',
  168. createdAt: new Date("2017-02-02T19:55:00"),
  169. author: 'Анна',
  170. content: ' Праект «Папулярная навука па-беларуску» запрашае 27 лютага правесці вечар разам. Новая тэма — «Оптыка. Светлавая хваля і яе прымяненне».Гэтым разам увага будзе скіравана на тлумачэнне звычайных светлавых з’яў, з якімі мы сустракаемся кожны дзень.Будзе прапанавана разабрацца, якую прыроду мае сонечны свет і што значыць «раскласці святло на спектр»а таксама разгледжана шкала электрамагнтных хваляў — дзе там ультарфіялет, а дзе інфрачырвонае выпраменьванне.Нагадаем пра з’явы інтэрферэнцыi і дыфракцыi (яны вывучаліся на мінулых лекцыях) і прадэманструем іх на практыцы.Будуць паказаны эксперыменты з лазерам і не толькі.',
  171. tag: ['Культура', 'Наука']
  172. },
  173. {
  174. id: "12",
  175. title: "В БГЭУ выбрали самую красивую студентку",
  176. summary: "Традиционно женский нархоз разыграл титул своей самой красивой студентки. " +
  177. "Пятничным вечером девять девушек сноровисто меняли платья, аккуратно вышагивали на шпильках высотой с небоскреб.",
  178. createdAt: new Date("2017-02-24T08:00:00"),
  179. author: "Onliner.by",
  180. content: " Девушек девять. Они представляют разные факультеты, аббревиатуры которых могут быть понятны только местным." +
  181. " На сцену выходит Марта Колб с факультета менеджмента. Сразу говорит, что она папина дочка: с 12 лет водит машину " +
  182. "и умеет забивать гвозди. Все аплодируют ее силе и независимости.В итоге главный приз" +
  183. " из его рук получила Марта Колб. Девушка настолько не ожидала успеха, что расплакалась прямо как в телевизоре. " +
  184. "Потом сказала, мол, очень сильно переживала и на репетициях даже лила слезы от перенапряжения." +
  185. "Девушка родом из Пинска. Пока неизвестно, вернется ли она на Полесье после учебы. Хотя это и неважно.",
  186. tag: ['Культура', 'Университет']
  187. },
  188. {
  189. id: "13",
  190. title: "6 марта в Беларуси ожидаются дожди",
  191. summary: "В Беларуси 6 марта будет облачно с прояснениями, на большей части территории пройдут дожди.",
  192. createdAt: new Date("2017-02-28T09:00:00"),
  193. author: "TUT.BY",
  194. content: " В северных районах страны возможен мокрый снег, слабый гололед, на отдельных участках дорог гололедица.",
  195. tag: ['Погода']
  196. },
  197. {
  198. id: "14",
  199. title: "Прыгун в высоту принес Беларуси третью медаль на ЧЕ-2017 по легкой атлетике в помещении ",
  200. summary: "Белорусский прыгун в высоту 20-летний Павел Селиверстов принес Беларуси третью медаль " +
  201. "на чемпионате Европы по легкой атлетике в помещении, который проходит в Белграде.+",
  202. createdAt: new Date("2017-02-25T09:40:00"),
  203. author: "TUT.BY",
  204. content: " Лучшим результатом белоруса стала высота 2,27 м, и этого показателя хватило для бронзовой награды.",
  205. tag: ['Спорт']
  206. },
  207. {
  208. id: "15",
  209. title: "В Минске прошел торжественный марш подразделений МВД, посвященный 100-летию белорусской милиции",
  210. summary: "Торжественный марш подразделений Министерства внутренних дел, посвященный 100-летию белорусской милиции," +
  211. " прошел сегодня в Минске на Октябрьской площади.",
  212. createdAt: new Date("2017-02-27T18:24:00"),
  213. author: "Onliner.by",
  214. content: " Всего в этом мероприятии было задействовано более 1,2 тыс. сотрудников различных подразделений МВД." +
  215. " Также в параде участвовало 46 единиц техники — современных машин и ретроавтомобилей.",
  216. tag: ['Культура']
  217. }
  218. ];
  219.  
  220. var GLOBAL_TAGS = ['Беларусь', 'Литва', 'Россия', 'Украина', 'Латвия', 'Польша', 'Авто', 'Проишествия', 'Спорт', 'Строительство', 'Культура', 'Афиша', 'Политика', 'Экономика', 'Туризм', 'Образование', 'Университет', 'Наука'];
  221. var GLOBAL_AUTHORS = ['Станислав', 'Дмитрий', 'Владимир', 'Иванов Иван', 'Виталий Олехнович', 'Onliner.by', "Станислав", 'Анна', "TUT.BY"];
  222. var GLOBAL_USERS = [
  223. {
  224. name: 'Татьяна',
  225. password: '2609'
  226. },
  227. {
  228. name: 'Вадим',
  229. password: '1058'
  230. },
  231. {
  232. name: 'Денчик',
  233. password: 'сам_придумает'
  234. },
  235. {
  236. name: 'Призрак',
  237. password: 'предположим_что_он_есть'
  238. }
  239. ];
  240.  
  241. function compareDates(firstArg, secondArg) {
  242. return secondArg.createdAt - firstArg.createdAt;
  243. }
  244.  
  245. function comparePassword(name, password) {
  246. var result = USER_NO_USER;
  247. GLOBAL_USERS.forEach(function (item) {
  248. if (item.name === name) {
  249. if (item.password === password) {
  250. result = USER_OK;
  251. }
  252. else {
  253. result = USER_INCORRECT_PASSWORD;
  254. }
  255. }
  256. });
  257. return result;
  258. }
  259.  
  260. function getArticles(skip=0, top=4) {//вопрос Дену: как упростить
  261. var result = GLOBAL_ARTICLES;//вопрос Дену: убрала filterConfig из параметров
  262. if (filterConfig.tags) {
  263. result = result.filter(function (obj) {
  264. var flag = filterConfig.tags.every(function (item, index, array) {
  265. return obj.tag.join(" ").indexOf(item) != -1;
  266. });
  267. return flag;
  268. });
  269. }
  270. if (filterConfig.createdAt)
  271. result = result.filter(function (obj) {
  272. var flag = obj.createdAt.getFullYear() === filterConfig.createdAt.getFullYear();
  273. flag = flag & obj.createdAt.getMonth() === filterConfig.createdAt.getMonth();
  274. flag = flag & obj.createdAt.getDate() === filterConfig.createdAt.getDate();
  275. return flag;
  276. });
  277. if (filterConfig.author)
  278. result = result.filter(function (obj) {
  279. return obj.author.toLowerCase() === filterConfig.author.toLowerCase();
  280. })
  281. result.sort(compareDates);
  282. result = result.slice(skip, skip + top);
  283. return result;
  284. }
  285.  
  286. function getArticle(id) {
  287. var result = GLOBAL_ARTICLES.filter(function (item) {
  288. return item.id === id;
  289. });
  290. if (result) {
  291. return result[0];
  292. }
  293. return false;
  294. }
  295.  
  296. function getArticlePosition(id) { //вопрос Дену: можно ли через стандартные функции
  297. for (var i = 0; i < GLOBAL_ARTICLES.length; i++)
  298. if (GLOBAL_ARTICLES[i].id == id)
  299. return i;
  300. return -1;
  301. }
  302.  
  303. function validateArticle(article) {//вопрос Дену: как через объект
  304. if (getArticle(article.id) || !article.id) {
  305. return false;
  306. }
  307. if (article.title.length >= 100 || !article.title) {
  308. return false;
  309. }
  310. if (article.summary.length >= 200 || !article.summary) {
  311. return false;
  312. }
  313. if (!article.createdAt) {
  314. return false;
  315. }
  316. if (!article.content) {
  317. return false;
  318. }
  319. if (!article.tag.every(function (item) {
  320. var pos = GLOBAL_TAGS.indexOf(item);
  321. return pos != -1;
  322. })) {
  323. return false;
  324. }
  325. return true;
  326. }
  327.  
  328. function addArticle(article) {
  329. if (!validateArticle(article)) {
  330. return false;
  331. }
  332. GLOBAL_ARTICLES.push(article);
  333. fillArticlesStorage();
  334. return true;
  335. }
  336.  
  337. function editArticle(id, article) {// вопрос Дену: можно ли объеденить валидации
  338. var pos = getArticlePosition(id);
  339. if (article.title.length >= 100 || !article.title) {
  340. return false;
  341. }
  342. if (pos === -1) {
  343. return false;
  344. }
  345. if (!article.tag.every(function (item) {
  346. var pos = GLOBAL_TAGS.indexOf(item);
  347. return pos != -1;
  348. })) {
  349. return false;
  350. }
  351. if (article.summary.length >= 200 || !article.summary) {
  352. return false
  353. }
  354. if (!article.content) {
  355. return false;
  356. }
  357. GLOBAL_ARTICLES[pos].title = article.title;
  358. GLOBAL_ARTICLES[pos].summary = article.summary;
  359. GLOBAL_ARTICLES[pos].content = article.content;
  360. GLOBAL_ARTICLES[pos].tag = article.tag;
  361. fillArticlesStorage();
  362. return true;
  363. }
  364.  
  365.  
  366. function removeArticle(id) {
  367. var pos = getArticlePosition(id);
  368. if (pos === -1)
  369. return false;
  370. GLOBAL_ARTICLES.splice(pos, 1);
  371. fillArticlesStorage();
  372. return true;
  373. }
  374.  
  375. function cleanFilterConfig() {
  376. filterConfig.author = "";
  377. filterConfig.createdAt = "";
  378. filterConfig.tags = [];
  379. }
  380.  
  381. function setFilterConfig(author, createdAt, tags) {
  382. filterConfig.author = author;
  383. filterConfig.createdAt = createdAt;
  384. filterConfig.tags = tags;
  385. }
  386.  
  387. function setGLOBAL_ARTICLES(articles){
  388. GLOBAL_ARTICLES = articles.splice(0,articles.length);
  389. }
  390.  
  391. return {
  392. comparePassword: comparePassword,
  393. getArticle: getArticle,
  394. getArticles: getArticles,
  395. addArticle: addArticle,
  396. editArticle: editArticle,
  397. removeArticle: removeArticle,
  398. GLOBAL_TAGS: GLOBAL_TAGS,
  399. GLOBAL_AUTHORS: GLOBAL_AUTHORS,
  400. GLOBAL_ARTICLES: GLOBAL_ARTICLES,
  401. cleanFilterConfig: cleanFilterConfig,
  402. setFilterConfig: setFilterConfig,
  403. setGLOBAL_ARTICLES:setGLOBAL_ARTICLES
  404. };
  405. }());
  406.  
  407. var displayModule = (function () {
  408.  
  409. function formSelection(authors) {
  410. var sel = document.querySelector('select');
  411. var op = document.createElement('option');
  412. op.text = "Выберите автора";
  413. op.value = "";
  414. sel.appendChild(op);
  415. authors.forEach(function (item) {
  416. var sel = document.querySelector('select');
  417. var op = document.createElement('option');
  418. op.value = item;
  419. op.text = item;
  420. sel.appendChild(op);
  421. });
  422. }
  423.  
  424. function createDate(article) {
  425. var month = article.createdAt.getMonth() + 1;
  426. return article.createdAt.getDate() + "." + month + "." + article.createdAt.getFullYear();
  427. }
  428.  
  429. function cleanNode(node) {//вопрос Дену: нужен ли if
  430. if (node) {
  431. while (node.firstChild) {
  432. node.removeChild(node.firstChild);
  433. }
  434. }
  435. }
  436.  
  437.  
  438. function showArticles(articles) {
  439. var news = document.querySelector(".news");
  440. articles = articles.slice(0, MAX_ON_PAGE);
  441. cleanNode(news);//вопрос Дену: не костыль ли?
  442. articles.forEach(function (item) {
  443. holder = document.getElementById("holder").content.cloneNode(true);
  444. var buttons = holder.querySelectorAll("button>img");
  445. buttons.forEach(function (buttonItem) {
  446. buttonItem.id = item.id;
  447. });
  448. var hide = holder.querySelector('.hide');
  449. var title = hide.querySelector('h2');
  450. var summary = hide.querySelector('div');
  451. var author = holder.querySelector('.author-date-info');
  452. var tags = holder.querySelector('.tegs');
  453.  
  454. title.innerText = item.title;
  455. summary.innerText = item.summary;
  456. author.innerText = item.author + "\n" + createDate(item);
  457. tags.innerHTML = '<p class="full_article">' + item.tag.join(' ') + '</p>';
  458. news.appendChild(holder);
  459. });
  460. }
  461.  
  462. function showMainPage(articles, authors) {
  463. var mainPart = document.querySelector('.main-part');
  464. cleanNode(mainPart);
  465. mainPart.style.backgroundColor = 'rgba(255,255,255,0)';
  466. mainPart.appendChild(document.querySelector('.main-page').content.cloneNode(true));//вопрос Дену: не слишком ли длинная строка
  467. formSelection(authors);
  468. showArticles(articles);
  469. }
  470.  
  471. function showAdd(article, tags, flag) {
  472. var mainPart = document.querySelector('.main-part');
  473. cleanNode(mainPart);
  474. mainPart.appendChild(document.querySelector('.add').content.cloneNode(true));//вопрос Дену: не слишком ли длинная строка
  475. var edit = document.querySelector('.edit');
  476. var title = document.createElement('div');
  477. var date = document.createElement('div');
  478. date.className = 'user_information';
  479. title.className = 'user_information';
  480.  
  481. var tagsHolder = document.querySelector('.add_tags');
  482. tags.forEach(function (item) {
  483. var checkBox = document.createElement("input");// вопрос Дену: нет ли лишнего
  484. checkBox.type = "checkbox";
  485. checkBox.className = "checkbox";
  486. checkBox.id = item;
  487. checkBox.value = item;
  488.  
  489. var label = document.createElement("label");
  490. label.htmlFor = item;
  491. label.innerText = item;
  492.  
  493. var div = document.createElement("div");
  494. div.style.display = "inline-block";
  495. div.appendChild(checkBox);
  496.  
  497. div.appendChild(label);
  498. tagsHolder.appendChild(div);
  499. });
  500. if (!flag) {
  501. // isAdd = true;
  502. article.tag = [];
  503. title.innerText = user.name
  504. var curDate = new Date();
  505. date.innerText = curDate.getDate() + "." + ( curDate.getMonth() + 1 ) + "." + curDate.getFullYear();
  506.  
  507. }
  508. else {
  509. // isAdd = false;
  510. document.querySelector('#title').value = article.title;
  511. document.querySelector('#summary').value = article.summary;
  512. document.querySelector('#content').value = article.content;
  513. title.innerText = article.author;
  514. date.innerText = article.createdAt.getDate() + "." + ( article.createdAt.getMonth() + 1 ) + "." + article.createdAt.getFullYear();
  515. tags = document.querySelectorAll('input');
  516. tags.forEach(function (item) {
  517. if (article.tag.join(' ').includes(item.value)) {
  518. item.checked = true;
  519. }
  520. });
  521. }
  522.  
  523. var id = document.createElement('div');
  524.  
  525. id.innerText = "ID: " + article.id;
  526. id.className = "user_information";
  527. edit.insertBefore(id, edit.firstChild);
  528. edit.insertBefore(date, edit.firstChild);
  529. edit.insertBefore(title, edit.firstChild);
  530. }
  531.  
  532. function showTags(tags) {
  533. var place = document.querySelector('.border');
  534. cleanNode(place);
  535. place.style.backgroundColor = 'rgba(255,255,255,0)';
  536.  
  537.  
  538. // var place = document.querySelector(".border");
  539. // if (place.firstChild) {
  540. // cleanBorder('click');
  541. // return;
  542. //}
  543. place.style.backgroundColor = 'rgba(255,255,255,0.7)';
  544. var but = document.createElement('button');
  545. but.innerText = 'Скрыть';
  546. but.className = 'hide_tags';
  547. // but.addEventListener('click', cleanBorder);
  548. place.appendChild(but);
  549. tags.forEach(function (item) {
  550. var checkBox = document.createElement('input');
  551. checkBox.type = 'checkbox';
  552. checkBox.className = 'checkbox';
  553. checkBox.id = item;
  554. checkBox.value = item;
  555. var label = document.createElement('label');
  556. label.htmlFor = item;
  557. label.innerHTML = item;
  558. var div = document.createElement('div');
  559. div.appendChild(checkBox);
  560. div.appendChild(label);
  561. place.appendChild(div);
  562. });
  563. }
  564.  
  565. function showFullArticle(article) {
  566. var mainPart = document.querySelector('.main-part');
  567. cleanNode(mainPart);
  568. mainPart.appendChild(document.querySelector('#read_more').content.cloneNode(true));//не слишком ли длинно
  569. mainPart.style.backgroundColor = 'rgba(255,255,255,0.7)';
  570.  
  571. var title = document.querySelector('h2');
  572. title.innerText = article.title;
  573.  
  574. var author = document.querySelectorAll('.small');
  575. author[0].innerText = article.author;
  576. author[1].innerText = article.createdAt.getDate() + "." + ( article.createdAt.getMonth() + 1 ) + "." + article.createdAt.getFullYear();
  577.  
  578. var p = document.querySelector('p.summary');
  579. p.appendChild(document.createTextNode(article.content));
  580.  
  581. var buttons = mainPart.querySelectorAll("button>img");
  582. buttons.forEach(function (item) {
  583. item.id = article.id;
  584. });
  585. // var toMain = mainPart.querySelector(".to_main");
  586. // toMain.addEventListener('click', showMainPage);
  587. var div = mainPart.querySelector('div');
  588. article.tag.forEach(function (item) {
  589. var t = document.createElement('p');
  590. t.className = "small";
  591. t.innerHTML = item;
  592. div.appendChild(t);
  593. });
  594.  
  595. };
  596.  
  597. function userCheck() {
  598. var header = document.querySelector("header");
  599. var log;
  600. var logButton;
  601. if (user) {
  602. log = document.querySelector("#log-in").content.cloneNode(true);
  603. cleanNode(header);
  604. var newArticle = log.querySelector(".icon");
  605. newArticle.addEventListener('click', function () {
  606. displayModule.showAdd({}, GLOBAL_TAGS, false);
  607. var id = -1;
  608. GLOBAL_ARTICLES.forEach(function (item) {
  609. if (Number(item.id) > Number(id)) {
  610. id = item.id;
  611. }
  612. });
  613. id = String(Number(id) + 1);
  614. var add = document.querySelector(".to_main");
  615. add.addEventListener('click', function (event) {
  616. saveArticle(id, true);
  617. });
  618. });
  619. right = log.querySelector(".right_header");
  620. logButton = log.querySelector("#log");
  621. // cleanNode(right);
  622. right.innerText = user.name;
  623. logButton.innerText = "Выход";
  624. right.appendChild(logButton);
  625.  
  626. }
  627. else {
  628. log = document.querySelector("#log-out").content.cloneNode(true);
  629. cleanNode(header);
  630. var newArticle = log.querySelector(".icon");
  631. newArticle.addEventListener('click', function () {
  632. displayModule.showAdd({}, GLOBAL_TAGS, false);
  633. var id = -1;
  634. GLOBAL_ARTICLES.forEach(function (item) {
  635. if (Number(item.id) > Number(id)) {
  636. id = item.id;
  637. }
  638. });
  639. id = String(Number(id) + 1);
  640. var add = document.querySelector(".to_main");
  641. add.addEventListener('click', function (event) {
  642. saveArticle(id, true);
  643. });
  644. });
  645. right = log.querySelector(".right_header");
  646. logButton = log.querySelector("#log");
  647. right.innerText = "";
  648. logButton.innerText = "Вход";
  649. right.appendChild(logButton);
  650. var options = document.querySelectorAll('.tools>.icon');
  651. for (var i = 0; i < options.length; i++) {
  652. options[i].style.display = 'none';
  653. }
  654. }
  655. header.appendChild(log);
  656. logButton.addEventListener('click', logIn);
  657. }
  658.  
  659. function showLog() {
  660. if (user) {
  661. user = null;
  662. userCheck();
  663. }
  664. else {
  665. var mainPart = document.querySelector(".main-part");
  666. cleanNode(mainPart);
  667. mainPart.style.backgroundColor = "rgba(255,255,255,0)"
  668. mainPart.appendChild(document.querySelector(".log").content.cloneNode(true));
  669. }
  670. }
  671.  
  672. return {
  673. showArticles: showArticles,
  674. showMainPage: showMainPage,
  675. showAdd: showAdd,
  676. showFullArticle: showFullArticle,
  677. // showNext: showNext
  678. showTags: showTags,
  679. showLog: showLog,
  680. userCheck: userCheck
  681. };
  682. }()
  683. );
  684.  
  685.  
  686.  
  687. const read = function (id) {
  688. var article = articlesModule.getArticle(id);
  689. displayModule.showFullArticle(article);
  690.  
  691. var add = document.querySelector(".to_main");
  692. add.addEventListener('click', function (event) {
  693. displayModule.showMainPage(GLOBAL_ARTICLES, GLOBAL_AUTHORS);
  694. });
  695. }
  696.  
  697. const del = function (id) {
  698. articlesModule.removeArticle(id);
  699. var GLOBAL_AUTHORS = articlesModule.GLOBAL_AUTHORS;
  700. var articles = articlesModule.getArticles(start, 4);
  701. displayModule.showMainPage(articles, GLOBAL_AUTHORS);
  702. }
  703. const change = function (id) {
  704. var article = articlesModule.getArticle(id);
  705. displayModule.showAdd(article, GLOBAL_TAGS, true);
  706.  
  707. var add = document.querySelector(".to_main");
  708. add.addEventListener('click', function (event) {
  709. saveArticle(id, false);
  710. });
  711. }
  712. const nextPage = function (id) {
  713. if (start <= GLOBAL_ARTICLES.length - 4) {
  714. start += MAX_ON_PAGE;
  715. articles = articlesModule.getArticles(start, 4);
  716. displayModule.showArticles(articles);
  717. }
  718. }
  719.  
  720. const previousPage = function (id) {
  721. if (start >= MAX_ON_PAGE) {
  722. start -= MAX_ON_PAGE;
  723. articles = articlesModule.getArticles(start, 4);
  724. displayModule.showArticles(articles);
  725. }
  726. }
  727.  
  728. const showTagsList = function () {
  729. displayModule.showTags(GLOBAL_TAGS);
  730. var hide = document.querySelector(".hide_tags");
  731. hide.addEventListener('click', hideTagsList);
  732. }
  733. const hideTagsList = function () {
  734. var place = document.querySelector(".border");
  735. while (place.firstChild) {
  736. place.removeChild(place.firstChild);
  737. }
  738. place.style.backgroundColor = "rgba(255,255,255,0)";
  739. }
  740. const filter = function (id) {
  741. var button = document.querySelector(".use");
  742. if (filterState) {
  743. button.innerText = "Применить";
  744. filterState = false;
  745. articlesModule.cleanFilterConfig();
  746. }
  747. else {
  748. button.innerText = "Сбросить фильтр";
  749. filterState = true;
  750. articlesModule.cleanFilterConfig();
  751. var temp;
  752. temp = document.querySelector(".author");
  753. var author = temp.options[temp.selectedIndex].value;
  754. temp = document.querySelector(".date");
  755. var createdAt;
  756. if (temp.value) {
  757. createdAt = new Date(temp.value);
  758. }
  759. else {
  760. createdAt = "";
  761. }
  762. start = 0;
  763. var tags = [];
  764. temp = document.querySelectorAll(".checkbox");
  765. temp.forEach(function (item) {
  766. if (item.checked) {
  767. tags.push(item.value);
  768. }
  769. });
  770. articlesModule.setFilterConfig(author, createdAt, tags);
  771. }
  772. displayModule.showArticles(articlesModule.getArticles(start, MAX_ON_PAGE));
  773. }
  774. const saveArticle = function (id, isAdd) {
  775. var article = {};
  776. article.title = document.querySelector("#title").value;
  777. article.summary = document.querySelector("#summary").value;
  778. article.content = document.querySelector("#content").value;
  779. article.id = id;
  780. article.tag = [];
  781. var tags = document.querySelectorAll("input");
  782. tags.forEach(function (item) {
  783. if (item.checked) {
  784. article.tag.push(item.value);
  785. }
  786. })
  787. if (isAdd) {
  788. article.author = user.name;
  789. article.createdAt = new Date;
  790. articlesModule.addArticle(article);
  791. }
  792. else {
  793. articlesModule.editArticle(id, article);
  794. }
  795. articles = articlesModule.getArticles(start, MAX_ON_PAGE);
  796. displayModule.showMainPage(articles, GLOBAL_AUTHORS);
  797.  
  798. }
  799.  
  800. const newArticle = function () {
  801. displayModule.showAdd({}, GLOBAL_TAGS, false);
  802. var id = -1;
  803. GLOBAL_ARTICLES.forEach(function (item) {
  804. if (Number(item.id) > Number(id)) {
  805. id = item.id;
  806. }
  807. });
  808. id += 1;
  809. var add = document.querySelector(".to_main");
  810. add.addEventListener('click', function (event) {
  811. saveArticle(id, true);
  812. });
  813. }
  814. const actions = {
  815. read: read,
  816. delete: del,
  817. change: change,
  818. nextPage: nextPage,
  819. previousPage: previousPage,
  820. filter:filter
  821. }
  822.  
  823.  
  824. function workWithArticles(event) {
  825. var action = event.target.getAttribute('data-action');
  826. var id = event.target.id;
  827. if (action) {
  828. actions[action](id);
  829. }
  830. }
  831.  
  832.  
  833.  
  834. window.beforeunload = function (event) {
  835. localStorage.setItem('articles', JSON.stringify(articlesModule.GLOBAL_ARTICLES));
  836. localStorage.setItem('user', JSON.stringify(user));
  837. // localStorage.setItem('authors', JSON.stringify(articlesModule.GLOBAL_AUTHORS));
  838. };
  839.  
  840.  
  841. window.addEventListener("DOMContentLoaded", function () {
  842. if (JSON.parse(localStorage.getItem('articles'))) {
  843. var tmp = JSON.parse(localStorage.getItem('articles'));
  844. tmp.forEach(function (item) {
  845. item.createdAt = new Date(item.createdAt);
  846. });
  847. articlesModule.setGLOBAL_ARTICLES(tmp);
  848. }
  849. // if (JSON.parse(localStorage.getItem('authors'))) {
  850. // articlesModule.GLOBAL_AUTHORS = JSON.parse(localStorage.getItem('authors'));
  851. // }
  852. if (JSON.parse(localStorage.getItem('user'))) {
  853. user = JSON.parse(localStorage.getItem('user'));
  854. }
  855. GLOBAL_ARTICLES = articlesModule.GLOBAL_ARTICLES;
  856. GLOBAL_AUTHORS = articlesModule.GLOBAL_AUTHORS;
  857. GLOBAL_TAGS = articlesModule.GLOBAL_TAGS;
  858. displayModule.userCheck();
  859. displayModule.showMainPage(GLOBAL_ARTICLES, GLOBAL_AUTHORS);
  860.  
  861. var articleList = document.querySelector(".main-part");
  862. articleList.addEventListener('click', workWithArticles);
  863.  
  864. var previous = document.querySelectorAll(".new-page")[0];
  865. var next = document.querySelectorAll(".new-page")[1];
  866.  
  867. var tags = document.querySelector(".tags");
  868. tags.addEventListener('click', showTagsList);
  869. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement