Skip to content

Instantly share code, notes, and snippets.

@muziejus
Forked from poteto/controllers.application.js
Last active June 26, 2019 16:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save muziejus/73dda1e77a1b3a878a903f7065e655b4 to your computer and use it in GitHub Desktop.
Save muziejus/73dda1e77a1b3a878a903f7065e655b4 to your computer and use it in GitHub Desktop.
ember-changeset-validations demo
import Ember from 'ember';
import {
validatePresence,
validateLength
} from 'ember-changeset-validations/validators';
const { get } = Ember;
export default Ember.Controller.extend({
props: ["name.firstName", "name.lastName", "job", "age"],
get FixedValidations() {
const validations = {
"name.firstName": [
validatePresence(true),
validateLength({ min: 2 })
],
"name.lastName": [
validatePresence(true),
validateLength({ min: 2 })
],
job: validatePresence(true),
age: validatePresence(true)
};
console.log("Fixed Validations", validations);
return validations;
},
get ProgrammaticValidations() {
const validations = {};
this.props.forEach(property => {
if (/Name/.test(property)) {
validations[property] = [
validatePresence(true),
validateLength({ min: 2 })
];
} else {
validations[property] = validatePresence(true);
}
})
console.log("Programmatic Validations", validations);
return validations;
},
actions: {
save(changeset) {
let snapshot = changeset.snapshot();
return changeset
.validate()
.then(() => {
if (get(changeset, 'isValid')) {
console.log("executing to model.");
return changeset.execute();
}
}).catch(() => {
changeset.restore(snapshot);
});
},
reset(changeset) {
return changeset.rollback();
},
validateProperty(changeset, property) {
return changeset.validate(property);
}
}
});
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { belongsTo, hasMany } from 'ember-data/relationships';
export const schema = {
name: attr(),
age: attr('number'),
job: attr('string')
};
export default Model.extend(schema);
import Ember from 'ember';
export default Ember.Route.extend({
model() {
return this.get('store').createRecord('user', {
name: {
firstName: 'Jim',
lastName: 'Bob'
},
age: 18
});
}
});
{{edit-user
user=model
validations=ProgrammaticValidations
type="adult"
save=(action "save")
reset=(action "reset")
validateProperty=(action "validateProperty")
props=props
}}
<h4>{{type}} user: <code>{{user.name.firstName}} {{user.name.lastName}}, age {{user.age}} is a {{user.job}}</code></h4>
{{#with (changeset user validations) as |changeset|}}
{{#each props as |property|}}
{{validated-field
type="text"
changeset=changeset
property=property
validateProperty=(action validateProperty changeset property)
}}
{{/each}}
Changeset invalid? {{get changeset "isInvalid"}}
<div class="row">
<button {{action save changeset}} disabled={{changeset.isInvalid}} class="button-primary">Save</button>
<button {{action reset changeset}}>Reset</button>
</div>
{{/with}}
<iframe src="https://ghbtns.com/github-btn.html?user=DockYard&repo=ember-changeset&type=star&count=true" frameborder="0" scrolling="0" width="170px" height="20px"></iframe>
<iframe src="https://ghbtns.com/github-btn.html?user=DockYard&repo=ember-changeset-validations&type=star&count=true" frameborder="0" scrolling="0" width="170px" height="20px"></iframe>
<p><code>ember-changeset</code> and <code>ember-changeset-validations</code> provide an easy way to validate and set changes to your data. Unlike CP or observer based validations, you don't need to write anything special to prevent data from immediately becoming invalid. Validators are simply functions, no CPs or observers required. Try clearing the inputs below, entering invalid values, or even just focusing out. Email is an async validation.</p>
<p>
Reserved emails: {{#each reservedEmails as |email|}}
<code>{{email}}</code>
{{/each}}
</p>
<label for={{concat type "-" property}}>{{property}}</label>
<input
class="u-full-width"
type={{type}}
id={{concat type "-" property}}
value={{get changeset property}}
oninput={{action (changeset-set changeset property) value="target.value"}}
onblur={{action validateProperty}}>
{{#if (get changeset.error property)}}
<small>
<ul>
{{#each (get (get changeset.error property) "validation") as |message|}}
<li>{{message}}</li>
{{/each}}
</ul>
</small>
{{/if}}
{
"version": "0.12.1",
"EmberENV": {
"FEATURES": {}
},
"options": {
"use_pods": false,
"enable-testing": false
},
"dependencies": {
"jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.3/jquery.js",
"ember": "3.4.3",
"ember-template-compiler": "3.4.3",
"ember-testing": "3.4.3",
"skeleton-css": "https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css"
},
"addons": {
"ember-data": "2.12.1",
"ember-changeset": "2.1.2",
"ember-changeset-validations": "2.1.0",
"ember-one-way-controls": "0.8.3"
}
}
import Ember from 'ember';
import { validateNumber } from 'ember-changeset-validations/validators';
import UserValidations from './user';
const { assign } = Ember;
export default assign({}, UserValidations, {
age: validateNumber({ gte: 18 })
});
import Ember from 'ember';
import { validateNumber } from 'ember-changeset-validations/validators';
import UserValidations from './user';
const { assign } = Ember;
export default assign({}, UserValidations, {
age: validateNumber({ lt: 18 })
});
import {
validatePresence,
validateLength,
validateFormat
} from 'ember-changeset-validations/validators';
import validateUniqueness from '../validators/uniqueness';
export default {
"name.firstName": [
validatePresence(true),
validateLength({ min: 2 })
],
"name.lastName": [
validatePresence(true),
validateLength({ min: 2 })
],
job: validatePresence(true)
}
import Ember from 'ember';
const { RSVP: { resolve } } = Ember;
export const reservedEmails = ['foo@bar.com', 'admin@example.com'];
export default function validateUniqueness() {
return (key, newValue, oldValue, changes) => {
let isAvailable = reservedEmails.indexOf(newValue) === -1;
return resolve(isAvailable || 'is taken');
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment