Merge branch 'master' into multi-file-editor-vuex
This commit is contained in:
commit
e6a1a798f5
|
@ -1,8 +1,8 @@
|
|||
import autosize from 'vendor/autosize';
|
||||
import Autosize from 'autosize';
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const autosizeEls = document.querySelectorAll('.js-autosize');
|
||||
|
||||
autosize(autosizeEls);
|
||||
autosize.update(autosizeEls);
|
||||
Autosize(autosizeEls);
|
||||
Autosize.update(autosizeEls);
|
||||
});
|
||||
|
|
|
@ -12,7 +12,7 @@ newline-per-chained-call, no-useless-escape, class-methods-use-this */
|
|||
import $ from 'jquery';
|
||||
import _ from 'underscore';
|
||||
import Cookies from 'js-cookie';
|
||||
import autosize from 'vendor/autosize';
|
||||
import Autosize from 'autosize';
|
||||
import 'vendor/jquery.caret'; // required by jquery.atwho
|
||||
import 'vendor/jquery.atwho';
|
||||
import AjaxCache from '~/lib/utils/ajax_cache';
|
||||
|
@ -25,7 +25,7 @@ import TaskList from './task_list';
|
|||
import { ajaxPost, isInViewport, getPagePath, scrollToElement, isMetaKey } from './lib/utils/common_utils';
|
||||
import imageDiffHelper from './image_diff/helpers/index';
|
||||
|
||||
window.autosize = autosize;
|
||||
window.autosize = Autosize;
|
||||
|
||||
function normalizeNewlines(str) {
|
||||
return str.replace(/\r\n/g, '\n');
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<script>
|
||||
import { mapActions, mapGetters } from 'vuex';
|
||||
import _ from 'underscore';
|
||||
import autosize from 'vendor/autosize';
|
||||
import Autosize from 'autosize';
|
||||
import Flash from '../../flash';
|
||||
import Autosave from '../../autosave';
|
||||
import TaskList from '../../task_list';
|
||||
|
@ -219,7 +219,7 @@
|
|||
},
|
||||
resizeTextarea() {
|
||||
this.$nextTick(() => {
|
||||
autosize.update(this.$refs.textarea);
|
||||
Autosize.update(this.$refs.textarea);
|
||||
});
|
||||
},
|
||||
},
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
<script>
|
||||
import { mapState } from 'vuex';
|
||||
import newModal from './modal.vue';
|
||||
import upload from './upload.vue';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
newModal,
|
||||
upload,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
@ -55,6 +57,11 @@
|
|||
{{ __('New file') }}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<upload
|
||||
:current-path="currentPath"
|
||||
/>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href="#"
|
||||
|
|
|
@ -0,0 +1,67 @@
|
|||
<script>
|
||||
import eventHub from '../../event_hub';
|
||||
|
||||
export default {
|
||||
props: {
|
||||
currentPath: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
createFile(target, file, isText) {
|
||||
const { name } = file;
|
||||
const nameWithPath = `${this.currentPath !== '' ? `${this.currentPath}/` : ''}${name}`;
|
||||
let { result } = target;
|
||||
|
||||
if (!isText) {
|
||||
result = result.split('base64,')[1];
|
||||
}
|
||||
|
||||
eventHub.$emit('createNewEntry', {
|
||||
name: nameWithPath,
|
||||
type: 'blob',
|
||||
content: result,
|
||||
toggleModal: false,
|
||||
base64: !isText,
|
||||
}, isText);
|
||||
},
|
||||
readFile(file) {
|
||||
const reader = new FileReader();
|
||||
const isText = file.type.match(/text.*/) !== null;
|
||||
|
||||
reader.addEventListener('load', e => this.createFile(e.target, file, isText), { once: true });
|
||||
|
||||
if (isText) {
|
||||
reader.readAsText(file);
|
||||
} else {
|
||||
reader.readAsDataURL(file);
|
||||
}
|
||||
},
|
||||
openFile() {
|
||||
Array.from(this.$refs.fileUpload.files).forEach(file => this.readFile(file));
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.$refs.fileUpload.addEventListener('change', this.openFile);
|
||||
},
|
||||
beforeDestroy() {
|
||||
this.$refs.fileUpload.removeEventListener('change', this.openFile);
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<label
|
||||
role="button"
|
||||
class="menu-item"
|
||||
>
|
||||
{{ __('Upload file') }}
|
||||
<input
|
||||
id="file-upload"
|
||||
type="file"
|
||||
class="hidden"
|
||||
ref="fileUpload"
|
||||
/>
|
||||
</label>
|
||||
</template>
|
|
@ -37,6 +37,13 @@ export default {
|
|||
v-if="!activeFile.renderError"
|
||||
v-html="activeFile.html">
|
||||
</div>
|
||||
<div
|
||||
v-else-if="activeFile.tempFile"
|
||||
class="vertical-center render-error">
|
||||
<p class="text-center">
|
||||
The source could not be displayed for this temporary file.
|
||||
</p>
|
||||
</div>
|
||||
<div
|
||||
v-else-if="renderErrorTooLarge"
|
||||
class="vertical-center render-error">
|
||||
|
|
|
@ -13,7 +13,7 @@ export default {
|
|||
},
|
||||
getRawFileData(file) {
|
||||
if (file.tempFile) {
|
||||
return Promise.resolve('');
|
||||
return Promise.resolve(file.content);
|
||||
}
|
||||
|
||||
return Vue.http.get(file.rawPath, { params: { format: 'json' } })
|
||||
|
|
|
@ -776,12 +776,15 @@
|
|||
a,
|
||||
button,
|
||||
.menu-item {
|
||||
margin-bottom: 0;
|
||||
border-radius: 0;
|
||||
box-shadow: none;
|
||||
padding: 8px 16px;
|
||||
text-align: left;
|
||||
white-space: normal;
|
||||
width: 100%;
|
||||
font-weight: $gl-font-weight-normal;
|
||||
line-height: normal;
|
||||
|
||||
&.dropdown-menu-user-link {
|
||||
white-space: nowrap;
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Only set Auto-Submitted header once for emails on push
|
||||
merge_request:
|
||||
author:
|
||||
type: fixed
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Allow files to uploaded in the multi-file editor
|
||||
merge_request:
|
||||
author:
|
||||
type: added
|
|
@ -1,8 +1,6 @@
|
|||
class AdditionalEmailHeadersInterceptor
|
||||
def self.delivering_email(message)
|
||||
message.headers(
|
||||
'Auto-Submitted' => 'auto-generated',
|
||||
'X-Auto-Response-Suppress' => 'All'
|
||||
)
|
||||
message.header['Auto-Submitted'] ||= 'auto-generated'
|
||||
message.header['X-Auto-Response-Suppress'] ||= 'All'
|
||||
end
|
||||
end
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
"webpack-prod": "NODE_ENV=production webpack --config config/webpack.config.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"autosize": "^4.0.0",
|
||||
"axios": "^0.16.2",
|
||||
"babel-core": "^6.22.1",
|
||||
"babel-eslint": "^7.2.1",
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
require 'spec_helper'
|
||||
|
||||
feature 'Multi-file editor upload file', :js do
|
||||
include WaitForRequests
|
||||
|
||||
let(:user) { create(:user) }
|
||||
let(:project) { create(:project, :repository) }
|
||||
let(:txt_file) { File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt') }
|
||||
let(:img_file) { File.join(Rails.root, 'spec', 'fixtures', 'dk.png') }
|
||||
|
||||
before do
|
||||
project.add_master(user)
|
||||
sign_in(user)
|
||||
|
||||
page.driver.set_cookie('new_repo', 'true')
|
||||
|
||||
visit project_tree_path(project, :master)
|
||||
|
||||
wait_for_requests
|
||||
end
|
||||
|
||||
it 'uploads text file' do
|
||||
find('.add-to-tree').click
|
||||
|
||||
# make the field visible so capybara can use it
|
||||
execute_script('document.querySelector("#file-upload").classList.remove("hidden")')
|
||||
attach_file('file-upload', txt_file)
|
||||
|
||||
find('.add-to-tree').click
|
||||
|
||||
expect(page).to have_selector('.repo-tab', text: 'doc_sample.txt')
|
||||
expect(page).to have_content(File.open(txt_file, &:readline))
|
||||
end
|
||||
|
||||
it 'uploads image file' do
|
||||
find('.add-to-tree').click
|
||||
|
||||
# make the field visible so capybara can use it
|
||||
execute_script('document.querySelector("#file-upload").classList.remove("hidden")')
|
||||
attach_file('file-upload', img_file)
|
||||
|
||||
find('.add-to-tree').click
|
||||
|
||||
expect(page).to have_selector('.repo-tab', text: 'dk.png')
|
||||
expect(page).not_to have_selector('.monaco-editor')
|
||||
expect(page).to have_content('The source could not be displayed for this temporary file.')
|
||||
end
|
||||
end
|
|
@ -1,9 +1,9 @@
|
|||
import autosize from 'vendor/autosize';
|
||||
import Autosize from 'autosize';
|
||||
import GLForm from '~/gl_form';
|
||||
import '~/lib/utils/text_utility';
|
||||
import '~/lib/utils/common_utils';
|
||||
|
||||
window.autosize = autosize;
|
||||
window.autosize = Autosize;
|
||||
|
||||
describe('GLForm', () => {
|
||||
describe('when instantiated', function () {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* global Notes */
|
||||
|
||||
import 'vendor/autosize';
|
||||
import 'autosize';
|
||||
import '~/gl_form';
|
||||
import '~/lib/utils/text_utility';
|
||||
import '~/render_gfm';
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import Vue from 'vue';
|
||||
import autosize from 'vendor/autosize';
|
||||
import Autosize from 'autosize';
|
||||
import store from '~/notes/stores';
|
||||
import issueCommentForm from '~/notes/components/issue_comment_form.vue';
|
||||
import { loggedOutIssueData, notesDataMock, userDataMock, issueDataMock } from '../mock_data';
|
||||
|
@ -97,14 +97,14 @@ describe('issue_comment_form component', () => {
|
|||
});
|
||||
|
||||
it('should resize textarea after note discarded', (done) => {
|
||||
spyOn(autosize, 'update');
|
||||
spyOn(Autosize, 'update');
|
||||
spyOn(vm, 'discard').and.callThrough();
|
||||
|
||||
vm.note = 'foo';
|
||||
vm.discard();
|
||||
|
||||
Vue.nextTick(() => {
|
||||
expect(autosize.update).toHaveBeenCalled();
|
||||
expect(Autosize.update).toHaveBeenCalled();
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* eslint-disable space-before-function-paren, no-unused-expressions, no-var, object-shorthand, comma-dangle, max-len */
|
||||
/* global Notes */
|
||||
|
||||
import 'vendor/autosize';
|
||||
import 'autosize';
|
||||
import '~/gl_form';
|
||||
import '~/lib/utils/text_utility';
|
||||
import '~/render_gfm';
|
||||
|
|
|
@ -0,0 +1,100 @@
|
|||
import Vue from 'vue';
|
||||
import upload from '~/repo/components/new_dropdown/upload.vue';
|
||||
import eventHub from '~/repo/event_hub';
|
||||
import createComponent from '../../../helpers/vue_mount_component_helper';
|
||||
|
||||
describe('new dropdown upload', () => {
|
||||
let vm;
|
||||
|
||||
beforeEach(() => {
|
||||
const Component = Vue.extend(upload);
|
||||
|
||||
vm = createComponent(Component, {
|
||||
currentPath: '',
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vm.$destroy();
|
||||
});
|
||||
|
||||
describe('readFile', () => {
|
||||
beforeEach(() => {
|
||||
spyOn(FileReader.prototype, 'readAsText');
|
||||
spyOn(FileReader.prototype, 'readAsDataURL');
|
||||
});
|
||||
|
||||
it('calls readAsText for text files', () => {
|
||||
const file = {
|
||||
type: 'text/html',
|
||||
};
|
||||
|
||||
vm.readFile(file);
|
||||
|
||||
expect(FileReader.prototype.readAsText).toHaveBeenCalledWith(file);
|
||||
});
|
||||
|
||||
it('calls readAsDataURL for non-text files', () => {
|
||||
const file = {
|
||||
type: 'images/png',
|
||||
};
|
||||
|
||||
vm.readFile(file);
|
||||
|
||||
expect(FileReader.prototype.readAsDataURL).toHaveBeenCalledWith(file);
|
||||
});
|
||||
});
|
||||
|
||||
describe('createFile', () => {
|
||||
const target = {
|
||||
result: 'content',
|
||||
};
|
||||
const binaryTarget = {
|
||||
result: 'base64,base64content',
|
||||
};
|
||||
const file = {
|
||||
name: 'file',
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
spyOn(eventHub, '$emit');
|
||||
});
|
||||
|
||||
it('emits createNewEntry event', () => {
|
||||
vm.createFile(target, file, true);
|
||||
|
||||
expect(eventHub.$emit).toHaveBeenCalledWith('createNewEntry', {
|
||||
name: 'file',
|
||||
type: 'blob',
|
||||
content: 'content',
|
||||
toggleModal: false,
|
||||
base64: false,
|
||||
}, true);
|
||||
});
|
||||
|
||||
it('createNewEntry event name contains current path', () => {
|
||||
vm.currentPath = 'testing';
|
||||
vm.createFile(target, file, true);
|
||||
|
||||
expect(eventHub.$emit).toHaveBeenCalledWith('createNewEntry', {
|
||||
name: 'testing/file',
|
||||
type: 'blob',
|
||||
content: 'content',
|
||||
toggleModal: false,
|
||||
base64: false,
|
||||
}, true);
|
||||
});
|
||||
|
||||
it('splits content on base64 if binary', () => {
|
||||
vm.createFile(binaryTarget, file, false);
|
||||
|
||||
expect(eventHub.$emit).toHaveBeenCalledWith('createNewEntry', {
|
||||
name: 'file',
|
||||
type: 'blob',
|
||||
content: 'base64content',
|
||||
toggleModal: false,
|
||||
base64: true,
|
||||
}, false);
|
||||
});
|
||||
});
|
||||
});
|
|
@ -1,12 +1,29 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe AdditionalEmailHeadersInterceptor do
|
||||
it 'adds Auto-Submitted header' do
|
||||
mail = ActionMailer::Base.mail(to: 'test@mail.com', from: 'info@mail.com', body: 'hello').deliver
|
||||
let(:mail) do
|
||||
ActionMailer::Base.mail(to: 'test@mail.com', from: 'info@mail.com', body: 'hello')
|
||||
end
|
||||
|
||||
before do
|
||||
mail.deliver_now
|
||||
end
|
||||
|
||||
it 'adds Auto-Submitted header' do
|
||||
expect(mail.header['To'].value).to eq('test@mail.com')
|
||||
expect(mail.header['From'].value).to eq('info@mail.com')
|
||||
expect(mail.header['Auto-Submitted'].value).to eq('auto-generated')
|
||||
expect(mail.header['X-Auto-Response-Suppress'].value).to eq('All')
|
||||
end
|
||||
|
||||
context 'when the same mail object is sent twice' do
|
||||
before do
|
||||
mail.deliver_now
|
||||
end
|
||||
|
||||
it 'does not add the Auto-Submitted header twice' do
|
||||
expect(mail.header['Auto-Submitted'].value).to eq('auto-generated')
|
||||
expect(mail.header['X-Auto-Response-Suppress'].value).to eq('All')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,243 +0,0 @@
|
|||
/*!
|
||||
Autosize 3.0.14
|
||||
license: MIT
|
||||
http://www.jacklmoore.com/autosize
|
||||
*/
|
||||
(function (global, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define(['exports', 'module'], factory);
|
||||
} else if (typeof exports !== 'undefined' && typeof module !== 'undefined') {
|
||||
factory(exports, module);
|
||||
} else {
|
||||
var mod = {
|
||||
exports: {}
|
||||
};
|
||||
factory(mod.exports, mod);
|
||||
global.autosize = mod.exports;
|
||||
}
|
||||
})(this, function (exports, module) {
|
||||
'use strict';
|
||||
|
||||
var set = typeof Set === 'function' ? new Set() : (function () {
|
||||
var list = [];
|
||||
|
||||
return {
|
||||
has: function has(key) {
|
||||
return Boolean(list.indexOf(key) > -1);
|
||||
},
|
||||
add: function add(key) {
|
||||
list.push(key);
|
||||
},
|
||||
'delete': function _delete(key) {
|
||||
list.splice(list.indexOf(key), 1);
|
||||
} };
|
||||
})();
|
||||
|
||||
function assign(ta) {
|
||||
var _ref = arguments[1] === undefined ? {} : arguments[1];
|
||||
|
||||
var _ref$setOverflowX = _ref.setOverflowX;
|
||||
var setOverflowX = _ref$setOverflowX === undefined ? true : _ref$setOverflowX;
|
||||
var _ref$setOverflowY = _ref.setOverflowY;
|
||||
var setOverflowY = _ref$setOverflowY === undefined ? true : _ref$setOverflowY;
|
||||
|
||||
if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || set.has(ta)) return;
|
||||
|
||||
var heightOffset = null;
|
||||
var overflowY = null;
|
||||
var clientWidth = ta.clientWidth;
|
||||
|
||||
function init() {
|
||||
var style = window.getComputedStyle(ta, null);
|
||||
|
||||
overflowY = style.overflowY;
|
||||
|
||||
if (style.resize === 'vertical') {
|
||||
ta.style.resize = 'none';
|
||||
} else if (style.resize === 'both') {
|
||||
ta.style.resize = 'horizontal';
|
||||
}
|
||||
|
||||
if (style.boxSizing === 'content-box') {
|
||||
heightOffset = -(parseFloat(style.paddingTop) + parseFloat(style.paddingBottom));
|
||||
} else {
|
||||
heightOffset = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth);
|
||||
}
|
||||
// Fix when a textarea is not on document body and heightOffset is Not a Number
|
||||
if (isNaN(heightOffset)) {
|
||||
heightOffset = 0;
|
||||
}
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
function changeOverflow(value) {
|
||||
{
|
||||
// Chrome/Safari-specific fix:
|
||||
// When the textarea y-overflow is hidden, Chrome/Safari do not reflow the text to account for the space
|
||||
// made available by removing the scrollbar. The following forces the necessary text reflow.
|
||||
var width = ta.style.width;
|
||||
ta.style.width = '0px';
|
||||
// Force reflow:
|
||||
/* jshint ignore:start */
|
||||
ta.offsetWidth;
|
||||
/* jshint ignore:end */
|
||||
ta.style.width = width;
|
||||
}
|
||||
|
||||
overflowY = value;
|
||||
|
||||
if (setOverflowY) {
|
||||
ta.style.overflowY = value;
|
||||
}
|
||||
|
||||
resize();
|
||||
}
|
||||
|
||||
function resize() {
|
||||
var htmlTop = window.pageYOffset;
|
||||
var bodyTop = document.body.scrollTop;
|
||||
var originalHeight = ta.style.height;
|
||||
|
||||
ta.style.height = 'auto';
|
||||
|
||||
var endHeight = ta.scrollHeight + heightOffset;
|
||||
|
||||
if (ta.scrollHeight === 0) {
|
||||
// If the scrollHeight is 0, then the element probably has display:none or is detached from the DOM.
|
||||
ta.style.height = originalHeight;
|
||||
return;
|
||||
}
|
||||
|
||||
ta.style.height = endHeight + 'px';
|
||||
|
||||
// used to check if an update is actually necessary on window.resize
|
||||
clientWidth = ta.clientWidth;
|
||||
|
||||
// prevents scroll-position jumping
|
||||
document.documentElement.scrollTop = htmlTop;
|
||||
document.body.scrollTop = bodyTop;
|
||||
}
|
||||
|
||||
function update() {
|
||||
var startHeight = ta.style.height;
|
||||
|
||||
resize();
|
||||
|
||||
var style = window.getComputedStyle(ta, null);
|
||||
|
||||
if (style.height !== ta.style.height) {
|
||||
if (overflowY !== 'visible') {
|
||||
changeOverflow('visible');
|
||||
}
|
||||
} else {
|
||||
if (overflowY !== 'hidden') {
|
||||
changeOverflow('hidden');
|
||||
}
|
||||
}
|
||||
|
||||
if (startHeight !== ta.style.height) {
|
||||
var evt = document.createEvent('Event');
|
||||
evt.initEvent('autosize:resized', true, false);
|
||||
ta.dispatchEvent(evt);
|
||||
}
|
||||
}
|
||||
|
||||
var pageResize = function pageResize() {
|
||||
if (ta.clientWidth !== clientWidth) {
|
||||
update();
|
||||
}
|
||||
};
|
||||
|
||||
var destroy = (function (style) {
|
||||
window.removeEventListener('resize', pageResize, false);
|
||||
ta.removeEventListener('input', update, false);
|
||||
ta.removeEventListener('keyup', update, false);
|
||||
ta.removeEventListener('autosize:destroy', destroy, false);
|
||||
ta.removeEventListener('autosize:update', update, false);
|
||||
set['delete'](ta);
|
||||
|
||||
Object.keys(style).forEach(function (key) {
|
||||
ta.style[key] = style[key];
|
||||
});
|
||||
}).bind(ta, {
|
||||
height: ta.style.height,
|
||||
resize: ta.style.resize,
|
||||
overflowY: ta.style.overflowY,
|
||||
overflowX: ta.style.overflowX,
|
||||
wordWrap: ta.style.wordWrap });
|
||||
|
||||
ta.addEventListener('autosize:destroy', destroy, false);
|
||||
|
||||
// IE9 does not fire onpropertychange or oninput for deletions,
|
||||
// so binding to onkeyup to catch most of those events.
|
||||
// There is no way that I know of to detect something like 'cut' in IE9.
|
||||
if ('onpropertychange' in ta && 'oninput' in ta) {
|
||||
ta.addEventListener('keyup', update, false);
|
||||
}
|
||||
|
||||
window.addEventListener('resize', pageResize, false);
|
||||
ta.addEventListener('input', update, false);
|
||||
ta.addEventListener('autosize:update', update, false);
|
||||
set.add(ta);
|
||||
|
||||
if (setOverflowX) {
|
||||
ta.style.overflowX = 'hidden';
|
||||
ta.style.wordWrap = 'break-word';
|
||||
}
|
||||
|
||||
init();
|
||||
}
|
||||
|
||||
function destroy(ta) {
|
||||
if (!(ta && ta.nodeName && ta.nodeName === 'TEXTAREA')) return;
|
||||
var evt = document.createEvent('Event');
|
||||
evt.initEvent('autosize:destroy', true, false);
|
||||
ta.dispatchEvent(evt);
|
||||
}
|
||||
|
||||
function update(ta) {
|
||||
if (!(ta && ta.nodeName && ta.nodeName === 'TEXTAREA')) return;
|
||||
var evt = document.createEvent('Event');
|
||||
evt.initEvent('autosize:update', true, false);
|
||||
ta.dispatchEvent(evt);
|
||||
}
|
||||
|
||||
var autosize = null;
|
||||
|
||||
// Do nothing in Node.js environment and IE8 (or lower)
|
||||
if (typeof window === 'undefined' || typeof window.getComputedStyle !== 'function') {
|
||||
autosize = function (el) {
|
||||
return el;
|
||||
};
|
||||
autosize.destroy = function (el) {
|
||||
return el;
|
||||
};
|
||||
autosize.update = function (el) {
|
||||
return el;
|
||||
};
|
||||
} else {
|
||||
autosize = function (el, options) {
|
||||
if (el) {
|
||||
Array.prototype.forEach.call(el.length ? el : [el], function (x) {
|
||||
return assign(x, options);
|
||||
});
|
||||
}
|
||||
return el;
|
||||
};
|
||||
autosize.destroy = function (el) {
|
||||
if (el) {
|
||||
Array.prototype.forEach.call(el.length ? el : [el], destroy);
|
||||
}
|
||||
return el;
|
||||
};
|
||||
autosize.update = function (el) {
|
||||
if (el) {
|
||||
Array.prototype.forEach.call(el.length ? el : [el], update);
|
||||
}
|
||||
return el;
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = autosize;
|
||||
});
|
|
@ -248,6 +248,10 @@ autoprefixer@^6.3.1:
|
|||
postcss "^5.2.16"
|
||||
postcss-value-parser "^3.2.3"
|
||||
|
||||
autosize@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/autosize/-/autosize-4.0.0.tgz#7a0599b1ba84d73bd7589b0d9da3870152c69237"
|
||||
|
||||
aws-sign2@~0.6.0:
|
||||
version "0.6.0"
|
||||
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
|
||||
|
|
Loading…
Reference in New Issue