aurelia-seabreeze v0.0.2
Aurelia Seabreeze
A small library to quickly get rocking with aurelia-breeze. Based on the sample northwind app: aurelia-breeze-northwind and tried to make the code more abstract/general and thus easily reusable for different entities.
Install
npm i aurelia-seabreeze --save
Usage
You will need to create the following:
- EntityManager factory method
- Section with entity router
- Service (with service queries)
- Entity lookups (with lookup queries)
- Entity VM
- Entities VM
Then you can create views for your VMs as you find appropriate to display/manage your entity data
EntityManager factory
breeze settings for EntityManager
// settings.js
export default {
serviceName: "http://sampleservice.breezejs.com/api/northwind",
pageSize: 100,
};
For the EntityManager
factory method we use our settings.
// createEntityManager.js
import settings from './settings';
import { EntityManagerFactory } from 'aurelia-seabreeze';
export createEntityManager() {
return new EntityManagerFactory(settings).entityManager;
}
Note that the settings can also include a logger
entry which provides a logger function logChanges(data)
.
See src/logger.js
for the default logger provided.
Entity Section
The OrderSection
is the entry point for the Order entity is itself a child-router
// orders/order-sections
import { EntitySection } from 'aurelia-seabreeze';
class OrderSection extends EntitySection {
constructor() {
super('order');
}
}
It will create a router with the following routes, defined in the getter routeMap
(override if you need to).
{ route: '', moduleId: `./order-list`, nav: false, title: '' },
{ route: ':id', moduleId: `./order`, nav: false, title: '' },
Service queries
You should create a (possibly paged) list
query and one or more queries to retrieve one entity (usually by id
).
Example:
// service-queries.js
import query from '../query';
const pagedList = query()
.from('Orders')
.select('OrderID, Customer.CompanyName, Employee.FirstName, Employee.LastName, OrderDate, Freight')
.orderByDesc('OrderDate')
.skip(pageIndex * settings.pageSize)
.take(settings.pageSize)
.inlineCount();
function queriesById({id}) {
return [
query().from('Orders').where('OrderID', '==', id),
query().from('OrderDetails').where('OrderID', '==', id)
]
}
export default {
order: {
list: pagedList,
oneBy: queriesById
}
}
Entity service
We create an OrderService
for the Order
entity
import { EntityService } from 'aurelia-seabreeze';
import { serviceQueries } from './service-queries';
import { createEntityManager } from './entity-manager'
class OrderService extends EntityService {
constructor() {
super('order');
}
get queries() {
return serviceQueries;
}
get entityManager() {
return createEntityManager();
}
}
Entity lookup queries:
// lookup-queries.js
import query from './query';
const customersQuery = query()
.from('Customers')
.select('CustomerID, CompanyName')
.orderBy('CompanyName');
const productsQuery = query()
.from('Products')
.select('ProductID, ProductName, UnitPrice')
.orderBy('ProductName');
export default [
{customers: customersQuery},
{products: productsQuery}
]
We use this to create an EntityLookups
aggregator
// lookups.js
import lookupQueries from './lookup-queries';
import { Lookups } from 'aurelia-seabreeze';
export class EntityLookups extends Lookups {
get entityManager() {
return createEntityManager();
}
get lookupQueries() {
return lookupQueries;
}
}
Entity VM
For the Order
VM we inject OrderService
and EntityLookups
as singletons.
import { Entity } from 'aurelia-seabreeze';
import { OrderService } from './order-service';
import { EntityLookups } from './entity-lookups';
@inject(OrderService, EntityLookups)
class Order extends Entity {
constructor(service, lookups) {
super('order', service, lookups);
}
}
Entities VM
Then create an Order
VM injecting OrderService
and Router
.
We also pass the plural entity name as the route, ie. orders
and optionally some settings, such as pageSize
import { EntityList } from 'aurelia-seabreeze';
import {OrderService} from './order-service';
import {Router} from './aurelia-framework';
@inject(Router, OrderService)
class OrderList extends EntityList {
constructor(router, service}) {
super('orders', router, service, {pageSize: 50})
}
}
Now we are good to go!!
PS: This is still very experimental! Let me know how it works out for you ;)
Notes
The included src files: lookup-queries.js
and section/service-queries.js
are simply there to demonstrate
how these queries should be defined and exported for use.
8 years ago