123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- Ext.require([
- 'Ext.form.*',
- 'Ext.Img',
- 'Ext.tip.QuickTipManager'
- ]);
- Ext.onReady(function() {
- Ext.tip.QuickTipManager.init();
- var formPanel = Ext.widget('form', {
- renderTo: Ext.getBody(),
- frame: true,
- width: 350,
- bodyPadding: 10,
- bodyBorder: true,
- title: 'Account Registration',
- defaults: {
- anchor: '100%'
- },
- fieldDefaults: {
- labelAlign: 'left',
- msgTarget: 'none',
- invalidCls: '' //unset the invalidCls so individual fields do not get styled as invalid
- },
- /*
- * Listen for validity change on the entire form and update the combined error icon
- */
- listeners: {
- fieldvaliditychange: function() {
- this.updateErrorState();
- },
- fielderrorchange: function() {
- this.updateErrorState();
- }
- },
- updateErrorState: function() {
- var me = this,
- errorCmp, fields, errors;
- if (me.hasBeenDirty || me.getForm().isDirty()) { //prevents showing global error when form first loads
- errorCmp = me.down('#formErrorState');
- fields = me.getForm().getFields();
- errors = [];
- fields.each(function(field) {
- Ext.Array.forEach(field.getErrors(), function(error) {
- errors.push({name: field.getFieldLabel(), error: error});
- });
- });
- errorCmp.setErrors(errors);
- me.hasBeenDirty = true;
- }
- },
- items: [{
- xtype: 'textfield',
- name: 'username',
- fieldLabel: 'User Name',
- allowBlank: false,
- minLength: 6
- }, {
- xtype: 'textfield',
- name: 'email',
- fieldLabel: 'Email Address',
- vtype: 'email',
- allowBlank: false
- }, {
- xtype: 'textfield',
- name: 'password1',
- fieldLabel: 'Password',
- inputType: 'password',
- style: 'margin-top:15px',
- allowBlank: false,
- minLength: 8
- }, {
- xtype: 'textfield',
- name: 'password2',
- fieldLabel: 'Repeat Password',
- inputType: 'password',
- allowBlank: false,
- /**
- * Custom validator implementation - checks that the value matches what was entered into
- * the password1 field.
- */
- validator: function(value) {
- var password1 = this.previousSibling('[name=password1]');
- return (value === password1.getValue()) ? true : 'Passwords do not match.'
- }
- },
- /*
- * Terms of Use acceptance checkbox. Two things are special about this:
- * 1) The boxLabel contains a HTML link to the Terms of Use page; a special click listener opens this
- * page in a modal Ext window for convenient viewing, and the Decline and Accept buttons in the window
- * update the checkbox's state automatically.
- * 2) This checkbox is required, i.e. the form will not be able to be submitted unless the user has
- * checked the box. Ext does not have this type of validation built in for checkboxes, so we add a
- * custom getErrors method implementation.
- */
- {
- xtype: 'checkboxfield',
- name: 'acceptTerms',
- fieldLabel: 'Terms of Use',
- hideLabel: true,
- style: 'margin-top:15px',
- boxLabel: 'I have read and accept the <a href="#" class="terms">Terms of Use</a>.',
- // Listener to open the Terms of Use page link in a modal window
- listeners: {
- click: {
- element: 'boxLabelEl',
- fn: function(e) {
- var target = e.getTarget('.terms'),
- win;
-
- e.preventDefault();
-
- if (target) {
- win = Ext.widget('window', {
- title: 'Terms of Use',
- modal: true,
- html: Ext.getDom('legalese').innerHTML,
- width: 700,
- height: 400,
- bodyStyle: 'padding: 10px 20px;',
- autoScroll: true,
-
- buttons: [{
- text: 'Decline',
- handler: function() {
- this.up('window').close();
- formPanel.down('[name=acceptTerms]').setValue(false);
- }
- }, {
- text: 'Accept',
- handler: function() {
- this.up('window').close();
- formPanel.down('[name=acceptTerms]').setValue(true);
- }
- }]
- });
- win.show();
- }
- }
- }
- },
- // Custom validation logic - requires the checkbox to be checked
- getErrors: function() {
- return this.getValue() ? [] : ['You must accept the Terms of Use']
- }
- }],
- dockedItems: [{
- xtype: 'container',
- dock: 'bottom',
- layout: {
- type: 'hbox',
- align: 'middle'
- },
- padding: '10 10 5',
- items: [{
- xtype: 'component',
- id: 'formErrorState',
- baseCls: 'form-error-state',
- flex: 1,
- validText: 'Form is valid',
- invalidText: 'Form has errors',
- tipTpl: Ext.create('Ext.XTemplate', '<ul><tpl for="."><li><span class="field-name">{name}</span>: <span class="error">{error}</span></li></tpl></ul>'),
- getTip: function() {
- var tip = this.tip;
- if (!tip) {
- tip = this.tip = Ext.widget('tooltip', {
- target: this.el,
- title: 'Error Details:',
- autoHide: false,
- anchor: 'top',
- mouseOffset: [-11, -2],
- closable: true,
- constrainPosition: false,
- cls: 'errors-tip'
- });
- tip.show();
- }
- return tip;
- },
- setErrors: function(errors) {
- var me = this,
- baseCls = me.baseCls,
- tip = me.getTip();
- errors = Ext.Array.from(errors);
- // Update CSS class and tooltip content
- if (errors.length) {
- me.addCls(baseCls + '-invalid');
- me.removeCls(baseCls + '-valid');
- me.update(me.invalidText);
- tip.setDisabled(false);
- tip.update(me.tipTpl.apply(errors));
- } else {
- me.addCls(baseCls + '-valid');
- me.removeCls(baseCls + '-invalid');
- me.update(me.validText);
- tip.setDisabled(true);
- tip.hide();
- }
- }
- }, {
- xtype: 'button',
- formBind: true,
- disabled: true,
- text: 'Submit Registration',
- width: 140,
- handler: function() {
- var form = this.up('form').getForm();
- /* Normally we would submit the form to the server here and handle the response...
- form.submit({
- clientValidation: true,
- url: 'register.php',
- success: function(form, action) {
- //...
- },
- failure: function(form, action) {
- //...
- }
- });
- */
- if (form.isValid()) {
- Ext.Msg.alert('Submitted Values', form.getValues(true));
- }
- }
- }]
- }]
- });
- });
|