0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-02-24 23:48:13 -05:00

Fix un-bound HTML attributes for gh-trim-focus-input

no issue
- updates `gh-trim-focus-input` to extend from `gh-input`/`one-way-input` to get the auto-binding attribute behaviour for passed-in HTML attributes
- renames `focus` property to `shouldFocus` so that we're not overriding default DOM functions
- fixes signin page issues with missing placeholders and no autofocus
This commit is contained in:
Kevin Ansfield 2016-06-20 15:20:25 +01:00
parent 80c8e746f6
commit df58953778
4 changed files with 20 additions and 94 deletions

View file

@ -1,9 +1,8 @@
/*global device*/ /*global device*/
import Ember from 'ember'; import Ember from 'ember';
import boundOneWay from 'ghost-admin/utils/bound-one-way'; import GhostInput from 'ghost-admin/components/gh-input';
import {InvokeActionMixin} from 'ember-invoke-action';
const {Component, computed} = Ember; const {computed} = Ember;
/** /**
* This doesn't override the OneWayInput component because * This doesn't override the OneWayInput component because
@ -11,113 +10,40 @@ const {Component, computed} = Ember;
* parts from both the OneWayInput component and Ember's default * parts from both the OneWayInput component and Ember's default
* input component * input component
*/ */
const TrimFocusInputComponent = Component.extend(InvokeActionMixin, { const TrimFocusInputComponent = GhostInput.extend({
tagName: 'input',
type: 'text',
focus: true,
classNames: 'gh-input',
// This is taken from Ember's input component shouldFocus: true,
attributeBindings: [
'autofocus',
'_value:value',
'accept',
'autocomplete',
'autosave',
'dir',
'formaction',
'formenctype',
'formmethod',
'formnovalidate',
'formtarget',
'height',
'inputmode',
'lang',
'list',
'multiple',
'name',
'pattern',
'size',
'step',
'type',
'value',
'width'
],
// These were in Ember's component attributeBindings: ['autofocus'],
// so they are reproduced here
size: null,
pattern: null,
max: null,
min: null,
_value: boundOneWay('value'),
autofocus: computed(function () { autofocus: computed(function () {
if (this.get('focus')) { if (this.get('shouldFocus')) {
return (device.ios()) ? false : 'autofocus'; return (device.ios()) ? false : 'autofocus';
} }
return false; return false;
}), }),
keyEvents: { init() {
'13': 'onenter', this._super(...arguments);
'27': 'onescape'
},
input() {
this._handleChangeEvent();
},
change() {
this._handleChangeEvent();
},
keyUp(event) {
this._interpretKeyEvents(event);
},
_interpretKeyEvents(event) {
let method = this.get(`keyEvents.${event.keyCode}`);
if (method) {
this._sanitizedValue = null;
this._handleChangeEvent(method);
}
},
_handleChangeEvent(method = 'update') {
let value = this.readDOMAttr('value');
this.invokeAction(method, value);
},
_trimValue() {
let text = this.readDOMAttr('value');
this.invokeAction('update', text.trim());
}, },
didInsertElement() { didInsertElement() {
this._super(...arguments); this._super(...arguments);
this._setFocus(); this._focus();
}, },
_setFocus() { sanitizeInput(input) {
return input.trim();
},
_focus() {
// Until mobile safari has better support // Until mobile safari has better support
// for focusing, we just ignore it // for focusing, we just ignore it
if (this.get('focus') && !device.ios()) { if (this.get('shouldFocus') && !device.ios()) {
this.$().focus(); this.element.focus();
} }
},
focusOut() {
this._super(...arguments);
this._trimValue();
} }
}); });
TrimFocusInputComponent.reopenClass({
positionalParams: ['value']
});
export default TrimFocusInputComponent; export default TrimFocusInputComponent;

View file

@ -6,7 +6,7 @@
<div class="gh-blognav-line"> <div class="gh-blognav-line">
{{#gh-validation-status-container tagName="span" class="gh-blognav-label" errors=navItem.errors property="label" hasValidated=navItem.hasValidated}} {{#gh-validation-status-container tagName="span" class="gh-blognav-label" errors=navItem.errors property="label" hasValidated=navItem.hasValidated}}
{{gh-trim-focus-input navItem.label focus=navItem.last placeholder="Label" keyPress=(action "clearLabelErrors") update=(action (mut navItem.label))}} {{gh-trim-focus-input navItem.label shouldFocus=navItem.last placeholder="Label" keyPress=(action "clearLabelErrors") update=(action (mut navItem.label))}}
{{gh-error-message errors=navItem.errors property="label"}} {{gh-error-message errors=navItem.errors property="label"}}
{{/gh-validation-status-container}} {{/gh-validation-status-container}}
{{#gh-validation-status-container tagName="span" class="gh-blognav-url" errors=navItem.errors property="url" hasValidated=navItem.hasValidated}} {{#gh-validation-status-container tagName="span" class="gh-blognav-url" errors=navItem.errors property="url" hasValidated=navItem.hasValidated}}

View file

@ -1,7 +1,7 @@
<section class="gh-view"> <section class="gh-view">
<header class="view-header"> <header class="view-header">
{{#gh-view-title classNames="gh-editor-title" openMobileMenu="openMobileMenu"}} {{#gh-view-title classNames="gh-editor-title" openMobileMenu="openMobileMenu"}}
{{gh-trim-focus-input model.titleScratch type="text" id="entry-title" placeholder="Your Post Title" tabindex="1" focus=shouldFocusTitle focus-out="updateTitle" update=(action (mut model.titleScratch))}} {{gh-trim-focus-input model.titleScratch type="text" id="entry-title" placeholder="Your Post Title" tabindex="1" shouldFocus=shouldFocusTitle focus-out="updateTitle" update=(action (mut model.titleScratch))}}
{{/gh-view-title}} {{/gh-view-title}}
{{#if scheduleCountdown}} {{#if scheduleCountdown}}
<time datetime="{{post.publishedAtUTC}}" class="gh-notification gh-notification-schedule"> <time datetime="{{post.publishedAtUTC}}" class="gh-notification gh-notification-schedule">

View file

@ -28,13 +28,13 @@ describeComponent(
it('does not have the autofocus attribute if not set to focus', function () { it('does not have the autofocus attribute if not set to focus', function () {
this.set('text', 'some text'); this.set('text', 'some text');
this.render(hbs`{{gh-trim-focus-input text focus=false}}`); this.render(hbs`{{gh-trim-focus-input text shouldFocus=false}}`);
expect(this.$('.gh-input').attr('autofocus')).to.not.be.ok; expect(this.$('.gh-input').attr('autofocus')).to.not.be.ok;
}); });
it('has the autofocus attribute if set to focus', function () { it('has the autofocus attribute if set to focus', function () {
this.set('text', 'some text'); this.set('text', 'some text');
this.render(hbs`{{gh-trim-focus-input text focus=true}}`); this.render(hbs`{{gh-trim-focus-input text shouldFocus=true}}`);
expect(this.$('.gh-input').attr('autofocus')).to.be.ok; expect(this.$('.gh-input').attr('autofocus')).to.be.ok;
}); });
} }