Skip to content

Последняя =) дз-8 #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all 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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.idea/

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));
56 changes: 56 additions & 0 deletions current-event.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
[
{
"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"
},
{
"name": "Событиеjnklk",
"start": "2012-11-29T18:00:00.000Z",
"end": "2012-11-29T18: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 = '<li class="event_item" >' +
"<div>Название: <%= name %></div>" +
"<div>Начало: <%= start %></div>" +
"<div>Окончание: <%= end %></div>" +
"<div>Местоположение: <%= location %></div>" +
"<div>Напомнить за: <%= remindTime %></div>" +
"<div>Описание: <%= description %></div>" +
"<div>Рейтинг: <%= raiting %></div></li>";
$(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();

var result = ListOfEvents.add(element);

$.post('current-event.json', result.serialise())
.success(function () {
ListOfEvents = result;
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 $box = $("<ul class='events'/>");
var $temp = $();

for (i = 0; i < length; i++)
{
$temp = $temp.add($(tmpl(template, filterList.items[i])));
}

$temp.appendTo($box);
$box.appendTo($("#collection"));
}

/**
* Навешивает обработчики событий на страницу
*/
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