aurelia-seabreeze

0.0.2 • Public • Published

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.

Package Sidebar

Install

npm i aurelia-seabreeze

Weekly Downloads

1

Version

0.0.2

License

MIT

Last publish

Collaborators

  • kmandrup