Skip to content

Commit 3f331a7

Browse files
author
Baylee Swenson
committed
Create form-controls
1 parent 02bcf38 commit 3f331a7

File tree

16 files changed

+229
-1
lines changed

16 files changed

+229
-1
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { computed } from '@ember-decorators/object';
2+
import { reads } from '@ember-decorators/object/computed';
3+
import { service } from '@ember-decorators/service';
4+
import Controller from '@ember/controller';
5+
import { action } from '@ember/object';
6+
// import Changeset from 'ember-changeset';
7+
// import lookupValidator from 'ember-changeset-validations';
8+
import { ChangesetDef } from 'ember-changeset/types';
9+
import DS from 'ember-data';
10+
import Toast from 'ember-toastr/services/toast';
11+
12+
import Node from 'ember-osf-web/models/node';
13+
14+
import { nodeValidation } from './validation';
15+
16+
export default class FormController extends Controller {
17+
@service store!: DS.Store;
18+
@service toast!: Toast;
19+
20+
@reads('model.taskInstance.value')
21+
existingNode?: Node;
22+
createDirt = false;
23+
editDirt = false;
24+
validation = nodeValidation;
25+
node = Node;
26+
changeset!: ChangesetDef;
27+
28+
@computed('createDirt', 'editDirt')
29+
get isDirty() {
30+
return this.createDirt || this.editDirt;
31+
}
32+
33+
@action
34+
submit() {
35+
this.changeset.save({});
36+
this.toast.success('Saved!');
37+
}
38+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<DocsDemo as |demo|>
2+
<demo.example @name='form-controls.demo-default.hbs'>
3+
<form {{action this.submit on='submit'}}>
4+
<FormControls
5+
@changeset={{changeset this.node this.validation}}
6+
as |form|
7+
>
8+
<form.text
9+
@label='Title'
10+
@valuePath='title'
11+
/>
12+
<form.text
13+
@label='Description'
14+
@valuePath='description'
15+
/>
16+
</FormControls>
17+
<OsfButton
18+
@type='primary'
19+
@buttonType='submit'
20+
>
21+
Submit
22+
</OsfButton>
23+
</form>
24+
</demo.example>
25+
26+
<demo.snippet @name='form-controls.demo-default.hbs' />
27+
</DocsDemo>
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { computed } from '@ember-decorators/object';
2+
import Route from '@ember/routing/route';
3+
import Changeset from 'ember-changeset';
4+
import { task } from 'ember-concurrency';
5+
import ConfirmationMixin from 'ember-onbeforeunload/mixins/confirmation';
6+
7+
import FormController from './controller';
8+
9+
export default class FormControls extends Route.extend(ConfirmationMixin, {
10+
modelTask: task(function *(this: FormControls) {
11+
return yield this.store.findRecord('node', 'extng');
12+
}),
13+
}) {
14+
model() {
15+
return {
16+
taskInstance: this.modelTask.perform(),
17+
};
18+
}
19+
20+
setupController(controller: FormController) {
21+
const changeset = new Changeset(controller.node, controller.validation);
22+
controller.set('changeset', changeset);
23+
}
24+
25+
@computed('controller.isDirty')
26+
get isPageDirty() {
27+
const controller = this.controller as FormController;
28+
return () => controller.get('isDirty');
29+
}
30+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# validated-form-controls
2+
Takes a changeset and yields validated form components
3+
4+
### Params
5+
The only param that `<FormControls />` takes is a changeset for the current form being created
6+
7+
### Yielded hash
8+
When invoked in a form, `<ValidatedFormControls />` yields a hash with the following keys:
9+
10+
* Several `validated-model-form/*` components with common arguments (`model`, `changeset`, `shouldShowMessages`, `disabled`) already bound:
11+
* `checkbox`
12+
* `checkboxes`
13+
* `date`
14+
* `recaptcha`
15+
* `text`
16+
* `textarea`
17+
18+
## Demo: Default
19+
{{docs/components/form-controls/demo-default
20+
submit=(action this.submit)
21+
node=this.node
22+
validation=this.validation
23+
}}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { ValidationObject } from 'ember-changeset-validations';
2+
import { validatePresence } from 'ember-changeset-validations/validators';
3+
import NodeModel from 'ember-osf-web/models/node';
4+
5+
export const nodeValidation: ValidationObject<NodeModel> = {
6+
title: [
7+
validatePresence(true),
8+
],
9+
};

lib/handbook/addon/docs/template.hbs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<nav.item @label='panel' @route='docs.components.panel' />
3434
<nav.item @label='placeholder' @route='docs.components.placeholder' />
3535
<nav.item @label='tags-widget' @route='docs.components.tags-widget' />
36+
<nav.item @label='validated-form-controls' @route='docs.components.validated-form-controls' />
3637
<nav.item @label='validated-model-form' @route='docs.components.validated-model-form' />
3738
</viewer.nav>
3839

lib/handbook/addon/routes.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export default buildRoutes(function() {
3838
this.route('panel');
3939
this.route('placeholder');
4040
this.route('tags-widget');
41+
this.route('validated-form-controls');
4142
this.route('validated-model-form');
4243
});
4344

lib/handbook/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
"@ember/render-modifiers": "*",
99
"ember-angle-bracket-invocation-polyfill": "*",
1010
"ember-bootstrap": "*",
11+
"ember-changeset": "^2.1.2",
12+
"ember-changeset-validations": "^2.1.0",
1113
"ember-cli-addon-docs": "*",
1214
"ember-cli-addon-docs-typedoc": "*",
1315
"ember-cli-babel": "*",
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { layout } from '@ember-decorators/component';
2+
import Component from '@ember/component';
3+
4+
import defaultTo from 'ember-osf-web/utils/default-to';
5+
6+
import template from './template';
7+
8+
@layout(template)
9+
export default class FormControls extends Component {
10+
// Optional arguments
11+
disabled: boolean = defaultTo(this.disabled, false);
12+
shouldShowMessages: boolean = false;
13+
}

lib/osf-components/addon/components/form-controls/styles.scss

Whitespace-only changes.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
{{yield (hash
2+
checkbox=(
3+
component
4+
'validated-input/checkbox'
5+
changeset=this.changeset
6+
shouldShowMessages=this.shouldShowMessages
7+
disabled=this.disabled
8+
)
9+
date=(
10+
component
11+
'validated-input/date'
12+
changeset=this.changeset
13+
shouldShowMessages=this.shouldShowMessages
14+
disabled=this.disabled
15+
)
16+
text=(
17+
component
18+
'validated-input/text'
19+
changeset=this.changeset
20+
shouldShowMessages=this.shouldShowMessages
21+
disabled=this.disabled
22+
)
23+
textarea=(
24+
component
25+
'validated-input/textarea'
26+
changeset=@changeset
27+
shouldShowMessages=this.shouldShowMessages
28+
disabled=this.disabled
29+
)
30+
select=(
31+
component
32+
'validated-input/power-select'
33+
changeset=this.changeset
34+
shouldShowMessages=this.shouldShowMessages
35+
disabled=this.disabled
36+
)
37+
custom=(
38+
component
39+
'validated-input/custom'
40+
changeset=this.changeset
41+
shouldShowMessages=this.shouldShowMessages
42+
disabled=this.disabled
43+
)
44+
)}}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from 'osf-components/components/form-controls/component';

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
"ember-bootstrap": "^1.2.2",
8080
"ember-bootstrap-datepicker": "^2.0.9",
8181
"ember-browserify": "^1.2.0",
82-
"ember-changeset": "^2.0.1",
82+
"ember-changeset-validations": "^2.1.0",
8383
"ember-cli": "~3.4.3",
8484
"ember-cli-addon-docs": "https://github.com/cos-forks/ember-cli-addon-docs#docs-engine#37",
8585
"ember-cli-addon-docs-typedoc": "https://github.com/typed-ember/ember-cli-addon-docs-typedoc#initial-implementation",
@@ -220,5 +220,8 @@
220220
"lib/osf-components",
221221
"lib/registries"
222222
]
223+
},
224+
"dependencies": {
225+
"ember-changeset": "^2.1.2"
223226
}
224227
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { ValidatorFunc } from 'ember-changeset/types';
2+
import { validator } from 'ember-validations';
3+
4+
export type ValidatorFunction = (key: string, result: any) => string | string[] | true;
5+
6+
export function lookupValidator(validator: validatorObject): ValidatorFunc;
7+
8+
// FIXME: Below doesn't actually work, but setting it aside for now to get actual
9+
// functionality implemented. James is upgrading types a bit, and the following
10+
// will make more sense after.
11+
12+
export type ValidationObject<M> = {
13+
[F in keyof M]?: any;
14+
};
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
declare module 'ember-changeset-validations/validators' {
2+
import { ValidatorFunction } from 'ember-changeset-validations';
3+
import { ConfirmationOptions } from 'ember-validators/validators/confirmation';
4+
import { ExclusionOptions } from 'ember-validators/validators/exclusion';
5+
import { InclusionOptions } from 'ember-validators/validators/inclusion';
6+
import { LengthOptions } from 'ember-validators/validators/length';
7+
import { NumberOptions } from 'ember-validators/validators/number';
8+
import { PresenceOptions } from 'ember-validators/validators/presence';
9+
10+
export function validatePresence(options: PresenceOptions | boolean): ValidatorFunction;
11+
export function validateLength(options: LengthOptions): ValidatorFunction;
12+
export function validateNumber(options: NumberOptions): ValidatorFunction;
13+
export function validateInclusion(options: InclusionOptions): ValidatorFunction;
14+
export function validateExclusion(options: ExclusionOptions): ValidatorFunction;
15+
export function validateFormat(options: FormatOptions): ValidatorFunction;
16+
export function validateConfirmation(options: ConfirmationOptions): ValidatorFunction;
17+
}

types/ember-osf-web/validations.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { ValidationObject } from 'ember-changeset-validations';
2+
3+
declare module '*/validations' {
4+
export const UserSettingValidation: ValidationObject<UserSettingModel>;
5+
}

0 commit comments

Comments
 (0)