Created
December 16, 2014 11:52
-
-
Save RubaXa/274b1dd5c813c8ee7af3 to your computer and use it in GitHub Desktop.
Pilot v2 (draft)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Pilot v2 (draft) | |
* - Не зависит от jQuery | |
* - Модульность (URL, history, Emitter) | |
* - Простота (один маршрут, один контроллер) | |
*/ | |
var app = { | |
// Глобальная дата | |
model: { | |
folders: function () { | |
return Folders.find(); | |
}, | |
folder: { | |
match: ['#letters', '#letter'], | |
defaults: null, | |
load: function (req) { | |
var id = req.params.id; | |
if (req.is('letters')) { | |
return Folder.findOne(id); | |
} else { | |
return Letter.findOne($.extend(req.query, { id: id })).then(function (letter) { | |
return Folder.findOne(letter.get('folder')); | |
}); | |
} | |
} | |
}, | |
letters: { | |
match: ['#mailbox'], | |
defaults: [], | |
load: function (req) { | |
return Letters.find({offset: req.query.offset}); | |
} | |
} | |
}, | |
// Слушать любое изменение маршрута | |
'*': { | |
// Список папок | |
folderList: { | |
match: ['#letters', '#letter'], // сужаем список маршрутов, на которые реагируем | |
'on:route': function () { } | |
} | |
}, | |
// Список писем | |
'#letters': { | |
url: '/messages/(folder/:id|:type)?', | |
urlBuilder: function (url, params) { | |
if (!(params instanceof Object)) { | |
params = params >= 0 ? { id: params } : { type: params }; | |
} | |
return Pilot.URL.build(url, params); | |
}, | |
paramsMatcher: { | |
type: function (value, req) { | |
req.param('id', Folder['TYPE_' + value.toUpperCase()] || Folder.TYPE_INBOX); | |
} | |
}, | |
'on:route': function (req) { | |
var folder = this.model.folder, | |
letters = this.model.letters; | |
// .. | |
}, | |
'on:404': function () { | |
// ... | |
} | |
}, | |
// Чтение | |
'#letter': { | |
url: '/message/:id', | |
paramsMatcher: { | |
'?': { | |
validator: function (query) { | |
return !!query.fromsearch | |
} | |
} | |
}, | |
model: { | |
letter: function (req) { | |
return Letter.findOne(req.params.id); | |
} | |
}, | |
'on-route': function () { | |
var letter = this.model.letter; | |
// .. | |
} | |
}, | |
// Настройки | |
'#settings': { | |
url: '/settings/', | |
'on:route': function () {}, | |
'*': { | |
navigation: { | |
events: { | |
'gotoinbox': function () { | |
this.router.go('#letters', 'inbox'); | |
} | |
}, | |
'on:route': function () { | |
var section = this.router.route.id.split('.').pop(); | |
// ... | |
} | |
} | |
}, | |
'#settings.folders': { | |
url: 'folders', | |
'on-route': function () {} | |
} | |
} | |
}; | |
var cloud = { | |
'#entries': { | |
url: '/:storage/:id(.+)', | |
model: { | |
entries: { | |
load: function (req) { | |
return CloudEntry.findOne(req.params.id).then(function (entry) { | |
var folderId = entry.isFile() ? entry.get('parent') : entry.id; | |
return CloudEntry.find(folderId); | |
}); | |
}, | |
compare: function (newEntry, oldEntry) { | |
return newEntry.id != oldEntry.id; | |
} | |
} | |
}, | |
'on:route': function () { | |
var entries = this.model.entries; | |
// .. | |
} | |
}, | |
'#entry': { | |
url: '#entries', | |
urlMatcher: { | |
id: { | |
validator: function (value) { | |
return this.loadEntry(value).then(function (entry) { | |
return entry.isFile(); | |
}); | |
} | |
} | |
}, | |
model: { | |
entry: function (req) { | |
return this.loadEntry(req.params.id); | |
} | |
}, | |
loadEntry: function (id) { | |
return CloudEntry.findOne(id); | |
}, | |
events: { | |
'close': function () { | |
this.router.history.rewindTo('entry'); | |
} | |
}, | |
'on:route-before-start': function () { | |
this.router.history.mark('entry'); | |
} | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment