Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .idea/dz-8-nodejs.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions .idea/encodings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

91 changes: 91 additions & 0 deletions collection.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
(function (exports) {
"use strict";

var Collection = function (items) {

this.items = [];
var key;

for (key in items) {
if (items.hasOwnProperty(key)) {
this.items.push(items[key]);
}
}
};

exports.Collection = Collection;

Collection.prototype.constructor = Collection;

/**
* Сериализует коллекцию
*
* @return {JSON object}
*
*/
Collection.prototype.serialise = function () {
return JSON.stringify(this.items, null, ' ');
}

/**
* Добавляет в коллекцию объект
*
* @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));
};

Collection.prototype.reverse = function () {

return new this.constructor(this.items.reverse());
};

Collection.prototype.length = function (selector) {

return this.items.length;
};
}(window));
46 changes: 46 additions & 0 deletions current-event.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{
"name": "pewpew",
"start": "2012-11-07T04:18:00.000Z",
"end": "2012-11-07T04:18:00.000Z",
"location": "",
"remindTime": 0,
"description": "(отсутствует)",
"raiting": 0
},
{
"name": "Пара по веб-технологиям",
"start": "2012-11-20T06:50:00.000Z",
"end": "2012-11-20T06:50:00.000Z",
"location": "5 этаж",
"remindTime": 10,
"description": "Взять бумагу и ручку, не брать бук!",
"raiting": 0
},
{
"name": "Событие",
"start": "2012-11-28T18:00:00.000Z",
"end": "2012-11-28T18:00:00.000Z",
"location": "",
"remindTime": 0,
"description": "(отсутствует)",
"raiting": "0"
},
{
"name": "Событие5",
"start": "2012-11-29T18:00:00.000Z",
"end": "2012-11-29T18:00:00.000Z",
"location": "",
"remindTime": 0,
"description": "(отсутствует)",
"raiting": "0"
}
,
{
"name": "tretr",
"start": "2012-11-28T18:00:00.000Z",
"end": "2012-11-28T18:00:00.000Z",
"location": "",
"remindTime": 0,
"description": "(отсутствует)",
"raiting": "0"
}
177 changes: 177 additions & 0 deletions documentAction.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
$(function (exports) {
"use strict";

var ListOfEvents = new Events(),
sortedList = new Events(),
queue = new Events,
filterOption = "all",
sortOption = "without";

var template = "<div>Название: <%= name %></div>" +
"<div>Начало: <%= start %></div>" +
"<div>Окончание: <%= end %></div>" +
"<div>Местоположение: <%= location %></div>" +
"<div>Напомнить за: <%= remindTime %></div>" +
"<div>Описание: <%= description %></div>" +
"<div>Рейтинг: <%= raiting %></div>";
$(document).ready(initialise);

/**
* Загружает свое состояние с сервера
* при отсутствии соединения/страницы на сервере пытается подключиться через 5 минут снова
*
*/
function initialise() {

$('.date').datepicker();

$.getJSON('current-event.json')
.complete(function () { $("#notify").hide(); })
.error(function () { $('#notifyError').show(); })
.success(function (result) {
var i, newEvent;

for (i = 0; i < result.length; i++) {
newEvent = new Event(result[i]).validate();
ListOfEvents = ListOfEvents.add(newEvent);
}
changeDocument("sort");
addListener();
});
}
/**
* Добавляет новое событие в список. Если установлены опции фильтрации и сортировки
* - то располагает элементы на странице, в с-ии с ними
*
*/
function preventDefault() {

var name = $("#title").val().trim(),
start = $("#from").val(),
end = $("#to").val(),
location = $("#location").val().trim(),
raiting = $("#raiting").val(),
description = $("#description").val().trim(),
remindTime = $("#remindTime").val();

if (!validateTitle(name, $('#title_help'))) { alert("Событие не было добавлено. Ошибка"); return; }
if (!validateDate(start, $('#from_help'))) { alert("Событие не было добавлено. Ошибка"); return; }
if (!validateNumber(remindTime, $('#remindTime_help'))) { alert("Событие не было добавлено. Ошибка"); return; }

var element = new Event({
name: name,
start: start,
end: end,
location: location,
raiting: raiting,
description: description,
remindTime: remindTime
}).validate();

ListOfEvents = ListOfEvents.add(element);
queue = queue.add(element);

$.post('current-event.json', queue.serialise())
.success(function () {
queue = new Events();
changeDocument("sort");
document.forms["form"].reset();
//alert("Все события были успешно отправлены.");
})
.error( function () {
alert("Отсутсвует подключение к серверу.");
});
}

function filterEvents(listEvents) {
switch (filterOption) {
case "future":
return listEvents.coming();
case "past":
return listEvents.past();
default:
return listEvents;
}
}

function sortEvents() {
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 $removeList = $(".events");
$removeList.remove();

if (changeType === "sort") {
sortedList = sortEvents();
}
var filterList = filterEvents(sortedList),
length = filterList.length(),
i;

var html = "<ul class='events'>";
for (i = 0; i < length; i++)
{
html += "<li class='event_item'>" +
tmpl(template, filterList.items[i]) +

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Смотри, у тебя и кодогенерация и шаблоны - используй что-нибудь одно ;-)

"</li>";
}

html += "</ul>";
document.getElementById("collection").innerHTML = html;
}

/**
* Навешивает обработчики событий на страницу
*/
function addListener() {

$("#title").on('blur', function($event) {
var cur = $event.currentTarget;
validateTitle(cur.value, $('#title_help'));
});

$("#from").on('blur', function ($event) {
var cur = $event.currentTarget;
validateDate(cur.value, $('#from_help'));
});

$("#remindTime").on('blur', function ($event) {
var cur = $event.currentTarget;
validateNumber(cur.value, $('#remindTime_help'));
});

$('.filter').each(function() {
$(this).on('change', function () {
filterOption = $('input[name="filter"]:checked').val();
changeDocument("filter");
})});

$('.sort').each(function() {
$(this).on('change', function () {
sortOption = $('input[name="sort"]:checked').val();
changeDocument("sort");
})});


$("#addButton").on('click', preventDefault);
}

}(window));
Loading