aurelia-form
Version:
Makes working with forms just a tad more pleasant.
115 lines (90 loc) • 2.88 kB
JavaScript
import { Config as ViewManagerConfig } from 'aurelia-view-manager';
import { getLogger } from 'aurelia-logging';
import { metadata } from 'aurelia-metadata';
import { Homefront } from 'homefront';
export const logger = getLogger('aurelia-form');
export function configure(aurelia, config) {
aurelia.aurelia.use.plugin('aurelia-view-manager');
aurelia.container.get(ViewManagerConfig).configureNamespace('spoonx/form', {
location: './view/{{framework}}/{{view}}.html'
});
let defaultComponents = ['aurelia-form', 'form-element', 'form-label', 'form-button', 'form-help', 'form-error', 'form-group', 'entity-form'];
let defaultElements = ['input', 'checkbox', 'radio', 'select', 'textarea', 'association'];
aurelia.globalResources('./attribute/prefixed', ...defaultComponents.map(component => `./component/${component}`), ...defaultElements.map(component => `./component/form-${component}`));
config.elements = config.elements || {};
defaultElements.forEach(element => {
config.elements[element] = config.elements[element] || `form-${element}`;
});
}
export const config = {
'aurelia-form': {
defaultElement: 'input',
defaultBehavior: 'regular',
defaultLabelClasses: '',
defaultElementClasses: '',
elements: {},
validation: {},
submitButton: {
enabled: true,
options: ['primary'],
label: 'Submit'
},
aliases: {
enum: 'radio',
int: 'input',
integer: 'input',
number: 'input',
float: 'input',
string: 'input',
bool: 'checkbox',
boolean: 'checkbox',
text: 'textarea'
}
}
};
export let Metadata = class Metadata {
static forTarget(target) {
if (typeof target !== 'function') {
target = target.constructor;
}
return metadata.getOrCreateOwn('spoonx:form:metadata', Homefront, target, target.name);
}
};
export function autofocus(value = true) {
return field(value, 'autofocus');
}
export function disabled(value = true) {
return field(value, 'disabled');
}
export function element(value) {
return field(value, 'element');
}
export function field(value, option) {
return function (target, property) {
Metadata.forTarget(target.constructor).put(`fields.${property}.${option}`, value);
};
}
export function inputType(value) {
return field(value, 'type');
}
export function label(value) {
return field(value, 'label');
}
export function noRender(value = true) {
return field(value, 'noRender');
}
export function options(value = {}) {
return field(value, 'options');
}
export function placeholder(value) {
return field(value, 'placeholder');
}
export function position(value = -1) {
return field(value, 'position');
}
export function readonly(value = true) {
return field(value, 'readonly');
}
export function required(value = true) {
return field(value, 'required');
}