diff --git a/.bowerrc b/.bowerrc
new file mode 100644
index 0000000..959e169
--- /dev/null
+++ b/.bowerrc
@@ -0,0 +1,4 @@
+{
+ "directory": "bower_components",
+ "analytics": false
+}
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..47c5438
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,34 @@
+# EditorConfig helps developers define and maintain consistent
+# coding styles between different editors and IDEs
+# editorconfig.org
+
+root = true
+
+
+[*]
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+indent_style = space
+indent_size = 2
+
+[*.js]
+indent_style = space
+indent_size = 2
+
+[*.hbs]
+insert_final_newline = false
+indent_style = space
+indent_size = 2
+
+[*.css]
+indent_style = space
+indent_size = 2
+
+[*.html]
+indent_style = space
+indent_size = 2
+
+[*.{diff,md}]
+trim_trailing_whitespace = false
diff --git a/.ember-cli b/.ember-cli
new file mode 100644
index 0000000..ee64cfe
--- /dev/null
+++ b/.ember-cli
@@ -0,0 +1,9 @@
+{
+ /**
+ Ember CLI sends analytics information by default. The data is completely
+ anonymous, but there are times when you might want to disable this behavior.
+
+ Setting `disableAnalytics` to true will prevent any data from being sent.
+ */
+ "disableAnalytics": false
+}
diff --git a/.gitignore b/.gitignore
index 41b1506..86fceae 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,38 +1,17 @@
-*.bpkg
-*.gem
-*.rbc
-.DS_Store
-.bpm
-.bundle
-.config
-.github-upload-token
-.yardoc
-InstalledFiles
-_site
-_yardoc
-assets
-assets/bpm_libs.js
-assets/bpm_styles.css
-bin/
-coverage
-dist
-docs/build
-docs/node_modules
-lib/*/tests/all.js
-lib/*/tests/qunit*
-lib/bundler/man
-pkg
-rdoc
-spade-boot.js
-spec/reports
-test/tmp
-test/version_tmp
-test_*.html
-/tests/ember-tests.js
-tmp
-tmp*.gem
-tmp.bpm
-tmp.spade
-tests/source
-node_modules
-.vagrant
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+/dist
+/tmp
+
+# dependencies
+/node_modules
+/bower_components
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage/*
+/libpeerconnection.log
+npm-debug.log
+testem.log
diff --git a/.jshintrc b/.jshintrc
index 697255f..08096ef 100644
--- a/.jshintrc
+++ b/.jshintrc
@@ -1,55 +1,32 @@
{
- "predef": [
- "console",
- "Ember",
- "DS",
- "Handlebars",
- "Metamorph",
- "ember_assert",
- "ember_warn",
- "ember_deprecate",
- "ember_deprecateFunc",
- "require",
- "equal",
- "asyncTest",
- "test",
- "raises",
- "deepEqual",
- "start",
- "stop",
- "ok",
- "strictEqual",
- "module",
- "expect",
- "minispade",
- "async",
- "invokeAsync",
- "requirejs"
- ],
-
- "node" : false,
- "es5" : true,
- "browser" : true,
-
- "boss" : true,
- "curly": false,
- "debug": false,
- "devel": false,
- "eqeqeq": true,
- "evil": true,
- "forin": false,
- "immed": false,
- "laxbreak": false,
- "newcap": true,
- "noarg": true,
- "noempty": false,
- "nonew": false,
- "nomen": false,
- "onevar": false,
- "plusplus": false,
- "regexp": false,
- "undef": true,
- "sub": true,
- "strict": false,
- "white": false
+ "predef": [
+ "document",
+ "window",
+ "-Promise"
+ ],
+ "browser": true,
+ "boss": true,
+ "curly": true,
+ "debug": false,
+ "devel": true,
+ "eqeqeq": true,
+ "evil": true,
+ "forin": false,
+ "immed": false,
+ "laxbreak": false,
+ "newcap": true,
+ "noarg": true,
+ "noempty": false,
+ "nonew": false,
+ "nomen": false,
+ "onevar": false,
+ "plusplus": false,
+ "regexp": false,
+ "undef": true,
+ "sub": true,
+ "strict": false,
+ "white": false,
+ "eqnull": true,
+ "esnext": true,
+ "unused": true
}
diff --git a/.npmignore b/.npmignore
new file mode 100644
index 0000000..d522ca2
--- /dev/null
+++ b/.npmignore
@@ -0,0 +1,15 @@
+bower_components/
+tests/
+tmp/
+dist/
+
+.bowerrc
+.editorconfig
+.ember-cli
+.travis.yml
+.npmignore
+**/.gitkeep
+bower.json
+ember-cli-build.js
+Brocfile.js
+testem.json
diff --git a/.travis.yml b/.travis.yml
index a687624..8197d31 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,10 +1,34 @@
-language: ruby
-before_script: sudo apt-get update && sudo apt-get install git
-script: bundle exec rake test[all]
-after_success: bundle exec rake publish_build BUILD_TYPE=release
+---
+language: node_js
+node_js:
+ - "0.12"
+
+sudo: false
+
+cache:
+ directories:
+ - node_modules
+
env:
- global:
- - S3_BUCKET_NAME=builds.dockyard.com
- - S3_FILE_PREFIX=ember-easyForm
- - secure: eiR9ujb8OeuU1GM0M5owT79OjrDuASuoZwdjgfXw7Uihhcr56PZt8BNaW286rg8t7S/BJKdJ01cRImWTezlrklpE1jWb8comcSYQUlVpP9F5ziPM/kjhg1/5uOh1UelVIEeawntkIcJhIc8Qh/uL1EQ857hTNB5TOnO1D7STG3o=
- - secure: MrLcuhH0IItaW01607Df1iIktJKIpMrucv9qnpKaMvf3/5ZvPsIh3viP4m/qdPcNN4v1s4eElBBT0Z7FUCQ8vtyTH4DmTp7Ek8PVRUMnJA+GupxsQqQmt9fIbQXYhUm460E1zNk2Bk5J17vetTX9ArgbgQkE4uV6Yn1BCzyo8SU=
+ - EMBER_TRY_SCENARIO=default
+ - EMBER_TRY_SCENARIO=ember-release
+ - EMBER_TRY_SCENARIO=ember-beta
+ - EMBER_TRY_SCENARIO=ember-canary
+
+matrix:
+ fast_finish: true
+ allow_failures:
+ - env: EMBER_TRY_SCENARIO=ember-canary
+
+before_install:
+ - export PATH=/usr/local/phantomjs-2.0.0/bin:$PATH
+ - "npm config set spin false"
+ - "npm install -g npm@^2"
+
+install:
+ - npm install -g bower
+ - npm install
+ - bower install
+
+script:
+ - ember try $EMBER_TRY_SCENARIO test
diff --git a/.watchmanconfig b/.watchmanconfig
new file mode 100644
index 0000000..5e9462c
--- /dev/null
+++ b/.watchmanconfig
@@ -0,0 +1,3 @@
+{
+ "ignore_dirs": ["tmp"]
+}
diff --git a/Assetfile b/Assetfile
deleted file mode 100644
index 7a7ce6d..0000000
--- a/Assetfile
+++ /dev/null
@@ -1,59 +0,0 @@
-require 'barber'
-
-instance_eval File.read(EmberDev.support_path.join('Assetfile'))
-
-class InlineHandlebarsPrecompiler < Rake::Pipeline::Filter
- def precompile_templates(data)
- data.gsub!(/Ember\.Handlebars\.compile\(['"](.*)['"]\)/) do
- Barber::Ember::InlinePrecompiler.call($1)
- end
- end
-
- def generate_output(inputs, output)
- inputs.each do |input|
- result = File.read(input.fullpath)
- precompile_templates(result)
- output.write result
- end
- end
-end
-
-distros = {
- :full => %w(ember-easyForm)
-}
-
-output "dist"
-
-distros.each do |name, modules|
- name = "ember-easyForm"
-
- input "dist/modules" do
- module_paths = modules.map{|m| "#{m}.js" }
- match "{#{module_paths.join(',')}}" do
- concat(module_paths){ ["#{name}.js", "#{name}.prod.js"] }
- end
-
- match "#{name}.js" do
- filter InlineHandlebarsPrecompiler
- filter VersionInfo
- filter EmberLicenseFilter
- end
-
- # Strip dev code
- match "#{name}.prod.js" do
- filter InlineHandlebarsPrecompiler
- filter VersionInfo
- filter EmberLicenseFilter
- filter(EmberStripDebugMessagesFilter) { ["#{name}.prod.js", "min/#{name}.js"] }
- end
-
- # Minify
- match "min/#{name}.js" do
- uglify{ "#{name}.min.js" }
- filter VersionInfo
- filter EmberLicenseFilter
- end
- end
-end
-
-# vim: filetype=ruby
diff --git a/Gemfile b/Gemfile
deleted file mode 100644
index 2df8c51..0000000
--- a/Gemfile
+++ /dev/null
@@ -1,8 +0,0 @@
-source 'https://rubygems.org'
-
-gem 'rake-pipeline', :git => 'https://github.com/livingsocial/rake-pipeline.git'
-gem 'ember-dev', :git => 'https://github.com/emberjs/ember-dev.git', :branch => 'ruby'
-
-gem "handlebars-source", "~> 2.0.0"
-gem 'ember-source', '~> 1.9.0.alpha'
-gem "barber", "~> 0.5.0"
diff --git a/Gemfile.lock b/Gemfile.lock
deleted file mode 100644
index 073ee20..0000000
--- a/Gemfile.lock
+++ /dev/null
@@ -1,89 +0,0 @@
-GIT
- remote: https://github.com/emberjs/ember-dev.git
- revision: 851608c1403a875c6b9dfd4b298b21ac9fef4bf5
- branch: ruby
- specs:
- ember-dev (0.1)
- aws-sdk
- colored
- execjs
- grit
- kicker
- puma
- rack
- rake-pipeline (~> 0.8.0)
- rake-pipeline-web-filters (~> 0.7.0)
- uglifier
-
-GIT
- remote: https://github.com/livingsocial/rake-pipeline.git
- revision: a75d96fbadcc659a35a0ae59212e0bc60b58cc54
- specs:
- rake-pipeline (0.8.0)
- json
- rake (~> 10.1.0)
- thor
-
-GEM
- remote: https://rubygems.org/
- specs:
- aws-sdk (1.59.1)
- aws-sdk-v1 (= 1.59.1)
- aws-sdk-v1 (1.59.1)
- json (~> 1.4)
- nokogiri (>= 1.4.4)
- barber (0.5.0)
- ember-source
- execjs
- handlebars-source (>= 1.0.0.rc.4)
- colored (1.2)
- diff-lcs (1.2.5)
- ember-source (1.9.0.alpha.2)
- handlebars-source (~> 2.0)
- execjs (2.0.2)
- ffi (1.9.6)
- grit (2.5.0)
- diff-lcs (~> 1.1)
- mime-types (~> 1.15)
- posix-spawn (~> 0.3.6)
- handlebars-source (2.0.0)
- json (1.8.1)
- kicker (3.0.0)
- listen (~> 1.3.0)
- notify (~> 0.5.2)
- listen (1.3.1)
- rb-fsevent (>= 0.9.3)
- rb-inotify (>= 0.9)
- rb-kqueue (>= 0.2)
- mime-types (1.25.1)
- mini_portile (0.6.1)
- nokogiri (1.6.5)
- mini_portile (~> 0.6.0)
- notify (0.5.2)
- posix-spawn (0.3.9)
- puma (2.10.2)
- rack (>= 1.1, < 2.0)
- rack (1.5.2)
- rake (10.1.1)
- rake-pipeline-web-filters (0.7.0)
- rack
- rake-pipeline (~> 0.6)
- rb-fsevent (0.9.4)
- rb-inotify (0.9.5)
- ffi (>= 0.5.0)
- rb-kqueue (0.2.3)
- ffi (>= 0.5.0)
- thor (0.18.1)
- uglifier (2.6.0)
- execjs (>= 0.3.0)
- json (>= 1.8.0)
-
-PLATFORMS
- ruby
-
-DEPENDENCIES
- barber (~> 0.5.0)
- ember-dev!
- ember-source (~> 1.9.0.alpha)
- handlebars-source (~> 2.0.0)
- rake-pipeline!
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..00e9fbb
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,9 @@
+The MIT License (MIT)
+
+Copyright (c) 2015
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/Rakefile b/Rakefile
deleted file mode 100644
index 130708f..0000000
--- a/Rakefile
+++ /dev/null
@@ -1,25 +0,0 @@
-require 'bundler/setup'
-require 'ember-dev/tasks'
-
-task :publish_build => [:dist, 'ember:generate_static_test_site'] do
- root_dir = Pathname.new(__FILE__).dirname
- dist_dir = root_dir.join('dist')
-
- files = %w{ember-easyForm.js ember-easyForm-spade.js
- ember-easyForm-tests.js ember-easyForm-tests.html}
-
- EmberDev::Publish.to_s3({
- :access_key_id => ENV['S3_ACCESS_KEY_ID'],
- :secret_access_key => ENV['S3_SECRET_ACCESS_KEY'],
- :bucket_name => ENV['S3_BUCKET_NAME'],
- :subdirectory => ENV['S3_FILE_PREFIX'],
-
- :files => files.map { |f| dist_dir.join(f) }
- })
-end
-
-task :clean => 'ember:clean'
-task :dist => 'ember:dist'
-task :test, [:suite] => 'ember:test'
-task :default => 'ember:test'
-task :test_site => 'ember:generate_static_test_site'
diff --git a/VERSION b/VERSION
deleted file mode 100644
index 76e8304..0000000
--- a/VERSION
+++ /dev/null
@@ -1 +0,0 @@
-1.0.0.beta.1
diff --git a/addon/.gitkeep b/addon/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/packages/ember-easyForm/lib/config.js b/addon/config.js
similarity index 78%
rename from packages/ember-easyForm/lib/config.js
rename to addon/config.js
index b4804a0..4171050 100644
--- a/packages/ember-easyForm/lib/config.js
+++ b/addon/config.js
@@ -1,4 +1,6 @@
-Ember.EasyForm.Config = Ember.Namespace.create({
+import Ember from 'ember';
+
+export default {
_wrappers: {
'default': {
formClass: '',
@@ -7,10 +9,10 @@ Ember.EasyForm.Config = Ember.Namespace.create({
errorClass: 'error',
hintClass: 'hint',
labelClass: '',
- inputTemplate: 'easyForm/input',
- errorTemplate: 'easyForm/error',
- labelTemplate: 'easyForm/label',
- hintTemplate: 'easyForm/hint',
+ inputTemplate: 'components/easy-form/input',
+ errorTemplate: 'components/easy-form/error-field',
+ labelTemplate: 'components/easy-form/label-field',
+ hintTemplate: 'components/easy-form/hint-field',
wrapControls: false,
controlsWrapperClass: '',
buttonClass: ''
@@ -39,4 +41,4 @@ Ember.EasyForm.Config = Ember.Namespace.create({
getTemplate: function(name) {
return this._templates[name];
}
-});
+};
diff --git a/addon/helpers/error-field.js b/addon/helpers/error-field.js
new file mode 100644
index 0000000..2f65a5f
--- /dev/null
+++ b/addon/helpers/error-field.js
@@ -0,0 +1,12 @@
+import ErrorView from 'ember-easy-form/views/error';
+import {processOptions} from 'ember-easy-form/utilities';
+import {viewHelper} from 'ember-easy-form/shims';
+
+export default function(property, options) {
+ options = processOptions(property, options);
+
+ if (options.hash.propertyBinding) {
+ options.hash.property = options.data.view.getStream(options.hash.propertyBinding).value();
+ }
+ return viewHelper(this, ErrorView, options);
+}
diff --git a/addon/helpers/form-for.js b/addon/helpers/form-for.js
new file mode 100644
index 0000000..de282e0
--- /dev/null
+++ b/addon/helpers/form-for.js
@@ -0,0 +1,14 @@
+import FormView from 'ember-easy-form/views/form';
+import {viewHelper} from 'ember-easy-form/shims';
+
+export default function(object, options) {
+ var parentView = options.data.view;
+
+ viewHelper(this, FormView, options);
+
+ var newView = parentView._childViews[parentView._childViews.length - 1];
+
+ newView._keywords.formForModelPath = object;
+
+ return newView;
+}
diff --git a/addon/helpers/hint-field.js b/addon/helpers/hint-field.js
new file mode 100644
index 0000000..5a81007
--- /dev/null
+++ b/addon/helpers/hint-field.js
@@ -0,0 +1,11 @@
+import HintView from 'ember-easy-form/views/hint';
+import {processOptions} from 'ember-easy-form/utilities';
+import {viewHelper} from 'ember-easy-form/shims';
+
+export default function(property, options) {
+ options = processOptions(property, options);
+
+ if (options.hash.text || options.hash.textBinding) {
+ return viewHelper(this, HintView, options);
+ }
+}
diff --git a/packages/ember-easyForm/lib/helpers/input-field.js b/addon/helpers/input-field.js
similarity index 62%
rename from packages/ember-easyForm/lib/helpers/input-field.js
rename to addon/helpers/input-field.js
index 62f41c3..e29c74c 100644
--- a/packages/ember-easyForm/lib/helpers/input-field.js
+++ b/addon/helpers/input-field.js
@@ -1,13 +1,20 @@
-var get = Ember.get,
- set = Ember.set;
-
-Ember.Handlebars.registerHelper('input-field', function(property, options) {
+import Ember from 'ember';
+import TextFieldView from 'ember-easy-form/views/text-field';
+import CheckboxView from 'ember-easy-form/views/checkbox';
+import TextAreaView from 'ember-easy-form/views/text-area';
+import SelectView from 'ember-easy-form/views/select';
+import config from 'ember-easy-form/config';
+import {processOptions} from 'ember-easy-form/utilities';
+import {viewHelper} from 'ember-easy-form/shims';
+
+const {get} = Ember;
+
+export default function(property, options) {
function handlebarsGet(root, path, options) {
return options.data.view.getStream(path).value();
}
-
- options = Ember.EasyForm.processOptions(property, options);
+ options = processOptions(property, options);
if (options.hash.propertyBinding) {
options.hash.property = handlebarsGet(this, options.hash.propertyBinding, options);
@@ -40,15 +47,20 @@ Ember.Handlebars.registerHelper('input-field', function(property, options) {
options.hash.valueBinding = modelPropertyPath(property);
- var context = this,
- propertyType = function(property) {
- var constructor = (get(context, 'content') || context).constructor;
- if (constructor.proto) {
- return Ember.meta(constructor.proto(), false).descs[property];
- } else {
- return null;
- }
+ var context = options.data.view,
+ propertyContext = get(context, 'context'),
+ propertyType = function(/*property*/) {
+ // TODO: The property `descs` was removed.
+ // https://github.com/emberjs/ember.js/pull/10323
+ return null;
+ // var constructor = (get(context, 'content') || context).constructor;
+ //
+ // if (constructor.proto) {
+ // return Ember.meta(constructor.proto(), false).descs[property];
+ // } else {
+ // return null;
+ // }
};
options.hash.viewName = 'input-field-'+options.data.view.elementId;
@@ -64,7 +76,7 @@ Ember.Handlebars.registerHelper('input-field', function(property, options) {
}
if (options.hash.as === 'text') {
- return Ember.Handlebars.helpers.view.call(context, Ember.EasyForm.TextArea, options);
+ return viewHelper(context, TextAreaView, options);
} else if (options.hash.as === 'select') {
delete(options.hash.valueBinding);
@@ -76,13 +88,13 @@ Ember.Handlebars.registerHelper('input-field', function(property, options) {
options.hash.selectionBinding = modelPropertyPath(property);
}
- return Ember.Handlebars.helpers.view.call(context, Ember.EasyForm.Select, options);
+ return viewHelper(context, SelectView, options);
} else if (options.hash.as === 'checkbox') {
if (Ember.isNone(options.hash.checkedBinding)) {
options.hash.checkedBinding = modelPropertyPath(property);
}
- return Ember.Handlebars.helpers.view.call(context, Ember.EasyForm.Checkbox, options);
+ return viewHelper(context, CheckboxView, options);
} else {
if (!options.hash.as) {
if (property.match(/password/)) {
@@ -98,23 +110,23 @@ Ember.Handlebars.registerHelper('input-field', function(property, options) {
} else if (property.match(/search/)) {
options.hash.type = 'search';
} else {
- if (propertyType(property) === 'number' || typeof(get(context,property)) === 'number') {
+ if (propertyType(property) === 'number' || typeof(get(propertyContext,property)) === 'number') {
options.hash.type = 'number';
- } else if (propertyType(property) === 'date' || (!Ember.isNone(get(context,property)) && get(context,property).constructor === Date)) {
+ } else if (propertyType(property) === 'date' || (!Ember.isNone(get(propertyContext,property)) && get(propertyContext,property).constructor === Date)) {
options.hash.type = 'date';
- } else if (propertyType(property) === 'boolean' || (!Ember.isNone(context.get(property)) && get(context,property).constructor === Boolean)) {
+ } else if (propertyType(property) === 'boolean' || (!Ember.isNone(propertyContext.get(property)) && get(propertyContext,property).constructor === Boolean)) {
options.hash.checkedBinding = property;
- return Ember.Handlebars.helpers.view.call(context, Ember.EasyForm.Checkbox, options);
+ return viewHelper(context, Ember.EasyForm.Checkbox, options);
}
}
} else {
- var inputType = Ember.EasyForm.Config.getInputType(options.hash.as);
+ var inputType = config.getInputType(options.hash.as);
if (inputType) {
- return Ember.Handlebars.helpers.view.call(context, inputType, options);
+ return viewHelper(context, inputType, options);
}
options.hash.type = options.hash.as;
}
- return Ember.Handlebars.helpers.view.call(context, Ember.EasyForm.TextField, options);
+ return viewHelper(context, TextFieldView, options);
}
-});
+}
diff --git a/addon/helpers/input.js b/addon/helpers/input.js
new file mode 100644
index 0000000..8a3d84d
--- /dev/null
+++ b/addon/helpers/input.js
@@ -0,0 +1,14 @@
+import InputView from 'ember-easy-form/views/input';
+import {processOptions} from 'ember-easy-form/utilities';
+import {viewHelper, emberInputHelper} from 'ember-easy-form/shims';
+
+export default function(property, options) {
+ if (arguments.length === 1) {
+ options = property;
+ return emberInputHelper(this, options);
+ }
+
+ options = processOptions(property, options);
+ options.hash.isBlock = !!(options.fn);
+ return viewHelper(this, InputView, options);
+}
diff --git a/addon/helpers/label-field.js b/addon/helpers/label-field.js
new file mode 100644
index 0000000..edac386
--- /dev/null
+++ b/addon/helpers/label-field.js
@@ -0,0 +1,9 @@
+import Label from 'ember-easy-form/views/label';
+import {processOptions} from 'ember-easy-form/utilities';
+import {viewHelper} from 'ember-easy-form/shims';
+
+export default function(property, options) {
+ options = processOptions(property, options);
+ options.hash.viewName = 'label-field-'+options.data.view.elementId;
+ return viewHelper(this, Label, options);
+}
diff --git a/addon/helpers/submit.js b/addon/helpers/submit.js
new file mode 100644
index 0000000..d2d28b7
--- /dev/null
+++ b/addon/helpers/submit.js
@@ -0,0 +1,16 @@
+import ButtonView from 'ember-easy-form/views/button';
+import SubmitView from 'ember-easy-form/views/submit';
+import {viewHelper} from 'ember-easy-form/shims';
+
+export default function(value, options) {
+ if (typeof(value) === 'object') {
+ options = value;
+ value = undefined;
+ }
+ options.hash.context = this;
+ options.hash.value = value || 'Submit';
+ return (options.hash.as === 'button') ?
+ viewHelper(this, ButtonView, options)
+ :
+ viewHelper(this, SubmitView, options);
+}
diff --git a/addon/setup.js b/addon/setup.js
new file mode 100644
index 0000000..6b789ac
--- /dev/null
+++ b/addon/setup.js
@@ -0,0 +1,14 @@
+import Ember from 'ember';
+import InputHelper from 'ember-easy-form/helpers/input';
+import SubmitHelper from 'ember-easy-form/helpers/submit';
+
+var registered = false;
+
+export default function() {
+ if (!registered) {
+ Ember.Handlebars.helpers['ember-input'] = Ember.Handlebars.helpers['input'];
+ Ember.Handlebars.registerHelper('input', InputHelper);
+ Ember.Handlebars.registerHelper('submit', SubmitHelper);
+ registered = true;
+ }
+}
\ No newline at end of file
diff --git a/addon/shims.js b/addon/shims.js
new file mode 100644
index 0000000..ad0802c
--- /dev/null
+++ b/addon/shims.js
@@ -0,0 +1,21 @@
+import Ember from 'ember';
+
+export function callHelper(helperName, context, params, options, env) {
+ env = env ? env : options;
+
+ return Ember.Handlebars.helpers[helperName].helperFunction.call(
+ context, params, options.hash, options, options
+ );
+}
+
+export function viewHelper(context, View, options) {
+ return callHelper('view', context, [View], options);
+}
+
+export function emberInputHelper(context, options) {
+ var env = options;
+
+ env.helpers = Ember.Handlebars.helpers;
+
+ return callHelper('ember-input', context, [], options, env);
+}
\ No newline at end of file
diff --git a/packages/ember-easyForm/lib/utilities.js b/addon/utilities.js
similarity index 54%
rename from packages/ember-easyForm/lib/utilities.js
rename to addon/utilities.js
index 9b4864c..15c78cc 100644
--- a/packages/ember-easyForm/lib/utilities.js
+++ b/addon/utilities.js
@@ -1,8 +1,12 @@
-Ember.EasyForm.humanize = function(string) {
- return string.underscore().split('_').join(' ').capitalize();
-};
+import Ember from 'ember';
-Ember.EasyForm.eachTranslatedAttribute = function(object, fn) {
+const {underscore, capitalize} = Ember.String;
+
+export function humanize(string) {
+ return capitalize(underscore(string).split('_').join(' '));
+}
+
+export function eachTranslatedAttribute(object, fn) {
var isTranslatedAttribute = /(.+)Translation$/,
isTranslatedAttributeMatch;
@@ -12,13 +16,13 @@ Ember.EasyForm.eachTranslatedAttribute = function(object, fn) {
fn.call(object, isTranslatedAttributeMatch[1], Ember.I18n.t(object[key]));
}
}
-};
+}
-Ember.EasyForm.processOptions = function(property, options) {
+export function processOptions(property, options) {
if (options) {
if (Ember.I18n) {
- var eachTranslatedAttribute = Ember.I18n.eachTranslatedAttribute || Ember.EasyForm.eachTranslatedAttribute;
- eachTranslatedAttribute(options.hash, function (attribute, translation) {
+ var eachTranslatedAttributeFunction = Ember.I18n.eachTranslatedAttribute || eachTranslatedAttribute;
+ eachTranslatedAttributeFunction(options.hash, function (attribute, translation) {
options.hash[attribute] = translation;
delete options.hash[attribute + 'Translation'];
});
@@ -29,4 +33,4 @@ Ember.EasyForm.processOptions = function(property, options) {
}
return options;
-};
+}
diff --git a/packages/ember-easyForm/lib/views/base_view.js b/addon/views/base.js
similarity index 66%
rename from packages/ember-easyForm/lib/views/base_view.js
rename to addon/views/base.js
index a6e3e1e..b2559d6 100644
--- a/packages/ember-easyForm/lib/views/base_view.js
+++ b/addon/views/base.js
@@ -1,16 +1,19 @@
-Ember.EasyForm.BaseView = Ember.View.extend({
+import Ember from 'ember';
+import config from 'ember-easy-form/config';
+
+export default Ember.View.extend({
classNameBindings: ['property'],
- wrapper: function() {
+ wrapper: Ember.computed(function() {
var wrapperView = this.nearestWithProperty('wrapper');
if (wrapperView) {
return wrapperView.get('wrapper');
} else {
return 'default';
}
- }.property(),
- wrapperConfig: function() {
- return Ember.EasyForm.Config.getWrapper(this.get('wrapper'));
- }.property('wrapper'),
+ }),
+ wrapperConfig: Ember.computed('wrapper', function() {
+ return config.getWrapper(this.get('wrapper'));
+ }),
templateForName: function(name) {
var template;
@@ -18,11 +21,10 @@ Ember.EasyForm.BaseView = Ember.View.extend({
template = this.container.lookup('template:' + name);
}
- return template || Ember.EasyForm.Config.getTemplate(name);
+ return template || config.getTemplate(name);
},
- formForModel: function(){
+ formForModel: Ember.computed(function(){
var formForModelPath = this._keywords.formForModelPath;
-
if (formForModelPath === 'context' || formForModelPath === 'controller' || formForModelPath === 'this') {
return this.get('context');
} else if (formForModelPath) {
@@ -30,5 +32,5 @@ Ember.EasyForm.BaseView = Ember.View.extend({
} else {
return this.get('context');
}
- }.property()
+ })
});
diff --git a/addon/views/button.js b/addon/views/button.js
new file mode 100644
index 0000000..5940f98
--- /dev/null
+++ b/addon/views/button.js
@@ -0,0 +1,16 @@
+import Ember from 'ember';
+import BaseView from 'ember-easy-form/views/base';
+
+export default BaseView.extend({
+ tagName: 'button',
+ templateName: 'components/easy-form/button',
+ attributeBindings: ['type', 'disabled'],
+ type: 'submit',
+ disabled: Ember.computed('formForModel.isValid', function() {
+ return !this.get('formForModel.isValid');
+ }),
+ init: function() {
+ this._super();
+ this.set('formForModel.text', this.value);
+ }
+});
diff --git a/addon/views/checkbox.js b/addon/views/checkbox.js
new file mode 100644
index 0000000..47a03b7
--- /dev/null
+++ b/addon/views/checkbox.js
@@ -0,0 +1,3 @@
+import Ember from 'ember';
+
+export default Ember.Checkbox.extend();
diff --git a/packages/ember-easyForm/lib/views/error.js b/addon/views/error.js
similarity index 53%
rename from packages/ember-easyForm/lib/views/error.js
rename to addon/views/error.js
index d4f0c78..41eda51 100644
--- a/packages/ember-easyForm/lib/views/error.js
+++ b/addon/views/error.js
@@ -1,4 +1,7 @@
-Ember.EasyForm.Error = Ember.EasyForm.BaseView.extend({
+import Ember from 'ember';
+import BaseView from 'ember-easy-form/views/base';
+
+export default BaseView.extend({
tagName: 'span',
classNameBindings: ['wrapperConfig.errorClass'],
init: function() {
@@ -6,5 +9,8 @@ Ember.EasyForm.Error = Ember.EasyForm.BaseView.extend({
Ember.Binding.from('formForModel.errors.' + this.property).to('errors').connect(this);
},
templateName: Ember.computed.oneWay('wrapperConfig.errorTemplate'),
- errorText: Ember.computed.oneWay('errors.firstObject')
+ errorText: Ember.computed('errors.[]', function() {
+ var errors = this.get('errors');
+ return errors ? errors[0] : null;
+ })
});
diff --git a/packages/ember-easyForm/lib/views/form.js b/addon/views/form.js
similarity index 88%
rename from packages/ember-easyForm/lib/views/form.js
rename to addon/views/form.js
index d6a0f13..dda1afb 100644
--- a/packages/ember-easyForm/lib/views/form.js
+++ b/addon/views/form.js
@@ -1,4 +1,7 @@
-Ember.EasyForm.Form = Ember.EasyForm.BaseView.extend({
+import Ember from 'ember';
+import BaseView from 'ember-easy-form/views/base';
+
+export default BaseView.extend({
tagName: 'form',
attributeBindings: ['novalidate'],
classNameBindings: ['wrapperConfig.formClass'],
diff --git a/packages/ember-easyForm/lib/views/hint.js b/addon/views/hint.js
similarity index 62%
rename from packages/ember-easyForm/lib/views/hint.js
rename to addon/views/hint.js
index 6ff4b9f..4318138 100644
--- a/packages/ember-easyForm/lib/views/hint.js
+++ b/addon/views/hint.js
@@ -1,4 +1,7 @@
-Ember.EasyForm.Hint = Ember.EasyForm.BaseView.extend({
+import Ember from 'ember';
+import BaseView from 'ember-easy-form/views/base';
+
+export default BaseView.extend({
tagName: 'span',
classNameBindings: ['wrapperConfig.hintClass'],
templateName: Ember.computed.oneWay('wrapperConfig.hintTemplate'),
diff --git a/packages/ember-easyForm/lib/views/input.js b/addon/views/input.js
similarity index 90%
rename from packages/ember-easyForm/lib/views/input.js
rename to addon/views/input.js
index 53f6f52..82324b8 100644
--- a/packages/ember-easyForm/lib/views/input.js
+++ b/addon/views/input.js
@@ -1,4 +1,7 @@
-Ember.EasyForm.Input = Ember.EasyForm.BaseView.extend({
+import Ember from 'ember';
+import BaseView from 'ember-easy-form/views/base';
+
+export default BaseView.extend({
init: function() {
this._super();
this.classNameBindings.push('showError:' + this.get('wrapperConfig.fieldErrorClass'));
@@ -7,16 +10,16 @@ Ember.EasyForm.Input = Ember.EasyForm.BaseView.extend({
this.set('templateName', this.get('wrapperConfig.inputTemplate'));
}
},
- setupValidationDependencies: function() {
+ setupValidationDependencies: Ember.on('init', function() {
var keys = this.get('formForModel._dependentValidationKeys'), key;
if (keys) {
for(key in keys) {
- if (keys[key].contains(this.property)) {
+ if (keys[key].indexOf(this.property) > -1) {
this._keysForValidationDependencies.pushObject(key);
}
}
}
- }.on('init'),
+ }),
_keysForValidationDependencies: Ember.A(),
dependentValidationKeyCanTrigger: false,
tagName: 'div',
@@ -38,7 +41,7 @@ Ember.EasyForm.Input = Ember.EasyForm.BaseView.extend({
}
}
},
- inputOptionsValues: function() {
+ inputOptionsValues: Ember.computed(function() {
var options = {}, i, key, keyBinding, value, inputOptions = this.inputOptions, bindableInputOptions = this.bindableInputOptions, defaultOptions = this.defaultOptions;
for (i = 0; i < inputOptions.length; i++) {
key = inputOptions[i];
@@ -68,7 +71,7 @@ Ember.EasyForm.Input = Ember.EasyForm.BaseView.extend({
}
return options;
- }.property(),
+ }),
focusOut: function() {
this.set('hasFocusedOut', true);
this.showValidationError();
diff --git a/addon/views/label.js b/addon/views/label.js
new file mode 100644
index 0000000..6b545d6
--- /dev/null
+++ b/addon/views/label.js
@@ -0,0 +1,13 @@
+import Ember from 'ember';
+import BaseView from 'ember-easy-form/views/base';
+import {humanize} from 'ember-easy-form/utilities';
+
+export default BaseView.extend({
+ tagName: 'label',
+ attributeBindings: ['for'],
+ classNameBindings: ['wrapperConfig.labelClass'],
+ labelText: Ember.computed('text', 'property', function() {
+ return this.get('text') || humanize(this.get('property'));
+ }),
+ templateName: Ember.computed.oneWay('wrapperConfig.labelTemplate')
+});
diff --git a/addon/views/select.js b/addon/views/select.js
new file mode 100644
index 0000000..2461719
--- /dev/null
+++ b/addon/views/select.js
@@ -0,0 +1,3 @@
+import Ember from 'ember';
+
+export default Ember.Select.extend();
diff --git a/packages/ember-easyForm/lib/views/submit.js b/addon/views/submit.js
similarity index 59%
rename from packages/ember-easyForm/lib/views/submit.js
rename to addon/views/submit.js
index 4d11178..6e64b98 100644
--- a/packages/ember-easyForm/lib/views/submit.js
+++ b/addon/views/submit.js
@@ -1,11 +1,14 @@
-Ember.EasyForm.Submit = Ember.EasyForm.BaseView.extend({
+import Ember from 'ember';
+import BaseView from 'ember-easy-form/views/base';
+
+export default BaseView.extend({
tagName: 'input',
attributeBindings: ['type', 'value', 'disabled'],
classNameBindings: ['wrapperConfig.buttonClass'],
type: 'submit',
- disabled: function() {
+ disabled: Ember.computed('formForModel.isValid', function() {
return !this.get('formForModel.isValid');
- }.property('formForModel.isValid'),
+ }),
init: function() {
this._super();
this.set('value', this.value);
diff --git a/addon/views/text-area.js b/addon/views/text-area.js
new file mode 100644
index 0000000..8055c8c
--- /dev/null
+++ b/addon/views/text-area.js
@@ -0,0 +1,2 @@
+import Ember from 'ember';
+export default Ember.TextArea.extend();
diff --git a/addon/views/text-field.js b/addon/views/text-field.js
new file mode 100644
index 0000000..cbc2991
--- /dev/null
+++ b/addon/views/text-field.js
@@ -0,0 +1,3 @@
+import Ember from 'ember';
+
+export default Ember.TextField.extend();
diff --git a/app/.gitkeep b/app/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/helpers/error-field.js b/app/helpers/error-field.js
new file mode 100644
index 0000000..5fef5c2
--- /dev/null
+++ b/app/helpers/error-field.js
@@ -0,0 +1 @@
+export { default } from 'ember-easy-form/helpers/error-field';
diff --git a/app/helpers/form-for.js b/app/helpers/form-for.js
new file mode 100644
index 0000000..2be8cd5
--- /dev/null
+++ b/app/helpers/form-for.js
@@ -0,0 +1 @@
+export { default } from 'ember-easy-form/helpers/form-for';
diff --git a/app/helpers/hint-field.js b/app/helpers/hint-field.js
new file mode 100644
index 0000000..018f509
--- /dev/null
+++ b/app/helpers/hint-field.js
@@ -0,0 +1 @@
+export { default } from 'ember-easy-form/helpers/hint-field';
diff --git a/app/helpers/input-field.js b/app/helpers/input-field.js
new file mode 100644
index 0000000..6a3cbea
--- /dev/null
+++ b/app/helpers/input-field.js
@@ -0,0 +1 @@
+export { default } from 'ember-easy-form/helpers/input-field';
diff --git a/app/helpers/label-field.js b/app/helpers/label-field.js
new file mode 100644
index 0000000..005f4d2
--- /dev/null
+++ b/app/helpers/label-field.js
@@ -0,0 +1 @@
+export { default } from 'ember-easy-form/helpers/label-field';
diff --git a/app/initializers/ember-easy-form.js b/app/initializers/ember-easy-form.js
new file mode 100644
index 0000000..3d4da23
--- /dev/null
+++ b/app/initializers/ember-easy-form.js
@@ -0,0 +1,7 @@
+import setup from 'ember-easy-form/setup';
+setup();
+
+export default {
+ name: 'ember-easy-form',
+ initialize: function() {}
+};
\ No newline at end of file
diff --git a/app/templates/components/easy-form/button.hbs b/app/templates/components/easy-form/button.hbs
new file mode 100644
index 0000000..bcc8355
--- /dev/null
+++ b/app/templates/components/easy-form/button.hbs
@@ -0,0 +1 @@
+{{text}}
\ No newline at end of file
diff --git a/app/templates/components/easy-form/error-field.hbs b/app/templates/components/easy-form/error-field.hbs
new file mode 100644
index 0000000..de4fcc4
--- /dev/null
+++ b/app/templates/components/easy-form/error-field.hbs
@@ -0,0 +1 @@
+{{view.errorText}}
\ No newline at end of file
diff --git a/app/templates/components/easy-form/hint-field.hbs b/app/templates/components/easy-form/hint-field.hbs
new file mode 100644
index 0000000..498c79e
--- /dev/null
+++ b/app/templates/components/easy-form/hint-field.hbs
@@ -0,0 +1 @@
+{{view.hintText}}
\ No newline at end of file
diff --git a/app/templates/components/easy-form/input-controls.hbs b/app/templates/components/easy-form/input-controls.hbs
new file mode 100644
index 0000000..21c8ea3
--- /dev/null
+++ b/app/templates/components/easy-form/input-controls.hbs
@@ -0,0 +1 @@
+{{input-field propertyBinding="view.property" inputOptionsBinding="view.inputOptionsValues"}}{{#if view.showError}}{{error-field propertyBinding="view.property"}}{{/if}}{{#if view.hint}}{{hint-field propertyBinding="view.property" textBinding="view.hint"}}{{/if}}
diff --git a/app/templates/components/easy-form/input.hbs b/app/templates/components/easy-form/input.hbs
new file mode 100644
index 0000000..8ce96ee
--- /dev/null
+++ b/app/templates/components/easy-form/input.hbs
@@ -0,0 +1 @@
+{{label-field propertyBinding="view.property" textBinding="view.label"}}{{partial "components/easy-form/input-controls"}}
diff --git a/app/templates/components/easy-form/label-field.hbs b/app/templates/components/easy-form/label-field.hbs
new file mode 100644
index 0000000..1b72a0d
--- /dev/null
+++ b/app/templates/components/easy-form/label-field.hbs
@@ -0,0 +1 @@
+{{view.labelText}}
\ No newline at end of file
diff --git a/bower.json b/bower.json
new file mode 100644
index 0000000..bba1e82
--- /dev/null
+++ b/bower.json
@@ -0,0 +1,15 @@
+{
+ "name": "ember-easy-form",
+ "dependencies": {
+ "ember": "1.12.1",
+ "ember-cli-shims": "ember-cli/ember-cli-shims#0.0.3",
+ "ember-cli-test-loader": "ember-cli-test-loader#0.1.3",
+ "ember-load-initializers": "ember-cli/ember-load-initializers#0.1.5",
+ "ember-qunit": "0.4.9",
+ "ember-qunit-notifications": "0.0.7",
+ "ember-resolver": "~0.1.18",
+ "jquery": "^1.11.3",
+ "loader.js": "ember-cli/loader.js#3.2.1",
+ "qunit": "~1.18.0"
+ }
+}
diff --git a/config.ru b/config.ru
deleted file mode 100644
index 598d872..0000000
--- a/config.ru
+++ /dev/null
@@ -1,5 +0,0 @@
-require 'bundler/setup'
-require 'ember/source'
-require 'ember-dev'
-
-run EmberDev::Server.new
diff --git a/config/ember-try.js b/config/ember-try.js
new file mode 100644
index 0000000..83dab0f
--- /dev/null
+++ b/config/ember-try.js
@@ -0,0 +1,35 @@
+module.exports = {
+ scenarios: [
+ {
+ name: 'default',
+ dependencies: { }
+ },
+ {
+ name: 'ember-release',
+ dependencies: {
+ 'ember': 'components/ember#release'
+ },
+ resolutions: {
+ 'ember': 'release'
+ }
+ },
+ {
+ name: 'ember-beta',
+ dependencies: {
+ 'ember': 'components/ember#beta'
+ },
+ resolutions: {
+ 'ember': 'beta'
+ }
+ },
+ {
+ name: 'ember-canary',
+ dependencies: {
+ 'ember': 'components/ember#canary'
+ },
+ resolutions: {
+ 'ember': 'canary'
+ }
+ }
+ ]
+};
diff --git a/config/environment.js b/config/environment.js
new file mode 100644
index 0000000..0dfaed4
--- /dev/null
+++ b/config/environment.js
@@ -0,0 +1,5 @@
+'use strict';
+
+module.exports = function(/* environment, appConfig */) {
+ return { };
+};
diff --git a/ember-cli-build.js b/ember-cli-build.js
new file mode 100644
index 0000000..d37d64c
--- /dev/null
+++ b/ember-cli-build.js
@@ -0,0 +1,17 @@
+/* global require, module */
+var EmberApp = require('ember-cli/lib/broccoli/ember-addon');
+
+module.exports = function(defaults) {
+ var app = new EmberApp(defaults, {
+ // Add options here
+ });
+
+ /*
+ This build file specifes the options for the dummy test app of this
+ addon, located in `/tests/dummy`
+ This build file does *not* influence how the addon or the app using it
+ behave. You most likely want to be modifying `./index.js` or app's build file
+ */
+
+ return app.toTree();
+};
diff --git a/ember-dev.yml b/ember-dev.yml
deleted file mode 100644
index e547f22..0000000
--- a/ember-dev.yml
+++ /dev/null
@@ -1,13 +0,0 @@
----
-name: Ember EasyForm
-dasherized_name: ember-easyForm
-assetfile: 'Assetfile'
-testing_suites:
- default:
- - "package=all&extendprototypes=true"
- all:
- - "package=all&extendprototypes=true&emberchannel=release"
- - "package=all&extendprototypes=true&emberchannel=beta"
- - "package=all&extendprototypes=true&emberchannel=canary"
-testing_packages:
- - ember-easyForm
diff --git a/generators/license.js b/generators/license.js
deleted file mode 100644
index b129cbc..0000000
--- a/generators/license.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// ==========================================================================
-// Project: Ember EasyForm
-// Copyright: Copyright 2013 DockYard, LLC. and contributors.
-// License: Licensed under MIT license (see license.js)
-// ==========================================================================
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..794fce8
--- /dev/null
+++ b/index.js
@@ -0,0 +1,6 @@
+/* jshint node: true */
+'use strict';
+
+module.exports = {
+ name: 'ember-easy-form'
+};
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..1b40427
--- /dev/null
+++ b/package.json
@@ -0,0 +1,48 @@
+{
+ "name": "ember-easy-form",
+ "version": "1.0.0.beta.2",
+ "description": "Ember EasyForm provides a DSL for quickly building forms similar to ActionPack's EasyForm and SimpleForm.",
+ "directories": {
+ "doc": "doc",
+ "test": "tests"
+ },
+ "scripts": {
+ "build": "ember build",
+ "start": "ember server",
+ "test": "ember try:testall"
+ },
+ "homepage": "https://github.com/dockyard/ember-easy-form",
+ "repository": "https://github.com/dockyard/ember-easy-form",
+ "engines": {
+ "node": ">= 0.10.0"
+ },
+ "author": "Brian Cardarella",
+ "license": "MIT",
+ "devDependencies": {
+ "broccoli-asset-rev": "^2.1.2",
+ "ember-cli": "1.13.8",
+ "ember-cli-app-version": "0.5.0",
+ "ember-cli-content-security-policy": "0.4.0",
+ "ember-cli-dependency-checker": "^1.0.1",
+ "ember-cli-htmlbars": "0.7.9",
+ "ember-cli-htmlbars-inline-precompile": "^0.2.0",
+ "ember-cli-ic-ajax": "0.2.1",
+ "ember-cli-inject-live-reload": "^1.3.1",
+ "ember-cli-qunit": "^1.0.0",
+ "ember-cli-release": "0.2.3",
+ "ember-cli-sri": "^1.0.3",
+ "ember-cli-uglify": "^1.2.0",
+ "ember-export-application-global": "^1.0.3",
+ "ember-disable-prototype-extensions": "^1.0.0",
+ "ember-try": "0.0.6"
+ },
+ "keywords": [
+ "ember-addon"
+ ],
+ "dependencies": {
+ "ember-cli-babel": "^5.1.3"
+ },
+ "ember-addon": {
+ "configPath": "tests/dummy/config"
+ }
+}
diff --git a/packages/ember-easyForm/lib/core.js b/packages/ember-easyForm/lib/core.js
deleted file mode 100644
index 8d530b7..0000000
--- a/packages/ember-easyForm/lib/core.js
+++ /dev/null
@@ -1,3 +0,0 @@
-Ember.EasyForm = Ember.Namespace.create({
- VERSION: 'VERSION_STRING_PLACEHOLDER'
-});
diff --git a/packages/ember-easyForm/lib/helpers.js b/packages/ember-easyForm/lib/helpers.js
deleted file mode 100644
index 1c70c10..0000000
--- a/packages/ember-easyForm/lib/helpers.js
+++ /dev/null
@@ -1,7 +0,0 @@
-require('ember-easyForm/helpers/error-field');
-require('ember-easyForm/helpers/form-for');
-require('ember-easyForm/helpers/hint-field');
-require('ember-easyForm/helpers/input');
-require('ember-easyForm/helpers/input-field');
-require('ember-easyForm/helpers/label-field');
-require('ember-easyForm/helpers/submit');
diff --git a/packages/ember-easyForm/lib/helpers/error-field.js b/packages/ember-easyForm/lib/helpers/error-field.js
deleted file mode 100644
index 5f658c8..0000000
--- a/packages/ember-easyForm/lib/helpers/error-field.js
+++ /dev/null
@@ -1,8 +0,0 @@
-Ember.Handlebars.registerHelper('error-field', function(property, options) {
- options = Ember.EasyForm.processOptions(property, options);
-
- if (options.hash.propertyBinding) {
- options.hash.property = options.data.view.getStream(options.hash.propertyBinding).value();
- }
- return Ember.Handlebars.helpers.view.call(this, Ember.EasyForm.Error, options);
-});
diff --git a/packages/ember-easyForm/lib/helpers/form-for.js b/packages/ember-easyForm/lib/helpers/form-for.js
deleted file mode 100644
index 27e16fa..0000000
--- a/packages/ember-easyForm/lib/helpers/form-for.js
+++ /dev/null
@@ -1,11 +0,0 @@
-Ember.Handlebars.registerHelper('form-for', function(object, options) {
- var parentView = options.data.view;
-
- Ember.Handlebars.helpers.view.call(this, Ember.EasyForm.Form, options);
-
- var newView = parentView._childViews[parentView._childViews.length - 1];
-
- newView._keywords.formForModelPath = object;
-
- return newView;
-});
diff --git a/packages/ember-easyForm/lib/helpers/hint-field.js b/packages/ember-easyForm/lib/helpers/hint-field.js
deleted file mode 100644
index 162b22d..0000000
--- a/packages/ember-easyForm/lib/helpers/hint-field.js
+++ /dev/null
@@ -1,7 +0,0 @@
-Ember.Handlebars.registerHelper('hint-field', function(property, options) {
- options = Ember.EasyForm.processOptions(property, options);
-
- if (options.hash.text || options.hash.textBinding) {
- return Ember.Handlebars.helpers.view.call(this, Ember.EasyForm.Hint, options);
- }
-});
diff --git a/packages/ember-easyForm/lib/helpers/input.js b/packages/ember-easyForm/lib/helpers/input.js
deleted file mode 100644
index cc7843f..0000000
--- a/packages/ember-easyForm/lib/helpers/input.js
+++ /dev/null
@@ -1,11 +0,0 @@
-Ember.Handlebars.helpers['ember-input'] = Ember.Handlebars.helpers['input'];
-
-Ember.Handlebars.registerHelper('input', function(property, options) {
- if (arguments.length === 1) {
- return Ember.Handlebars.helpers['ember-input'].call(this, arguments[0]);
- }
-
- options = Ember.EasyForm.processOptions(property, options);
- options.hash.isBlock = !!(options.fn);
- return Ember.Handlebars.helpers.view.call(this, Ember.EasyForm.Input, options);
-});
diff --git a/packages/ember-easyForm/lib/helpers/label-field.js b/packages/ember-easyForm/lib/helpers/label-field.js
deleted file mode 100644
index a60ac84..0000000
--- a/packages/ember-easyForm/lib/helpers/label-field.js
+++ /dev/null
@@ -1,5 +0,0 @@
-Ember.Handlebars.registerHelper('label-field', function(property, options) {
- options = Ember.EasyForm.processOptions(property, options);
- options.hash.viewName = 'label-field-'+options.data.view.elementId;
- return Ember.Handlebars.helpers.view.call(this, Ember.EasyForm.Label, options);
-});
diff --git a/packages/ember-easyForm/lib/helpers/submit.js b/packages/ember-easyForm/lib/helpers/submit.js
deleted file mode 100644
index a1923c0..0000000
--- a/packages/ember-easyForm/lib/helpers/submit.js
+++ /dev/null
@@ -1,12 +0,0 @@
-Ember.Handlebars.registerHelper('submit', function(value, options) {
- if (typeof(value) === 'object') {
- options = value;
- value = undefined;
- }
- options.hash.context = this;
- options.hash.value = value || 'Submit';
- return (options.hash.as === 'button') ?
- Ember.Handlebars.helpers.view.call(this, Ember.EasyForm.Button, options)
- :
- Ember.Handlebars.helpers.view.call(this, Ember.EasyForm.Submit, options);
-});
diff --git a/packages/ember-easyForm/lib/main.js b/packages/ember-easyForm/lib/main.js
deleted file mode 100644
index af53722..0000000
--- a/packages/ember-easyForm/lib/main.js
+++ /dev/null
@@ -1,6 +0,0 @@
-require('ember-easyForm/core');
-require('ember-easyForm/config');
-require('ember-easyForm/helpers');
-require('ember-easyForm/views');
-require('ember-easyForm/templates');
-require('ember-easyForm/utilities');
diff --git a/packages/ember-easyForm/lib/templates.js b/packages/ember-easyForm/lib/templates.js
deleted file mode 100644
index 4129a5f..0000000
--- a/packages/ember-easyForm/lib/templates.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('ember-easyForm/templates/error');
-require('ember-easyForm/templates/hint');
-require('ember-easyForm/templates/input');
-require('ember-easyForm/templates/inputControls');
-require('ember-easyForm/templates/label');
diff --git a/packages/ember-easyForm/lib/templates/error.js b/packages/ember-easyForm/lib/templates/error.js
deleted file mode 100644
index dc39ea4..0000000
--- a/packages/ember-easyForm/lib/templates/error.js
+++ /dev/null
@@ -1 +0,0 @@
-Ember.EasyForm.Config.registerTemplate('easyForm/error', Ember.Handlebars.compile('{{view.errorText}}'));
diff --git a/packages/ember-easyForm/lib/templates/hint.js b/packages/ember-easyForm/lib/templates/hint.js
deleted file mode 100644
index faffc2f..0000000
--- a/packages/ember-easyForm/lib/templates/hint.js
+++ /dev/null
@@ -1 +0,0 @@
-Ember.EasyForm.Config.registerTemplate('easyForm/hint', Ember.Handlebars.compile('{{view.hintText}}'));
diff --git a/packages/ember-easyForm/lib/templates/input.js b/packages/ember-easyForm/lib/templates/input.js
deleted file mode 100644
index 45af2d2..0000000
--- a/packages/ember-easyForm/lib/templates/input.js
+++ /dev/null
@@ -1 +0,0 @@
-Ember.EasyForm.Config.registerTemplate('easyForm/input', Ember.Handlebars.compile('{{label-field propertyBinding="view.property" textBinding="view.label"}}{{partial "easyForm/inputControls"}}'));
diff --git a/packages/ember-easyForm/lib/templates/inputControls.js b/packages/ember-easyForm/lib/templates/inputControls.js
deleted file mode 100644
index b2374c2..0000000
--- a/packages/ember-easyForm/lib/templates/inputControls.js
+++ /dev/null
@@ -1 +0,0 @@
-Ember.EasyForm.Config.registerTemplate('easyForm/inputControls', Ember.Handlebars.compile('{{input-field propertyBinding="view.property" inputOptionsBinding="view.inputOptionsValues"}}{{#if view.showError}}{{error-field propertyBinding="view.property"}}{{/if}}{{#if view.hint}}{{hint-field propertyBinding="view.property" textBinding="view.hint"}}{{/if}}'));
diff --git a/packages/ember-easyForm/lib/templates/label.js b/packages/ember-easyForm/lib/templates/label.js
deleted file mode 100644
index 04db81b..0000000
--- a/packages/ember-easyForm/lib/templates/label.js
+++ /dev/null
@@ -1 +0,0 @@
-Ember.EasyForm.Config.registerTemplate('easyForm/label', Ember.Handlebars.compile('{{view.labelText}}'));
diff --git a/packages/ember-easyForm/lib/views.js b/packages/ember-easyForm/lib/views.js
deleted file mode 100644
index d231c9d..0000000
--- a/packages/ember-easyForm/lib/views.js
+++ /dev/null
@@ -1,12 +0,0 @@
-require('ember-easyForm/views/base_view');
-require('ember-easyForm/views/checkbox');
-require('ember-easyForm/views/error');
-require('ember-easyForm/views/form');
-require('ember-easyForm/views/hint');
-require('ember-easyForm/views/input');
-require('ember-easyForm/views/label');
-require('ember-easyForm/views/select');
-require('ember-easyForm/views/submit');
-require('ember-easyForm/views/button');
-require('ember-easyForm/views/textArea');
-require('ember-easyForm/views/textField');
diff --git a/packages/ember-easyForm/lib/views/button.js b/packages/ember-easyForm/lib/views/button.js
deleted file mode 100644
index d0c3ef0..0000000
--- a/packages/ember-easyForm/lib/views/button.js
+++ /dev/null
@@ -1,13 +0,0 @@
-Ember.EasyForm.Button = Ember.EasyForm.BaseView.extend({
- tagName: 'button',
- template: Ember.Handlebars.compile('{{text}}'),
- attributeBindings: ['type', 'disabled'],
- type: 'submit',
- disabled: function() {
- return !this.get('formForModel.isValid');
- }.property('formForModel.isValid'),
- init: function() {
- this._super();
- this.set('formForModel.text', this.value);
- }
-});
diff --git a/packages/ember-easyForm/lib/views/checkbox.js b/packages/ember-easyForm/lib/views/checkbox.js
deleted file mode 100644
index aec84ce..0000000
--- a/packages/ember-easyForm/lib/views/checkbox.js
+++ /dev/null
@@ -1 +0,0 @@
-Ember.EasyForm.Checkbox = Ember.Checkbox.extend();
diff --git a/packages/ember-easyForm/lib/views/label.js b/packages/ember-easyForm/lib/views/label.js
deleted file mode 100644
index 160bd24..0000000
--- a/packages/ember-easyForm/lib/views/label.js
+++ /dev/null
@@ -1,9 +0,0 @@
-Ember.EasyForm.Label = Ember.EasyForm.BaseView.extend({
- tagName: 'label',
- attributeBindings: ['for'],
- classNameBindings: ['wrapperConfig.labelClass'],
- labelText: function() {
- return this.get('text') || Ember.EasyForm.humanize(this.get('property'));
- }.property('text', 'property'),
- templateName: Ember.computed.oneWay('wrapperConfig.labelTemplate')
-});
diff --git a/packages/ember-easyForm/lib/views/select.js b/packages/ember-easyForm/lib/views/select.js
deleted file mode 100644
index 9130e5e..0000000
--- a/packages/ember-easyForm/lib/views/select.js
+++ /dev/null
@@ -1 +0,0 @@
-Ember.EasyForm.Select = Ember.Select.extend();
diff --git a/packages/ember-easyForm/lib/views/textArea.js b/packages/ember-easyForm/lib/views/textArea.js
deleted file mode 100644
index 9054e65..0000000
--- a/packages/ember-easyForm/lib/views/textArea.js
+++ /dev/null
@@ -1 +0,0 @@
-Ember.EasyForm.TextArea = Ember.TextArea.extend();
diff --git a/packages/ember-easyForm/lib/views/textField.js b/packages/ember-easyForm/lib/views/textField.js
deleted file mode 100644
index 44d96c3..0000000
--- a/packages/ember-easyForm/lib/views/textField.js
+++ /dev/null
@@ -1 +0,0 @@
-Ember.EasyForm.TextField = Ember.TextField.extend();
diff --git a/packages/ember-easyForm/package.json b/packages/ember-easyForm/package.json
deleted file mode 100644
index d98ab63..0000000
--- a/packages/ember-easyForm/package.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "name": "ember-easyForm",
- "summary": "Short package description",
- "description": "Ember EasyForm provides a DSL for quickly building forms similar to ActionPack's EasyForm and SimpleForm",
- "homepage": "https://github.com/dockyard/ember-easyForm",
- "author": "Brian Cardarella",
- "version": "1.0.0.beta.1",
-
- "directories": {
- "lib": "lib"
- },
-
- "dependencies": {
- "spade": "~> 1.0",
- "ember-runtime": ">= 0"
- },
- "dependencies:development": {
- "spade-qunit": "~> 1.0.0"
- },
- "bpm:build": {
- "bpm_libs.js": {
- "files": ["lib"],
- "modes": "*"
- },
- "ember-easyForm/bpm_tests.js": {
- "files": ["tests"],
- "modes": ["debug"]
- }
- }
-}
-
diff --git a/packages/ember-easyForm/tests/config_test.js b/packages/ember-easyForm/tests/config_test.js
deleted file mode 100644
index a7799e0..0000000
--- a/packages/ember-easyForm/tests/config_test.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var originalRequire, originalRequireJs;
-
-module('EasyForm config methods');
-
-test('contains a default wrapper', function() {
- var wrapper = Ember.EasyForm.Config.getWrapper('default');
- ok(wrapper, 'The default wrapper could not be found');
- equal(wrapper.errorClass, 'error');
-});
-
-test('register custom wrappers', function() {
- Ember.EasyForm.Config.registerWrapper('my_wrapper', {errorClass: 'my-error'});
- var wrapper = Ember.EasyForm.Config.getWrapper('my_wrapper');
- ok(wrapper, 'The custom wrapper could not be found');
- equal(wrapper.errorClass, 'my-error');
-});
-
-test('merge the default wrapper with the custom one', function() {
- Ember.EasyForm.Config.registerWrapper('my_wrapper', {errorClass: 'my-error'});
- var wrapper = Ember.EasyForm.Config.getWrapper('my_wrapper');
- equal(wrapper.errorClass, 'my-error');
- equal(wrapper.hintClass, 'hint');
-});
-
-test('register custom input types', function() {
- Ember.EasyForm.Config.registerInputType('my_input', Ember.EasyForm.Select);
- Ember.EasyForm.Config.registerInputType('another_input', Ember.EasyForm.Label);
-
- var inputType = Ember.EasyForm.Config.getInputType('my_input');
- equal(inputType, Ember.EasyForm.Select);
- inputType = Ember.EasyForm.Config.getInputType('another_input');
- equal(inputType, Ember.EasyForm.Label);
-});
diff --git a/packages/ember-easyForm/tests/helpers/error-field_test.js b/packages/ember-easyForm/tests/helpers/error-field_test.js
deleted file mode 100644
index 38693ac..0000000
--- a/packages/ember-easyForm/tests/helpers/error-field_test.js
+++ /dev/null
@@ -1,97 +0,0 @@
-var model, view, container, controller, valid, ErrorsObject,
- get = Ember.get,
- set = Ember.set;
-var templateFor = function(template) {
- return Ember.Handlebars.compile(template);
-};
-var original_lookup = Ember.lookup, lookup;
-ErrorsObject = Ember.Object.extend({
- unknownProperty: function(property) {
- this.set(property, Ember.makeArray());
- return this.get(property);
- }
-});
-
-module('error-field helpers', {
- setup: function() {
- container = new Ember.Container();
- container.optionsForType('template', { instantiate: false });
- container.resolver = function(fullName) {
- var name = fullName.split(':')[1];
- return Ember.TEMPLATES[name];
- };
- model = {
- firstName: 'Brian',
- lastName: 'Cardarella',
- errors: ErrorsObject.create()
- };
- controller = Ember.ObjectController.create();
- controller.set('content', model);
- },
- teardown: function() {
- Ember.run(function() {
- view.destroy();
- view = null;
- });
- Ember.lookup = original_lookup;
- }
-});
-
-var append = function(view) {
- Ember.run(function() {
- view.appendTo('#qunit-fixture');
- });
-};
-
-test('error helper should bind to first error message in array', function() {
- view = Ember.View.create({
- template: templateFor('{{error-field firstName}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('span.error').text(), '');
- Ember.run(function() {
- get(model, 'errors.firstName').pushObject("can't be blank");
- });
- equal(view.$().find('span.error').text(), "can't be blank");
- Ember.run(function() {
- get(model, 'errors.firstName').unshiftObject('is invalid');
- });
- equal(view.$().find('span.error').text(), 'is invalid');
- Ember.run(function() {
- get(model, 'errors.firstName').clear();
- });
- equal(view.$().find('span.error').text(), '');
-});
-
-test('uses the wrapper config', function() {
- Ember.EasyForm.Config.registerWrapper('my_wrapper', {errorClass: 'my-error'});
- view = Ember.View.create({
- template: templateFor('{{#form-for controller wrapper="my_wrapper"}}{{error-field firstName}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
- Ember.run(function() {
- model.errors.set('firstName', ["can't be blank"]);
- });
- ok(view.$().find('span.my-error').get(0), 'errorClass not defined');
-});
-
-test('uses the defined template name', function() {
- Ember.TEMPLATES['custom-error-template'] = templateFor('My custom error | {{view.errorText}}');
- Ember.EasyForm.Config.registerWrapper('my_wrapper', {errorTemplate: 'custom-error-template'});
-
- view = Ember.View.create({
- template: templateFor('{{#form-for model wrapper="my_wrapper"}}{{error-field firstName}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
- Ember.run(function() {
- model.errors.set('firstName', ["can't be blank"]);
- });
- equal(view.$().text(), "My custom error | can't be blank");
-});
-
diff --git a/packages/ember-easyForm/tests/helpers/form-for_test.js b/packages/ember-easyForm/tests/helpers/form-for_test.js
deleted file mode 100644
index 4c9e862..0000000
--- a/packages/ember-easyForm/tests/helpers/form-for_test.js
+++ /dev/null
@@ -1,223 +0,0 @@
-var model, view, container, controller, valid,
- get = Ember.get,
- set = Ember.set;
-
-var templateFor = function(template) {
- return Ember.Handlebars.compile(template);
-};
-var original_lookup = Ember.lookup, lookup;
-var validateFunction = function() {
- var promise = new Ember.Deferred();
- promise.resolve();
- return promise;
-};
-
-module('the form-for helper', {
- setup: function() {
- container = new Ember.Container();
- container.optionsForType('template', { instantiate: false });
- container.resolver = function(fullName) {
- var name = fullName.split(':')[1];
- return Ember.TEMPLATES[name];
- };
- model = {
- firstName: 'Brian',
- lastName: 'Cardarella',
- errors: Ember.Object.create(),
- validate: validateFunction
- };
- var Controller = Ember.ObjectController.extend({
- actions: {
- submit: function() {
- this.incrementProperty('count');
- },
- bigSubmit: function() {
- this.incrementProperty('count', 2);
- }
- }
- });
- controller = Controller.create();
- controller.set('content', model);
- controller.set('count', 0);
- },
- teardown: function() {
- Ember.run(function() {
- view.destroy();
- view = null;
- });
- Ember.lookup = original_lookup;
- }
-});
-
-var append = function(view) {
- Ember.run(function() {
- view.appendTo('#qunit-fixture');
- });
-};
-
-test('renders a form element', function() {
- view = Ember.View.create({
- template: templateFor('{{#form-for controller}}{{/form-for}}'),
- controller: controller
- });
- append(view);
- ok(view.$().find('form').get(0));
-});
-
-test('uses the defined wrapper', function() {
- Ember.EasyForm.Config.registerWrapper('my_wrapper', {formClass: 'my-form-class'});
- view = Ember.View.create({
- template: templateFor('{{#form-for controller wrapper="my_wrapper"}}{{/form-for}}'),
- controller: controller
- });
- append(view);
- equal(view.$().find('form').attr('class'), 'ember-view my-form-class');
-});
-
-test('submitting with invalid model does not call submit action on controller', function() {
- Ember.run(function() {
- set(model, 'isValid', false);
- });
- view = Ember.View.create({
- template: templateFor('{{#form-for controller}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
- Ember.run(function() {
- view._childViews[0].trigger('submit');
- });
- equal(controller.get('count'), 0);
-});
-
-test('submitting with valid model calls submit action on controller', function() {
- Ember.run(function() {
- set(model, 'isValid', true);
- });
- view = Ember.View.create({
- template: templateFor('{{#form-for controller}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
- Ember.run(function() {
- view._childViews[0].trigger('submit');
- });
- equal(controller.get('count'), 1);
-});
-
-test('submitting with valid controller calls submit action on controller', function() {
- controller.reopen({
- validate: function() {
- var promise = new Ember.Deferred();
- promise.resolve();
- return promise;
- }
- });
- Ember.run(function() {
- controller.set('isValid', true);
- });
- view = Ember.View.create({
- template: templateFor('{{#form-for controller}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
- Ember.run(function() {
- view._childViews[0].trigger('submit');
- });
- equal(controller.get('count'), 1);
-});
-
-test('can override the action called by submit on the controller', function() {
- Ember.run(function() {
- set(model, 'isValid', true);
- });
- view = Ember.View.create({
- template: templateFor('{{#form-for controller action="bigSubmit"}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
- Ember.run(function() {
- view._childViews[0].trigger('submit');
- });
- equal(controller.get('count'), 2);
-});
-
-test('submitting with model that does not have validate method', function() {
- var model = Ember.Object.create();
- Ember.run(function() {
- controller.set('content', model);
- });
- view = Ember.View.create({
- template: templateFor('{{#form-for controller}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
- Ember.run(function() {
- view._childViews[0].trigger('submit');
- });
- equal(controller.get('count'), 1);
-});
-
-test('submitting with ember-data model without validations can call submit action on controller', function() {
- Ember.run(function() {
- set(model, 'isValid', false);
- model.validate = undefined;
- });
- view = Ember.View.create({
- template: templateFor('{{#form-for controller}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
- Ember.run(function() {
- view._childViews[0].trigger('submit');
- });
- equal(controller.get('count'), 1);
-});
-
-test('uses the specified model as the basis for {{input}} property lookup', function() {
- view = Ember.View.create({
- template: templateFor('{{#form-for theModel}}{{input foo name="easy-input"}}
{{foo}}
{{input id="ember-input" value=foo}}{{/form-for}}'),
- container: container,
- controller: Ember.Controller.create({
- theModel: { foo: "LOL" },
- foo: "BORING"
- })
- });
- append(view);
-
- equal(view.$('input[name="easy-input"]').val(), "LOL", "easy-input uses form-for's model as its context for looking up its property");
- equal(view.$('#ember-input').val(), "BORING", "vanilla ember inputs are unaffected by form-for");
- equal(view.$('#asl').text(), "BORING", "form-for doesn't change context for plain ol bindings");
-});
-
-test('uses the specified models validation object', function() {
- model = {
- theModel: {
- validate: validateFunction
- },
- count: 0
- };
- controller.set('content', model);
- view = Ember.View.create({
- template: templateFor('{{#form-for theModel}}{{input foo}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
-
- Ember.run(function() {
- view._childViews[0].trigger('submit');
- });
- equal(controller.get('count'), 0);
-
- set(model, 'theModel.isValid', true);
- Ember.run(function() {
- view._childViews[0].trigger('submit');
- });
- equal(controller.get('count'), 1);
-});
diff --git a/packages/ember-easyForm/tests/helpers/hint-field_test.js b/packages/ember-easyForm/tests/helpers/hint-field_test.js
deleted file mode 100644
index 88cd672..0000000
--- a/packages/ember-easyForm/tests/helpers/hint-field_test.js
+++ /dev/null
@@ -1,80 +0,0 @@
-var model, view, container, controller, valid,
- get = Ember.get,
- set = Ember.set;
-
-var templateFor = function(template) {
- return Ember.Handlebars.compile(template);
-};
-var original_lookup = Ember.lookup, lookup;
-
-module('hint-field helpers', {
- setup: function() {
- container = new Ember.Container();
- container.optionsForType('template', { instantiate: false });
- container.resolver = function(fullName) {
- var name = fullName.split(':')[1];
- return Ember.TEMPLATES[name];
- };
- model = { firstName: 'Brian' };
- controller = Ember.ObjectController.create();
- controller.set('content', model);
- },
- teardown: function() {
- Ember.run(function() {
- view.destroy();
- view = null;
- });
- Ember.lookup = original_lookup;
- }
-});
-
-var append = function(view) {
- Ember.run(function() {
- view.appendTo('#qunit-fixture');
- });
-};
-
-test('renders a hint field with custom text', function() {
- view = Ember.View.create({
- template: templateFor('{{hint-field firstName text="Some text"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('span.hint').text(), 'Some text');
-});
-
-test('does not render a hint field without custom text', function() {
- view = Ember.View.create({
- template: templateFor('{{hint-field firstName}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('span.hint').length, 0, 'The hint element should not have been created');
-});
-
-
-test('uses the wrapper config', function() {
- Ember.EasyForm.Config.registerWrapper('my_wrapper', {hintClass: 'my-hint'});
- view = Ember.View.create({
- template: templateFor('{{#form-for controller wrapper="my_wrapper"}}{{hint-field firstName text="Some text"}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
- ok(view.$().find('span.my-hint').get(0), 'hintClass not defined');
-});
-
-test('uses the defined template name', function() {
- Ember.TEMPLATES['custom-hint-template'] = templateFor('My custom hint | {{view.hintText}}');
- Ember.EasyForm.Config.registerWrapper('my_wrapper', {hintTemplate: 'custom-hint-template'});
-
- view = Ember.View.create({
- template: templateFor('{{#form-for controller wrapper="my_wrapper"}}{{hint-field firstName text="My text"}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().text(), "My custom hint | My text");
-});
diff --git a/packages/ember-easyForm/tests/helpers/input-field_test.js b/packages/ember-easyForm/tests/helpers/input-field_test.js
deleted file mode 100644
index 31c248f..0000000
--- a/packages/ember-easyForm/tests/helpers/input-field_test.js
+++ /dev/null
@@ -1,380 +0,0 @@
-var model, view, container, controller, valid, countries,
- get = Ember.get,
- set = Ember.set;
-
-var templateFor = function(template) {
- return Ember.Handlebars.compile(template);
-};
-var original_lookup = Ember.lookup, lookup;
-
-module('input-field helpers', {
- setup: function() {
- container = new Ember.Container();
- container.optionsForType('template', { instantiate: false });
- container.resolver = function(fullName) {
- var name = fullName.split(':')[1];
- return Ember.TEMPLATES[name];
- };
- countries = [{ id: 1, name: 'South Aftica' }, { id: 2, name: 'United States' }];
-
- model = {
- firstName: 'Brian',
- lastName: 'Cardarella',
- country: countries[1]
- };
-
- controller = Ember.ObjectController.create();
- controller.set('content', model);
- controller.set('optionsForCountry', countries);
- },
- teardown: function() {
- Ember.run(function() {
- view.destroy();
- view = null;
- });
- Ember.lookup = original_lookup;
- }
-});
-
-var append = function(view) {
- Ember.run(function() {
- view.appendTo('#qunit-fixture');
- });
-};
-
-test('render text input and sets value propertly', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field firstName}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'text');
- equal(view.$().find('input').val(), 'Brian');
-});
-
-test('allows setting of input attributes', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field secret type="hidden"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'hidden');
-});
-
-test('auto sets input type to password if name includes password', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field passwordConfirmation}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'password');
-});
-
-test('auto sets input type to password if forced to password', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field token as="password"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'password');
-});
-
-test('auto sets input type to url if name includes url', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field url}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'url');
-});
-
-test('auto sets input type to url if forced to url', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field website as="url"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'url');
-});
-
-test('auto sets input type to color if name includes color', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field color}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'color');
-});
-
-test('auto sets input type to color if forced to color', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field hue as="color"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'color');
-});
-
-test('auto sets input type to tel if name includes tel', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field telephone}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'tel');
-});
-
-test('auto sets input type to tel if forced to tel', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field phoneNumber as="tel"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'tel');
-});
-
-test('auto sets input type to search if name includes search', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field search}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'search');
-});
-
-test('auto sets input type to search if forced to search', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field query as="search"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'search');
-});
-
-test('auto sets input type to email if name includes email', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field email}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'email');
-});
-
-test('auto sets input type to email if forced to email', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field receivedAt as="email"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'email');
-});
-
-test('auto sets input type to number if property meta attribute is a number', function() {
- model['metaForProperty'] = function(property) {
- var obj = { 'type': 'number' };
- if (property === 'age') {
- return obj;
- }
- };
- set(model,'age', 30);
- view = Ember.View.create({
- template: templateFor('{{input-field age}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'number');
-});
-
-test('auto sets input type to number if property is a number', function() {
- set(model,'age', 30);
- view = Ember.View.create({
- template: templateFor('{{input-field age}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'number');
-});
-
-test('auto sets input type to date if property meta attribute is a date', function() {
- model['metaForProperty'] = function(property) {
- var obj = { 'type': 'date' };
- if (property === 'birthday') {
- return obj;
- }
- };
- set(model,'birthday', new Date());
- view = Ember.View.create({
- template: templateFor('{{input-field birthday}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'date');
-});
-
-test('auto sets input type to checkbox if forced to checkbox', function() {
- set(model,'alive', true);
- view = Ember.View.create({
- template: templateFor('{{input-field alive as="checkbox"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'checkbox');
- equal(view.$().find('input').is(':checked'), true);
-});
-
-test('auto sets input type to checkbox if property meta attribute is a boolean', function() {
- model['metaForProperty'] = function(property) {
- var obj = { 'type': 'boolean' };
- if (property === 'old') {
- return obj;
- }
- };
- set(model,'old', false);
- view = Ember.View.create({
- template: templateFor('{{input-field old}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'checkbox');
-});
-
-test('auto sets input type to number if property is a number', function() {
- set(model,'age', 30);
- view = Ember.View.create({
- template: templateFor('{{input-field age}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'number');
-});
-
-test('does not fail if a controller content constructor does not respond to proto', function() {
- controller.set('content', []);
- view = Ember.View.create({
- template: templateFor('{{input-field name}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'text');
-});
-
-test('renders semantic form elements with text area', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field firstName as="text"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('textarea').val(), 'Brian');
-});
-
-test('uses the custom input type when defined', function() {
- Ember.EasyForm.Config.registerInputType('my_input', Ember.EasyForm.TextArea);
- Ember.EasyForm.Config.registerInputType('another_input', Ember.EasyForm.TextField);
- view = Ember.View.create({
- template: templateFor('{{input-field firstName as="my_input"}}{{input-field lastName as="another_input"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('textarea').val(), 'Brian');
- equal(view.$().find('input').val(), 'Cardarella');
-});
-
-test('generates a select input and options', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field country as="select" collection="optionsForCountry"}}'),
- container: container,
- controller: controller
- });
-
- append(view);
- equal(view.$().find('select').length, 1);
- equal(view.$().find('select option').length, 2);
-});
-
-test('generates a select input and options with prompt', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field country as="select" collection="optionsForCountry" prompt="Select Country"}}'),
- container: container,
- controller: controller
- });
-
- append(view);
- equal(view.$().find('select').length, 1);
- equal(view.$().find('select option').length, 3);
-});
-
-test('generates a select input with correct selection', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field country as="select" collection="optionsForCountry" selection="country" optionValuePath="content.id" optionLabelPath="content.name"}}'),
- container: container,
- controller: controller
- });
-
- append(view);
- ok(view.$().find('select option:selected').html().match(/United States/));
-});
-
-test('generates a select input with correct selection when no selection is specified', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field country as="select" collection="optionsForCountry" optionValuePath="content.id" optionLabelPath="content.name"}}'),
- container: container,
- controller: controller
- });
-
- append(view);
- ok(view.$().find('select option:selected').html().match(/United States/));
-});
-
-test('generates a select input correct value', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field country as="select" collection="optionsForCountry" value="country.id" optionValuePath="content.id" optionLabelPath="content.name"}}'),
- container: container,
- controller: controller
- });
-
- append(view);
- ok(view.$().find('select option:selected').html().match(/United States/));
-});
-
-test('auto sets input type to date', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field receivedAt as="date"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'date');
-});
-
-test('auto sets input type to time', function() {
- view = Ember.View.create({
- template: templateFor('{{input-field receivedAt as="time"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').attr('type'), 'time');
-});
diff --git a/packages/ember-easyForm/tests/helpers/input_test.js b/packages/ember-easyForm/tests/helpers/input_test.js
deleted file mode 100644
index 49d6830..0000000
--- a/packages/ember-easyForm/tests/helpers/input_test.js
+++ /dev/null
@@ -1,471 +0,0 @@
-var model, Model, view, valid, container, controller, ErrorsObject, originalEmberWarn,
- set = Ember.set,
- get = Ember.get;
-
-var templateFor = function(template) {
- return Ember.Handlebars.compile(template);
-};
-var originalLookup = Ember.lookup, lookup;
-ErrorsObject = Ember.Object.extend({
- unknownProperty: function(property) {
- this.set(property, Ember.makeArray());
- return this.get(property);
- }
-});
-
-function prepare(){
- container = new Ember.Container();
- container.optionsForType('template', { instantiate: false });
- container.resolver = function(fullName) {
- var name = fullName.split(':')[1];
- return Ember.TEMPLATES[name];
- };
- model = {
- firstName: 'Brian',
- lastName: 'Cardarella'
- };
- controller = Ember.ObjectController.create({
- placeholder: 'A placeholder',
- label: 'A label',
- hint: 'A hint',
- prompt: 'A prompt'
- });
- controller.set('content', model);
-}
-
-function cleanup(){
- Ember.run(function() {
- view.destroy();
- view = null;
- });
- Ember.lookup = originalLookup;
-}
-
-module('input helpers', {
- setup: prepare,
- teardown: cleanup
-});
-
-var append = function(view) {
- Ember.run(function() {
- view.appendTo('#qunit-fixture');
- });
-};
-
-test('renders semantic form elements', function() {
- view = Ember.View.create({
- template: templateFor('{{input firstName}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('label').text(), 'First name');
- equal(view.$().find('input').val(), 'Brian');
- equal(view.$().find('input').attr('type'), 'text');
-});
-
-test('does not render error tag when context does not have errors object', function() {
- view = Ember.View.create({
- template: templateFor('{{input firstName}}'),
- container: container,
- controller: controller
- });
- append(view);
- ok(!view.$().find('div.fieldWithErrors').get(0));
- ok(!view.$().find('span.error').get(0));
- Ember.run(function() {
- view._childViews[0].trigger('focusOut');
- });
- ok(!view.$().find('div.fieldWithErrors').get(0));
- ok(!view.$().find('span.error').get(0));
-});
-
-test('renders error for invalid data', function() {
- model['errors'] = ErrorsObject.create();
-
- Ember.run(function() {
- get(model, 'errors.firstName').pushObject("can't be blank");
- });
-
- view = Ember.View.create({
- template: templateFor('{{input firstName}}'),
- container: container,
- controller: controller
- });
- append(view);
-
- ok(!view.$().find('div.fieldWithErrors').get(0));
- ok(!view.$().find('span.error').get(0));
-
- Ember.run(function() {
- view._childViews[0].trigger('input');
- });
- ok(!view.$().find('div.fieldWithErrors').get(0));
- ok(!view.$().find('span.error').get(0));
-
- Ember.run(function() {
- view._childViews[0].trigger('focusOut');
- });
- ok(view.$().find('div.fieldWithErrors').get(0));
- equal(view.$().find('span.error').text(), "can't be blank");
-
- Ember.run(function() {
- get(model, 'errors.firstName').clear();
- });
- ok(!view.$().find('div.fieldWithErrors').get(0));
- ok(!view.$().find('span.error').get(0));
-
- Ember.run(function() {
- view._childViews[0].trigger('focusOut');
- });
- ok(!view.$().find('div.fieldWithErrors').get(0));
- ok(!view.$().find('span.error').get(0));
-
- Ember.run(function() {
- get(model, 'errors.firstName').pushObject("can't be blank");
- view._childViews[0].trigger('input');
- });
- ok(!view.$().find('div.fieldWithErrors').get(0));
- ok(!view.$().find('span.error').get(0));
-
- Ember.run(function() {
- view._childViews[0].trigger('focusOut');
- });
- ok(view.$().find('div.fieldWithErrors').get(0));
- equal(view.$().find('span.error').text(), "can't be blank");
-});
-
-test('renders errors properly with dependent keys', function() {
- var passwordView, confirmationView;
- model['errors'] = ErrorsObject.create();
- model['_dependentValidationKeys'] = {
- passwordConfirmation: ['password']
- };
-
- Ember.run(function() {
- get(model,'errors.passwordConfirmation').pushObject("does not match password");
- });
-
- view = Ember.View.create({
- template: templateFor('{{input password}}{{input passwordConfirmation}}'),
- container: container,
- controller: controller
- });
- append(view);
- passwordView = view._childViews[0];
- confirmationView = view._childViews[1];
-
- ok(!confirmationView.$().hasClass('fieldWithErrors'));
- ok(!confirmationView.$().find('span.error').get(0));
-
- Ember.run(function() {
- passwordView.trigger('input');
- });
- ok(!confirmationView.$().hasClass('fieldWithErrors'));
- ok(!confirmationView.$().find('span.error').get(0));
-
- Ember.run(function() {
- passwordView.trigger('focusOut');
- });
- ok(!confirmationView.$().hasClass('fieldWithErrors'));
- ok(!confirmationView.$().find('span.error').get(0));
-
- Ember.run(function() {
- confirmationView.trigger('focusOut');
- });
- ok(confirmationView.$().hasClass('fieldWithErrors'));
- ok(confirmationView.$().find('span.error').get(0));
-
- Ember.run(function() {
- get(model, 'errors.passwordConfirmation').clear();
- confirmationView.trigger('focusOut');
- });
- ok(!confirmationView.$().hasClass('fieldWithErrors'));
- ok(!confirmationView.$().find('span.error').get(0));
-
- Ember.run(function() {
- get(model, 'errors.passwordConfirmation').pushObject("does not match password");
- passwordView.trigger('input');
- });
- ok(confirmationView.$().hasClass('fieldWithErrors'));
- ok(confirmationView.$().find('span.error').get(0));
-});
-
-test('allows label text to be set', function() {
- view = Ember.View.create({
- template: templateFor('{{input firstName label="Your First Name"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('label').text(), 'Your First Name');
-});
-
-test('allows hint text to be set', function() {
- view = Ember.View.create({
- template: templateFor('{{input firstName hint="My hint text"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('span.hint').text(), 'My hint text');
-});
-
-test('does not show hint span when there is no hint', function() {
- view = Ember.View.create({
- template: templateFor('{{input firstName}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('span.hint').length, 0);
-});
-
-test('block form for input', function() {
- view = Ember.View.create({
- template: templateFor('{{#input firstName}}{{label-field firstName}}{{input-field firstName}}{{error-field firstName}}{{/input}}'),
- container: container,
- controller: controller
- });
- append(view);
-
- var input = view.$().find('input');
- var label = view.$().find('label');
-
- equal(label.text(), 'First name');
- equal(input.val(), 'Brian');
- equal(input.attr('type'), 'text');
- equal(label.prop('for'), input.prop('id'));
-});
-
-test('block form for input without label', function() {
- view = Ember.View.create({
- template: templateFor('{{#input firstName}}{{input-field firstName}}{{/input}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('input').val(), 'Brian');
- equal(view.$().find('input').attr('type'), 'text');
-});
-
-test('sets input attributes property', function() {
- view = Ember.View.create({
- template: templateFor('{{input receiveAt as="email" placeholder="Your email" disabled=true}}'),
- container: container,
- controller: controller
- });
- append(view);
- var input = view.$().find('input');
- equal(input.prop('type'), 'email');
- equal(input.prop('placeholder'), 'Your email');
- equal(input.prop('disabled'), true);
-});
-
-test('binds label to input field', function() {
- view = Ember.View.create({
- template: templateFor('{{input firstName}}'),
- container: container,
- controller: controller
- });
- append(view);
- var input = view.$().find('input');
- var label = view.$().find('label');
- equal(input.prop('id'), label.prop('for'));
-});
-
-test('uses the wrapper config', function() {
- Ember.EasyForm.Config.registerWrapper('my_wrapper', {inputClass: 'my-input', errorClass: 'my-error', fieldErrorClass: 'my-fieldWithErrors'});
- model['errors'] = ErrorsObject.create();
-
- Ember.run(function() {
- get(model,'errors.firstName').pushObject("can't be blank");
- });
- view = Ember.View.create({
- template: templateFor('{{#form-for model wrapper="my_wrapper"}}{{input firstName}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
- Ember.run(function() {
- view._childViews[0]._childViews[0].trigger('focusOut');
- });
- ok(view.$().find('div.my-input').get(0), 'inputClass not defined');
- ok(view.$().find('div.my-fieldWithErrors').get(0), 'fieldErrorClass not defined');
- ok(view.$().find('span.my-error').get(0), 'errorClass not defined');
-});
-
-test('uses the defined template name', function() {
- Ember.TEMPLATES['custom-input-template'] = templateFor('My custom template | {{label-field propertyBinding="view.property"}}');
- Ember.EasyForm.Config.registerWrapper('my_wrapper', {inputTemplate: 'custom-input-template'});
-
- view = Ember.View.create({
- template: templateFor('{{#form-for model wrapper="my_wrapper"}}{{input firstName}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().text(), 'My custom template | First name');
-});
-
-test('sets input attributes property as bindings', function() {
- view = Ember.View.create({
- template: templateFor('{{input firstName placeholderBinding="placeholder" labelBinding="label" hintBinding="hint"}}'),
- container: container,
- controller: controller
- });
- append(view);
-
- equal(view.$().find('input').prop('placeholder'), controller.get('placeholder'));
- equal(view.$().find('label').text(), controller.get('label'));
- equal(view.$().find('.hint').text(), controller.get('hint'));
-
- Ember.run(function() {
- controller.setProperties({
- placeholder: 'Write your first name',
- label: 'First name (not a last name)',
- hint: 'Usually different than your last name'
- });
- });
-
- equal(view.$().find('input').prop('placeholder'), controller.get('placeholder'));
- equal(view.$().find('label').text(), controller.get('label'));
- equal(view.$().find('.hint').text(), controller.get('hint'));
-});
-
-test('sets select prompt property as bindings', function() {
- view = Ember.View.create({
- template: templateFor('{{input firstName as="select" labelBinding="label" hintBinding="hint" promptBinding="prompt"}}'),
- container: container,
- controller: controller
- });
- append(view);
-
- equal(view.$().find('option').text(), controller.get('prompt'));
- equal(view.$().find('label').text(), controller.get('label'));
- equal(view.$().find('.hint').text(), controller.get('hint'));
-
- Ember.run(function() {
- controller.setProperties({
- prompt: 'Select an option',
- label: 'First name (not a last name)',
- hint: 'Usually different than your last name'
- });
- });
-
- equal(view.$().find('option').text(), controller.get('prompt'));
- equal(view.$().find('label').text(), controller.get('label'));
- equal(view.$().find('.hint').text(), controller.get('hint'));
-});
-
-test('defaults the name property', function() {
- view = Ember.View.create({
- template: templateFor('{{input firstName}}'),
- container: container,
- controller: controller
- });
- append(view);
-
- equal(view.$().find('input').prop('name'), "firstName");
-});
-
-test('allows specifying the name property', function() {
- view = Ember.View.create({
- template: templateFor('{{input firstName name="some-other-name"}}'),
- container: container,
- controller: controller
- });
- append(view);
-
- equal(view.$().find('input').prop('name'), "some-other-name");
-});
-
-test('scopes property lookup to model declared in form-for', function(){
- controller.set('someOtherModel', Ember.Object.create({firstName: 'Robert'}));
-
- view = Ember.View.create({
- template: templateFor('{{#form-for someOtherModel}}{{input firstName}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
-
- equal(view.$().find('input').val(), "Robert");
-});
-
-test('can specify a property outside of the model if a keyword is used as a prefix', function(){
- controller.set('someOtherModel', Ember.Object.create({firstName: 'Robert'}));
-
- view = Ember.View.create({
- template: templateFor('{{#form-for someOtherModel}}{{input controller.firstName}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
-
- equal(view.$().find('input').val(), "Brian");
-});
-
-test('select collection can use controller scope if prefix', function() {
- controller.set('someOtherModel', Ember.Object.create({ city: 'Ocala' }));
-
- controller.set('cities', Ember.A("Boston Ocala Portland".w()));
-
- view = Ember.View.create({
- template: templateFor('{{#form-for someOtherModel}}{{input city as="select" collection="controller.cities"}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
-
- equal(view.$('option').text(), "BostonOcalaPortland");
- equal(view.$('option:selected').text(), "Ocala");
-});
-
-test('sets input as="date" attributes properly', function() {
- view = Ember.View.create({
- template: templateFor('{{input receiveAt as="date"}}'),
- container: container,
- controller: controller
- });
- append(view);
- var input = view.$().find('input');
- equal(input.prop('type'), 'date');
-});
-
-module('{{input}} without property argument', {
- setup: prepare,
- teardown: cleanup
-});
-
-test('allows using the {{input}} helper', function() {
- view = Ember.View.create({
- template: templateFor('{{input name="first-name"}}'),
- container: container,
- controller: controller
- });
- append(view);
-
- equal(view.$().find('input').prop('name'), "first-name");
-});
-
-test('{{ember-input}} uses the original Ember {{input}} helper', function(){
- view = Ember.View.create({
- template: templateFor('{{ember-input name="first-name"}}'),
- container: container,
- controller: controller
- });
- append(view);
-
- equal(view.$().find('input').prop('name'), "first-name");
-});
-
-test('adds a class to the parent div for the property name', function() {
- view = Ember.View.create({
- template: templateFor('{{input firstName labelClass="blammo"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('div.input.firstName input').val(), 'Brian');
-});
diff --git a/packages/ember-easyForm/tests/helpers/label-field_test.js b/packages/ember-easyForm/tests/helpers/label-field_test.js
deleted file mode 100644
index 49017b3..0000000
--- a/packages/ember-easyForm/tests/helpers/label-field_test.js
+++ /dev/null
@@ -1,79 +0,0 @@
-var model, view, container, controller, valid;
-var templateFor = function(template) {
- return Ember.Handlebars.compile(template);
-};
-var original_lookup = Ember.lookup, lookup;
-
-module('label-field helpers', {
- setup: function() {
- container = new Ember.Container();
- container.optionsForType('template', { instantiate: false });
- container.resolver = function(fullName) {
- var name = fullName.split(':')[1];
- return Ember.TEMPLATES[name];
- };
- model = {
- firstName: 'Brian',
- };
- controller = Ember.ObjectController.create();
- controller.set('content', model);
- },
- teardown: function() {
- Ember.run(function() {
- view.destroy();
- view = null;
- });
- Ember.lookup = original_lookup;
- }
-});
-
-var append = function(view) {
- Ember.run(function() {
- view.appendTo('#qunit-fixture');
- });
-};
-
-test('renders a label field', function() {
- view = Ember.View.create({
- template: templateFor('{{label-field firstName}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('label').text(), 'First name');
-});
-
-test('renders a label field with custom text', function() {
- view = Ember.View.create({
- template: templateFor('{{label-field firstName text="Your first name"}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().find('label').text(), 'Your first name');
-});
-
-test('uses the wrapper config', function() {
- Ember.EasyForm.Config.registerWrapper('my_wrapper', {labelClass: 'my-label'});
- view = Ember.View.create({
- template: templateFor('{{#form-for controller wrapper="my_wrapper"}}{{label-field firstName}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
- ok(view.$().find('label.my-label').get(0), 'labelClass not defined');
-});
-
-test('uses the defined template name', function() {
- Ember.TEMPLATES['custom-label-template'] = templateFor('My custom label | {{view.labelText}}');
- Ember.EasyForm.Config.registerWrapper('my_wrapper', {labelTemplate: 'custom-label-template'});
-
- view = Ember.View.create({
- template: templateFor('{{#form-for controller wrapper="my_wrapper"}}{{label-field firstName}}{{/form-for}}'),
- container: container,
- controller: controller
- });
- append(view);
- equal(view.$().text(), "My custom label | First name");
-});
-
diff --git a/packages/ember-easyForm/tests/helpers/submit_test.js b/packages/ember-easyForm/tests/helpers/submit_test.js
deleted file mode 100644
index 73337ae..0000000
--- a/packages/ember-easyForm/tests/helpers/submit_test.js
+++ /dev/null
@@ -1,125 +0,0 @@
-var model, view, container, controller, valid,
- set = Ember.set,
- get = Ember.get;
-
-var templateFor = function(template) {
- return Ember.Handlebars.compile(template);
-};
-var original_lookup = Ember.lookup, lookup;
-
-module('submit helpers', {
- setup: function() {
- container = new Ember.Container();
- container.optionsForType('template', { instantiate: false });
- container.resolver = function(fullName) {
- var name = fullName.split(':')[1];
- return Ember.TEMPLATES[name];
- };
- model = {
- firstName: 'Brian',
- lastName: 'Cardarella',
- validate: function() {
- return valid;
- },
- };
- var Controller = Ember.Controller.extend({
- actions: {
- submit: function() {
- this.incrementProperty('count');
- }
- }
- });
- controller = Controller.create();
- controller.set('count', 0);
- },
- teardown: function() {
- Ember.run(function() {
- view.destroy();
- view = null;
- });
- Ember.lookup = original_lookup;
- }
-});
-
-var append = function(view) {
- Ember.run(function() {
- view.appendTo('#qunit-fixture');
- });
-};
-
-test('renders submit button', function() {
- view = Ember.View.create({
- template: templateFor('{{submit}}'),
- container: container,
- context: model
- });
- append(view);
- equal(view.$().find('input').prop('value'), 'Submit');
- equal(view.$().find('input').prop('type'), 'submit');
-});
-
-test('renders as button', function() {
- view = Ember.View.create({
- template: templateFor('{{submit as="button"}}'),
- container: container,
- context: model
- });
- append(view);
- equal(view.$().find('button').text(), 'Submit');
- equal(view.$().find('button').prop('type'), 'submit');
-});
-
-test('has custom value as button', function() {
- view = Ember.View.create({
- template: templateFor('{{submit "Create" as="button"}}'),
- container: container,
- context: model
- });
- append(view);
- equal(view.$().find('button').text(), 'Create');
-});
-
-test('submit as button disabled state is bound to models valid state', function() {
- Ember.run(function() {
- set(model,'isValid', false);
- });
- view = Ember.View.create({
- template: templateFor('{{submit as="button"}}'),
- container: container,
- context: model
- });
- append(view);
- equal(view.$().find('button').prop('disabled'), true);
- Ember.run(function() {
- set(model,'isValid', true);
- });
- equal(view.$().find('button').prop('disabled'), false);
-});
-
-test('custom value', function() {
- view = Ember.View.create({
- template: templateFor('{{submit "Create"}}'),
- container: container,
- context: model
- });
- append(view);
- equal(view.$().find('input').prop('value'), 'Create');
-});
-
-test('submit button disabled state is bound to models valid state', function() {
- Ember.run(function() {
- set(model,'isValid', false);
- model = Ember.Object.create(model);
- });
- view = Ember.View.create({
- template: templateFor('{{submit}}'),
- container: container,
- context: model
- });
- append(view);
- equal(view.$().find('input').prop('disabled'), true);
- Ember.run(function() {
- set(model,'isValid', true);
- });
- equal(view.$().find('input').prop('disabled'), false);
-});
diff --git a/packages/ember-easyForm/tests/utilities_test.js b/packages/ember-easyForm/tests/utilities_test.js
deleted file mode 100644
index 12a3e8f..0000000
--- a/packages/ember-easyForm/tests/utilities_test.js
+++ /dev/null
@@ -1,33 +0,0 @@
-module('EasyForm utility methods', {
-
-});
-
-test('humanizes string', function() {
- equal(Ember.EasyForm.humanize('firstName'), 'First name');
-});
-
-test('mutation of options - only property', function() {
- equal(Ember.EasyForm.processOptions('firstName'), 'firstName');
-});
-
-test('mutation of options - property and options', function() {
- var options = {hash: {placeholder: 'First name'}};
- deepEqual(Ember.EasyForm.processOptions('firstName', options), {hash: {placeholder: 'First name', property: 'firstName'}});
-});
-
-test('mutation of options - property and translation options (e.g. placeholderTranslation, labelTranslation, etc) without Ember.I18n', function() {
- var options = {hash: {placeholderTranslation: 'users.first_name'}};
- deepEqual(Ember.EasyForm.processOptions('firstName', options), {hash: {placeholderTranslation: 'users.first_name', property: 'firstName'}});
-});
-
-test('mutation of options - property and translation options (e.g. placeholderTranslation, labelTranslation, etc) with Ember.I18n', function() {
- Ember.I18n = {
- t: function(key) {
- return Ember.EasyForm.humanize(key);
- }
- };
- var options = {hash: {placeholderTranslation: 'users.first_name'}};
- deepEqual(Ember.EasyForm.processOptions('firstName', options), {hash: {placeholder: 'Users.first name', property: 'firstName'}});
-
- delete Ember.I18n;
-});
\ No newline at end of file
diff --git a/project.json b/project.json
deleted file mode 100644
index 021624d..0000000
--- a/project.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "name": "ember-easyForm-project",
- "bpm": "1.0.0",
- "dependencies": {
- "ember-easyForm": ">= 0"
- },
-
- "bpm:build": {
- "bpm_libs.js": {
- "minifier": "uglify-js"
- }
- }
-}
diff --git a/testem.json b/testem.json
new file mode 100644
index 0000000..0f35392
--- /dev/null
+++ b/testem.json
@@ -0,0 +1,12 @@
+{
+ "framework": "qunit",
+ "test_page": "tests/index.html?hidepassed",
+ "disable_watching": true,
+ "launch_in_ci": [
+ "PhantomJS"
+ ],
+ "launch_in_dev": [
+ "PhantomJS",
+ "Chrome"
+ ]
+}
diff --git a/tests/.jshintrc b/tests/.jshintrc
new file mode 100644
index 0000000..6ec0b7c
--- /dev/null
+++ b/tests/.jshintrc
@@ -0,0 +1,52 @@
+{
+ "predef": [
+ "document",
+ "window",
+ "location",
+ "setTimeout",
+ "$",
+ "-Promise",
+ "define",
+ "console",
+ "visit",
+ "exists",
+ "fillIn",
+ "click",
+ "keyEvent",
+ "triggerEvent",
+ "find",
+ "findWithAssert",
+ "wait",
+ "DS",
+ "andThen",
+ "currentURL",
+ "currentPath",
+ "currentRouteName"
+ ],
+ "node": false,
+ "browser": false,
+ "boss": true,
+ "curly": true,
+ "debug": false,
+ "devel": false,
+ "eqeqeq": true,
+ "evil": true,
+ "forin": false,
+ "immed": false,
+ "laxbreak": false,
+ "newcap": true,
+ "noarg": true,
+ "noempty": false,
+ "nonew": false,
+ "nomen": false,
+ "onevar": false,
+ "plusplus": false,
+ "regexp": false,
+ "undef": true,
+ "sub": true,
+ "strict": false,
+ "white": false,
+ "eqnull": true,
+ "esnext": true,
+ "unused": true
+}
diff --git a/tests/acceptance/simple-test.js b/tests/acceptance/simple-test.js
new file mode 100644
index 0000000..5bb9fc6
--- /dev/null
+++ b/tests/acceptance/simple-test.js
@@ -0,0 +1,62 @@
+import Ember from 'ember';
+import { module, test } from 'qunit';
+import startApp from '../../tests/helpers/start-app';
+
+module('Acceptance | simple', {
+ beforeEach: function() {
+ this.application = startApp();
+ },
+
+ afterEach: function() {
+ Ember.run(this.application, 'destroy');
+ }
+});
+
+test('displays form values', function(assert) {
+ visit('/person');
+
+ andThen(() => {
+ assert.equal(find('.firstName > input').val(), 'Diogo');
+ assert.equal(find('.lastName > input').val(), 'Mafra');
+ });
+
+ andThen(() => {
+ fillIn('.firstName > input', 'Ozzy');
+ fillIn('.lastName > input', 'Osbourne');
+ click('input[type="submit"]');
+ });
+
+ andThen(() => {
+ assert.equal(find('.bound-values .first-name').text(), 'Ozzy');
+ assert.equal(find('.bound-values .last-name').text(), 'Osbourne');
+ assert.equal(find('.form-submitted').text(), 'Submitted!!');
+ });
+});
+
+test('displays errors', function(assert) {
+ visit('/person');
+
+ // Initial state
+ andThen(() => {
+ assert.equal(find('.firstName > input').val(), 'Diogo');
+ assert.equal(find('.lastName > input').val(), 'Mafra');
+ });
+
+ // Empty name
+ andThen(() => {
+ fillIn('.firstName > input', '');
+ triggerEvent('.firstName > input', 'blur');
+ });
+ andThen(() => {
+ assert.equal(find('.firstName > .error').text(), 'can\'t be blank');
+ });
+
+ // Valid name
+ andThen(() => {
+ fillIn('.firstName > input', 'Test');
+ });
+ andThen(() => {
+ assert.equal(find('.firstName > .error').text(), '');
+ });
+
+});
diff --git a/tests/components/error-field-test.js b/tests/components/error-field-test.js
new file mode 100644
index 0000000..4456917
--- /dev/null
+++ b/tests/components/error-field-test.js
@@ -0,0 +1,61 @@
+import Ember from 'ember';
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+import config from 'ember-easy-form/config';
+
+const ErrorsObject = Ember.Object.extend({
+ unknownProperty: function(property) {
+ this.set(property, Ember.A([]));
+ return this.get(property);
+ }
+});
+
+moduleForComponent('error-field', 'Integration | Component | error field', {
+ integration: true
+});
+
+test('error helper should bind to first error message in array', function(assert) {
+ this.set('errors', ErrorsObject.create());
+ this.render(hbs`{{error-field firstName}}`);
+ assert.equal(this.$().find('span.error').text(), '');
+ Ember.run(() => {
+ this.get('errors.firstName').pushObject("can't be blank");
+ });
+ assert.equal(this.$().find('span.error').text(), "can't be blank");
+ Ember.run(() => {
+ this.get('errors.firstName').unshiftObject('is invalid');
+ });
+ assert.equal(this.$().find('span.error').text(), 'is invalid');
+ Ember.run(() => {
+ this.get('errors.firstName').clear();
+ });
+ assert.equal(this.$().find('span.error').text(), '');
+});
+
+test('uses the wrapper config', function(assert) {
+ var model = Ember.Object.create({
+ errors: ErrorsObject.create()
+ });
+ this.set('model', model);
+ config.registerWrapper('my_wrapper', {errorClass: 'my-error'});
+ this.render(hbs`{{#form-for model wrapper="my_wrapper"}}{{error-field firstName}}{{/form-for}}`);
+ Ember.run(() => {
+ model.get('errors').set('firstName', ["can't be blank"]);
+ });
+ assert.ok(this.$().find('span.my-error').get(0), 'errorClass not defined');
+});
+
+test('uses the defined template name', function(assert) {
+ var model = Ember.Object.create({
+ errors: ErrorsObject.create()
+ });
+ this.set('model', model);
+ this.container.register('template:custom-error-template', hbs`My custom error | {{view.errorText}}`);
+ config.registerWrapper('my_wrapper', {errorTemplate: 'custom-error-template'});
+
+ this.render(hbs`{{#form-for model wrapper="my_wrapper"}}{{error-field firstName}}{{/form-for}}`);
+ Ember.run(() => {
+ model.get('errors').set('firstName', ["can't be blank"]);
+ });
+ assert.equal(this.$().text(), "My custom error | can't be blank");
+});
diff --git a/tests/components/form-for-test.js b/tests/components/form-for-test.js
new file mode 100644
index 0000000..81a7138
--- /dev/null
+++ b/tests/components/form-for-test.js
@@ -0,0 +1,181 @@
+import Ember from 'ember';
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+import config from 'ember-easy-form/config';
+
+const {set} = Ember;
+
+var model;
+
+var validateFunction = function() {
+ var promise = new Ember.Deferred();
+ promise.resolve();
+ return promise;
+};
+
+moduleForComponent('form-for', 'Integration | Component | form for', {
+ integration: true,
+ beforeEach: function() {
+ model = Ember.Object.create({
+ firstName: 'Brian',
+ lastName: 'Cardarella',
+ errors: Ember.Object.create(),
+ validate: validateFunction
+ });
+ this.set('model', model);
+ }
+});
+
+test('renders a form element', function(assert) {
+ this.render(hbs`{{#form-for controller}}{{/form-for}}`);
+ assert.ok(this.$().find('form').get(0));
+});
+
+test('uses the defined wrapper', function(assert) {
+ config.registerWrapper('my_wrapper', {formClass: 'my-form-class'});
+ this.render(hbs`{{#form-for controller wrapper="my_wrapper"}}{{/form-for}}`);
+ assert.equal(this.$().find('form').attr('class'), 'ember-view my-form-class');
+});
+
+test('submitting with invalid model does not call submit action on controller', function(assert) {
+ Ember.run(function() {
+ set(model, 'isValid', false);
+ });
+ var submitCalled = false;
+ this.on('submit', function() {
+ submitCalled = true;
+ });
+ this.render(hbs`{{#form-for model}}{{/form-for}}`);
+ Ember.run(() => {
+ this.$().find('form').submit();
+ });
+ assert.ok(!submitCalled, 'submit should not be called');
+});
+
+test('submitting with valid model calls submit action on controller', function(assert) {
+ Ember.run(function() {
+ set(model, 'isValid', true);
+ });
+ var submitCalled = false;
+ this.on('submit', function() {
+ submitCalled = true;
+ });
+ this.render(hbs`{{#form-for model}}{{/form-for}}`);
+
+ Ember.run(() => {
+ this.$().find('form').submit();
+ });
+ assert.ok(submitCalled, 'submit was not called');
+});
+
+test('submitting with valid controller calls submit action on controller', function(assert) {
+ model.reopen({
+ validate: function() {
+ var promise = new Ember.Deferred();
+ promise.resolve();
+ return promise;
+ }
+ });
+ Ember.run(function() {
+ model.set('isValid', true);
+ });
+ var submitCalled = false;
+ this.on('submit', function() {
+ submitCalled = true;
+ });
+ this.render(hbs`{{#form-for model}}{{/form-for}}`);
+ Ember.run(() => {
+ this.$().find('form').submit();
+ });
+ assert.ok(submitCalled, 'submit was not called');
+});
+
+test('can override the action called by submit on the controller', function(assert) {
+ Ember.run(function() {
+ set(model, 'isValid', true);
+ });
+ var submitCalled = false;
+ this.on('bigSubmit', function() {
+ submitCalled = true;
+ });
+ this.render(hbs`{{#form-for model action="bigSubmit"}}{{/form-for}}`);
+
+ Ember.run(() => {
+ this.$().find('form').submit();
+ });
+ assert.ok(submitCalled, 'bigSubmit was not called');
+});
+
+test('submitting with model that does not have validate method', function(assert) {
+ model = Ember.Object.create();
+ Ember.run(() => {
+ this.set('model', model);
+ });
+ this.render(hbs`{{#form-for model}}{{/form-for}}`);
+ var submitCalled = false;
+ this.on('submit', function() {
+ submitCalled = true;
+ });
+ Ember.run(() => {
+ this.$().find('form').submit();
+ });
+ assert.ok(submitCalled, 'submit was not called');
+});
+
+test('submitting with ember-data model without validations can call submit action on controller', function(assert) {
+ Ember.run(function() {
+ set(model, 'isValid', false);
+ model.validate = undefined;
+ });
+ var submitCalled = false;
+ this.on('submit', function() {
+ submitCalled = true;
+ });
+ this.render(hbs`{{#form-for model}}{{/form-for}}`);
+
+ Ember.run(() => {
+ this.$().find('form').submit();
+ });
+ assert.ok(submitCalled, 'submit was not called');
+});
+
+// test('uses the specified model as the basis for {{input}} property lookup', function(assert) {
+// this.set('foo', "BORING");
+// this.set('theModel', { foo: "LOL" });
+// this.render(hbs`{{#form-for theModel}}{{input foo name="easy-input"}} {{foo}}
{{input id="ember-input" value=foo}}{{/form-for}}`);
+//
+// assert.equal(this.$('input[name="easy-input"]').val(), "LOL", "easy-input uses form-for's model as its context for looking up its property");
+// assert.equal(this.$('#ember-input').val(), "BORING", "vanilla ember inputs are unaffected by form-for");
+// assert.equal(this.$('#asl').text(), "BORING", "form-for doesn't change context for plain ol bindings");
+// });
+
+test('uses the specified models validation object', function(assert) {
+ var validationCalled = false;
+ this.set('theModel', {
+ validate: function() {
+ validationCalled = true;
+ return Ember.RSVP.resolve();
+ },
+ isValid: false
+ });
+ var submitCalled = false;
+ this.on('submit', function() {
+ submitCalled = true;
+ });
+ this.render(hbs`{{#form-for theModel}}{{/form-for}}`);
+
+ Ember.run(() => {
+ this.$().find('form').submit();
+ });
+ assert.ok(validationCalled, 'validation was not called');
+ assert.ok(!submitCalled, 'submit should not be called');
+ submitCalled = false;
+ validationCalled = false;
+
+ this.set('theModel.isValid', true);
+ Ember.run(() => {
+ this.$().find('form').submit();
+ });
+ assert.ok(validationCalled, 'validation was not called');
+ assert.ok(submitCalled, 'submit was not called');
+});
diff --git a/tests/components/hint-field-test.js b/tests/components/hint-field-test.js
new file mode 100644
index 0000000..abc312d
--- /dev/null
+++ b/tests/components/hint-field-test.js
@@ -0,0 +1,30 @@
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+import config from 'ember-easy-form/config';
+
+moduleForComponent('hint-field', 'Integration | Component | hint field', {
+ integration: true
+});
+
+test('renders a hint field with custom text', function(assert) {
+ this.render(hbs`{{hint-field firstName text="Some text"}}`);
+ assert.equal(this.$().find('span.hint').text(), 'Some text');
+});
+
+test('does not render a hint field without custom text', function(assert) {
+ this.render(hbs`{{hint-field firstName}}`);
+ assert.equal(this.$().find('span.hint').length, 0, 'The hint element should not have been created');
+});
+
+test('uses the wrapper config', function(assert) {
+ config.registerWrapper('my_wrapper', {hintClass: 'my-hint'});
+ this.render(hbs`{{#form-for controller wrapper="my_wrapper"}}{{hint-field firstName text="Some text"}}{{/form-for}}`);
+ assert.ok(this.$().find('span.my-hint').get(0), 'hintClass not defined');
+});
+
+test('uses the defined template name', function(assert) {
+ this.container.register('template:custom-hint-template', hbs`My custom hint | {{view.hintText}}`);
+ config.registerWrapper('my_wrapper', {hintTemplate: 'custom-hint-template'});
+ this.render(hbs`{{#form-for controller wrapper="my_wrapper"}}{{hint-field firstName text="My text"}}{{/form-for}}`);
+ assert.equal(this.$().text(), "My custom hint | My text");
+});
diff --git a/tests/components/input-field-test.js b/tests/components/input-field-test.js
new file mode 100644
index 0000000..cd00b5f
--- /dev/null
+++ b/tests/components/input-field-test.js
@@ -0,0 +1,221 @@
+import Ember from 'ember';
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+import config from 'ember-easy-form/config';
+import TextArea from 'ember-easy-form/views/text-area';
+import TextField from 'ember-easy-form/views/text-field';
+
+moduleForComponent('input-field', 'Integration | Component | input field', {
+ integration: true,
+ beforeEach: function() {
+ var countries = Ember.A([{ id: 1, name: 'South Aftica' }, { id: 2, name: 'United States' }]);
+ this.set('optionsForCountry', countries);
+ this.setProperties({
+ firstName: 'Brian',
+ lastName: 'Cardarella',
+ country: countries[1]
+ });
+ }
+});
+
+test('render text input and sets value propertly', function(assert) {
+ this.render(hbs`{{input-field firstName}}`);
+ assert.equal(this.$().find('input').attr('type'), 'text');
+ assert.equal(this.$().find('input').val(), 'Brian');
+});
+
+test('allows setting of input attributes', function(assert) {
+ this.render(hbs`{{input-field secret type="hidden"}}`);
+ assert.equal(this.$().find('input').attr('type'), 'hidden');
+});
+
+test('auto sets input type to password if name includes password', function(assert) {
+ this.render(hbs`{{input-field passwordConfirmation}}`);
+ assert.equal(this.$().find('input').attr('type'), 'password');
+});
+
+test('auto sets input type to password if forced to password', function(assert) {
+ this.render(hbs`{{input-field token as="password"}}`);
+ assert.equal(this.$().find('input').attr('type'), 'password');
+});
+
+test('auto sets input type to url if name includes url', function(assert) {
+ this.render(hbs`{{input-field url}}`);
+ assert.equal(this.$().find('input').attr('type'), 'url');
+});
+
+test('auto sets input type to url if forced to url', function(assert) {
+ this.render(hbs`{{input-field website as="url"}}`);
+ assert.equal(this.$().find('input').attr('type'), 'url');
+});
+
+test('auto sets input type to color if name includes color', function(assert) {
+ this.render(hbs`{{input-field color}}`);
+ assert.equal(this.$().find('input').attr('type'), 'color');
+});
+
+test('auto sets input type to color if forced to color', function(assert) {
+ this.render(hbs`{{input-field hue as="color"}}`);
+ assert.equal(this.$().find('input').attr('type'), 'color');
+});
+
+test('auto sets input type to tel if name includes tel', function(assert) {
+ this.render(hbs`{{input-field telephone}}`);
+ assert.equal(this.$().find('input').attr('type'), 'tel');
+});
+
+test('auto sets input type to tel if forced to tel', function(assert) {
+ this.render(hbs `{{input-field phoneNumber as="tel"}}`);
+ assert.equal(this.$().find('input').attr('type'), 'tel');
+});
+
+test('auto sets input type to search if name includes search', function(assert) {
+ this.render(hbs`{{input-field search}}`);
+ assert.equal(this.$().find('input').attr('type'), 'search');
+});
+
+test('auto sets input type to search if forced to search', function(assert) {
+ this.render(hbs`{{input-field query as="search"}}`);
+ assert.equal(this.$().find('input').attr('type'), 'search');
+});
+
+test('auto sets input type to email if name includes email', function(assert) {
+ this.render(hbs`{{input-field email}}`);
+ assert.equal(this.$().find('input').attr('type'), 'email');
+});
+
+test('auto sets input type to email if forced to email', function(assert) {
+ this.render(hbs`{{input-field receivedAt as="email"}}`);
+ assert.equal(this.$().find('input').attr('type'), 'email');
+});
+
+// test('auto sets input type to number if property meta attribute is a number', function() {
+// model['metaForProperty'] = function(property) {
+// var obj = { 'type': 'number' };
+// if (property === 'age') {
+// return obj;
+// }
+// };
+// set(model,'age', 30);
+// view = Ember.View.create({
+// template: templateFor('{{input-field age}}'),
+// container: container,
+// controller: controller
+// });
+// append(view);
+// equal(view.$().find('input').attr('type'), 'number');
+// });
+//
+// test('auto sets input type to number if property is a number', function() {
+// set(model,'age', 30);
+// view = Ember.View.create({
+// template: templateFor('{{input-field age}}'),
+// container: container,
+// controller: controller
+// });
+// append(view);
+// equal(view.$().find('input').attr('type'), 'number');
+// });
+//
+// test('auto sets input type to date if property meta attribute is a date', function() {
+// model['metaForProperty'] = function(property) {
+// var obj = { 'type': 'date' };
+// if (property === 'birthday') {
+// return obj;
+// }
+// };
+// set(model,'birthday', new Date());
+// view = Ember.View.create({
+// template: templateFor('{{input-field birthday}}'),
+// container: container,
+// controller: controller
+// });
+// append(view);
+// equal(view.$().find('input').attr('type'), 'date');
+// });
+
+test('auto sets input type to checkbox if forced to checkbox', function(assert) {
+ this.set('alive', true);
+ this.render(hbs`{{input-field alive as="checkbox"}}`);
+ assert.equal(this.$().find('input').attr('type'), 'checkbox');
+ assert.equal(this.$().find('input').is(':checked'), true);
+});
+
+// test('auto sets input type to checkbox if property meta attribute is a boolean', function() {
+// model['metaForProperty'] = function(property) {
+// var obj = { 'type': 'boolean' };
+// if (property === 'old') {
+// return obj;
+// }
+// };
+// set(model,'old', false);
+// view = Ember.View.create({
+// template: templateFor('{{input-field old}}'),
+// container: container,
+// controller: controller
+// });
+// append(view);
+// equal(view.$().find('input').attr('type'), 'checkbox');
+// });
+
+test('auto sets input type to number if property is a number', function(assert) {
+ this.set('age', 30);
+ this.render(hbs`{{input-field age}}`);
+ assert.equal(this.$().find('input').attr('type'), 'number');
+});
+
+test('does not fail if a controller content constructor does not respond to proto', function(assert) {
+ this.set('content', []);
+ this.render(hbs`{{input-field name}}`);
+ assert.equal(this.$().find('input').attr('type'), 'text');
+});
+
+test('renders semantic form elements with text area', function(assert) {
+ this.render(hbs`{{input-field firstName as="text"}}`);
+ assert.equal(this.$().find('textarea').val(), 'Brian');
+});
+
+test('uses the custom input type when defined', function(assert) {
+ config.registerInputType('my_input', TextArea);
+ config.registerInputType('another_input', TextField);
+ this.render(hbs`{{input-field firstName as="my_input"}}{{input-field lastName as="another_input"}}`);
+ assert.equal(this.$().find('textarea').val(), 'Brian');
+ assert.equal(this.$().find('input').val(), 'Cardarella');
+});
+
+test('generates a select input and options', function(assert) {
+ this.render(hbs`{{input-field country as="select" collection="optionsForCountry"}}`);
+ assert.equal(this.$().find('select').length, 1);
+ assert.equal(this.$().find('select option').length, 2);
+});
+
+test('generates a select input and options with prompt', function(assert) {
+ this.render(hbs`{{input-field country as="select" collection="optionsForCountry" prompt="Select Country"}}`);
+ assert.equal(this.$().find('select').length, 1);
+ assert.equal(this.$().find('select option').length, 3);
+});
+
+test('generates a select input with correct selection', function(assert) {
+ this.render(hbs`{{input-field country as="select" collection="optionsForCountry" selection="country" optionValuePath="content.id" optionLabelPath="content.name"}}`);
+ assert.ok(this.$().find('select option:selected').html().match(/United States/));
+});
+
+test('generates a select input with correct selection when no selection is specified', function(assert) {
+ this.render(hbs`{{input-field country as="select" collection="optionsForCountry" optionValuePath="content.id" optionLabelPath="content.name"}}`);
+ assert.ok(this.$().find('select option:selected').html().match(/United States/));
+});
+
+test('generates a select input correct value', function(assert) {
+ this.render(hbs`{{input-field country as="select" collection="optionsForCountry" value="country.id" optionValuePath="content.id" optionLabelPath="content.name"}}`);
+ assert.ok(this.$().find('select option:selected').html().match(/United States/));
+});
+
+// test('auto sets input type to date', function(assert) {
+// this.render(hbs`{{input-field receivedAt as="date"}}`);
+// assert.equal(this.$().find('input').attr('type'), 'date');
+// });
+
+// test('auto sets input type to time', function(assert) {
+// this.render(hbs`{{input-field receivedAt as="time"}}`);
+// assert.equal(this.$().find('input').attr('type'), 'time');
+// });
diff --git a/tests/components/input-test.js b/tests/components/input-test.js
new file mode 100644
index 0000000..8db9483
--- /dev/null
+++ b/tests/components/input-test.js
@@ -0,0 +1,331 @@
+import Ember from 'ember';
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+import config from 'ember-easy-form/config';
+import setup from 'ember-easy-form/setup';
+
+const ErrorsObject = Ember.Object.extend({
+ unknownProperty: function(property) {
+ this.set(property, Ember.A([]));
+ return this.get(property);
+ }
+});
+
+moduleForComponent('form-input', 'Integration | Component | form input', {
+ integration: true,
+ beforeEach: function() {
+ setup();
+ this.setProperties({
+ firstName: 'Brian',
+ lastName: 'Cardarella'
+ });
+ }
+});
+
+test('renders semantic form elements', function(assert) {
+ this.render(hbs`{{input firstName}}`);
+ assert.equal(this.$().find('label').text(), 'First name');
+ assert.equal(this.$().find('input').val(), 'Brian');
+ assert.equal(this.$().find('input').attr('type'), 'text');
+});
+
+test('does not render error tag when context does not have errors object', function(assert) {
+ this.render(hbs`{{input firstName}}`);
+ assert.ok(!this.$().find('div.fieldWithErrors').get(0));
+ assert.ok(!this.$().find('span.error').get(0));
+ Ember.run(() => {
+ this.$('input:first').blur();
+ });
+ assert.ok(!this.$().find('div.fieldWithErrors').get(0));
+ assert.ok(!this.$().find('span.error').get(0));
+});
+
+test('renders error for invalid data', function(assert) {
+ this.set('errors', ErrorsObject.create());
+
+ Ember.run(() => {
+ this.get('errors.firstName').pushObject("can't be blank");
+ });
+
+ this.render(hbs`{{input firstName}}`);
+ assert.ok(!this.$().find('div.fieldWithErrors').get(0));
+ assert.ok(!this.$().find('span.error').get(0));
+
+ Ember.run(() => {
+ this.$('input:first').focus();
+ });
+ assert.ok(!this.$().find('div.fieldWithErrors').get(0));
+ assert.ok(!this.$().find('span.error').get(0));
+
+ Ember.run(() => {
+ this.$('input:first').blur();
+ });
+ assert.ok(this.$().find('div.fieldWithErrors').get(0));
+ assert.equal(this.$().find('span.error').text(), "can't be blank");
+
+ Ember.run(() => {
+ this.get('errors.firstName').clear();
+ });
+ assert.ok(!this.$().find('div.fieldWithErrors').get(0));
+ assert.ok(!this.$().find('span.error').get(0));
+
+ Ember.run(() => {
+ this.$('input:first').blur();
+ });
+ assert.ok(!this.$().find('div.fieldWithErrors').get(0));
+ assert.ok(!this.$().find('span.error').get(0));
+
+ Ember.run(() => {
+ this.get('errors.firstName').pushObject("can't be blank");
+ this.$('input:first').focus();
+ });
+ assert.ok(!this.$().find('div.fieldWithErrors').get(0));
+ assert.ok(!this.$().find('span.error').get(0));
+
+ Ember.run(() => {
+ this.$('input:first').blur();
+ });
+ assert.ok(this.$().find('div.fieldWithErrors').get(0));
+ assert.equal(this.$().find('span.error').text(), "can't be blank");
+});
+
+test('renders errors properly with dependent keys', function(assert) {
+ this.set('errors', ErrorsObject.create());
+ this.set('_dependentValidationKeys', {
+ passwordConfirmation: ['password']
+ });
+
+ Ember.run(() => {
+ this.get('errors.passwordConfirmation').pushObject("does not match password");
+ });
+ this.render(hbs`{{input password}}{{input passwordConfirmation}}`);
+ assert.ok(!this.$().find('.passwordConfirmation').hasClass('fieldWithErrors'));
+ assert.ok(!this.$().find('.passwordConfirmation').find('span.error').get(0));
+
+ Ember.run(() => {
+ Ember.View.views[this.$().find('.password').attr('id')].input();
+ });
+ assert.ok(!this.$().find('.passwordConfirmation').hasClass('fieldWithErrors'));
+ assert.ok(!this.$().find('.passwordConfirmation').find('span.error').get(0));
+
+ Ember.run(() => {
+ this.$().find('.password').blur();
+ });
+ assert.ok(!this.$().find('.passwordConfirmation').hasClass('fieldWithErrors'));
+ assert.ok(!this.$().find('.passwordConfirmation').find('span.error').get(0));
+
+ Ember.run(() => {
+ this.$().find('.passwordConfirmation').blur();
+ });
+ assert.ok(this.$().find('.passwordConfirmation').hasClass('fieldWithErrors'));
+ assert.ok(this.$().find('.passwordConfirmation').find('span.error').get(0));
+
+ Ember.run(() => {
+ this.get('errors.passwordConfirmation').clear();
+ this.$().find('.passwordConfirmation').blur();
+ });
+ assert.ok(!this.$().find('.passwordConfirmation').hasClass('fieldWithErrors'));
+ assert.ok(!this.$().find('.passwordConfirmation').find('span.error').get(0));
+
+ Ember.run(() => {
+ this.get('errors.passwordConfirmation').pushObject("does not match password");
+ Ember.View.views[this.$().find('.password').attr('id')].input();
+ });
+ assert.ok(this.$().find('.passwordConfirmation').hasClass('fieldWithErrors'));
+ assert.ok(this.$().find('.passwordConfirmation').find('span.error').get(0));
+});
+
+test('allows label text to be set', function(assert) {
+ this.render(hbs`{{input firstName label="Your First Name"}}`);
+ assert.equal(this.$().find('label').text(), 'Your First Name');
+});
+
+test('allows hint text to be set', function(assert) {
+ this.render(hbs`{{input firstName hint="My hint text"}}`);
+ assert.equal(this.$().find('span.hint').text(), 'My hint text');
+});
+
+test('does not show hint span when there is no hint', function(assert) {
+ this.render(hbs`{{input firstName}}`);
+ assert.equal(this.$().find('span.hint').length, 0);
+});
+
+test('block form for input', function(assert) {
+ this.render(hbs`{{#input firstName}}{{label-field firstName}}{{input-field firstName}}{{error-field firstName}}{{/input}}`);
+
+ var input = this.$().find('input');
+ var label = this.$().find('label');
+
+ assert.equal(label.text(), 'First name');
+ assert.equal(input.val(), 'Brian');
+ assert.equal(input.attr('type'), 'text');
+ assert.equal(label.prop('for'), input.prop('id'));
+});
+
+test('block form for input without label', function(assert) {
+ this.render(hbs`{{#input firstName}}{{input-field firstName}}{{/input}}`);
+ assert.equal(this.$().find('input').val(), 'Brian');
+ assert.equal(this.$().find('input').attr('type'), 'text');
+});
+
+test('sets input attributes property', function(assert) {
+ this.render(hbs`{{input receiveAt as="email" placeholder="Your email" disabled=true}}`);
+ var input = this.$().find('input');
+ assert.equal(input.prop('type'), 'email');
+ assert.equal(input.prop('placeholder'), 'Your email');
+ assert.equal(input.prop('disabled'), true);
+});
+
+test('binds label to input field', function(assert) {
+ this.render(hbs`{{input firstName}}`);
+ var input = this.$().find('input');
+ var label = this.$().find('label');
+ assert.equal(input.prop('id'), label.prop('for'));
+});
+
+test('uses the wrapper config', function(assert) {
+ config.registerWrapper('my_wrapper', {inputClass: 'my-input', errorClass: 'my-error', fieldErrorClass: 'my-fieldWithErrors'});
+ this.set('model', {
+ errors: ErrorsObject.create()
+ });
+
+ Ember.run(() => {
+ this.get('model.errors.firstName').pushObject("can't be blank");
+ });
+ this.render(hbs`{{#form-for model wrapper="my_wrapper"}}{{input firstName}}{{/form-for}}`);
+ Ember.run(() => {
+ this.$().find('input').blur();
+ });
+ assert.ok(this.$().find('div.my-input').get(0), 'inputClass not defined');
+ assert.ok(this.$().find('div.my-fieldWithErrors').get(0), 'fieldErrorClass not defined');
+ assert.ok(this.$().find('span.my-error').get(0), 'errorClass not defined');
+});
+
+test('uses the defined template name', function(assert) {
+ this.container.register('template:custom-input-template', hbs`My custom template | {{label-field propertyBinding="view.property"}}`);
+ config.registerWrapper('my_wrapper', {inputTemplate: 'custom-input-template'});
+
+ this.render(hbs`{{#form-for model wrapper="my_wrapper"}}{{input firstName}}{{/form-for}}`);
+ assert.equal(this.$().text(), 'My custom template | First name');
+});
+
+test('sets input attributes property as bindings', function(assert) {
+ this.setProperties({
+ placeholder: 'The placeholder',
+ label: 'My label',
+ hint: 'Some hint'
+ });
+ this.render(hbs`{{input firstName placeholderBinding="placeholder" labelBinding="label" hintBinding="hint"}}`);
+ assert.equal(this.$().find('input').prop('placeholder'), 'The placeholder');
+ assert.equal(this.$().find('label').text(), 'My label');
+ assert.equal(this.$().find('.hint').text(), 'Some hint');
+
+ Ember.run(() => {
+ this.setProperties({
+ placeholder: 'Write your first name',
+ label: 'First name (not a last name)',
+ hint: 'Usually different than your last name'
+ });
+ });
+
+ assert.equal(this.$().find('input').prop('placeholder'), 'Write your first name');
+ assert.equal(this.$().find('label').text(), 'First name (not a last name)');
+ assert.equal(this.$().find('.hint').text(), 'Usually different than your last name');
+});
+
+test('sets select prompt property as bindings', function(assert) {
+ this.setProperties({
+ label: 'My label',
+ hint: 'Some hint',
+ prompt: 'The prompt'
+ });
+ this.render(hbs`{{input firstName as="select" labelBinding="label" hintBinding="hint" promptBinding="prompt"}}`);
+
+ assert.equal(this.$().find('option').text(), 'The prompt');
+ assert.equal(this.$().find('label').text(), 'My label');
+ assert.equal(this.$().find('.hint').text(), 'Some hint');
+
+ Ember.run(() => {
+ this.setProperties({
+ prompt: 'Select an option',
+ label: 'First name (not a last name)',
+ hint: 'Usually different than your last name'
+ });
+ });
+
+ assert.equal(this.$().find('option').text(), 'Select an option');
+ assert.equal(this.$().find('label').text(), 'First name (not a last name)');
+ assert.equal(this.$().find('.hint').text(), 'Usually different than your last name');
+});
+
+test('defaults the name property', function(assert) {
+ this.render(hbs`{{input firstName}}`);
+ assert.equal(this.$().find('input').prop('name'), "firstName");
+});
+
+test('allows specifying the name property', function(assert) {
+ this.render(hbs`{{input firstName name="some-other-name"}}`);
+ assert.equal(this.$().find('input').prop('name'), "some-other-name");
+});
+
+test('scopes property lookup to model declared in form-for', function(assert){
+ this.set('someOtherModel', Ember.Object.create({firstName: 'Robert'}));
+
+ this.render(hbs`{{#form-for someOtherModel}}{{input firstName}}{{/form-for}}`);
+ assert.equal(this.$().find('input').val(), "Robert");
+});
+
+// test('can specify a property outside of the model if a keyword is used as a prefix', function() {
+// controller.set('someOtherModel', Ember.Object.create({firstName: 'Robert'}));
+//
+// view = Ember.View.create({
+// template: templateFor('{{#form-for someOtherModel}}{{input controller.firstName}}{{/form-for}}'),
+// container: container,
+// controller: controller
+// });
+// append(view);
+//
+// equal(view.$().find('input').val(), "Brian");
+// });
+
+// test('select collection can use controller scope if prefix', function() {
+// controller.set('someOtherModel', Ember.Object.create({ city: 'Ocala' }));
+//
+// controller.set('cities', Ember.A("Boston Ocala Portland".w()));
+//
+// view = Ember.View.create({
+// template: templateFor('{{#form-for someOtherModel}}{{input city as="select" collection="controller.cities"}}{{/form-for}}'),
+// container: container,
+// controller: controller
+// });
+// append(view);
+//
+// equal(view.$('option').text(), "BostonOcalaPortland");
+// equal(view.$('option:selected').text(), "Ocala");
+// });
+//
+// test('sets input as="date" attributes properly', function() {
+// view = Ember.View.create({
+// template: templateFor('{{input receiveAt as="date"}}'),
+// container: container,
+// controller: controller
+// });
+// append(view);
+// var input = view.$().find('input');
+// equal(input.prop('type'), 'date');
+// });
+
+test('allows using the {{input}} helper', function(assert) {
+ this.render(hbs`{{input name="first-name"}}`);
+ assert.equal(this.$().find('input').prop('name'), "first-name");
+});
+
+test('{{ember-input}} uses the original Ember {{input}} helper', function(assert) {
+ this.render(hbs`{{ember-input name="first-name"}}`);
+ assert.equal(this.$().find('input').prop('name'), "first-name");
+});
+
+test('adds a class to the parent div for the property name', function(assert) {
+ this.render(hbs`{{input firstName labelClass="blammo"}}`);
+ assert.equal(this.$().find('div.input.firstName input').val(), 'Brian');
+});
diff --git a/tests/components/label-field-test.js b/tests/components/label-field-test.js
new file mode 100644
index 0000000..69ace02
--- /dev/null
+++ b/tests/components/label-field-test.js
@@ -0,0 +1,30 @@
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+import config from 'ember-easy-form/config';
+
+moduleForComponent('label-field', 'Integration | Component | label field', {
+ integration: true
+});
+
+test('renders a label field', function(assert) {
+ this.render(hbs`{{label-field firstName}}`);
+ assert.equal(this.$().find('label').text(), 'First name');
+});
+
+test('renders a label field with custom text', function(assert) {
+ this.render(hbs`{{label-field firstName text="Your first name"}}`);
+ assert.equal(this.$().find('label').text(), 'Your first name');
+});
+
+test('uses the wrapper config', function(assert) {
+ config.registerWrapper('my_wrapper', {labelClass: 'my-label'});
+ this.render(hbs`{{#form-for controller wrapper="my_wrapper"}}{{label-field firstName}}{{/form-for}}`);
+ assert.ok(this.$().find('label.my-label').get(0), 'labelClass not defined');
+});
+
+test('uses the defined template name', function(assert) {
+ this.container.register('template:custom-label-template', hbs`My custom label | {{view.labelText}}`);
+ config.registerWrapper('my_wrapper', {labelTemplate: 'custom-label-template'});
+ this.render(hbs`{{#form-for controller wrapper="my_wrapper"}}{{label-field firstName}}{{/form-for}}`);
+ assert.equal(this.$().text(), "My custom label | First name");
+});
diff --git a/tests/components/submit-test.js b/tests/components/submit-test.js
new file mode 100644
index 0000000..b23d33b
--- /dev/null
+++ b/tests/components/submit-test.js
@@ -0,0 +1,57 @@
+import { moduleForComponent, test } from 'ember-qunit';
+import Ember from 'ember';
+import hbs from 'htmlbars-inline-precompile';
+import setup from 'ember-easy-form/setup';
+
+moduleForComponent('submit-button', 'Integration | Component | submit button', {
+ integration: true,
+ beforeEach: function() {
+ setup();
+ }
+});
+
+test('renders submit button', function(assert) {
+ this.render(hbs`{{submit}}`);
+ assert.equal(this.$().find('input').prop('value'), 'Submit');
+ assert.equal(this.$().find('input').prop('type'), 'submit');
+});
+
+test('renders as button', function(assert) {
+ this.render(hbs`{{submit as="button"}}`);
+ assert.equal(this.$().find('button').text(), 'Submit');
+ assert.equal(this.$().find('button').prop('type'), 'submit');
+});
+
+test('has custom value as button', function(assert) {
+ this.render(hbs`{{submit "Create" as="button"}}`);
+ assert.equal(this.$().find('button').text(), 'Create');
+});
+
+test('submit as button disabled state is bound to models valid state', function(assert) {
+ Ember.run(() => {
+ this.set('isValid', false);
+ });
+ this.render(hbs`{{submit as="button"}}`);
+ assert.equal(this.$().find('button').prop('disabled'), true);
+ Ember.run(() => {
+ this.set('isValid', true);
+ });
+ assert.equal(this.$().find('button').prop('disabled'), false);
+});
+
+test('custom value', function(assert) {
+ this.render(hbs`{{submit "Create"}}`);
+ assert.equal(this.$().find('input').prop('value'), 'Create');
+});
+
+test('submit button disabled state is bound to models valid state', function(assert) {
+ Ember.run(() => {
+ this.set('isValid', false);
+ });
+ this.render(hbs`{{submit}}`);
+ assert.equal(this.$().find('input').prop('disabled'), true);
+ Ember.run(() => {
+ this.set('isValid', true);
+ });
+ assert.equal(this.$().find('input').prop('disabled'), false);
+});
diff --git a/tests/dummy/app/app.js b/tests/dummy/app/app.js
new file mode 100644
index 0000000..8d66b95
--- /dev/null
+++ b/tests/dummy/app/app.js
@@ -0,0 +1,18 @@
+import Ember from 'ember';
+import Resolver from 'ember/resolver';
+import loadInitializers from 'ember/load-initializers';
+import config from './config/environment';
+
+var App;
+
+Ember.MODEL_FACTORY_INJECTIONS = true;
+
+App = Ember.Application.extend({
+ modulePrefix: config.modulePrefix,
+ podModulePrefix: config.podModulePrefix,
+ Resolver: Resolver
+});
+
+loadInitializers(App, config.modulePrefix);
+
+export default App;
diff --git a/tests/dummy/app/components/.gitkeep b/tests/dummy/app/components/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/tests/dummy/app/controllers/.gitkeep b/tests/dummy/app/controllers/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/tests/dummy/app/controllers/person.js b/tests/dummy/app/controllers/person.js
new file mode 100644
index 0000000..b49b92a
--- /dev/null
+++ b/tests/dummy/app/controllers/person.js
@@ -0,0 +1,5 @@
+import Ember from 'ember';
+
+export default Ember.Controller.extend({
+ submitted: false
+});
\ No newline at end of file
diff --git a/tests/dummy/app/helpers/.gitkeep b/tests/dummy/app/helpers/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/tests/dummy/app/index.html b/tests/dummy/app/index.html
new file mode 100644
index 0000000..1c49d36
--- /dev/null
+++ b/tests/dummy/app/index.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+ Dummy
+
+
+
+ {{content-for 'head'}}
+
+
+
+
+ {{content-for 'head-footer'}}
+
+
+ {{content-for 'body'}}
+
+
+
+
+ {{content-for 'body-footer'}}
+
+
diff --git a/tests/dummy/app/models/.gitkeep b/tests/dummy/app/models/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/tests/dummy/app/models/person.js b/tests/dummy/app/models/person.js
new file mode 100644
index 0000000..2b972ff
--- /dev/null
+++ b/tests/dummy/app/models/person.js
@@ -0,0 +1,42 @@
+import Ember from 'ember';
+
+const ErrorsObject = Ember.Object.extend({
+ unknownProperty: function(property) {
+ this.set(property, Ember.A([]));
+ return this.get(property);
+ }
+});
+
+export default Ember.Object.extend({
+ firstName: null,
+ lastName: null,
+ isValid: false,
+ errors: null,
+
+ init: function() {
+ this._super();
+ this.set('errors', ErrorsObject.create());
+ },
+
+ validate: function() {
+ var errors = this.get('errors');
+ var requiredFields = ['firstName', 'lastName'];
+ var isValid = true;
+ for (var i = 0; i < requiredFields.length; i++) {
+ var field = requiredFields[i];
+ if (Ember.isBlank(this.get(field))) {
+ errors.get(field).pushObject('can\'t be blank');
+ isValid = false;
+ } else {
+ errors.get(field).clear();
+ }
+ }
+ this.set('isValid', isValid);
+ return Ember.RSVP.resolve();
+ },
+
+ requiredFieldsChanged: Ember.observer('firstName', 'lastName', function() {
+ this.validate();
+ })
+
+});
\ No newline at end of file
diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js
new file mode 100644
index 0000000..74d0a6d
--- /dev/null
+++ b/tests/dummy/app/router.js
@@ -0,0 +1,12 @@
+import Ember from 'ember';
+import config from './config/environment';
+
+var Router = Ember.Router.extend({
+ location: config.locationType
+});
+
+Router.map(function() {
+ this.route('person');
+});
+
+export default Router;
diff --git a/tests/dummy/app/routes/.gitkeep b/tests/dummy/app/routes/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/tests/dummy/app/routes/person.js b/tests/dummy/app/routes/person.js
new file mode 100644
index 0000000..8e36e34
--- /dev/null
+++ b/tests/dummy/app/routes/person.js
@@ -0,0 +1,20 @@
+import Ember from 'ember';
+import Person from 'dummy/models/person';
+
+export default Ember.Route.extend({
+ model: function() {
+ return Person.create({
+ firstName: 'Diogo',
+ lastName: 'Mafra'
+ });
+ },
+ setupController: function(controller) {
+ this._super(...arguments);
+ controller.set('submitted', false);
+ },
+ actions: {
+ submit: function() {
+ this.controller.set('submitted', true);
+ }
+ }
+});
diff --git a/tests/dummy/app/styles/app.css b/tests/dummy/app/styles/app.css
new file mode 100644
index 0000000..6e944a2
--- /dev/null
+++ b/tests/dummy/app/styles/app.css
@@ -0,0 +1,15 @@
+.error {
+ color: red;
+}
+
+.input {
+ margin: 10px;
+}
+
+.input > label {
+ margin-right: 4px;
+}
+
+.input > .error {
+ margin-left: 4px;
+}
\ No newline at end of file
diff --git a/tests/dummy/app/templates/application.hbs b/tests/dummy/app/templates/application.hbs
new file mode 100644
index 0000000..402f95f
--- /dev/null
+++ b/tests/dummy/app/templates/application.hbs
@@ -0,0 +1,3 @@
+Ember Easy Form
+
+{{outlet}}
diff --git a/tests/dummy/app/templates/components/.gitkeep b/tests/dummy/app/templates/components/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs
new file mode 100644
index 0000000..b402a00
--- /dev/null
+++ b/tests/dummy/app/templates/index.hbs
@@ -0,0 +1 @@
+{{link-to "Person" "person"}}
\ No newline at end of file
diff --git a/tests/dummy/app/templates/person.hbs b/tests/dummy/app/templates/person.hbs
new file mode 100644
index 0000000..3a5dab6
--- /dev/null
+++ b/tests/dummy/app/templates/person.hbs
@@ -0,0 +1,17 @@
+Person form
+
+{{#form-for model}}
+ {{input firstName}}
+ {{input lastName}}
+
+{{/form-for}}
+
+
+ First name: {{model.firstName}}
+ Last name: {{model.lastName}}
+
+
+{{#if submitted}}
+
Submitted!!
+{{/if}}
+
\ No newline at end of file
diff --git a/tests/dummy/config/environment.js b/tests/dummy/config/environment.js
new file mode 100644
index 0000000..c59bcd5
--- /dev/null
+++ b/tests/dummy/config/environment.js
@@ -0,0 +1,47 @@
+/* jshint node: true */
+
+module.exports = function(environment) {
+ var ENV = {
+ modulePrefix: 'dummy',
+ environment: environment,
+ baseURL: '/',
+ locationType: 'auto',
+ EmberENV: {
+ FEATURES: {
+ // Here you can enable experimental features on an ember canary build
+ // e.g. 'with-controller': true
+ }
+ },
+
+ APP: {
+ // Here you can pass flags/options to your application instance
+ // when it is created
+ }
+ };
+
+ if (environment === 'development') {
+ // ENV.APP.LOG_RESOLVER = true;
+ // ENV.APP.LOG_ACTIVE_GENERATION = true;
+ // ENV.APP.LOG_TRANSITIONS = true;
+ // ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
+ // ENV.APP.LOG_VIEW_LOOKUPS = true;
+ }
+
+ if (environment === 'test') {
+ // Testem prefers this...
+ ENV.baseURL = '/';
+ ENV.locationType = 'none';
+
+ // keep test console output quieter
+ ENV.APP.LOG_ACTIVE_GENERATION = false;
+ ENV.APP.LOG_VIEW_LOOKUPS = false;
+
+ ENV.APP.rootElement = '#ember-testing';
+ }
+
+ if (environment === 'production') {
+
+ }
+
+ return ENV;
+};
diff --git a/tests/dummy/public/crossdomain.xml b/tests/dummy/public/crossdomain.xml
new file mode 100644
index 0000000..0c16a7a
--- /dev/null
+++ b/tests/dummy/public/crossdomain.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/dummy/public/robots.txt b/tests/dummy/public/robots.txt
new file mode 100644
index 0000000..f591645
--- /dev/null
+++ b/tests/dummy/public/robots.txt
@@ -0,0 +1,3 @@
+# http://www.robotstxt.org
+User-agent: *
+Disallow:
diff --git a/tests/ember_configuration.js b/tests/ember_configuration.js
deleted file mode 100644
index 05e541f..0000000
--- a/tests/ember_configuration.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/*globals ENV QUnit EmberDev */
-
-(function() {
- window.Ember = {
- testing: true
- };
- window.ENV = window.ENV || {};
-
- // Test for "hooks in ENV.EMBER_LOAD_HOOKS['hookName'] get executed"
- ENV.EMBER_LOAD_HOOKS = ENV.EMBER_LOAD_HOOKS || {};
- ENV.EMBER_LOAD_HOOKS.__before_ember_test_hook__ = ENV.EMBER_LOAD_HOOKS.__before_ember_test_hook__ || [];
- ENV.__test_hook_count__ = 0;
- ENV.EMBER_LOAD_HOOKS.__before_ember_test_hook__.push(function(object) {
- ENV.__test_hook_count__ += object;
- });
-
- // Handle extending prototypes
- QUnit.config.urlConfig.push('extendprototypes');
-
- // var extendPrototypes = QUnit.urlParams.extendprototypes;
- // ENV['EXTEND_PROTOTYPES'] = !!extendPrototypes;
-
- // Don't worry about jQuery version
- ENV['FORCE_JQUERY'] = true;
-
- if (EmberDev.jsHint) {
- // jsHint makes its own Object.create stub, we don't want to use this
- ENV['STUB_OBJECT_CREATE'] = !Object.create;
- }
-
- EmberDev.afterEach = function(){};
- EmberDev.distros = {
- spade: 'ember-easyForm-spade.js',
- build: 'ember-easyForm.js',
- };
-})();
diff --git a/tests/helpers/resolver.js b/tests/helpers/resolver.js
new file mode 100644
index 0000000..28f4ece
--- /dev/null
+++ b/tests/helpers/resolver.js
@@ -0,0 +1,11 @@
+import Resolver from 'ember/resolver';
+import config from '../../config/environment';
+
+var resolver = Resolver.create();
+
+resolver.namespace = {
+ modulePrefix: config.modulePrefix,
+ podModulePrefix: config.podModulePrefix
+};
+
+export default resolver;
diff --git a/tests/helpers/start-app.js b/tests/helpers/start-app.js
new file mode 100644
index 0000000..0f7aab1
--- /dev/null
+++ b/tests/helpers/start-app.js
@@ -0,0 +1,18 @@
+import Ember from 'ember';
+import Application from '../../app';
+import config from '../../config/environment';
+
+export default function startApp(attrs) {
+ var application;
+
+ var attributes = Ember.merge({}, config.APP);
+ attributes = Ember.merge(attributes, attrs); // use defaults, but you can override;
+
+ Ember.run(function() {
+ application = Application.create(attributes);
+ application.setupForTesting();
+ application.injectTestHelpers();
+ });
+
+ return application;
+}
diff --git a/tests/index.html b/tests/index.html
new file mode 100644
index 0000000..8fea6fe
--- /dev/null
+++ b/tests/index.html
@@ -0,0 +1,33 @@
+
+
+
+
+
+ Dummy Tests
+
+
+
+ {{content-for 'head'}}
+ {{content-for 'test-head'}}
+
+
+
+
+
+ {{content-for 'head-footer'}}
+ {{content-for 'test-head-footer'}}
+
+
+
+ {{content-for 'body'}}
+ {{content-for 'test-body'}}
+
+
+
+
+
+
+ {{content-for 'body-footer'}}
+ {{content-for 'test-body-footer'}}
+
+
diff --git a/tests/test-helper.js b/tests/test-helper.js
new file mode 100644
index 0000000..e6cfb70
--- /dev/null
+++ b/tests/test-helper.js
@@ -0,0 +1,6 @@
+import resolver from './helpers/resolver';
+import {
+ setResolver
+} from 'ember-qunit';
+
+setResolver(resolver);
diff --git a/tests/unit/.gitkeep b/tests/unit/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/tests/unit/config-test.js b/tests/unit/config-test.js
new file mode 100644
index 0000000..614135d
--- /dev/null
+++ b/tests/unit/config-test.js
@@ -0,0 +1,36 @@
+import config from 'ember-easy-form/config';
+import { module, test } from 'qunit';
+
+module('Unit | config');
+
+test('contains a default wrapper', function(assert) {
+ var wrapper = config.getWrapper('default');
+ assert.ok(wrapper, 'The default wrapper could not be found');
+ assert.equal(wrapper.errorClass, 'error');
+});
+
+test('register custom wrappers', function(assert) {
+ config.registerWrapper('my_wrapper', {errorClass: 'my-error'});
+ var wrapper = config.getWrapper('my_wrapper');
+ assert.ok(wrapper, 'The custom wrapper could not be found');
+ assert.equal(wrapper.errorClass, 'my-error');
+});
+
+test('merge the default wrapper with the custom one', function(assert) {
+ config.registerWrapper('my_wrapper', {errorClass: 'my-error'});
+ var wrapper = config.getWrapper('my_wrapper');
+ assert.equal(wrapper.errorClass, 'my-error');
+ assert.equal(wrapper.hintClass, 'hint');
+});
+
+test('register custom input types', function(assert) {
+ var myInputComponent = {myInput: true};
+ var anotherInputComponent = {anotherInput: true};
+ config.registerInputType('my_input', myInputComponent);
+ config.registerInputType('another_input', anotherInputComponent);
+
+ var inputType = config.getInputType('my_input');
+ assert.equal(inputType, myInputComponent);
+ inputType = config.getInputType('another_input');
+ assert.equal(inputType, anotherInputComponent);
+});
diff --git a/tests/unit/utilities-test.js b/tests/unit/utilities-test.js
new file mode 100644
index 0000000..416b12d
--- /dev/null
+++ b/tests/unit/utilities-test.js
@@ -0,0 +1,38 @@
+import { module, test } from 'qunit';
+import {
+ humanize,
+ processOptions
+} from 'ember-easy-form/utilities';
+import Ember from 'ember';
+
+module('Unit | utilities');
+
+test('humanizes string', function(assert) {
+ assert.equal(humanize('firstName'), 'First name');
+});
+
+test('mutation of options - only property', function(assert) {
+ assert.equal(processOptions('firstName'), 'firstName');
+});
+
+test('mutation of options - property and options', function(assert) {
+ var options = {hash: {placeholder: 'First name'}};
+ assert.deepEqual(processOptions('firstName', options), {hash: {placeholder: 'First name', property: 'firstName'}});
+});
+
+test('mutation of options - property and translation options (e.g. placeholderTranslation, labelTranslation, etc) without Ember.I18n', function(assert) {
+ var options = {hash: {placeholderTranslation: 'users.first_name'}};
+ assert.deepEqual(processOptions('firstName', options), {hash: {placeholderTranslation: 'users.first_name', property: 'firstName'}});
+});
+
+test('mutation of options - property and translation options (e.g. placeholderTranslation, labelTranslation, etc) with Ember.I18n', function(assert) {
+ Ember.I18n = {
+ t: function(key) {
+ return humanize(key);
+ }
+ };
+ var options = {hash: {placeholderTranslation: 'users.first_name'}};
+ assert.deepEqual(processOptions('firstName', options), {hash: {placeholder: 'Users.first name', property: 'firstName'}});
+
+ delete Ember.I18n;
+});
diff --git a/vendor/.gitkeep b/vendor/.gitkeep
new file mode 100644
index 0000000..e69de29