From 345c51cdece2b6c73133ac4edb6810789cc273db Mon Sep 17 00:00:00 2001 From: Sergey Zhigalov Date: Wed, 21 Nov 2012 18:18:36 +0600 Subject: [PATCH 1/5] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D1=81=D1=82=D0=B0=D1=8F?= =?UTF-8?q?=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=B2?= =?UTF-8?q?=D0=B2=D0=BE=D0=B4=D0=B0=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Base/Collection.js | 71 ++++++++++++++++++++++++ Base/Model.js | 41 ++++++++++++++ Clone.js | 29 ++++++++++ Event/Event.js | 78 ++++++++++++++++++++++++++ Event/Events.js | 134 +++++++++++++++++++++++++++++++++++++++++++++ Event/Example.js | 77 ++++++++++++++++++++++++++ Inherits.js | 7 +++ index.html | 47 ++++++++++++++++ 8 files changed, 484 insertions(+) create mode 100644 Base/Collection.js create mode 100644 Base/Model.js create mode 100644 Clone.js create mode 100644 Event/Event.js create mode 100644 Event/Events.js create mode 100644 Event/Example.js create mode 100644 Inherits.js create mode 100644 index.html diff --git a/Base/Collection.js b/Base/Collection.js new file mode 100644 index 0000000..44943e3 --- /dev/null +++ b/Base/Collection.js @@ -0,0 +1,71 @@ +/** +* Возвращает объект Collection +* +* @param {Array} items Элементы списка +* +* @example Collection([]); +*/ +var Collection = function (items) { + "use strict"; + + var i; + this.items = [] + for (i = 0; i < items.length; i++) { + this.items[i] = items[i].clone(); + } +}; + +/** + * Добавление элемента в коллекцию + * + * @return {Collection} + */ +Collection.prototype.add = function (model) { + "use strict"; + + var result = new this.constructor(this.items); + result.items.push(model); + return result; +}; + +/** + * @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) { + "use strict"; + + return new this.constructor(this.items.filter(selector)); +}; + +/** + * @param {String} fieldName + * + * @see http://javascript.ru/Array/sort + * + * @example + * new Collection([]).sortBy("raiting"); + * @return {Collection} + */ +Collection.prototype.sortBy = function (fieldName) { + "use strict"; + + var result = new this.constructor(this.items); + result.items.sort(function (first, second) { + if (first.get(fieldName) < second.get(fieldName)) { + return -1; + } + if (first.get(fieldName) > second.get(fieldName)) { + return 1; + } + return 0; + }); + return result; +}; \ No newline at end of file diff --git a/Base/Model.js b/Base/Model.js new file mode 100644 index 0000000..20c780a --- /dev/null +++ b/Base/Model.js @@ -0,0 +1,41 @@ +var Model = function (data) { + "use strict"; +}; + +/** + * @param {Object} attributes + * + * @example + * item.set({title: "March 20", content: "In his eyes she eclipses..."}); + */ +Model.prototype.set = function (attributes) { + "use strict"; + var keyName; + for (keyName in attributes) { + this[keyName] = attributes[keyName]; + } +}; + +/** + * @param {String} attribute + */ +Model.prototype.get = function (attribute) { + "use strict"; + return this[attribute]; +}; + +/** + * @param {Object} attributes + */ +Model.prototype.validate = function (attributes) { + "use strict"; + throw new Error('this is Abstract method'); +}; + +Model.prototype.clone = function () { + var attr, temp = new this.constructor(); + for (attr in this) { + temp[attr] = clone(this.get(attr)); + } + return temp; +} \ No newline at end of file diff --git a/Clone.js b/Clone.js new file mode 100644 index 0000000..02cb9f4 --- /dev/null +++ b/Clone.js @@ -0,0 +1,29 @@ +function clone(obj) { + if (null == obj || "object" != typeof obj) { + return obj; + } + + if (obj instanceof Date) { + var copy = new Date(); + copy.setTime(obj.getTime()); + return copy; + } + + if (obj instanceof Array) { + var i, copy = []; + for (i = 0; i < obj.length; ++i) { + copy[i] = clone(obj[i]); + } + return copy; + } + + if (obj instanceof Object) { + var copy = {}; + for (var attr in obj) { + if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]); + } + return copy; + } + + throw new Error("Unable to copy obj! Its type isn't supported."); +} \ No newline at end of file diff --git a/Event/Event.js b/Event/Event.js new file mode 100644 index 0000000..b6bfd6e --- /dev/null +++ b/Event/Event.js @@ -0,0 +1,78 @@ +/** +* Возвращает объект Event +* +* @param {String} [name = "Событие"] Имя события +* @param {String} [address = ""] Адресс события +* @param {Object} time Дата события +* @param {Array} member Участники +* @param {Number} [raiting=3] Важность события (по шкале от 0 до 5) +* +* @example +* Event( +* "Совещание", "Екатеринбург, ул. Тургенева, д. 4, ауд. 150", +* EventTime(new Date(2011, 10, 10, 14, 48, 00), 60), ["я"], 5) +* +* @see EventTime +*/ + +var Event = function (name, address, time, member, raiting) { + "use strict"; + + Model.call(this); + var myTime = time || new EventTime(new Date(), 60); + + this.set({ + name: name || "Событие", + address: address || "", + timeStart: myTime.start, + timeLength: myTime.length, + member: member || [], + raiting: +raiting || 3 + }); +} + +inherits(Event, Model); +Event.prototype.constructor = Event; + + +/** +* Возвращает объект EventTime +* +* @private +* @param {Number|Date} start Начало события +* @param {Number} [length=0] Длительность события в минутрах +* +* @example +* EventTime(new Date(2011, 10, 10, 14, 48, 00), 60) +* +* @return {Object} +*/ +function EventTime(start, length) { + "use strict"; + + return { + "start": +start, + "length": +length || 0 + }; +} + +/** + * Валидация собития + * + * @return {Array} Список ошибок + */ +Event.prototype.validate = function () { + "use strict"; + + var errors = []; + if (this.get("timeLength") < 0) { + errors.push("Продолжительность события меньше допустимой величины"); + } + if (this.get("raiting") < 0) { + errors.puch("Рэйтинг собития меньше допустимой величины"); + } + else if (this.get("raiting") > 5) { + errors.push("Рэйтинг события больше допустимой величины"); + } + return errors; +}; \ No newline at end of file diff --git a/Event/Events.js b/Event/Events.js new file mode 100644 index 0000000..b8f51ad --- /dev/null +++ b/Event/Events.js @@ -0,0 +1,134 @@ +/** + * @return {Object} Список событий + */ +var Events = function (items) { + "use strict"; + + Collection.call(this, items); +}; + +inherits(Events, Collection); +Events.prototype.constructor = Events; + +/** + * Прошедшие события + * + * @return {Events} + */ +Events.prototype.findPastEvents = function () { + "use strict"; + + return this.filter(function (event) { + return event.get("timeStart") < new Date().getTime(); + }); +}; + +/** + * Предстоящие события + * + * @return {Events} + */ +Events.prototype.findFutureEvents = function () { + "use strict"; + + return this.filter(function (event) { + return event.get("timeStart") > new Date().getTime(); + }); +}; + +/** + * События с участием персоны с именем "name" + * + * @param personName Имя персоны + * + * @return {Events} + */ +Events.prototype.findEventsWithPerson = function (personName) { + "use strict"; + + return this.filter(function (event) { + return event.get("member").some(function (member) { + return member === personName; + }); + }); +}; + +/** + * События без участия персоны с именем "name" + * + * @param personName Имя персоны + * + * @return {Events} + */ +Events.prototype.findEventsWithoutPerson = function (personName) { + "use strict"; + + return this.filter(function (event) { + return event.get("member").every(function (member) { + return member != personName; + }); + }); +}; + +/** + * События, которые произойдут после указанного времени + * + * @param time Временной отсчет + * + * @return {Events} + */ +Events.prototype.findEventsHappendLaterTime = function (time) { + "use strict"; + + return this.filter(function (event) { + return event.get("timeStart") > time; + }); +}; + +/** + * События, которые произойдут до указанного времени + * + * @param time Временной отсчет + * + * @return {Events} + */ +Events.prototype.findEventsHappendBeforeTime = function (time) { + "use strict"; + + return this.filter(function (event) { + return event.get("timeStart") < time; + }); +}; + +/** + * Сортировка по времени начала события + * + * @return {Events} + */ +Events.prototype.sortEventsByDate = function () { + "use strict"; + + return this.sortBy("timeStart"); +}; + +/** + * Сортировка по рэтингу события + * + * @return {Events} + */ +Events.prototype.sortEventsByRaiting = function () { + "use strict"; + + return this.sortBy("raiting"); +}; + +/** + * Сортировка по имени события + * + * @return {Events} + */ +Events.prototype.sortEventsByName = function () { + "use strict"; + + return this.sortBy("name"); +}; \ No newline at end of file diff --git a/Event/Example.js b/Event/Example.js new file mode 100644 index 0000000..c3355d7 --- /dev/null +++ b/Event/Example.js @@ -0,0 +1,77 @@ +var myEvents = new Events([]) + .add(new Event("jsy6on0kz4", "7429kpz7nh", EventTime(new Date(2012, 10, 8), 45), ["Иванов", "я", "Петров"])) // 1 + .add(new Event("l8zklfh2r5", "1ygb121nee", EventTime(new Date(2012, 11, 22), 45), ["Иванов", "я"])) // 2 + .add(new Event("weoua5w3pf", "icu620fqpo", EventTime(new Date(2012, 11, 3), 45), ["Иванов"])) // 3 + .add(new Event("5zs4x4aij9", "4x9pkek4dp", EventTime(new Date(2012, 9, 10), 45), ["Иванов", "я", "Петров"])) // 4 + .add(new Event("s1m5vkm5mv", "5v6hifv041", EventTime(new Date(2012, 11, 25)), ["Иванов", "я"])) // 5 + .add(new Event("3bdg49u3ez", "zwvyu91w3b", EventTime(new Date(2012, 10, 10), 45), ["Иванов", "Петров"])) // 6 + .add(new Event("efc7dr20dx", "u641l89gw7", EventTime(new Date(2012, 9, 9)), ["Иванов", "я"])) // 7 + .add(new Event("pqlv9jglxq", "nkb24jd7u6", EventTime(new Date(2012, 10, 29)), ["Петров"])) // 8 + .add(new Event("iei2z6c63b", "kgzdrcs4mk", EventTime(new Date(2012, 11, 9)), ["я", "Петров"])) // 9 + .add(new Event("kygauxe4ub", "br0vzaikwr", EventTime(new Date(2012, 11, 27), 45), ["Иванов", "я"], 5)) // 10 + .add(new Event("ke4vd03xp8", "9k3bbogzz5", EventTime(new Date(2012, 11, 3), 45), ["Иванов"])) // 11 + .add(new Event("jt4kew1ayg", "4q51wfulmd", EventTime(new Date(2012, 11, 29), 45), ["Иванов", "Петров"])) // 12 + .add(new Event("dg9q72wmw9", "c5r5t5z024", EventTime(new Date(2012, 11, 8), 45), ["Иванов"])) // 13 + .add(new Event("v4873m9tgp", "l0rdqy22d3", EventTime(new Date(2012, 10, 25), 45), ["Иванов", "я"])) // 14 + .add(new Event("rrb6bjyubc", "0oxvmk59p4", EventTime(new Date(2012, 10, 23)), ["Иванов", "я"])) // 15 + .add(new Event("0oqqd4j655", "rb1gc65t8d", EventTime(new Date(2012, 10, 11), 45), ["Иванов", "Петров"])) // 16 + .add(new Event("f7b16x9cmy", "ncxmyqnhp1", EventTime(new Date(2012, 11, 4)), ["Иванов", "я"])) // 17 + .add(new Event("ik3xyzqoky", "3cguxe6l6n", EventTime(new Date(2012, 11, 16)), ["Петров"])) // 18 + .add(new Event("u4mfqatngu", "a7vnsmnpb0", EventTime(new Date(2012, 9, 24)), ["я"])) // 19 + .add(new Event("s53m0j6u9j", "bk9y4szr2s", EventTime(new Date(2012, 9, 7), 45), ["Иванов", "я"], 5)) // 20 + .add(new Event("lkajbmx7y2", "vwzpu1xl0o", EventTime(new Date(2012, 9, 20), 45), ["Иванов", "я", "Петров"], 1)); // 21 + +/** +* Все предстоящие события с моим участием отсортированные по рейтигу +*/ +function NewEventWithMeSortByRaiting() { + "use strict"; + + myEvents + .findFutureEvents() + .findEventsWithPerson("я") + .sortEventsByRaiting() + .items.forEach(printEvent); +} + +/** +* Все события, которые произойдут на этой неделе, отсортированые по рейтингу +*/ +function ThisWeekSortedByRaiting() { + "use strict"; + + var now = new Date(); + var today = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime(); + var timeToEndOfWeek = (7 - now.getDay()) * 24 * 60 * 60 * 1000; + var endOfWeek = new Date(today + timeToEndOfWeek); + myEvents + .findFutureEvents() + .findEventsHappendBeforeTime(endOfWeek) + .sortEventsByRaiting() + .items.forEach(printEvent); +}; + +/** +* Выбрать ближайшее (по времени) событие без моего участия +*/ +function FirstEventWithoutMe() { + "use strict"; + var filteredEvents = myEvents + .findFutureEvents() + .findEventsWithoutPerson("я") + .sortEventsByDate() + .items; + if (filteredEvents.length != 0) + printEvent(filteredEvents[0]); +}; + +var printEvent = function (event) { + console.log( + "Наименование: " + event.name + + " по адресу: " + event.address + + " начало в: " + event.timeStart + + " будет длится: " + event.timeLength + + " участники: " + event.member + + " рэйтинг: " + event.raiting + ); +} \ No newline at end of file diff --git a/Inherits.js b/Inherits.js new file mode 100644 index 0000000..3cc478b --- /dev/null +++ b/Inherits.js @@ -0,0 +1,7 @@ +function inherits (Constructor, SuperConstructor) { + "use strict"; + + var Temp = function () {}; + Temp.prototype = SuperConstructor.prototype; + Constructor.prototype = new Temp(); +} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..04ff25b --- /dev/null +++ b/index.html @@ -0,0 +1,47 @@ + + + + Выборки + + + + + + + + + +

Выбрать все предстоящие события с моим участием отсортированные по рейтигу

+

Выбрать все события, которые произойдут на этой неделе, отсортированые по рейтингу

+

Выбрать ближайшее (по времени) событие без моего участия

+ + +
+
+ Название + +
+
+ Адрес + +
+
+ Время события + + +
+
+ Продолжительность события + +
+
+ Участники + +
+
+ Рэтинг + +
+
+ + \ No newline at end of file From bdcd15a8def3b8e22d370d6a34e5947f18ac4a4c Mon Sep 17 00:00:00 2001 From: Sergey Zhigalov Date: Mon, 26 Nov 2012 09:00:26 +0600 Subject: [PATCH 2/5] =?UTF-8?q?=D0=A1=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20+=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20+=20=D1=81=D0=BE=D1=80=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Сохранение данных формы в локальную переменную myEvents По данным формы строится отображение При выборе способа сортировки - список введенных событий перестраивается --- Event/Event.js | 23 ++++----- Event/Events.js | 28 ++--------- Event/Example.js | 77 ---------------------------- eventFormController.js | 111 +++++++++++++++++++++++++++++++++++++++++ images/add.png | Bin 0 -> 3396 bytes images/delete.jpg | Bin 0 -> 707 bytes index.html | 37 +++++++++----- style.css | 8 +++ 8 files changed, 158 insertions(+), 126 deletions(-) delete mode 100644 Event/Example.js create mode 100644 eventFormController.js create mode 100644 images/add.png create mode 100644 images/delete.jpg create mode 100644 style.css diff --git a/Event/Event.js b/Event/Event.js index b6bfd6e..b5872ae 100644 --- a/Event/Event.js +++ b/Event/Event.js @@ -9,8 +9,7 @@ * * @example * Event( -* "Совещание", "Екатеринбург, ул. Тургенева, д. 4, ауд. 150", -* EventTime(new Date(2011, 10, 10, 14, 48, 00), 60), ["я"], 5) +* "Совещание", "Екатеринбург, ул. Тургенева, д. 4, ауд. 150", eventTime, ["я"], 5) * * @see EventTime */ @@ -19,13 +18,13 @@ var Event = function (name, address, time, member, raiting) { "use strict"; Model.call(this); - var myTime = time || new EventTime(new Date(), 60); + var myTime = time || new EventTime(new Date(), new Date()); this.set({ name: name || "Событие", address: address || "", timeStart: myTime.start, - timeLength: myTime.length, + timeEnd: myTime.end, member: member || [], raiting: +raiting || 3 }); @@ -39,20 +38,20 @@ Event.prototype.constructor = Event; * Возвращает объект EventTime * * @private -* @param {Number|Date} start Начало события -* @param {Number} [length=0] Длительность события в минутрах +* @param {Number|Date} start Время начала события +* @param {Number|Date} end Время конца события * * @example -* EventTime(new Date(2011, 10, 10, 14, 48, 00), 60) +* EventTime(new Date(2011, 10, 10, 14, 48, 00), new Date(2011, 10, 10, 15, 48, 00)) * * @return {Object} */ -function EventTime(start, length) { +function EventTime(start, end) { "use strict"; return { - "start": +start, - "length": +length || 0 + "start": start, + "end": end }; } @@ -65,8 +64,8 @@ Event.prototype.validate = function () { "use strict"; var errors = []; - if (this.get("timeLength") < 0) { - errors.push("Продолжительность события меньше допустимой величины"); + if (this.get("timeStart") < this.get("timeEnd")) { + errors.push("Время начала события больше чем время конца"); } if (this.get("raiting") < 0) { errors.puch("Рэйтинг собития меньше допустимой величины"); diff --git a/Event/Events.js b/Event/Events.js index b8f51ad..6b7615a 100644 --- a/Event/Events.js +++ b/Event/Events.js @@ -101,34 +101,12 @@ Events.prototype.findEventsHappendBeforeTime = function (time) { }; /** - * Сортировка по времени начала события + * Сортировка по переданному полю * * @return {Events} */ -Events.prototype.sortEventsByDate = function () { +Events.prototype.sortEventsBy = function (field) { "use strict"; - return this.sortBy("timeStart"); -}; - -/** - * Сортировка по рэтингу события - * - * @return {Events} - */ -Events.prototype.sortEventsByRaiting = function () { - "use strict"; - - return this.sortBy("raiting"); -}; - -/** - * Сортировка по имени события - * - * @return {Events} - */ -Events.prototype.sortEventsByName = function () { - "use strict"; - - return this.sortBy("name"); + return this.sortBy(field); }; \ No newline at end of file diff --git a/Event/Example.js b/Event/Example.js deleted file mode 100644 index c3355d7..0000000 --- a/Event/Example.js +++ /dev/null @@ -1,77 +0,0 @@ -var myEvents = new Events([]) - .add(new Event("jsy6on0kz4", "7429kpz7nh", EventTime(new Date(2012, 10, 8), 45), ["Иванов", "я", "Петров"])) // 1 - .add(new Event("l8zklfh2r5", "1ygb121nee", EventTime(new Date(2012, 11, 22), 45), ["Иванов", "я"])) // 2 - .add(new Event("weoua5w3pf", "icu620fqpo", EventTime(new Date(2012, 11, 3), 45), ["Иванов"])) // 3 - .add(new Event("5zs4x4aij9", "4x9pkek4dp", EventTime(new Date(2012, 9, 10), 45), ["Иванов", "я", "Петров"])) // 4 - .add(new Event("s1m5vkm5mv", "5v6hifv041", EventTime(new Date(2012, 11, 25)), ["Иванов", "я"])) // 5 - .add(new Event("3bdg49u3ez", "zwvyu91w3b", EventTime(new Date(2012, 10, 10), 45), ["Иванов", "Петров"])) // 6 - .add(new Event("efc7dr20dx", "u641l89gw7", EventTime(new Date(2012, 9, 9)), ["Иванов", "я"])) // 7 - .add(new Event("pqlv9jglxq", "nkb24jd7u6", EventTime(new Date(2012, 10, 29)), ["Петров"])) // 8 - .add(new Event("iei2z6c63b", "kgzdrcs4mk", EventTime(new Date(2012, 11, 9)), ["я", "Петров"])) // 9 - .add(new Event("kygauxe4ub", "br0vzaikwr", EventTime(new Date(2012, 11, 27), 45), ["Иванов", "я"], 5)) // 10 - .add(new Event("ke4vd03xp8", "9k3bbogzz5", EventTime(new Date(2012, 11, 3), 45), ["Иванов"])) // 11 - .add(new Event("jt4kew1ayg", "4q51wfulmd", EventTime(new Date(2012, 11, 29), 45), ["Иванов", "Петров"])) // 12 - .add(new Event("dg9q72wmw9", "c5r5t5z024", EventTime(new Date(2012, 11, 8), 45), ["Иванов"])) // 13 - .add(new Event("v4873m9tgp", "l0rdqy22d3", EventTime(new Date(2012, 10, 25), 45), ["Иванов", "я"])) // 14 - .add(new Event("rrb6bjyubc", "0oxvmk59p4", EventTime(new Date(2012, 10, 23)), ["Иванов", "я"])) // 15 - .add(new Event("0oqqd4j655", "rb1gc65t8d", EventTime(new Date(2012, 10, 11), 45), ["Иванов", "Петров"])) // 16 - .add(new Event("f7b16x9cmy", "ncxmyqnhp1", EventTime(new Date(2012, 11, 4)), ["Иванов", "я"])) // 17 - .add(new Event("ik3xyzqoky", "3cguxe6l6n", EventTime(new Date(2012, 11, 16)), ["Петров"])) // 18 - .add(new Event("u4mfqatngu", "a7vnsmnpb0", EventTime(new Date(2012, 9, 24)), ["я"])) // 19 - .add(new Event("s53m0j6u9j", "bk9y4szr2s", EventTime(new Date(2012, 9, 7), 45), ["Иванов", "я"], 5)) // 20 - .add(new Event("lkajbmx7y2", "vwzpu1xl0o", EventTime(new Date(2012, 9, 20), 45), ["Иванов", "я", "Петров"], 1)); // 21 - -/** -* Все предстоящие события с моим участием отсортированные по рейтигу -*/ -function NewEventWithMeSortByRaiting() { - "use strict"; - - myEvents - .findFutureEvents() - .findEventsWithPerson("я") - .sortEventsByRaiting() - .items.forEach(printEvent); -} - -/** -* Все события, которые произойдут на этой неделе, отсортированые по рейтингу -*/ -function ThisWeekSortedByRaiting() { - "use strict"; - - var now = new Date(); - var today = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime(); - var timeToEndOfWeek = (7 - now.getDay()) * 24 * 60 * 60 * 1000; - var endOfWeek = new Date(today + timeToEndOfWeek); - myEvents - .findFutureEvents() - .findEventsHappendBeforeTime(endOfWeek) - .sortEventsByRaiting() - .items.forEach(printEvent); -}; - -/** -* Выбрать ближайшее (по времени) событие без моего участия -*/ -function FirstEventWithoutMe() { - "use strict"; - var filteredEvents = myEvents - .findFutureEvents() - .findEventsWithoutPerson("я") - .sortEventsByDate() - .items; - if (filteredEvents.length != 0) - printEvent(filteredEvents[0]); -}; - -var printEvent = function (event) { - console.log( - "Наименование: " + event.name + - " по адресу: " + event.address + - " начало в: " + event.timeStart + - " будет длится: " + event.timeLength + - " участники: " + event.member + - " рэйтинг: " + event.raiting - ); -} \ No newline at end of file diff --git a/eventFormController.js b/eventFormController.js new file mode 100644 index 0000000..70172c1 --- /dev/null +++ b/eventFormController.js @@ -0,0 +1,111 @@ +var myEvents = new Events([]); + +function onSubmitEventForm() { + try { + var event = ParseEventForm(); + ResetEventForm(); + + myEvents = myEvents.add(event); + RePaintEvents(myEvents); + } catch (e) { + console.log(e.message); + console.log(e.stack); + } finally { + return false; + } +} + +function SortEvents(selector) { + var events = myEvents.sortEventsBy(selector.value); + console.log(events); + RePaintEvents(events); +} + +function ResetEventForm () { + var form = document.getElementById("eventForm"); + form.reset(); + DeleteMembers(); +} + +function ParseEventForm() { + var name = document.getElementById("eventName").value; + var address = document.getElementById("eventAddress").value; + var timeStart = + new Date( + Date.parse( + document.getElementById("eventDateStart").value + "T" + + document.getElementById("eventTimeStart").value)); + var timeEnd = + new Date( + Date.parse( + document.getElementById("eventDateEnd").value + "T" + + document.getElementById("eventTimeEnd"))); + var memberHTML = document.querySelectorAll(".memberItem"); + var members = []; + for (var i = 0; i < memberHTML.length; i++) { + members.push(memberHTML[i].innerHTML); + } + var raiting = document.getElementById("eventRaiting").value; + + return new Event(name, address, new EventTime(timeStart, timeEnd), members, raiting); +} + +function RePaintEvents(events) { + var oldContainer = document.getElementById("myEvents"); + + var newContainer = document.createElement("div"); + newContainer.id = "myEvents"; + + events.items + .map(EventHtml) + .map(function (event) { + newContainer.innerHTML += event; + }); + + oldContainer.parentNode.replaceChild(newContainer, oldContainer); +} + +function EventHtml(event) { + var i, stars = ""; + for(i = 0; i < event.raiting ; i++) { + stars += "*" + } + var timeStart = (event.timeStart == "Invalid Date") ? "Не указано" : event.timeStart.toUTCString(); + var timeEnd = (event.timeEnd == "Invalid Date") ? "Не указано" : event.timeEnd.toUTCString(); + + var eventHtml = + "
" + + "
" + stars + " \"" + event.name + "\" с " + timeStart + " по " + timeEnd + "
" + + "
Адрес: " + event.address + "
" + + "
Участники: " + event.member + "
" + + "
"; + return eventHtml; +} + +function AddMember() { + var member = document.getElementById("eventMember").value; + if (member != "") { + var memberHTML = + "
" + + " " + + "" + member +"" + + "Удалить элемент" + + "
"; + + var membersContainer = document.getElementById("eventMembers"); + membersContainer.innerHTML += memberHTML; + } +} + +function DeleteMember(deleteButton) { + var memberContainer = deleteButton.parentNode; + memberContainer.parentNode.removeChild(memberContainer); +} + +function DeleteMembers() { + var i, membersHTML = document.querySelectorAll(".memberItem"); + for (i = 0; i < membersHTML.length; i++) { + var memberContainer = membersHTML[i].parentNode; + memberContainer.parentNode.removeChild(memberContainer); + } +} \ No newline at end of file diff --git a/images/add.png b/images/add.png new file mode 100644 index 0000000000000000000000000000000000000000..483536c8a5089271516e3d86cc17b2378fae16cc GIT binary patch literal 3396 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 04ff25b..9f0140e 100644 --- a/index.html +++ b/index.html @@ -8,15 +8,20 @@ - + + -

Выбрать все предстоящие события с моим участием отсортированные по рейтигу

-

Выбрать все события, которые произойдут на этой неделе, отсортированые по рейтингу

-

Выбрать ближайшее (по времени) событие без моего участия

- - -
+
+ Сортировка событий + +
+
+
Название @@ -26,22 +31,30 @@
- Время события + Время начала события
- Продолжительность события - + Время конца события + +
-
+
Участники - +
+ + Добавить +
Рэтинг
+
+   + +
\ No newline at end of file diff --git a/style.css b/style.css new file mode 100644 index 0000000..ec1d048 --- /dev/null +++ b/style.css @@ -0,0 +1,8 @@ +.inputTitle { + float: left; + width: 200px; +} +.event { + background: #FDF5E6; + margin: 10px; +} \ No newline at end of file From 615ecc89fb3bebc56b0eb580ced5b809f8a94546 Mon Sep 17 00:00:00 2001 From: Sergey Zhigalov Date: Mon, 26 Nov 2012 09:41:20 +0600 Subject: [PATCH 3/5] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=B1=D1=80=D0=B0=D0=BB?= =?UTF-8?q?=D1=81=D1=8F=20=D0=B2=20=D0=BA=D0=BE=D0=B4=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eventFormController.js | 144 ++++++++++++++++++++++++++++------------- index.html | 6 +- 2 files changed, 103 insertions(+), 47 deletions(-) diff --git a/eventFormController.js b/eventFormController.js index 70172c1..d13545d 100644 --- a/eventFormController.js +++ b/eventFormController.js @@ -1,33 +1,60 @@ var myEvents = new Events([]); +/** + * Обработка формы с событием + * 1. Извлечение данных о событии из формы + * 2. Очитка формы от введенных данных + * 3. Добавление события в список сохраненных + * 4. Перересовка списка событий + * + * @return false для того чтобы не перезагружалась страница + */ function onSubmitEventForm() { - try { - var event = ParseEventForm(); - ResetEventForm(); - - myEvents = myEvents.add(event); - RePaintEvents(myEvents); + "use strict"; + + try { + var event = ParseEventForm(); + ResetEventForm(); + + myEvents = myEvents.add(event); + RePaintEvents(myEvents); } catch (e) { - console.log(e.message); - console.log(e.stack); - } finally { - return false; - } + console.log(e.message); + console.log(e.stack); + } finally { + return false; + } } +/** + * Сортировка списка сохраненных событий и их перерисовка + */ function SortEvents(selector) { - var events = myEvents.sortEventsBy(selector.value); - console.log(events); - RePaintEvents(events); + "use strict"; + + var events = myEvents.sortEventsBy(selector.value); + RePaintEvents(events); } +/** + * Очитка формы от введенных данных + */ function ResetEventForm () { - var form = document.getElementById("eventForm"); - form.reset(); - DeleteMembers(); + "use strict"; + + var form = document.getElementById("eventForm"); + form.reset(); + DeleteMembers(); } +/** + * Извлечение данных из формы + * + * @return {Object|Event} Событие + */ function ParseEventForm() { + "use strict"; + var name = document.getElementById("eventName").value; var address = document.getElementById("eventAddress").value; var timeStart = @@ -39,18 +66,25 @@ function ParseEventForm() { new Date( Date.parse( document.getElementById("eventDateEnd").value + "T" + - document.getElementById("eventTimeEnd"))); + document.getElementById("eventTimeEnd").value)); var memberHTML = document.querySelectorAll(".memberItem"); - var members = []; - for (var i = 0; i < memberHTML.length; i++) { - members.push(memberHTML[i].innerHTML); - } + var i, members = []; + for (i = 0; i < memberHTML.length; i++) { + members.push(memberHTML[i].innerHTML); + } var raiting = document.getElementById("eventRaiting").value; - + return new Event(name, address, new EventTime(timeStart, timeEnd), members, raiting); } +/** + * Перерисовка списка переданных событий + * + * @param events список событий для отрисовки + */ function RePaintEvents(events) { + "use strict"; + var oldContainer = document.getElementById("myEvents"); var newContainer = document.createElement("div"); @@ -65,47 +99,69 @@ function RePaintEvents(events) { oldContainer.parentNode.replaceChild(newContainer, oldContainer); } +/** + * Создание представления для одного события + * + * @return {String} html представление события + */ function EventHtml(event) { + "use strict"; + var i, stars = ""; for(i = 0; i < event.raiting ; i++) { stars += "*" } var timeStart = (event.timeStart == "Invalid Date") ? "Не указано" : event.timeStart.toUTCString(); var timeEnd = (event.timeEnd == "Invalid Date") ? "Не указано" : event.timeEnd.toUTCString(); - + var eventHtml = "
" + "
" + stars + " \"" + event.name + "\" с " + timeStart + " по " + timeEnd + "
" + "
Адрес: " + event.address + "
" + "
Участники: " + event.member + "
" + "
"; - return eventHtml; + return eventHtml; } +/** + * Добавление участника события при нажатии на плюсик + */ function AddMember() { - var member = document.getElementById("eventMember").value; - if (member != "") { - var memberHTML = - "
" + - " " + - "" + member +"" + - "Удалить элемент" + - "
"; - - var membersContainer = document.getElementById("eventMembers"); - membersContainer.innerHTML += memberHTML; - } + "use strict"; + + var member = document.getElementById("eventMember").value; + if (member != "") { + var memberHTML = + "
" + + " " + + "" + member +"" + + "Удалить элемент" + + "
"; + + var membersContainer = document.getElementById("eventMembers"); + membersContainer.innerHTML += memberHTML; + } } +/** + * Удаление учатника события из отображаемого списка при нажатии на крестик + */ function DeleteMember(deleteButton) { - var memberContainer = deleteButton.parentNode; - memberContainer.parentNode.removeChild(memberContainer); + "use strict"; + + var memberContainer = deleteButton.parentNode; + memberContainer.parentNode.removeChild(memberContainer); } +/** + * Удаление всех участников события + */ function DeleteMembers() { - var i, membersHTML = document.querySelectorAll(".memberItem"); - for (i = 0; i < membersHTML.length; i++) { - var memberContainer = membersHTML[i].parentNode; - memberContainer.parentNode.removeChild(memberContainer); - } + "use strict"; + + var i, membersHTML = document.querySelectorAll(".memberItem"); + for (i = 0; i < membersHTML.length; i++) { + var memberContainer = membersHTML[i].parentNode; + memberContainer.parentNode.removeChild(memberContainer); + } } \ No newline at end of file diff --git a/index.html b/index.html index 9f0140e..24b09fb 100644 --- a/index.html +++ b/index.html @@ -8,7 +8,7 @@ - + @@ -33,12 +33,12 @@
Время начала события - +
Время конца события - +
Участники From 1e5989899edcc7d7b2f5e05ac8a6b06bc8abe3b2 Mon Sep 17 00:00:00 2001 From: Sergey Zhigalov Date: Mon, 26 Nov 2012 10:19:23 +0600 Subject: [PATCH 4/5] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=86=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Если созданное событие не проходит валидацию, то добавляется информационное сообщение, а данные формы не очищаются, давая возможность пользователю исправить данные на корректные. После успешного добавления события информационное сообщение пропадает. --- Event/Event.js | 2 +- eventFormController.js | 26 ++++++++++++++++++++++---- index.html | 1 + style.css | 3 +++ 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Event/Event.js b/Event/Event.js index b5872ae..3411932 100644 --- a/Event/Event.js +++ b/Event/Event.js @@ -64,7 +64,7 @@ Event.prototype.validate = function () { "use strict"; var errors = []; - if (this.get("timeStart") < this.get("timeEnd")) { + if (this.get("timeStart") > this.get("timeEnd")) { errors.push("Время начала события больше чем время конца"); } if (this.get("raiting") < 0) { diff --git a/eventFormController.js b/eventFormController.js index d13545d..b408099 100644 --- a/eventFormController.js +++ b/eventFormController.js @@ -14,10 +14,15 @@ function onSubmitEventForm() { try { var event = ParseEventForm(); - ResetEventForm(); - - myEvents = myEvents.add(event); - RePaintEvents(myEvents); + var errors = event.validate(); + if (errors.length == 0) { + ResetEventForm(); + myEvents = myEvents.add(event); + RePaintEvents(myEvents); + } + else { + SetErrorMessage("Невозможно добавить событие, содержатся следующие ошибки:" + errors); + } } catch (e) { console.log(e.message); console.log(e.stack); @@ -45,6 +50,7 @@ function ResetEventForm () { var form = document.getElementById("eventForm"); form.reset(); DeleteMembers(); + SetErrorMessage(""); } /** @@ -164,4 +170,16 @@ function DeleteMembers() { var memberContainer = membersHTML[i].parentNode; memberContainer.parentNode.removeChild(memberContainer); } +} + +/** + * Устанавливает сообщение об ошибке + * + * @param message сообщение об ошибке в форме + */ +function SetErrorMessage(message) { + "use strict"; + + var errorContainer = document.getElementById("errorInForm"); + errorContainer.innerHTML = message; } \ No newline at end of file diff --git a/index.html b/index.html index 24b09fb..eb9b7b1 100644 --- a/index.html +++ b/index.html @@ -21,6 +21,7 @@
+
Название diff --git a/style.css b/style.css index ec1d048..a870768 100644 --- a/style.css +++ b/style.css @@ -5,4 +5,7 @@ .event { background: #FDF5E6; margin: 10px; +} +.error { + color: red; } \ No newline at end of file From 0aa6e6590e1b7f305a32ff948c365e861ccefa30 Mon Sep 17 00:00:00 2001 From: Sergey Zhigalov Date: Mon, 26 Nov 2012 17:54:44 +0600 Subject: [PATCH 5/5] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D0=B0=D1=86=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Event/Events.js | 15 +++++++++++++++ eventFormController.js | 24 +++++++++++++++++++++--- index.html | 32 ++++++++++++++++++++++++++++---- 3 files changed, 64 insertions(+), 7 deletions(-) diff --git a/Event/Events.js b/Event/Events.js index 6b7615a..da8c197 100644 --- a/Event/Events.js +++ b/Event/Events.js @@ -100,6 +100,21 @@ Events.prototype.findEventsHappendBeforeTime = function (time) { }); }; +/** + * События, с рейтингом больше (или равного) переданному + * + * @param raiting Рэйтинг + * + * @return {Events} + */ +Events.prototype.findEventsWithRaitingMore = function (raiting) { + "use strict"; + + return this.filter(function (event) { + return event.get("raiting") >= raiting; + }); +}; + /** * Сортировка по переданному полю * diff --git a/eventFormController.js b/eventFormController.js index b408099..f9f8e8e 100644 --- a/eventFormController.js +++ b/eventFormController.js @@ -32,12 +32,30 @@ function onSubmitEventForm() { } /** - * Сортировка списка сохраненных событий и их перерисовка + * Сортировка и фильтрация списка сохраненных событий и их перерисовка */ -function SortEvents(selector) { +function ShowEventList() { "use strict"; - var events = myEvents.sortEventsBy(selector.value); + var sortSelector = document.getElementById("eventSortType"); + var events = myEvents.sortEventsBy(sortSelector.value); + if (document.getElementById("lastEvents").checked) { + events = events.findPastEvents(); + } + if (document.getElementById("futureEvents").checked) { + events = events.findFutureEvents(); + } + var withPerson = document.getElementById("withPerson").value; + if (withPerson != "") { + events = events.findEventsWithPerson(withPerson); + } + var withoutPerson = document.getElementById("withoutPerson").value; + if (withoutPerson != "") { + events = events.findEventsWithoutPerson(withoutPerson); + } + var raiting = document.getElementById("raitingMore").value; + events = events.findEventsWithRaitingMore(raiting); + RePaintEvents(events); } diff --git a/index.html b/index.html index eb9b7b1..e009166 100644 --- a/index.html +++ b/index.html @@ -13,13 +13,37 @@
- Сортировка событий - + +
+
+ Прошедшие события + +
+
+ Предстоящие события + +
+
+ С участием персоны + +
+
+ Без участия персоны + +
+
+ Рэтинг больше чем + +
+
+   + +