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:
parent
80c8e746f6
commit
df58953778
4 changed files with 20 additions and 94 deletions
|
@ -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;
|
||||||
|
|
|
@ -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}}
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue