pimatic
Version:
A home automation server and framework for the Raspberry PI running on node.js
98 lines (82 loc) • 3.04 kB
text/coffeescript
__ = require("i18n-pimatic").__
Promise = require 'bluebird'
assert = require 'cassert'
_ = require('lodash')
S = require('string')
module.exports = (env) ->
class PageManager
constructor: (, ) -> #nop
addPage: (id, page) ->
if _.findIndex(, {id: id}) isnt -1
throw new Error('A page with this ID already exists')
unless page.name?
throw new Error('No name given')
.push( page = {
id: id
name: page.name
devices: []
})
.saveConfig()
._emitPageAdded(page)
return page
updatePage: (id, page) ->
assert typeof id is "string"
assert typeof page is "object"
assert(if page.name? then typeof page.name is "string" else true)
assert(if page.devicesOrder? then Array.isArray page.devicesOrder else true)
thepage =
unless thepage?
throw new Error('Page not found')
thepage.name = page.name if page.name?
if page.devicesOrder?
thepage.devices = _.sortBy(thepage.devices, (device) =>
index = page.devicesOrder.indexOf device.deviceId
# push it to the end if not found
return if index is -1 then 99999 else index
)
.saveConfig()
._emitPageChanged(thepage)
return thepage
getPageById: (id) -> _.find(, {id: id})
addDeviceToPage: (pageId, deviceId) ->
page =
unless page?
throw new Error('Could not find the page')
page.devices.push({
deviceId: deviceId
})
.saveConfig()
._emitPageChanged(page)
return page
removeDeviceFromPage: (pageId, deviceId) ->
page =
unless page?
throw new Error('Could not find the page')
_.remove(page.devices, {deviceId: deviceId})
.saveConfig()
._emitPageChanged(page)
return page
removeDeviceFromAllPages: (deviceId) ->
for page in
removed = _.remove(page.devices, {deviceId: deviceId})
if removed.length > 0
._emitPageChanged(page)
.saveConfig()
removePage: (id, page) ->
removedPage = _.remove(, {id: id})
.saveConfig() if removedPage.length > 0
._emitPageRemoved(removedPage[0])
return removedPage
getPages: (role = "admin") ->
.filter (page) ->
if page.allowedRoles? then page.allowedRoles.indexOf(role) isnt -1 else true
updatePageOrder: (pageOrder) ->
assert pageOrder? and Array.isArray pageOrder
.config.pages = = _.sortBy(, (page) =>
index = pageOrder.indexOf page.id
return if index is -1 then 99999 else index # push it to the end if not found
)
.saveConfig()
._emitPageOrderChanged(pageOrder)
return pageOrder
return exports = { PageManager }