Skip to content
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

>_< дз 4 допилил. #9

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: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1 @@
.idea/
.idea/
6 changes: 6 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[submodule "underscore"]
path = underscore
url = https://github.com/documentcloud/underscore.git
[submodule "backbone"]
path = backbone
url = https://github.com/documentcloud/backbone.git
91 changes: 91 additions & 0 deletions Collection.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
/**
* Коллекции для модели Event.
*
* @constructor
* @this {EventsCollection}
* @param {Array} collect_list Список Event классов.
*/
var EventsCollection = new Collection({
'model': Event
});

/**
* Отфильтровывает события, которые произошли до указанной даты.
*
* @return {EventsCollection} Новый объект EventsCollection.
*/
EventsCollection.prototype.start_before = function (date) {
return this.filter(function (event) {
return event.get('start_time') < date;
});
};

/**
* Возвращает количество событий (Event) в коллекции.
*
* @return {number} Кол-во событий.
*/
EventsCollection.prototype.count_events = function () {
return this.size();
};

/**
* Отфильтровывает события, которые произошли после указанной даты.
*
* @return {EventsCollection} Новый объект EventsCollection.
*/
EventsCollection.prototype.start_after = function (date) {
return this.filter(function (event) {
return event.get('start_time') > date;
});
};

/**
* Фильтрует личные события.
*
* @return {EventsCollection} Новый объект EventsCollection.
*/
EventsCollection.prototype.my_events = function () {
return this.filter(function (event) {
return event.get('go');
});
};

/**
*
* TESTS
*
*/

function ok(name, val1, val2) {
if (val1 !== val2) {
console.log(name + " [FAILED]");
} else {
console.log(name + " [OK]");
}
}

function Collection_tests() {
var a1 = createNewEvent(222, 333, 'lol'); // invalid date
var a2 = createNewEvent(223, 333, 'lol2');
var a3 = createNewEvent(100, 500, 'lol2');
var events_data = [a1, a2, a3];
var events_callect = new EventsCollection(events_data);

// t1
var events_before_date = events_callect.start_before(223);
ok('events_before_date filter', events_before_date.size(), 2);

// t2
ok('events_before_date count_events()', events_before_date.count_events(), 2);

// t3
var events_after_date = events_callect.start_after(222);
ok('events_after_date filter count_events()', events_after_date.count_events(), 1);

// t4 combine methods
var some_filtered_event = events_callect.start_before(223).start_after(100);
ok('sequence filters', some_filtered_event.count_events(), 1);

ok('MY EVENTS filter', some_filtered_event.my_events().size(), 0);
}
89 changes: 89 additions & 0 deletions Model.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@

function isValidDate(d) {
if ( Object.prototype.toString.call(d) === "[object Date]" ) {
// it is a date
if ( isNaN( d.getTime() ) ) { // d.valueOf() could also work
// date is not valid
return false;
}
else {
// date is valid
return true;
}
}
else {
// not a date
return false;
}
}


/**
* Модель для класса Event.
*
* @constructor
* @param {Object} info Обект, описывающий общую информацию о мероприятии (место проведения, название, описание, временные рамки).
*/
var Event = new Model({
'default': {
title: "event",
go: false
},
'constructor': function (info) {
if (typeof info.start_time === 'string') {
info.start_time = new Date(Date.parse(info.start_time));
}
if (typeof info.end_time === 'string') {
info.end_time = new Date(Date.parse(info.end_time));
}

this.update(info);
},
'errors': function (name) {
if (!this.get('start_time') || !this.get('end_time')) {
return "miss required fields";
}
if (!isValidDate(this.get('start_time'))) {
return "invalid start_time value";
}
if (!isValidDate(this.get('end_time'))) {
return "invalid end_time value";
}
if (this.get('start_time') > this.get('end_time')) {
return "starat_time more then end_time";
}
return null;
}
});

/**
* Создает объект Event
*
* @param {Number|Date} start_at Начало события
* @param {Number|Date} end_at Конец события
* @param {String} [name="Событие"] Имя события
*
* @example
* Event(new Date("2011-10-10T14:48:00"),
* new Date("2011-10-10T15:48:00"),
* "Совещание")
*
* @return {Object}
*/
function createNewEvent(start_at, end_at, name, go) {
var info = {
start_time: start_at,
end_time: end_at,
title: name
};
if (go) {
info.go = true;
}

return new Event(info);
}


function ModelTests() {
var a = createNewEvent(222, 333, 'lol'); // invalid date
}
Loading