From 63589d32d9bcdcf8101788613339b42a2f5dbebe Mon Sep 17 00:00:00 2001 From: yunnii Date: Mon, 5 Nov 2012 03:10:10 +0600 Subject: [PATCH 1/8] =?UTF-8?q?=D0=A1=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D0=B0=20+=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- collection.js | 69 ++++++++++++++++++++++++++++ event.js | 81 ++++++++++++++++++++++++++++++++ events.js | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++ index.css | 5 ++ index.html | 47 +++++++++++++++++++ model.js | 62 +++++++++++++++++++++++++ 6 files changed, 389 insertions(+) create mode 100644 collection.js create mode 100644 event.js create mode 100644 events.js create mode 100644 index.css create mode 100644 index.html create mode 100644 model.js diff --git a/collection.js b/collection.js new file mode 100644 index 0000000..fa814a3 --- /dev/null +++ b/collection.js @@ -0,0 +1,69 @@ +(function (exports) { + "use strict"; + +exports.Collection = function (items) { + + this.items = []; + var key; + + for (key in items) { + if (items.hasOwnProperty(key)) { + this.items.push(items[key]); + } + } +}; + +Collection.prototype.constructor = exports.Collection; + +/** + * Добавляет в коллекцию объект + * + * @param {object} model + * + * @return {Collection} * @example + * + */ +Collection.prototype.add = function (model) { + + var temp = new this.constructor(this.items); + temp.items.push(model); + return temp; +}; + +/** + * @param {Function} selector + * + * @see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter + * + * @example + * new Collection().filter(function (item) { + * return item.get('attendee').indexOf("me") !== -1; + * }); + * @return {Collection} + */ +Collection.prototype.filter = function (selector) { + + if (typeof selector !== "function") { + throw new Error('Argument must be function'); + } + + return new this.constructor(this.items.filter(selector)); +}; + +/** + * Принимает функцию сортировки и сортирует на основе ее + * + * @param {function} selector + * + * @return {Collection} * @example + * + */ +Collection.prototype.sort = function (selector) { + + if (typeof selector !== "function") { + throw new Error('Argument must be function'); + } + + return new this.constructor(this.items.sort(selector)); +}; +}(window)); \ No newline at end of file diff --git a/event.js b/event.js new file mode 100644 index 0000000..dc67f0c --- /dev/null +++ b/event.js @@ -0,0 +1,81 @@ +(function (exports) { + "use strict"; + +function isDate(date) { + + if (typeof date === 'undefined') { + return false; + } + if (typeof date.getMonth !== 'function') { + return false; + } + return true; +} + +exports.inherits = function (constructor, superconstructor) { + + var Func = function () { }; + + Func.prototype = superconstructor.prototype; + constructor.prototype = new Func(); +} + +exports.Event = function (data) { + + Model.apply(this, arguments); +}; + +inherits(Event, Model); + +/** + * Валидирует объект event, либо undefined, если в объекте отсутвуют обязательные поля + * eventObject{ + * name - название события + * start - начало + * end - окончание + * location - место + * remindTime - за сколько минут до события напомнить + * description - описание + * } + + * @param {object} obj Объект + * @example + * Event({ + * name: "Пара по веб-технологиям", + * start: new Date("2012-10-20 10:00:00"), + * end: new Date("2012-10-20 12:50:00"), + * location: "5 этаж", + * remindTime: 10, + * description: "Взять бумагу и ручку, не брать бук!" + * }) + * + * @return {Object} + */ +Event.prototype.validate = function () { + + var remindTime = this.remindTime || 0; + this.raiting = this.raiting || 0; + + if (!isDate(this.get("start"))) { + throw new Error('Field "start" must be Date format'); + } + + if (!isDate(this.end)) { + this.end = this.start; + } + + if (this.end < this.start) { + this.end = this.start; + } + + return { + "name": this.name || "(Нет темы)", + "start": this.start, + "end": this.end, + "location": this.location || "", + "remindTime": remindTime, + "description": this.description || "(отсутствует)", + "raiting": this.raiting + }; +}; +}(window)); \ No newline at end of file diff --git a/events.js b/events.js new file mode 100644 index 0000000..fe1ed51 --- /dev/null +++ b/events.js @@ -0,0 +1,125 @@ +(function (exports) { + "use strict"; + +exports.Events = function (data) { + + Collection.apply(this, arguments); +}; + +inherits(Events, Collection); + +Events.prototype.constructor = exports.Events; + +/** + * Возвращает прошедшие события, из items отсортированной по дате начала + * + * @param {events} - коллекция объектов типа event + * @return {Collection} - коллекция объектов типа event +*/ +Events.prototype.past = function () { + + return this.filter(function (events) { + return events.start < new Date(); + }); +}; + +/** + * Возвращает предстоящие события, + * из items, отсортированной по дате начала + * + * @return {Collection} - коллекция объектов типа event +*/ +Events.prototype.coming = function () { + + return this.filter(function (events) { + return events.start > new Date(); + }); +}; + +/** + * Возвращает события, которые произойдут через опр период времени, + * из items, отсортированной по дате начала + * + * @param {number} days - период (в днях) времени + * + * @return коллекция объектов типа event +*/ +Events.prototype.comeThrough = function (days) { + + var now = new Date(); + now.setDate(now.getDate() + days); + + var result = this.coming() + .filter(function (events) { + return events.start < now; + }); + + return result; +}; + +Events.prototype.byEndTime = function () { + + return this.sort(function (a, b) { + return a.end - b.end; + }); +}; + +Events.prototype.byRaiting = function () { + + return this.sort(function (a, b) { + return a.raiting - b.raiting; + }); +}; + +Events.prototype.byStartTime = function () { + + return this.sort(function (a, b) { + return a.start - b.start; + }); +}; + +/** + * Возвращает события,из items отсортированной по дате начала по возр/убыв + * от старых обытий к новым / наоборот. + * По умолчанию сортирует в порядке возрастания + * + * @param {bool} isAscending - необязательный параметр - указывает порядок сортировки. + * при отсутсвии сортируется по возрастанию. + * + * @return {Collection} - Новый объект типа Collection +*/ +Events.prototype.sortByTime = function (isAscending) { + + isAscending = isAscending || false; + + if (isAscending) { + return this + .byStartTime(); + } + return this.byStartTime() + .reverse(); +}; + +/** + * Возвращает события, из items, отсортированной по рейтингу по убыв/возрастанию + * от событий с более высоким рейтингом к самому низко приоритетному / наоборот. + * По умолчанию сортирует в порядке убывания + * + * @param {bool} isAscending - необязательный параметр - указывает порядок сортировки. + * при отсутствии сортируется по убыванию. + * + * @return {COllection} - Новый объект типа Collection +*/ +Events.prototype.sortByRaiting = function (isAscending) { + + isAscending = isAscending || false; + + if (isAscending) { + return this + .byRaiting(); + } + return this + .byRaiting() + .reverse(); +}; +}(window)); \ No newline at end of file diff --git a/index.css b/index.css new file mode 100644 index 0000000..a40d24b --- /dev/null +++ b/index.css @@ -0,0 +1,5 @@ +body{ text-align: left;} +#frame { + float: right; + text-align: right; +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..27a694e --- /dev/null +++ b/index.html @@ -0,0 +1,47 @@ + + + + + Календарь событий + + + + + + + + +
+
+
+
+
Название:
+
С:
+
По:
+
Место:
+
Важность события: + +
+
Описание: + +
+
Напоминнить за: минут +
+ + +
+
+ + \ No newline at end of file diff --git a/model.js b/model.js new file mode 100644 index 0000000..963a925 --- /dev/null +++ b/model.js @@ -0,0 +1,62 @@ +(function (exports) { + "use strict"; + +/** + * Абстрактный конструктор, принимает объект и создает абстрактный объект для работы + * + * @param {Object} attributes + * + * @example + * item.set({title: "March 20", content: "In his eyes she eclipses..."}); + */ +exports.Model = function (data) { + + var key; + + for (key in data) { + if (data.hasOwnProperty(key)) { + this[key] = data[key]; + } + } +}; + + +/** + * Сеттер - устанавливает аттрибуты и значения атрибутов, в соответсвии с принятым в качестве параметра объектом + * + * @param {Object} attributes + * + * @example + * item.set({title: "March 20", content: "In his eyes she eclipses..."}); + */ +Model.prototype.set = function (attributes) { + + var key; + + for (key in attributes) { + if (attributes.hasOwnProperty(key)) { + this[key] = attributes[key]; + } + } +}; + +/** + * Геттер - возвращает запрашиваемое свойство у объекта + * + * @param {Object} attributes + */ +Model.prototype.get = function (attribute) { + + if (this.hasOwnProperty(attribute)) { + return this[attribute]; + } + + return undefined; +}; +/** + * @param {Object} attributes + */ +Model.prototype.validate = function (attributes) { + throw new Error('this is Abstract method'); +}; +}(window)); \ No newline at end of file From 69830cd75dedcc7be6b4145f53ad6e725f1bebfb Mon Sep 17 00:00:00 2001 From: yunnii Date: Wed, 7 Nov 2012 03:04:44 +0600 Subject: [PATCH 2/8] =?UTF-8?q?1=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit страница с формой валидация навешевание обработчиков событий --- documentAction.js | 49 +++++++++++++++++++++++++++++++++++++++ event.js | 4 +++- index.css | 7 +++++- index.html | 38 ++++++++++++++++++------------ validation.js | 59 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 140 insertions(+), 17 deletions(-) create mode 100644 documentAction.js create mode 100644 validation.js diff --git a/documentAction.js b/documentAction.js new file mode 100644 index 0000000..9e907d9 --- /dev/null +++ b/documentAction.js @@ -0,0 +1,49 @@ +(function (exports) { + "use strict"; + + exports.ListOfEvents = new Events(); + + exports.preventDefault = function() { + + var name = document.querySelector("#title").value; + var start = document.querySelector("#from").value; + var end = document.querySelector("#to").value; + var location = document.querySelector("#location").value; + var raiting = document.querySelector("#raiting").value; + var description = document.querySelector("#description").value; + var remindTime = document.querySelector("#remindTime").value; + + if ( !validateTitle(name, document.querySelector('#title_help'))) { alert("Событие не было добавлено. Ошибка"); return; }; + if (!validateDate(start, document.querySelector('#from_help'))) { alert("Событие не было добавлено. Ошибка"); return; }; + if (!validateNumber(remindTime, document.querySelector('#remindTime_help'))) { alert("Событие не было добавлено. Ошибка"); return; }; + + ListOfEvents.add({ name: name, + start: start, + end: end, + location: location, + raiting: raiting, + description: description, + remindTime: remindTime}); +} + + exports.addListener = function() { + var name = document.querySelector("#title"); + var start = document.querySelector("#from"); + var remindTime = document.querySelector("#remindTime"); + + name.addEventListener('blur', function(event) { + var cur = event.currentTarget; + validateTitle(cur.value, document.querySelector('#title_help')); + }); + + start.addEventListener('blur', function(event) { + var cur = event.currentTarget; + validateDate(cur.value, document.querySelector('#from_help')); + }); + + remindTime.addEventListener('blur', function(event) { + var cur = event.currentTarget; + validateNumber(remindTime.value, document.querySelector('#remindTime_help')); + }); + } +}(window)); \ No newline at end of file diff --git a/event.js b/event.js index dc67f0c..22da9b3 100644 --- a/event.js +++ b/event.js @@ -1,7 +1,7 @@ (function (exports) { "use strict"; -function isDate(date) { +exports.isDate = function c(date) { if (typeof date === 'undefined') { return false; @@ -36,6 +36,7 @@ inherits(Event, Model); * location - место * remindTime - за сколько минут до события напомнить * description - описание + * raiting - важность события * } * @param {object} obj Объект @@ -46,6 +47,7 @@ inherits(Event, Model); * end: new Date("2012-10-20 12:50:00"), * location: "5 этаж", * remindTime: 10, + * raiting:5, * description: "Взять бумагу и ручку, не брать бук!" * }) * diff --git a/index.css b/index.css index a40d24b..31e70c1 100644 --- a/index.css +++ b/index.css @@ -1,5 +1,10 @@ body{ text-align: left;} #frame { - float: right; + float: left; text-align: right; } +.help { + color: red; + visibility : hidden; + min-height: 25px; +} diff --git a/index.html b/index.html index 27a694e..d83afd8 100644 --- a/index.html +++ b/index.html @@ -4,25 +4,23 @@ Календарь событий - - - - - + + + + + + - +
-
Название:
+
Название: +
С:
По:
-
Место:
+
Место:
Важность события:
Описание: -
-
Напоминнить за: минут +
Напомнить за: минут
- +
+
+
Введите название события
+
Введите корректную дату
+
Введите корректную дату
+
D
+
D
+
D
+
D
+
Введите корректное число
+
\ No newline at end of file diff --git a/validation.js b/validation.js new file mode 100644 index 0000000..1620f2e --- /dev/null +++ b/validation.js @@ -0,0 +1,59 @@ +(function (exports) { + "use strict"; + + exports.ListOfEvents = new Events(); + + exports.showError = function (isError, helpText) { + + if (isError) { + if (helpText.style.visibility !== 'visible') { + helpText.style.visibility = 'visible'; + } + return; + } + + if (helpText.style.visibility !== 'hidden') { + helpText.style.visibility = 'hidden'; + } + }; + + exports.validateTitle = function (input, helpText) { + + if (input.length === 0) { + showError(true, helpText); + return false; + } + + showError(false, helpText); + return true; + }; + + exports.validateDate = function (input, helpText) { + + if (!isDate(input)) { + showError(true, helpText); + return false; + } + + showError(false, helpText); + return true; + }; + + exports.validateNumber = function (input, helpText) { + + if (typeof +input !== "number") { + if (typeof input !== "undefined") { + showError(true, helpText); + return false; + } + } + + if (+input < 0) { + showError(true, helpText); + return false; + } + + showError(false, helpText); + return true; + }; +}(window)); \ No newline at end of file From fdb01dcb275f411677189a6bed7fbab3d002f717 Mon Sep 17 00:00:00 2001 From: yunnii Date: Wed, 7 Nov 2012 04:07:41 +0600 Subject: [PATCH 3/8] =?UTF-8?q?2=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit При добавлении валидного события - добавляется в список на странице --- documentAction.js | 56 +++++++++++++++++++++++++++++++++++++++++------ event.js | 5 ++++- index.css | 8 +++++++ index.html | 12 +++++----- validation.js | 2 +- 5 files changed, 69 insertions(+), 14 deletions(-) diff --git a/documentAction.js b/documentAction.js index 9e907d9..8523be0 100644 --- a/documentAction.js +++ b/documentAction.js @@ -17,15 +17,57 @@ if (!validateDate(start, document.querySelector('#from_help'))) { alert("Событие не было добавлено. Ошибка"); return; }; if (!validateNumber(remindTime, document.querySelector('#remindTime_help'))) { alert("Событие не было добавлено. Ошибка"); return; }; - ListOfEvents.add({ name: name, - start: start, - end: end, - location: location, - raiting: raiting, - description: description, - remindTime: remindTime}); + var element = new Event({ + name: name, + start: new Date(start), + end: new Date(end), + location: location, + raiting: raiting, + description: description, + remindTime: remindTime}).validate(); + ListOfEvents.add(element); + + placeElement(element); } + function placeElement(element) { + var el = document.createElement('li'); + el.className = 'event_item'; + + var name = document.createElement('div') + name.textContent = "Название: " + element.name; + + var start = document.createElement('div') + start.textContent = "Начало: " + element.start; + + var end = document.createElement('div') + end.textContent = "Окончание: " + element.end; + + var location = document.createElement('div') + location.textContent = "Местоположение: " + element.location; + + var remindTime = document.createElement('div') + remindTime.textContent = "Напомнить за: " + element.remindTime + "минут"; + + var description = document.createElement('div') + description.textContent = "Описание: " + element.description; + + var raiting = document.createElement('div') + raiting.textContent = "Рейтинг: " + element.raiting; + + var fragment = document.createDocumentFragment(); + fragment.appendChild(el); + el.appendChild(start); + el.appendChild(end); + el.appendChild(location); + el.appendChild(remindTime); + el.appendChild(description); + el.appendChild(raiting); + + var parent = document.querySelector(".events"); + parent.appendChild(fragment); + } + exports.addListener = function() { var name = document.querySelector("#title"); var start = document.querySelector("#from"); diff --git a/event.js b/event.js index 22da9b3..8787c31 100644 --- a/event.js +++ b/event.js @@ -1,7 +1,7 @@ (function (exports) { "use strict"; -exports.isDate = function c(date) { +exports.isDate = function (date) { if (typeof date === 'undefined') { return false; @@ -9,6 +9,9 @@ exports.isDate = function c(date) { if (typeof date.getMonth !== 'function') { return false; } + if( isNaN( date.getMonth())) { + return false; + } return true; } diff --git a/index.css b/index.css index 31e70c1..ca93488 100644 --- a/index.css +++ b/index.css @@ -1,5 +1,6 @@ body{ text-align: left;} #frame { + display: inline-block; float: left; text-align: right; } @@ -8,3 +9,10 @@ body{ text-align: left;} visibility : hidden; min-height: 25px; } +.event_item{ +} +.collection{ + float: left; + text-align: left; + margin-left: 50px; +} diff --git a/index.html b/index.html index d83afd8..d129d1a 100644 --- a/index.html +++ b/index.html @@ -12,8 +12,6 @@ -
-
Название: @@ -37,11 +35,11 @@
Напомнить за: минут
- - + +
-
+
Введите название события
Введите корректную дату
Введите корректную дату
@@ -51,5 +49,9 @@
D
Введите корректное число
+ +
+
    +
    \ No newline at end of file diff --git a/validation.js b/validation.js index 1620f2e..fd8464c 100644 --- a/validation.js +++ b/validation.js @@ -30,7 +30,7 @@ exports.validateDate = function (input, helpText) { - if (!isDate(input)) { + if (!isDate(new Date(input))) { showError(true, helpText); return false; } From ac2dbc44de20a21c03118bee5c48f861793de6d4 Mon Sep 17 00:00:00 2001 From: yunnii Date: Wed, 7 Nov 2012 04:26:57 +0600 Subject: [PATCH 4/8] =?UTF-8?q?2=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?+=20=D1=87=D0=B0=D1=81=D1=82=D1=8C=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + очистка формы + страница --- documentAction.js | 1 + events.js | 27 +++++++++++ examples.js | 23 +++++++++ index.css | 6 +++ index.html | 12 ++++- tests/EventsTest.html | 18 +++++++ tests/EventsTest.js | 78 +++++++++++++++++++++++++++++++ tests/collectionTest.html | 17 +++++++ tests/collectionTest.js | 49 ++++++++++++++++++++ tests/eventTest.html | 16 +++++++ tests/eventTest.js | 24 ++++++++++ tests/modelTest.html | 16 +++++++ tests/modelTest.js | 30 ++++++++++++ tests/runner.js | 98 +++++++++++++++++++++++++++++++++++++++ 14 files changed, 414 insertions(+), 1 deletion(-) create mode 100644 examples.js create mode 100644 tests/EventsTest.html create mode 100644 tests/EventsTest.js create mode 100644 tests/collectionTest.html create mode 100644 tests/collectionTest.js create mode 100644 tests/eventTest.html create mode 100644 tests/eventTest.js create mode 100644 tests/modelTest.html create mode 100644 tests/modelTest.js create mode 100644 tests/runner.js diff --git a/documentAction.js b/documentAction.js index 8523be0..124a6d3 100644 --- a/documentAction.js +++ b/documentAction.js @@ -28,6 +28,7 @@ ListOfEvents.add(element); placeElement(element); + document.forms["form"].reset(); } function placeElement(element) { diff --git a/events.js b/events.js index fe1ed51..070b183 100644 --- a/events.js +++ b/events.js @@ -78,6 +78,13 @@ Events.prototype.byStartTime = function () { }); }; +Events.prototype.byName = function () { + + return this.sort(function (a, b) { + return a.name - b.name; + }); +}; + /** * Возвращает события,из items отсортированной по дате начала по возр/убыв * от старых обытий к новым / наоборот. @@ -88,6 +95,26 @@ Events.prototype.byStartTime = function () { * * @return {Collection} - Новый объект типа Collection */ +Events.prototype.sortByName = function (isAscending) { + + isAscending = isAscending || false; + + if (isAscending) { + return this.byName(); + } + return this.byName() + .reverse(); +}; + +/** + * Возвращает события,из items отсортированной по названию по возр/убыв + * По умолчанию сортирует в порядке возрастания + * + * @param {bool} isAscending - необязательный параметр - указывает порядок сортировки. + * при отсутсвии сортируется по возрастанию. + * + * @return {Collection} - Новый объект типа Collection +*/ Events.prototype.sortByTime = function (isAscending) { isAscending = isAscending || false; diff --git a/examples.js b/examples.js new file mode 100644 index 0000000..8aa58ae --- /dev/null +++ b/examples.js @@ -0,0 +1,23 @@ +var examples = [ + { name: "Пара по веб-технологиям", start: new Date("2012-10-20 10:00:00"), end: new Date("2012-10-20 12:50:00"), location: "5 этаж", remindTime: 10, description: "Взять бумагу и ручку, не брать бук!" }, + { name: "День зимы", start: new Date("2012-10-27 06:00:00"), end: new Date("2012-10-27 12:00:00"), location: "Скандинавия", description: "Кататься ^_^" }, + { name: "День инженера механика", start: new Date("2012-10-29 10:00:00"), end: new Date("2012-10-29 15:00:00"), location: "9 этаж", remindTime: 10 }, + { name: "День вегана", start: new Date("2012-11-1 10:00:00"), end: new Date("2012-10-1 23:00"), location: "Дома", description: "Be vegan =)" }, + { name: "День журналисты", start: new Date("2012-11-8 10:00:00"), location: "Китай", remindTime: 10, description: "Поздравить Олежу" }, + { name: "Всемирный день борьбы с диабетом", start: new Date("2012-11-14 12:00") }, + { name: "Международный день отказа от курения", start: new Date("2012-11-15 12:00"), description: "Поздравить Сашку)" }, + { name: "День защиты черных котов", start: new Date("2012-11-17 14:00:00"), location: "Италия", remindTime: 50, description: "Котэ" }, + { name: "Всемирный день туалетов", start: new Date("2012-11-19 15:00:00"), location: "МИр", description: "о_О" }, + { name: "День революции", start: new Date("2012-11-20 12:00:00"), location: "Мексика"}, + { name: "День сладостей", start: new Date("2012-10-20 15:00:00"), location: "США", remindTime: 10, description: "Приготовить вкусняшки" }, + { name: "Ерофеев день", start: new Date("2012-10-17 16:00:00"), location: "Россия", description: "Лисики" }, + { name: "Утиный фестиваль", start: new Date("2012-10-13 12:00:00"), location: "Италия", description: "Все в Италию!" }, + { name: "Дент ребенка", start: new Date("2012-10-12 14:00:00"), location: "Бразилия" }, + { name: "День физкультуры", start: new Date("2012-10-8 12:00:00"), location: "Япония"}, + { name: "Всемирный день животных", start: new Date("2012-10-4 12:00:00 ")}, + { name: "День сакэ в Японии", start: new Date("2012-10-1 14:00:00") }, + { name: "День моря", start: new Date("2012-09-27 15:00:00") }, + { name: "День комиксов", start: new Date("2012-09-25 15:00:00"), location: "США"}, + { name: "День почитания пожилых людей", start: new Date("2012-09-17 16:00:00")}, + { name: "Международный жень демократии", start: new Date("2012-09-15 17:00:00")} +]; \ No newline at end of file diff --git a/index.css b/index.css index ca93488..fef4148 100644 --- a/index.css +++ b/index.css @@ -16,3 +16,9 @@ body{ text-align: left;} text-align: left; margin-left: 50px; } +.filter{ + text-align: left; +} +.selecter{ + color: blue; +} diff --git a/index.html b/index.html index d129d1a..e17b4f1 100644 --- a/index.html +++ b/index.html @@ -13,7 +13,7 @@
    -
    +
    Название:
    С:
    @@ -38,6 +38,16 @@
    +
    +
    Выбрать
    +
    + +
    Отсортировать по
    +
    +
    +
    + +
    Введите название события
    diff --git a/tests/EventsTest.html b/tests/EventsTest.html new file mode 100644 index 0000000..dbafb9e --- /dev/null +++ b/tests/EventsTest.html @@ -0,0 +1,18 @@ + + + + + Тестирование класса Events (Collection) + + + + + + + + + + +
    + + diff --git a/tests/EventsTest.js b/tests/EventsTest.js new file mode 100644 index 0000000..9549c6c --- /dev/null +++ b/tests/EventsTest.js @@ -0,0 +1,78 @@ +function getString(event) { + "use strict"; + + return "\n" + event.name + "\n" + " начало: " + event.start + "\n" + + " конец: " + event.end + "\n" + + " место события: " + event.location + " напомнить за " + event.remindTime + " минут" + "\n" + + " описание: " + event.description + "\n"; +} + +test("Testing inherits Events from Collection", function () { + "use strict"; + + var collection = new Events(examples), + element = {title: "March 20", content: "In his eyes she eclipses..."}, + result = collection.add(element); + + examples.push(element); + + deepEqual(result.items, examples, "Two objects can be the same in value"); +}); + +test("Testing past in Events", function () { + "use strict"; + + var collection = new Events(examples), + result = collection.past(); + + console.log("Result: " + result.items.map(function (event) { + return getString(event); + })); + + console.log("--------------\n"); + ok("1" === "1", "Two objects can be the same in value"); +}); + +test("Testing coming in Events", function () { + "use strict"; + + var collection = new Events(examples), + result = collection.coming(); + + console.log("Result: " + result.items.map(function(event) { + return getString(event); + })); + + console.log("--------------\n"); + ok("1" === "1", "Two objects can be the same in value"); +}); + +test("Testing comeThrough in Events", function () { + "use strict"; + + var collection = new Events(examples), + result = collection.comeThrough(10); + + console.log("Result: " + result.items.map(function (event) { + return getString(event); + })); + + console.log("--------------\n"); + ok("1" === "1", "Two objects can be the same in value"); +}); + +test("Testing sortBytime in Events", function () { + "use strict"; + + var collection = new Events(examples), + result = collection.byStartTime(); + + console.log("Result: " + result.items.map(function (event) { + return getString(event); + })); + + console.log("--------------\n"); + ok("1" === "1", "Two objects can be the same in value"); +}); + + diff --git a/tests/collectionTest.html b/tests/collectionTest.html new file mode 100644 index 0000000..1ae6ec6 --- /dev/null +++ b/tests/collectionTest.html @@ -0,0 +1,17 @@ + + + + + Тестирование класса Collection + + + + + + + + + +
    + + diff --git a/tests/collectionTest.js b/tests/collectionTest.js new file mode 100644 index 0000000..131b6c1 --- /dev/null +++ b/tests/collectionTest.js @@ -0,0 +1,49 @@ +test("Create object Collection", function () { + "use strict"; + + var result = new Collection(examples); + + ok(result.items[0].name == examples[0].name, "Passed!"); +}); + +test("Testing for creating new Collection in constructor", function () { + "use strict"; + + var result = new Collection(examples); + result.items.pop(); + + ok(result.items.length !== examples.length, "Passed!"); +}); + +test("Add func in Collection", function () { + "use strict"; + + var collection = new Collection(examples), + element = {title: "March 20", content: "In his eyes she eclipses..."}, + result = collection.add(element); + + examples.push(element); + + deepEqual(result.items, examples, "Two objects can be the same in value"); +}); + +test("Test Collection", function () { + "use strict"; + + var collection = new Collection(), + element = {title: "March 20", content: "In his eyes she eclipses..."}, + result = collection.add(element); + + deepEqual(result.items, [element], "Two objects can be the same in value"); +}); + +test("Filter func in Collection", function () { + "use strict"; + + var collection = new Collection(examples), + result = collection.filter(function (item) { + return item.name === "День зимы"; + }); + + ok(result.items.length !== examples.length, "Passed"); +}); diff --git a/tests/eventTest.html b/tests/eventTest.html new file mode 100644 index 0000000..d8284b1 --- /dev/null +++ b/tests/eventTest.html @@ -0,0 +1,16 @@ + + + + + Тестирование класса Event и наследования от класса Model + + + + + + + + +
    + + diff --git a/tests/eventTest.js b/tests/eventTest.js new file mode 100644 index 0000000..0787a89 --- /dev/null +++ b/tests/eventTest.js @@ -0,0 +1,24 @@ +test("Create object Event using Model constructor", function () { + "use strict"; + + var item = new Event({title: "March 20", content: "In his eyes she eclipses..."}); + + ok(item.title === "March 20", "Passed!"); +}); + +test("Testing inherits Event from Model", function () { + "use strict"; + + var item = new Event({title: "March 20", content: "In his eyes she eclipses..."}); + + ok(item.get("title") === "March 20", "Passed!"); +}); + +test("Test for validate method", function () { + "use strict"; + + var item = new Event({name: "hello", start: new Date("2012-10-20 10:00:00")}), + valide = item.validate(); + + ok(valide.name === "hello", "Passed!"); +}); diff --git a/tests/modelTest.html b/tests/modelTest.html new file mode 100644 index 0000000..978bab0 --- /dev/null +++ b/tests/modelTest.html @@ -0,0 +1,16 @@ + + + + + Тестирование класса Model + + + + + + + + +
    + + diff --git a/tests/modelTest.js b/tests/modelTest.js new file mode 100644 index 0000000..c322f9e --- /dev/null +++ b/tests/modelTest.js @@ -0,0 +1,30 @@ +test("Testing qunit", function () { + "use strict"; + + ok( "1" == "1", "Passed!"); +}); + +test("Creating absract object Model", function () { + "use strict"; + + var item = new Model({title: "March 20", content: "In his eyes she eclipses..."}); + ok(item.title === "March 20", "Passed!"); +}); + + +test("Testing setter for Model", function () { + "use strict"; + + var item = new Model(); + item.set({title: "March 20", content: "In his eyes she eclipses..."}); + ok(item.title === "March 20", "Passed!"); +}); + +test("Testing getter for Model", function () { + "use strict"; + + var item = new Model(); + item.set({title: "March 20", content: "In his eyes she eclipses..."}); + + ok(item.get("title") === "March 20", "Passed!"); +}); \ No newline at end of file diff --git a/tests/runner.js b/tests/runner.js new file mode 100644 index 0000000..cea3719 --- /dev/null +++ b/tests/runner.js @@ -0,0 +1,98 @@ +/* + * Qt+WebKit powered headless test runner using Phantomjs + * + * Phantomjs installation: http://code.google.com/p/phantomjs/wiki/BuildInstructions + * + * Run with: + * phantomjs runner.js [url-of-your-qunit-testsuite] + * + * E.g. + * phantomjs runner.js http://localhost/qunit/test + */ + +/*jshint latedef:false */ +/*global phantom:true require:true console:true */ +var url = phantom.args[0], + page = require('webpage').create(); + +// Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this") +page.onConsoleMessage = function(msg) { + console.log(msg); +}; + +page.onInitialized = function() { + page.evaluate(addLogging); +}; +page.open(url, function(status){ + if (status !== "success") { + console.log("Unable to access network: " + status); + phantom.exit(1); + } else { + // page.evaluate(addLogging); + var interval = setInterval(function() { + if (finished()) { + clearInterval(interval); + onfinishedTests(); + } + }, 500); + } +}); + +function finished() { + return page.evaluate(function(){ + return !!window.qunitDone; + }); +} + +function onfinishedTests() { + var output = page.evaluate(function() { + return JSON.stringify(window.qunitDone); + }); + phantom.exit(JSON.parse(output).failed > 0 ? 1 : 0); +} + +function addLogging() { + window.document.addEventListener( "DOMContentLoaded", function() { + var current_test_assertions = []; + + QUnit.testDone(function(result) { + var i, + name = result.module + ': ' + result.name; + + if (result.failed) { + console.log('Assertion Failed: ' + name); + + for (i = 0; i < current_test_assertions.length; i++) { + console.log(' ' + current_test_assertions[i]); + } + } + + current_test_assertions = []; + }); + + QUnit.log(function(details) { + var response; + + if (details.result) { + return; + } + + response = details.message || ''; + + if (typeof details.expected !== 'undefined') { + if (response) { + response += ', '; + } + + response += 'expected: ' + details.expected + ', but was: ' + details.actual; + } + + current_test_assertions.push('Failed assertion: ' + response); + }); + + QUnit.done(function(result){ + console.log('Took ' + result.runtime + 'ms to run ' + result.total + ' tests. ' + result.passed + ' passed, ' + result.failed + ' failed.'); + window.qunitDone = result; + }); + }, false ); +} From 6d8ab49f850126e18777f2dec0dbe6a123bc19b6 Mon Sep 17 00:00:00 2001 From: yunnii Date: Wed, 7 Nov 2012 22:15:38 +0600 Subject: [PATCH 5/8] =?UTF-8?q?3=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + фильтрация + сортировка + при установке сортировки и фильтрации, в момент добавления события оно автоматически встает куда надо --- collection.js | 10 ++++++++ documentAction.js | 31 ++++++++++++++++++------ documentSelector.js | 58 +++++++++++++++++++++++++++++++++++++++++++++ events.js | 12 +++++----- index.css | 2 +- index.html | 18 +++++++------- 6 files changed, 109 insertions(+), 22 deletions(-) create mode 100644 documentSelector.js diff --git a/collection.js b/collection.js index fa814a3..b40333c 100644 --- a/collection.js +++ b/collection.js @@ -66,4 +66,14 @@ Collection.prototype.sort = function (selector) { return new this.constructor(this.items.sort(selector)); }; + +Collection.prototype.reverse = function () { + + return new this.constructor(this.items.reverse()); +}; + +Collection.prototype.length = function (selector) { + + return this.items.length; +}; }(window)); \ No newline at end of file diff --git a/documentAction.js b/documentAction.js index 124a6d3..5e730c4 100644 --- a/documentAction.js +++ b/documentAction.js @@ -3,6 +3,9 @@ exports.ListOfEvents = new Events(); + exports.filterOption = "all"; + exports.sortOption = "without"; + exports.preventDefault = function() { var name = document.querySelector("#title").value; @@ -25,13 +28,13 @@ raiting: raiting, description: description, remindTime: remindTime}).validate(); - ListOfEvents.add(element); + ListOfEvents = ListOfEvents.add(element); - placeElement(element); + changeDocument("sort"); document.forms["form"].reset(); } - function placeElement(element) { + exports.addLiElement = function (element) { var el = document.createElement('li'); el.className = 'event_item'; @@ -56,8 +59,7 @@ var raiting = document.createElement('div') raiting.textContent = "Рейтинг: " + element.raiting; - var fragment = document.createDocumentFragment(); - fragment.appendChild(el); + el.appendChild(name); el.appendChild(start); el.appendChild(end); el.appendChild(location); @@ -65,14 +67,15 @@ el.appendChild(description); el.appendChild(raiting); - var parent = document.querySelector(".events"); - parent.appendChild(fragment); + return el; } exports.addListener = function() { var name = document.querySelector("#title"); var start = document.querySelector("#from"); var remindTime = document.querySelector("#remindTime"); + var filters = document.querySelectorAll('.filter'); + var sort = document.querySelectorAll('.sort'); name.addEventListener('blur', function(event) { var cur = event.currentTarget; @@ -88,5 +91,19 @@ var cur = event.currentTarget; validateNumber(remindTime.value, document.querySelector('#remindTime_help')); }); + + for(var i=0; i < filters.length; i++) { + filters[i].addEventListener('change', function(event) { + filterOption = document.querySelector('input[name="filter"]:checked').value; + changeDocument("filter"); + }); + } + + for(var i=0; i < sort.length; i++) { + sort[i].addEventListener('change', function(event) { + sortOption = document.querySelector('input[name="sort"]:checked').value; + changeDocument("sort"); + }); + } } }(window)); \ No newline at end of file diff --git a/documentSelector.js b/documentSelector.js new file mode 100644 index 0000000..73cfda7 --- /dev/null +++ b/documentSelector.js @@ -0,0 +1,58 @@ +(function (exports) { + "use strict"; + + exports.sortedList = new Events(); + + function filterEvents(listEvents) { + switch (filterOption) { + case "future": + return listEvents.coming(); + case "past": + return listEvents.past(); + default: + return listEvents; + } + } + + function sortEvents(listEvents) { + switch (sortOption) { + case "byName": + return ListOfEvents.sortByName(); + case "byStart": + return ListOfEvents.sortByTime(); + case "byRaiting": + return ListOfEvents.sortByRaiting(); + default: + return ListOfEvents; + } + } + + exports.changeDocument = function(changeType) { + var parent = document.querySelector(".collection"); + var removeList = document.querySelector(".events"); + parent.removeChild(removeList); + + var addList = document.createElement('ul'); + addList.className = "events"; + + var fragment = document.createDocumentFragment(); + if (changeType === "sort") { + sortedList = sortEvents(ListOfEvents); + } + var filterList = filterEvents(sortedList); + + var length = filterList.length(); + + for( var i = 0; i < length; i++) + { + var element = filterList.items[i]; + var el = addLiElement(element); + addList.appendChild(el); + } + + var parent = document.querySelector(".collection"); + fragment.appendChild(addList); + parent.appendChild(fragment); +} + +}(window)); \ No newline at end of file diff --git a/events.js b/events.js index 070b183..89b3d76 100644 --- a/events.js +++ b/events.js @@ -121,10 +121,10 @@ Events.prototype.sortByTime = function (isAscending) { if (isAscending) { return this - .byStartTime(); + .byStartTime().reverse(); } - return this.byStartTime() - .reverse(); + return this.byStartTime(); + }; /** @@ -143,10 +143,10 @@ Events.prototype.sortByRaiting = function (isAscending) { if (isAscending) { return this - .byRaiting(); + .byRaiting() + .reverse(); } return this - .byRaiting() - .reverse(); + .byRaiting(); }; }(window)); \ No newline at end of file diff --git a/index.css b/index.css index fef4148..e19eec3 100644 --- a/index.css +++ b/index.css @@ -16,7 +16,7 @@ body{ text-align: left;} text-align: left; margin-left: 50px; } -.filter{ +.select{ text-align: left; } .selecter{ diff --git a/index.html b/index.html index e17b4f1..8b476ef 100644 --- a/index.html +++ b/index.html @@ -8,8 +8,9 @@ - + +
    @@ -38,15 +39,16 @@ -
    +
    Выбрать
    -
    - +
    +
    +
    Отсортировать по
    -
    -
    -
    - +
    +
    +
    +
    From 505203e6fa29c7f8f6ec6b4ff0f7eba307d129cb Mon Sep 17 00:00:00 2001 From: yunnii Date: Wed, 7 Nov 2012 22:44:22 +0600 Subject: [PATCH 6/8] jslint + jsdoc --- documentAction.js | 82 ++++++++++++++++++++++++++----------------- documentSelector.js | 44 ++++++++++++++---------- event.js | 84 ++++++++++++++++++++++----------------------- 3 files changed, 118 insertions(+), 92 deletions(-) diff --git a/documentAction.js b/documentAction.js index 5e730c4..16e9dfa 100644 --- a/documentAction.js +++ b/documentAction.js @@ -6,57 +6,72 @@ exports.filterOption = "all"; exports.sortOption = "without"; - exports.preventDefault = function() { - - var name = document.querySelector("#title").value; - var start = document.querySelector("#from").value; - var end = document.querySelector("#to").value; - var location = document.querySelector("#location").value; - var raiting = document.querySelector("#raiting").value; - var description = document.querySelector("#description").value; - var remindTime = document.querySelector("#remindTime").value; - - if ( !validateTitle(name, document.querySelector('#title_help'))) { alert("Событие не было добавлено. Ошибка"); return; }; +/** + * Добавляет новое событие в список. Если установлены опции фильтрации и сортировки + * - то располагает элменты на странице, в с-ии с ними + * +*/ + exports.preventDefault = function () { + + var name = document.querySelector("#title").value, + start = document.querySelector("#from").value, + end = document.querySelector("#to").value, + location = document.querySelector("#location").value, + raiting = document.querySelector("#raiting").value, + description = document.querySelector("#description").value, + remindTime = document.querySelector("#remindTime").value; + + if (!validateTitle(name, document.querySelector('#title_help'))) { alert("Событие не было добавлено. Ошибка"); return; }; if (!validateDate(start, document.querySelector('#from_help'))) { alert("Событие не было добавлено. Ошибка"); return; }; if (!validateNumber(remindTime, document.querySelector('#remindTime_help'))) { alert("Событие не было добавлено. Ошибка"); return; }; var element = new Event({ - name: name, - start: new Date(start), - end: new Date(end), - location: location, - raiting: raiting, - description: description, - remindTime: remindTime}).validate(); + name: name, + start: new Date(start), + end: new Date(end), + location: location, + raiting: raiting, + description: description, + remindTime: remindTime + }).validate(); + ListOfEvents = ListOfEvents.add(element); changeDocument("sort"); document.forms["form"].reset(); -} +}; + +/** + * Создает DOM-элемент типа li, заполняется полями из объекта + * + * @param {Event} element - объект типа Element + * + * @return Возвращает созданный дом-элемент типа li +*/ exports.addLiElement = function (element) { var el = document.createElement('li'); el.className = 'event_item'; - var name = document.createElement('div') + var name = document.createElement('div'); name.textContent = "Название: " + element.name; - var start = document.createElement('div') + var start = document.createElement('div'); start.textContent = "Начало: " + element.start; - var end = document.createElement('div') + var end = document.createElement('div'); end.textContent = "Окончание: " + element.end; - var location = document.createElement('div') + var location = document.createElement('div'); location.textContent = "Местоположение: " + element.location; - var remindTime = document.createElement('div') + var remindTime = document.createElement('div'); remindTime.textContent = "Напомнить за: " + element.remindTime + "минут"; - var description = document.createElement('div') + var description = document.createElement('div'); description.textContent = "Описание: " + element.description; - var raiting = document.createElement('div') + var raiting = document.createElement('div'); raiting.textContent = "Рейтинг: " + element.raiting; el.appendChild(name); @@ -68,8 +83,11 @@ el.appendChild(raiting); return el; - } + }; +/** + * Навешивает обработчики событий на страницу +*/ exports.addListener = function() { var name = document.querySelector("#title"); var start = document.querySelector("#from"); @@ -82,24 +100,24 @@ validateTitle(cur.value, document.querySelector('#title_help')); }); - start.addEventListener('blur', function(event) { + start.addEventListener('blur', function (event) { var cur = event.currentTarget; validateDate(cur.value, document.querySelector('#from_help')); }); - remindTime.addEventListener('blur', function(event) { + remindTime.addEventListener('blur', function (event) { var cur = event.currentTarget; validateNumber(remindTime.value, document.querySelector('#remindTime_help')); }); - for(var i=0; i < filters.length; i++) { - filters[i].addEventListener('change', function(event) { + for (var i=0; i < filters.length; i++) { + filters[i].addEventListener('change', function (event) { filterOption = document.querySelector('input[name="filter"]:checked').value; changeDocument("filter"); }); } - for(var i=0; i < sort.length; i++) { + for (var i=0; i < sort.length; i++) { sort[i].addEventListener('change', function(event) { sortOption = document.querySelector('input[name="sort"]:checked').value; changeDocument("sort"); diff --git a/documentSelector.js b/documentSelector.js index 73cfda7..3c2e2ea 100644 --- a/documentSelector.js +++ b/documentSelector.js @@ -5,31 +5,39 @@ function filterEvents(listEvents) { switch (filterOption) { - case "future": - return listEvents.coming(); - case "past": - return listEvents.past(); - default: - return listEvents; + case "future": + return listEvents.coming(); + case "past": + return listEvents.past(); + default: + return listEvents; } } function sortEvents(listEvents) { switch (sortOption) { - case "byName": - return ListOfEvents.sortByName(); - case "byStart": - return ListOfEvents.sortByTime(); - case "byRaiting": - return ListOfEvents.sortByRaiting(); - default: - return ListOfEvents; + case "byName": + return ListOfEvents.sortByName(); + case "byStart": + return ListOfEvents.sortByTime(); + case "byRaiting": + return ListOfEvents.sortByRaiting(); + default: + return ListOfEvents; } } - exports.changeDocument = function(changeType) { - var parent = document.querySelector(".collection"); - var removeList = document.querySelector(".events"); +/** + * . + * + * @param {string} changeType - "sort", , + * - + * @return event +*/ + + exports.changeDocument = function (changeType) { + var parent = document.querySelector(".collection"), + removeList = document.querySelector(".events"); parent.removeChild(removeList); var addList = document.createElement('ul'); @@ -43,7 +51,7 @@ var length = filterList.length(); - for( var i = 0; i < length; i++) + for (var i = 0; i < length; i++) { var element = filterList.items[i]; var el = addLiElement(element); diff --git a/event.js b/event.js index 8787c31..ca9101b 100644 --- a/event.js +++ b/event.js @@ -1,34 +1,34 @@ (function (exports) { "use strict"; -exports.isDate = function (date) { + exports.isDate = function (date) { - if (typeof date === 'undefined') { - return false; - } - if (typeof date.getMonth !== 'function') { - return false; - } - if( isNaN( date.getMonth())) { - return false; - } - return true; -} + if (typeof date === 'undefined') { + return false; + } + if (typeof date.getMonth !== 'function') { + return false; + } + if (isNaN(date.getMonth())) { + return false; + } + return true; + }; -exports.inherits = function (constructor, superconstructor) { + exports.inherits = function (constructor, superconstructor) { - var Func = function () { }; + var Func = function () { }; - Func.prototype = superconstructor.prototype; - constructor.prototype = new Func(); -} + Func.prototype = superconstructor.prototype; + constructor.prototype = new Func(); + }; -exports.Event = function (data) { + exports.Event = function (data) { - Model.apply(this, arguments); -}; + Model.apply(this, arguments); + }; -inherits(Event, Model); + inherits(Event, Model); /** * Валидирует объект event, либо undefined, если в объекте отсутвуют обязательные поля @@ -56,31 +56,31 @@ inherits(Event, Model); * * @return {Object} */ -Event.prototype.validate = function () { + Event.prototype.validate = function () { - var remindTime = this.remindTime || 0; - this.raiting = this.raiting || 0; + var remindTime = this.remindTime || 0; + this.raiting = this.raiting || 0; - if (!isDate(this.get("start"))) { - throw new Error('Field "start" must be Date format'); - } + if (!isDate(this.get("start"))) { + throw new Error('Field "start" must be Date format'); + } - if (!isDate(this.end)) { - this.end = this.start; - } + if (!isDate(this.end)) { + this.end = this.start; + } - if (this.end < this.start) { - this.end = this.start; - } + if (this.end < this.start) { + this.end = this.start; + } - return { - "name": this.name || "(Нет темы)", - "start": this.start, - "end": this.end, - "location": this.location || "", - "remindTime": remindTime, - "description": this.description || "(отсутствует)", - "raiting": this.raiting + return { + "name": this.name || "(Нет темы)", + "start": this.start, + "end": this.end, + "location": this.location || "", + "remindTime": remindTime, + "description": this.description || "(отсутствует)", + "raiting": this.raiting + }; }; -}; }(window)); \ No newline at end of file From ce8d69becda981ac9ea0f8bffcf459df84e273a3 Mon Sep 17 00:00:00 2001 From: yunnii Date: Wed, 7 Nov 2012 23:46:14 +0600 Subject: [PATCH 7/8] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BE=D1=87=D0=BA?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- collection.js | 6 ++-- documentAction.js | 74 ++++++++++++++++++++++++++++++++++++++++++--- documentSelector.js | 66 ---------------------------------------- index.html | 42 ++++++++++++------------- 4 files changed, 94 insertions(+), 94 deletions(-) delete mode 100644 documentSelector.js diff --git a/collection.js b/collection.js index b40333c..5792d4d 100644 --- a/collection.js +++ b/collection.js @@ -1,7 +1,7 @@ (function (exports) { "use strict"; -exports.Collection = function (items) { +var Collection = function (items) { this.items = []; var key; @@ -13,7 +13,9 @@ exports.Collection = function (items) { } }; -Collection.prototype.constructor = exports.Collection; +exports.Collection = Collection; + +Collection.prototype.constructor = Collection; /** * Добавляет в коллекцию объект diff --git a/documentAction.js b/documentAction.js index 16e9dfa..2b207bc 100644 --- a/documentAction.js +++ b/documentAction.js @@ -1,17 +1,18 @@ (function (exports) { "use strict"; - exports.ListOfEvents = new Events(); + ListOfEvents = new Events(); + sortedList = new Events(); - exports.filterOption = "all"; - exports.sortOption = "without"; + filterOption = "all"; + sortOption = "without"; /** * Добавляет новое событие в список. Если установлены опции фильтрации и сортировки * - то располагает элменты на странице, в с-ии с ними * */ - exports.preventDefault = function () { + function preventDefault() { var name = document.querySelector("#title").value, start = document.querySelector("#from").value, @@ -41,6 +42,66 @@ document.forms["form"].reset(); }; + function filterEvents(listEvents) { + switch (filterOption) { + case "future": + return listEvents.coming(); + case "past": + return listEvents.past(); + default: + return listEvents; + } + } + + function sortEvents(listEvents) { + switch (sortOption) { + case "byName": + return ListOfEvents.sortByName(); + case "byStart": + return ListOfEvents.sortByTime(); + case "byRaiting": + return ListOfEvents.sortByRaiting(); + default: + return ListOfEvents; + } + } + +/** + * Сортирует и фильтрует события в соответствии с указанными опциями. + * + * @param {string} changeType - если указана строка "sort", то события также будут отсортированы, + * инчае - только отфильтрованы + * @return коллекция объектов типа event +*/ + + function changeDocument(changeType) { + var parent = document.querySelector(".collection"), + removeList = document.querySelector(".events"); + parent.removeChild(removeList); + + var addList = document.createElement('ul'); + addList.className = "events"; + + var fragment = document.createDocumentFragment(); + if (changeType === "sort") { + sortedList = sortEvents(ListOfEvents); + } + var filterList = filterEvents(sortedList); + + var length = filterList.length(); + + for (var i = 0; i < length; i++) + { + var element = filterList.items[i]; + var el = addLiElement(element); + addList.appendChild(el); + } + + var parent = document.querySelector(".collection"); + fragment.appendChild(addList); + parent.appendChild(fragment); +} + /** * Создает DOM-элемент типа li, заполняется полями из объекта * @@ -49,7 +110,7 @@ * @return Возвращает созданный дом-элемент типа li */ - exports.addLiElement = function (element) { + function addLiElement (element) { var el = document.createElement('li'); el.className = 'event_item'; @@ -94,6 +155,7 @@ var remindTime = document.querySelector("#remindTime"); var filters = document.querySelectorAll('.filter'); var sort = document.querySelectorAll('.sort'); + var button = document.querySelectorAll('#addButton'); name.addEventListener('blur', function(event) { var cur = event.currentTarget; @@ -123,5 +185,7 @@ changeDocument("sort"); }); } + + button.addEventListener('click', preventDefault); } }(window)); \ No newline at end of file diff --git a/documentSelector.js b/documentSelector.js deleted file mode 100644 index 3c2e2ea..0000000 --- a/documentSelector.js +++ /dev/null @@ -1,66 +0,0 @@ -(function (exports) { - "use strict"; - - exports.sortedList = new Events(); - - function filterEvents(listEvents) { - switch (filterOption) { - case "future": - return listEvents.coming(); - case "past": - return listEvents.past(); - default: - return listEvents; - } - } - - function sortEvents(listEvents) { - switch (sortOption) { - case "byName": - return ListOfEvents.sortByName(); - case "byStart": - return ListOfEvents.sortByTime(); - case "byRaiting": - return ListOfEvents.sortByRaiting(); - default: - return ListOfEvents; - } - } - -/** - * . - * - * @param {string} changeType - "sort", , - * - - * @return event -*/ - - exports.changeDocument = function (changeType) { - var parent = document.querySelector(".collection"), - removeList = document.querySelector(".events"); - parent.removeChild(removeList); - - var addList = document.createElement('ul'); - addList.className = "events"; - - var fragment = document.createDocumentFragment(); - if (changeType === "sort") { - sortedList = sortEvents(ListOfEvents); - } - var filterList = filterEvents(sortedList); - - var length = filterList.length(); - - for (var i = 0; i < length; i++) - { - var element = filterList.items[i]; - var el = addLiElement(element); - addList.appendChild(el); - } - - var parent = document.querySelector(".collection"); - fragment.appendChild(addList); - parent.appendChild(fragment); -} - -}(window)); \ No newline at end of file diff --git a/index.html b/index.html index 8b476ef..b145959 100644 --- a/index.html +++ b/index.html @@ -4,30 +4,23 @@ Календарь событий - - - - - - - - +
    Название:
    -
    С:
    -
    По:
    -
    Место:
    +
    С:
    +
    По:
    +
    Место:
    Важность события:
    Описание: @@ -36,19 +29,19 @@
    Напомнить за: минут
    - +
    Выбрать
    -
    +

    Отсортировать по



    - +
    @@ -63,7 +56,14 @@
    -
      +
        + + + + + + + \ No newline at end of file From 17156f769a589edee846a99fc2031ad8fac03497 Mon Sep 17 00:00:00 2001 From: yunnii Date: Thu, 8 Nov 2012 00:33:48 +0600 Subject: [PATCH 8/8] =?UTF-8?q?=D1=82=5F=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- documentAction.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/documentAction.js b/documentAction.js index 2b207bc..1abadf8 100644 --- a/documentAction.js +++ b/documentAction.js @@ -1,11 +1,11 @@ (function (exports) { "use strict"; - ListOfEvents = new Events(); - sortedList = new Events(); + var ListOfEvents = new Events(); + var sortedList = new Events(); - filterOption = "all"; - sortOption = "without"; + var filterOption = "all"; + var sortOption = "without"; /** * Добавляет новое событие в список. Если установлены опции фильтрации и сортировки @@ -155,7 +155,7 @@ var remindTime = document.querySelector("#remindTime"); var filters = document.querySelectorAll('.filter'); var sort = document.querySelectorAll('.sort'); - var button = document.querySelectorAll('#addButton'); + var button = document.querySelector("#addButton"); name.addEventListener('blur', function(event) { var cur = event.currentTarget;