|
|
@@ -0,0 +1,167 @@ |
|
|
|
/*! |
|
|
|
* bsCustomFileInput v1.3.2 (https://github.com/Johann-S/bs-custom-file-input) |
|
|
|
* Copyright 2018 - 2019 Johann-S <johann.servoire@gmail.com> |
|
|
|
* Licensed under MIT (https://github.com/Johann-S/bs-custom-file-input/blob/master/LICENSE) |
|
|
|
*/ |
|
|
|
(function (global, factory) { |
|
|
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : |
|
|
|
typeof define === 'function' && define.amd ? define(factory) : |
|
|
|
(global = global || self, global.bsCustomFileInput = factory()); |
|
|
|
}(this, function () { 'use strict'; |
|
|
|
|
|
|
|
var Selector = { |
|
|
|
CUSTOMFILE: '.custom-file input[type="file"]', |
|
|
|
CUSTOMFILELABEL: '.custom-file-label', |
|
|
|
FORM: 'form', |
|
|
|
INPUT: 'input' |
|
|
|
}; |
|
|
|
|
|
|
|
var textNodeType = 3; |
|
|
|
|
|
|
|
var getDefaultText = function getDefaultText(input) { |
|
|
|
var defaultText = ''; |
|
|
|
var label = input.parentNode.querySelector(Selector.CUSTOMFILELABEL); |
|
|
|
|
|
|
|
if (label) { |
|
|
|
defaultText = label.innerHTML; |
|
|
|
} |
|
|
|
|
|
|
|
return defaultText; |
|
|
|
}; |
|
|
|
|
|
|
|
var findFirstChildNode = function findFirstChildNode(element) { |
|
|
|
if (element.childNodes.length > 0) { |
|
|
|
var childNodes = [].slice.call(element.childNodes); |
|
|
|
|
|
|
|
for (var i = 0; i < childNodes.length; i++) { |
|
|
|
var node = childNodes[i]; |
|
|
|
|
|
|
|
if (node.nodeType !== textNodeType) { |
|
|
|
return node; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return element; |
|
|
|
}; |
|
|
|
|
|
|
|
var restoreDefaultText = function restoreDefaultText(input) { |
|
|
|
var defaultText = input.bsCustomFileInput.defaultText; |
|
|
|
var label = input.parentNode.querySelector(Selector.CUSTOMFILELABEL); |
|
|
|
|
|
|
|
if (label) { |
|
|
|
var element = findFirstChildNode(label); |
|
|
|
element.innerHTML = defaultText; |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
var fileApi = !!window.File; |
|
|
|
var FAKE_PATH = 'fakepath'; |
|
|
|
var FAKE_PATH_SEPARATOR = '\\'; |
|
|
|
|
|
|
|
var getSelectedFiles = function getSelectedFiles(input) { |
|
|
|
if (input.hasAttribute('multiple') && fileApi) { |
|
|
|
return [].slice.call(input.files).map(function (file) { |
|
|
|
return file.name; |
|
|
|
}).join(', '); |
|
|
|
} |
|
|
|
|
|
|
|
if (input.value.indexOf(FAKE_PATH) !== -1) { |
|
|
|
var splittedValue = input.value.split(FAKE_PATH_SEPARATOR); |
|
|
|
return splittedValue[splittedValue.length - 1]; |
|
|
|
} |
|
|
|
|
|
|
|
return input.value; |
|
|
|
}; |
|
|
|
|
|
|
|
function handleInputChange() { |
|
|
|
var label = this.parentNode.querySelector(Selector.CUSTOMFILELABEL); |
|
|
|
|
|
|
|
if (label) { |
|
|
|
var element = findFirstChildNode(label); |
|
|
|
var inputValue = getSelectedFiles(this); |
|
|
|
|
|
|
|
if (inputValue.length) { |
|
|
|
element.innerHTML = inputValue; |
|
|
|
} else { |
|
|
|
restoreDefaultText(this); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
function handleFormReset() { |
|
|
|
var customFileList = [].slice.call(this.querySelectorAll(Selector.INPUT)).filter(function (input) { |
|
|
|
return !!input.bsCustomFileInput; |
|
|
|
}); |
|
|
|
|
|
|
|
for (var i = 0, len = customFileList.length; i < len; i++) { |
|
|
|
restoreDefaultText(customFileList[i]); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
var customProperty = 'bsCustomFileInput'; |
|
|
|
var Event = { |
|
|
|
FORMRESET: 'reset', |
|
|
|
INPUTCHANGE: 'change' |
|
|
|
}; |
|
|
|
var bsCustomFileInput = { |
|
|
|
init: function init(inputSelector, formSelector) { |
|
|
|
if (inputSelector === void 0) { |
|
|
|
inputSelector = Selector.CUSTOMFILE; |
|
|
|
} |
|
|
|
|
|
|
|
if (formSelector === void 0) { |
|
|
|
formSelector = Selector.FORM; |
|
|
|
} |
|
|
|
|
|
|
|
var customFileInputList = [].slice.call(document.querySelectorAll(inputSelector)); |
|
|
|
var formList = [].slice.call(document.querySelectorAll(formSelector)); |
|
|
|
|
|
|
|
for (var i = 0, len = customFileInputList.length; i < len; i++) { |
|
|
|
var input = customFileInputList[i]; |
|
|
|
Object.defineProperty(input, customProperty, { |
|
|
|
value: { |
|
|
|
defaultText: getDefaultText(input) |
|
|
|
}, |
|
|
|
writable: true |
|
|
|
}); |
|
|
|
handleInputChange.call(input); |
|
|
|
input.addEventListener(Event.INPUTCHANGE, handleInputChange); |
|
|
|
} |
|
|
|
|
|
|
|
for (var _i = 0, _len = formList.length; _i < _len; _i++) { |
|
|
|
formList[_i].addEventListener(Event.FORMRESET, handleFormReset); |
|
|
|
|
|
|
|
Object.defineProperty(formList[_i], customProperty, { |
|
|
|
value: true, |
|
|
|
writable: true |
|
|
|
}); |
|
|
|
} |
|
|
|
}, |
|
|
|
destroy: function destroy() { |
|
|
|
var formList = [].slice.call(document.querySelectorAll(Selector.FORM)).filter(function (form) { |
|
|
|
return !!form.bsCustomFileInput; |
|
|
|
}); |
|
|
|
var customFileInputList = [].slice.call(document.querySelectorAll(Selector.INPUT)).filter(function (input) { |
|
|
|
return !!input.bsCustomFileInput; |
|
|
|
}); |
|
|
|
|
|
|
|
for (var i = 0, len = customFileInputList.length; i < len; i++) { |
|
|
|
var input = customFileInputList[i]; |
|
|
|
restoreDefaultText(input); |
|
|
|
input[customProperty] = undefined; |
|
|
|
input.removeEventListener(Event.INPUTCHANGE, handleInputChange); |
|
|
|
} |
|
|
|
|
|
|
|
for (var _i2 = 0, _len2 = formList.length; _i2 < _len2; _i2++) { |
|
|
|
formList[_i2].removeEventListener(Event.FORMRESET, handleFormReset); |
|
|
|
|
|
|
|
formList[_i2][customProperty] = undefined; |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
return bsCustomFileInput; |
|
|
|
|
|
|
|
})); |
|
|
|
//# sourceMappingURL=bs-custom-file-input.js.map |