ebraft-finder
Version:
Media manager for EBraft Editor.
1,262 lines (1,033 loc) • 84 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("react"));
else if(typeof define === 'function' && define.amd)
define(["react"], factory);
else {
var a = typeof exports === 'object' ? factory(require("react")) : factory(root["react"]);
for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
}
})(window, function(__WEBPACK_EXTERNAL_MODULE__0__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "/";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 3);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE__0__;
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var UniqueIndex = exports.UniqueIndex = function UniqueIndex() {
if (isNaN(window.__BRAFT_MM_UNIQUE_INDEX__)) {
window.__BRAFT_MM_UNIQUE_INDEX__ = 1;
} else {
window.__BRAFT_MM_UNIQUE_INDEX__ += 1;
}
return window.__BRAFT_MM_UNIQUE_INDEX__;
};
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var compressImage = exports.compressImage = function compressImage(url) {
var width = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1280;
var height = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 800;
return new Promise(function (resolve, reject) {
var image = new Image();
image.src = url;
image.onerror = function (error) {
reject(error);
};
image.onload = function () {
try {
var compressCanvas = document.createElement('canvas');
var scale = this.width > width || this.height > height ? this.width > this.height ? width / this.width : height / this.height : 1;
compressCanvas.width = this.width * scale;
compressCanvas.height = this.height * scale;
var canvasContext = compressCanvas.getContext('2d');
canvasContext.drawImage(this, 0, 0, compressCanvas.width, compressCanvas.height);
resolve({
url: compressCanvas.toDataURL('image/png', 1),
width: compressCanvas.width,
height: compressCanvas.height
});
} catch (error) {
reject(error);
}
};
});
};
/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ImageUtils = undefined;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _react = __webpack_require__(0);
var _react2 = _interopRequireDefault(_react);
var _controller = __webpack_require__(4);
var _controller2 = _interopRequireDefault(_controller);
var _view = __webpack_require__(5);
var _view2 = _interopRequireDefault(_view);
var _languages = __webpack_require__(13);
var _languages2 = _interopRequireDefault(_languages);
var _image = __webpack_require__(2);
var ImageUtils = _interopRequireWildcard(_image);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var BraftFinder = function (_FinderController) {
_inherits(BraftFinder, _FinderController);
function BraftFinder(props) {
_classCallCheck(this, BraftFinder);
var _this = _possibleConstructorReturn(this, (BraftFinder.__proto__ || Object.getPrototypeOf(BraftFinder)).call(this, props));
_initialiseProps.call(_this);
_this.superProps = props;
return _this;
}
return BraftFinder;
}(_controller2.default);
var _initialiseProps = function _initialiseProps() {
var _this2 = this;
this.ReactComponent = function () {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var componentProps = _extends({}, _this2.superProps, props);
var language = (typeof componentProps.language === 'function' ? componentProps.language(_languages2.default, 'braft-finder') : _languages2.default[componentProps.language]) || _languages2.default['zh'];
return _react2.default.createElement(_view2.default, _extends({}, componentProps, {
language: language,
controller: _this2
}));
};
};
exports.default = BraftFinder;
exports.ImageUtils = ImageUtils;
/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _base = __webpack_require__(1);
var _image = __webpack_require__(2);
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var defaultValidator = function defaultValidator() {
return true;
};
var BraftFinderController = function BraftFinderController() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, BraftFinderController);
_initialiseProps.call(this);
this.items = props.items || [];
this.uploadFn = props.uploader;
this.validateFn = props.validator || defaultValidator;
this.changeListeners = [];
}
// resolvePastedFiles ({ clipboardData }, callback) {
// if (clipboardData && clipboardData.items && clipboardData.items[0].type.indexOf('image') > -1) {
// this.uploadImage(clipboardData.items[0].getAsFile(), callback)
// }
// }
;
var _initialiseProps = function _initialiseProps() {
var _this = this;
this.setProps = function () {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_this.items = props.items || _this.items || [];
_this.uploadFn = props.uploader;
_this.validateFn = props.validator || defaultValidator;
};
this.getMediaItem = function (id) {
return _this.items.find(function (item) {
return item.id === id;
});
};
this.getSelectedItems = function () {
return _this.items.filter(function (item) {
return item.selected;
});
};
this.getItems = function () {
return _this.items;
};
this.setItems = function (items) {
_this.items = items.map(function (item) {
return _extends({}, item, { id: item.id.toString() });
}) || [];
_this.applyChange();
_this.uploadItems();
};
this.addMediaItem = function (item) {
_this.addItems([item]);
};
this.addItems = function (items) {
_this.items = [].concat(_toConsumableArray(_this.items), _toConsumableArray(items.map(function (item) {
return _extends({}, item, { id: item.id.toString() });
})));
_this.applyChange();
_this.uploadItems();
};
this.selectMediaItem = function (id) {
var item = _this.getMediaItem(id);
if (item && (item.uploading || item.error)) {
return false;
}
_this.setMediaItemState(id, {
selected: true
});
};
this.selectAllItems = function () {
_this.items = _this.items.filter(function (item) {
return !item.error && !item.uploading;
}).map(function (item) {
return _extends({}, item, { selected: true });
});
_this.applyChange();
};
this.deselectMediaItem = function (id) {
_this.setMediaItemState(id, {
selected: false
});
};
this.deselectAllItems = function () {
_this.items = _this.items.map(function (item) {
return _extends({}, item, { selected: false });
});
_this.applyChange();
};
this.removeMediaItem = function (id) {
_this.items = _this.items.filter(function (item) {
return item.id !== id;
});
_this.applyChange();
};
this.removeItems = function () {
var ids = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
_this.items = _this.items.filter(function (item) {
return !ids.includes(item.id);
});
_this.applyChange();
};
this.removeSelectedItems = function () {
_this.items = _this.items.filter(function (item) {
return !item.selected;
});
_this.applyChange();
};
this.removeErrorItems = function () {
_this.items = _this.items.filter(function (item) {
return !item.error;
});
_this.applyChange();
};
this.removeAllItems = function () {
_this.items = [];
_this.applyChange();
};
this.setMediaItemState = function (id, state) {
_this.items = _this.items.map(function (item) {
return item.id === id ? _extends({}, item, state) : item;
});
_this.applyChange();
};
this.reuploadErrorItems = function () {
_this.uploadItems(true);
};
this.uploadItems = function () {
var ignoreError = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
_this.items.forEach(function (item, index) {
if (item.uploading || item.url) {
return false;
}
if (!ignoreError && item.error) {
return false;
}
if (item.type === 'IMAGE') {
_this.createThumbnail(item);
_this.uploadFn = _this.uploadFn || _this.createInlineImage;
} else if (!_this.uploadFn) {
_this.setMediaItemState(item.id, { error: 1 });
return false;
}
_this.setMediaItemState(item.id, {
uploading: true,
uploadProgress: 0,
error: 0
});
_this.uploadFn({
id: item.id,
file: item.file,
success: function success(res) {
_this.handleUploadSuccess(item.id, res);
},
progress: function progress(_progress) {
_this.setMediaItemState(item.id, {
uploading: true,
uploadProgress: _progress
});
},
error: function error(_error) {
_this.setMediaItemState(item.id, {
uploading: false,
error: 2
});
}
});
});
};
this.createThumbnail = function (_ref) {
var id = _ref.id,
file = _ref.file;
(0, _image.compressImage)(URL.createObjectURL(file), 226, 226).then(function (result) {
_this.setMediaItemState(id, { thumbnail: result.url });
});
};
this.createInlineImage = function (param) {
(0, _image.compressImage)(URL.createObjectURL(param.file), 1280, 800).then(function (result) {
param.success({ url: result.url });
}).catch(function (error) {
param.error(error);
});
};
this.handleUploadSuccess = function (id, data) {
_this.setMediaItemState(id, _extends({}, data, {
file: null,
uploadProgress: 1,
uploading: false,
selected: false
}));
var item = _this.getMediaItem(data.id || id);
item.onReady && item.onReady(item);
};
this.applyChange = function () {
_this.changeListeners.forEach(function (_ref2) {
var callback = _ref2.callback;
return callback(_this.items);
});
};
this.uploadImage = function (file, callback) {
var fileId = new Date().getTime() + '_' + (0, _base.UniqueIndex)();
_this.addMediaItem({
type: 'IMAGE',
id: fileId,
file: file,
name: fileId,
size: file.size,
uploadProgress: 0,
uploading: false,
selected: false,
error: 0,
onReady: callback
});
};
this.uploadImageRecursively = function (files, callback) {
var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
if (files[index] && files[index].type.indexOf('image') > -1) {
_this.uploadImage(files[index], function (image) {
callback && callback(image);
index < files.length - 1 && _this.uploadImageRecursively(files, callback, index + 1);
});
} else {
index < files.length - 1 && _this.uploadImageRecursively(files, callback, index + 1);
}
};
this.addResolvedFiles = function (param, index, accepts) {
var data = {
id: new Date().getTime() + '_' + (0, _base.UniqueIndex)(),
file: param.files[index],
name: param.files[index].name,
size: param.files[index].size,
uploadProgress: 0,
uploading: false,
selected: false,
error: 0,
onReady: function onReady(item) {
param.onItemReady && param.onItemReady(item);
}
};
if (param.files[index].type.indexOf('image/') === 0 && accepts.image) {
data.type = 'IMAGE';
_this.addMediaItem(data);
} else if (param.files[index].type.indexOf('video/') === 0 && accepts.video) {
data.type = 'VIDEO';
_this.addMediaItem(data);
} else if (param.files[index].type.indexOf('audio/') === 0 && accepts.audio) {
data.type = 'AUDIO';
_this.addMediaItem(data);
}
setTimeout(function () {
_this.resolveFiles(param, index + 1, accepts);
}, 60);
};
this.resolveFiles = function (param, index, accepts) {
if (index < param.files.length) {
var validateResult = _this.validateFn(param.files[index]);
if (validateResult instanceof Promise) {
validateResult.then(function () {
_this.addResolvedFiles(param, index, accepts);
});
} else if (validateResult) {
_this.addResolvedFiles(param, index, accepts);
}
} else {
param.onAllReady && param.onAllReady();
}
};
this.onChange = function (callback) {
var listenerId = (0, _base.UniqueIndex)();
_this.changeListeners.push({
id: listenerId,
callback: callback
});
return listenerId;
};
this.offChange = function (listenerId) {
_this.changeListeners = _this.changeListeners.filter(function (_ref3) {
var id = _ref3.id;
return id !== listenerId;
});
};
};
exports.default = BraftFinderController;
/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
__webpack_require__(6);
var _react = __webpack_require__(0);
var _react2 = _interopRequireDefault(_react);
var _base = __webpack_require__(1);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var defaultAccepts = {
image: 'image/png,image/jpeg,image/gif,image/webp,image/apng,image/svg',
video: 'video/mp4',
audio: 'audio/mp3'
};
var BraftFinderView = function (_React$Component) {
_inherits(BraftFinderView, _React$Component);
function BraftFinderView(props) {
_classCallCheck(this, BraftFinderView);
var _this = _possibleConstructorReturn(this, (BraftFinderView.__proto__ || Object.getPrototypeOf(BraftFinderView)).call(this, props));
_this.toggleSelectItem = function (event) {
var itemId = event.currentTarget.dataset.id;
var item = _this.controller.getMediaItem(itemId);
if (!item) {
return false;
}
if (item.selected) {
if (!_this.props.onBeforeDeselect || _this.props.onBeforeDeselect([item], _this.controller.getItems()) !== false) {
_this.controller.deselectMediaItem(itemId);
_this.props.onDeselect && _this.props.onDeselect([item], _this.controller.getItems());
}
} else {
if (!_this.props.onBeforeSelect || _this.props.onBeforeSelect([item], _this.controller.getItems()) !== false) {
_this.controller.selectMediaItem(itemId);
_this.props.onSelect && _this.props.onSelect([item], _this.controller.getItems());
}
}
};
_this.removeItem = function (event) {
var itemId = event.currentTarget.dataset.id;
var item = _this.controller.getMediaItem(itemId);
if (!item) {
return false;
}
if (!_this.props.onBeforeRemove || _this.props.onBeforeRemove([item], _this.controller.getItems()) !== false) {
_this.controller.removeMediaItem(itemId);
_this.props.onRemove && _this.props.onRemove([item], _this.controller.getItems());
}
event.stopPropagation();
};
_this.selectAllItems = function () {
var allItems = _this.controller.getItems();
if (!_this.props.onBeforeSelect || _this.props.onBeforeSelect(allItems, allItems) !== false) {
_this.controller.selectAllItems();
_this.props.onSelect && _this.props.onSelect(allItems, allItems);
}
};
_this.deselectAllItems = function () {
var allItems = _this.controller.getItems();
if (!_this.props.onBeforeDeselect || _this.props.onBeforeDeselect(allItems, allItems) !== false) {
_this.controller.deselectAllItems();
_this.props.onDeselect && _this.props.onDeselect(allItems, allItems);
}
};
_this.removeSelectedItems = function () {
var selectedItems = _this.controller.getSelectedItems();
if (!_this.props.onBeforeRemove || _this.props.onBeforeRemove(selectedItems, _this.controller.getItems()) !== false) {
_this.controller.removeSelectedItems();
_this.props.onRemove && _this.props.onRemove(selectedItems, _this.controller.getItems());
}
};
_this.handleDragLeave = function (event) {
event.preventDefault();
_this.dragCounter--;
_this.dragCounter === 0 && _this.setState({
draging: false
});
};
_this.handleDragDrop = function (event) {
event.preventDefault();
_this.dragCounter = 0;
_this.setState({ draging: false });
_this.reslovePickedFiles(event);
};
_this.handleDragEnter = function (event) {
event.preventDefault();
_this.dragCounter++;
_this.setState({ draging: true });
};
_this.reslovePickedFiles = function (event) {
event.persist();
var _ref = event.type === 'drop' ? event.dataTransfer : event.target,
files = _ref.files;
if (_this.props.onFileSelect) {
var result = _this.props.onFileSelect(files);
if (result === false) {
return false;
} else if (result instanceof FileList || result instanceof Array) {
files = result;
}
}
var accepts = _extends({}, defaultAccepts, _this.props.accepts);
_this.controller.resolveFiles({
files: files,
onItemReady: function onItemReady(_ref2) {
var id = _ref2.id;
return _this.controller.selectMediaItem(id);
},
onAllReady: function onAllReady() {
return event.target.value = null;
}
}, 0, accepts);
};
_this.inputExternal = function (event) {
_this.setState({
external: _extends({}, _this.state.external, {
url: event.target.value
})
});
};
_this.switchExternalType = function (event) {
_this.setState({
external: _extends({}, _this.state.external, { type: event.target.dataset.type })
});
};
_this.confirmAddExternal = function (event) {
if (event.target.nodeName.toLowerCase() === 'button' || event.keyCode === 13) {
var _this$state$external = _this.state.external,
url = _this$state$external.url,
type = _this$state$external.type;
url = url.split('|');
var name = url.length > 1 ? url[0] : _this.props.language.unnamedItem;
url = url.length > 1 ? url[1] : url[0];
var thumbnail = type === 'IMAGE' ? url : null;
_this.controller.addItems([{
thumbnail: thumbnail, url: url, name: name, type: type,
id: new Date().getTime() + '_' + (0, _base.UniqueIndex)(),
uploading: false,
uploadProgress: 1,
selected: true
}]);
_this.setState({
showExternalForm: false,
external: {
url: '',
type: 'IMAGE'
}
});
}
};
_this.toggleExternalForm = function () {
_this.setState({
showExternalForm: !_this.state.showExternalForm
});
};
_this.cancelInsert = function () {
_this.props.onCancel && _this.props.onCancel();
};
_this.confirmInsert = function () {
var selectedItems = _this.controller.getSelectedItems();
if (_this.props.onBeforeInsert) {
var filteredItems = _this.props.onBeforeInsert(selectedItems);
if (filteredItems && filteredItems instanceof Array) {
_this.controller.deselectAllItems();
_this.props.onInsert && _this.props.onInsert(filteredItems);
} else if (filteredItems !== false) {
_this.controller.deselectAllItems();
_this.props.onInsert && _this.props.onInsert(selectedItems);
}
} else {
_this.controller.deselectAllItems();
_this.props.onInsert && _this.props.onInsert(selectedItems);
}
};
_this.dragCounter = 0;
_this.controller = _this.props.controller;
var initialItems = _this.controller.getItems();
_this.state = {
draging: false,
error: false,
confirmable: initialItems.find(function (_ref3) {
var selected = _ref3.selected;
return selected;
}),
external: {
url: '',
type: 'IMAGE'
},
fileAccept: '',
showExternalForm: false,
allowExternal: false,
items: initialItems
};
_this.changeListenerId = _this.controller.onChange(function (items) {
_this.setState({ items: items, confirmable: items.find(function (_ref4) {
var selected = _ref4.selected;
return selected;
}) });
_this.props.onChange && _this.props.onChange(items);
});
return _this;
}
_createClass(BraftFinderView, [{
key: 'mapPropsToState',
value: function mapPropsToState(props) {
var accepts = props.accepts,
externals = props.externals;
accepts = _extends({}, defaultAccepts, accepts);
var fileAccept = !accepts ? [defaultAccepts.image, defaultAccepts.video, defaultAccepts.audio].join(',') : [accepts.image, accepts.video, accepts.audio].filter(function (item) {
return item;
}).join(',');
var external = {
url: '',
type: externals.image ? 'IMAGE' : externals.audio ? 'AUDIO' : externals.video ? 'VIDEO' : externals.embed ? 'EMBED' : ''
};
return {
fileAccept: fileAccept,
external: external,
allowExternal: externals && (externals.image || externals.audio || externals.video || externals.embed)
};
}
}, {
key: 'componentDidMount',
value: function componentDidMount() {
this.setState(this.mapPropsToState(this.props));
}
}, {
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
this.setState(this.mapPropsToState(nextProps));
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
this.controller.offChange(this.changeListenerId);
}
}, {
key: 'render',
value: function render() {
var _props = this.props,
language = _props.language,
externals = _props.externals;
var _state = this.state,
items = _state.items,
draging = _state.draging,
confirmable = _state.confirmable,
fileAccept = _state.fileAccept,
external = _state.external,
showExternalForm = _state.showExternalForm,
allowExternal = _state.allowExternal;
return _react2.default.createElement(
'div',
{ className: 'braft-finder' },
_react2.default.createElement(
'div',
{
onDragEnter: this.handleDragEnter,
onDragLeave: this.handleDragLeave,
onDrop: this.handleDragDrop,
className: 'bf-uploader'
},
_react2.default.createElement(
'div',
{ className: "bf-drag-uploader " + (draging || !items.length ? 'active ' : ' ') + (draging ? 'draging' : '') },
_react2.default.createElement(
'span',
{ className: 'bf-drag-tip' },
_react2.default.createElement('input', { accept: fileAccept, onChange: this.reslovePickedFiles, multiple: true, type: 'file' }),
draging ? language.dropTip : language.dragTip
)
),
items.length ? _react2.default.createElement(
'div',
{ className: 'bf-list-wrap' },
_react2.default.createElement(
'div',
{ className: 'bf-list-tools' },
_react2.default.createElement(
'span',
{ onClick: this.selectAllItems, className: 'bf-select-all' },
_react2.default.createElement('i', { className: 'braft-icon-done' }),
' ',
language.selectAll
),
_react2.default.createElement(
'span',
{ onClick: this.deselectAllItems, disabled: !confirmable, className: 'bf-deselect-all' },
_react2.default.createElement('i', { className: 'braft-icon-close' }),
' ',
language.deselect
),
_react2.default.createElement(
'span',
{ onClick: this.removeSelectedItems, disabled: !confirmable, className: 'bf-remove-selected' },
_react2.default.createElement('i', { className: 'braft-icon-bin' }),
' ',
language.removeSelected
)
),
this.buildItemList()
) : null,
showExternalForm && allowExternal ? _react2.default.createElement(
'div',
{ className: 'bf-add-external' },
_react2.default.createElement(
'div',
{ className: 'bf-external-form' },
_react2.default.createElement(
'div',
{ className: 'bf-external-input' },
_react2.default.createElement(
'div',
null,
_react2.default.createElement('input', { onKeyDown: this.confirmAddExternal, value: external.url, onChange: this.inputExternal, placeholder: language.externalInputPlaceHolder })
),
_react2.default.createElement(
'button',
{ type: 'button', onClick: this.confirmAddExternal, disabled: !external.url.trim().length },
language.confirm
)
),
_react2.default.createElement(
'div',
{ 'data-type': external.type, className: 'bf-switch-external-type' },
externals.image ? _react2.default.createElement(
'button',
{ type: 'button', onClick: this.switchExternalType, 'data-type': 'IMAGE' },
language.image
) : null,
externals.audio ? _react2.default.createElement(
'button',
{ type: 'button', onClick: this.switchExternalType, 'data-type': 'AUDIO' },
language.audio
) : null,
externals.video ? _react2.default.createElement(
'button',
{ type: 'button', onClick: this.switchExternalType, 'data-type': 'VIDEO' },
language.video
) : null,
externals.embed ? _react2.default.createElement(
'button',
{ type: 'button', onClick: this.switchExternalType, 'data-type': 'EMBED' },
language.embed
) : null
),
_react2.default.createElement(
'span',
{ className: 'bf-external-tip' },
language.externalInputTip
)
)
) : null
),
_react2.default.createElement(
'footer',
{ className: 'bf-manager-footer' },
_react2.default.createElement(
'div',
{ className: 'pull-left' },
allowExternal ? _react2.default.createElement(
'span',
{
onClick: this.toggleExternalForm,
className: 'bf-toggle-external-form'
},
showExternalForm ? _react2.default.createElement(
'span',
{ className: 'bf-bottom-text' },
_react2.default.createElement('i', { className: 'braft-icon-add' }),
' ',
language.addLocalFile
) : _react2.default.createElement(
'span',
{ className: 'bf-bottom-text' },
_react2.default.createElement('i', { className: 'braft-icon-add' }),
' ',
language.addExternalSource
)
) : null
),
_react2.default.createElement(
'div',
{ className: 'pull-right' },
_react2.default.createElement(
'button',
{ onClick: this.confirmInsert, className: 'button button-insert', disabled: !confirmable },
language.insert
),
_react2.default.createElement(
'button',
{ onClick: this.cancelInsert, className: 'button button-cancel' },
language.cancel
)
)
)
);
}
}, {
key: 'buildItemList',
value: function buildItemList() {
var _this2 = this;
return _react2.default.createElement(
'ul',
{ className: 'bf-list' },
_react2.default.createElement(
'li',
{ className: 'bf-add-item' },
_react2.default.createElement('i', { className: 'braft-icon-add' }),
_react2.default.createElement('input', { accept: this.state.fileAccept, onChange: this.reslovePickedFiles, multiple: true, type: 'file' })
),
this.state.items.map(function (item, index) {
var previewerComponents = null;
var progressMarker = item.uploading && !_this2.props.hideProgress ? _react2.default.createElement(
'div',
{ className: 'bf-item-uploading' },
_react2.default.createElement('div', { className: 'bf-item-uploading-bar', style: { width: item.uploadProgress / 1 + '%' } })
) : '';
switch (item.type) {
case 'IMAGE':
previewerComponents = _react2.default.createElement(
'div',
{ className: 'bf-image' },
progressMarker,
_react2.default.createElement('img', { src: item.thumbnail || item.url })
);
break;
case 'VIDEO':
previewerComponents = _react2.default.createElement(
'div',
{ className: 'bf-icon bf-video', title: item.url },
progressMarker,
_react2.default.createElement('i', { className: 'braft-icon-film' }),
_react2.default.createElement(
'span',
null,
item.name || item.url
)
);
break;
case 'AUDIO':
previewerComponents = _react2.default.createElement(
'div',
{ className: 'bf-icon bf-audio', title: item.url },
progressMarker,
_react2.default.createElement('i', { className: 'braft-icon-music' }),
_react2.default.createElement(
'span',
null,
item.name || item.url
)
);
break;
case 'EMBED':
previewerComponents = _react2.default.createElement(
'div',
{ className: 'bf-icon bf-embed', title: item.url },
progressMarker,
_react2.default.createElement('i', { className: 'braft-icon-code' }),
_react2.default.createElement(
'span',
null,
item.name || _this2.props.language.embed
)
);
break;
default:
previewerComponents = _react2.default.createElement(
'a',
{ className: 'bf-icon bf-file', title: item.url, href: item.url },
progressMarker,
_react2.default.createElement('i', { className: 'braft-icon-file-text' }),
_react2.default.createElement(
'span',
null,
item.name || item.url
)
);
break;
}
var className = ['bf-item'];
item.selected && className.push('active');
item.uploading && className.push('uploading');
item.error && className.push('error');
return _react2.default.createElement(
'li',
{
key: index,
title: item.name,
'data-id': item.id,
className: className.join(' '),
onClick: _this2.toggleSelectItem
},
previewerComponents,
_react2.default.createElement('span', { 'data-id': item.id, onClick: _this2.removeItem, className: 'bf-item-remove braft-icon-close' }),
_react2.default.createElement(
'span',
{ className: 'bf-item-title' },
item.name
)
);
})
);
}
}]);
return BraftFinderView;
}(_react2.default.Component);
BraftFinderView.defaultProps = {
accepts: defaultAccepts,
externals: {
image: true,
video: true,
audio: true,
embed: true
}
};
exports.default = BraftFinderView;
/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {
var content = __webpack_require__(7);
if(typeof content === 'string') content = [[module.i, content, '']];
var transform;
var insertInto;
var options = {"hmr":true}
options.transform = transform
options.insertInto = undefined;
var update = __webpack_require__(11)(content, options);
if(content.locals) module.exports = content.locals;
if(false) {}
/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {
var escape = __webpack_require__(8);
exports = module.exports = __webpack_require__(9)(false);
// imports
// module
exports.push([module.i, "@font-face{font-family:'bf-icons';src:url(" + escape(__webpack_require__(10)) + ") format(\"truetype\");font-weight:normal;font-style:normal}.braft-finder [class^=\"braft-icon-\"],.braft-finder [class*=\" braft-icon-\"]{font-family:'bf-icons' !important;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.braft-finder .braft-icon-code:before{content:\"\\E903\"}.braft-finder .braft-icon-pause:before{content:\"\\E034\"}.braft-finder .braft-icon-play_arrow:before{content:\"\\E037\"}.braft-finder .braft-icon-bin:before{content:\"\\E9AC\"}.braft-finder .braft-icon-replay:before{content:\"\\E042\"}.braft-finder .braft-icon-close:before{content:\"\\E913\"}.braft-finder .braft-icon-music:before{content:\"\\E90E\"}.braft-finder .braft-icon-camera:before{content:\"\\E911\"}.braft-finder .braft-icon-file-text:before{content:\"\\E926\"}.braft-finder .braft-icon-film:before{content:\"\\E91C\"}.braft-finder .braft-icon-paste:before{content:\"\\E92D\"}.braft-finder .braft-icon-spinner:before{content:\"\\E980\"}.braft-finder .braft-icon-media:before{content:\"\\E90F\"}.braft-finder .braft-icon-add:before{content:\"\\E918\"}.braft-finder .braft-icon-done:before{content:\"\\E912\"}.braft-finder .braft-icon-drop-down:before{content:\"\\E906\"}.braft-finder .braft-icon-drop-up:before{content:\"\\E909\"}.braft-finder .braft-icon-help:before{content:\"\\E902\"}.braft-finder .braft-icon-info:before{content:\"\\E901\"}.braft-finder .braft-icon-menu:before{content:\"\\E908\"}.pull-left{float:left}.pull-right{float:right}.braft-finder .bf-uploader{position:relative;height:370px;margin:0}.braft-finder .bf-uploader.draging .bf-list-wrap,.braft-finder .bf-uploader.draging .bf-add-external{pointer-events:none}.braft-finder .bf-uploader input::-webkit-input-placeholder{color:#ccc}.braft-finder .bf-uploader input::-moz-placeholder{color:#ccc}.braft-finder .bf-uploader input::-ms-input-placeholder{color:#ccc}.braft-finder .bf-list-wrap{position:relative;height:370px}.braft-finder .bf-list-tools{z-index:1;position:absolute;top:0;right:0;left:0;height:20px;padding:0 15px;background-color:#fff}.braft-finder .bf-list-tools span{height:26px;font-size:12px;line-height:20px;cursor:pointer;user-select:none}.braft-finder .bf-list-tools span[disabled]{opacity:0.3;pointer-events:none}.braft-finder .bf-list-tools .bf-select-all,.braft-finder .bf-list-tools .bf-deselect-all{float:left;margin-right:5px;color:#bbb}.braft-finder .bf-list-tools .bf-select-all:hover,.braft-finder .bf-list-tools .bf-deselect-all:hover{color:#3498db}.braft-finder .bf-list-tools .bf-remove-selected{float:right;color:#e74c3c}.braft-finder .bf-list-tools .bf-remove-selected:hover{color:#c92e1e}.braft-finder .bf-list{position:absolute;z-index:1;top:30px;right:0;left:0;bottom:0;margin:0;padding:0 10px;list-style:none;overflow:auto}.braft-finder .bf-list::-webkit-scrollbar{width:5px;height:5px;background-color:#fff}.braft-finder .bf-list::-webkit-scrollbar-track{background-color:#fff}.braft-finder .bf-list::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0.1)}.braft-finder .bf-item,.braft-finder .bf-add-item{position:relative;display:block;float:left;width:113px;height:113px;margin:5px;overflow:hidden;border-radius:3px}.braft-finder .bf-item.uploading{pointer-events:none}.braft-finder .bf-item.error::before{display:block;content:\"\\E901\"}.braft-finder .bf-item.error::after{position:absolute;z-index:1;top:0;right:0;bottom:0;left:0;background-color:rgba(231,76,60,0.8);content:\"\"}.braft-finder .bf-item.error:hover::after{background-color:rgba(231,76,60,0.9)}.braft-finder .bf-item.error .bf-item-uploading{display:none}.braft-finder .bf-add-item{background-color:#ecedef;color:#999}.braft-finder .bf-add-item:hover{background-color:#e1e2e3}.braft-finder .bf-add-item i{display:block;width:113px;height:113px;font-size:48px;line-height:113px;text-align:center}.braft-finder .bf-add-item input{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer}.braft-finder .bf-item::before{display:none;position:absolute;z-index:2;top:0;left:0;width:113px;height:113px;color:#fff;font-size:48px;font-family:\"bf-icons\";line-height:113px;text-align:center}.braft-finder .bf-item::after{position:absolute;z-index:1;top:0;right:0;bottom:0;left:0;background-color:rgba(52,152,219,0);content:\"\"}.braft-finder .bf-item:hover::after{background-color:rgba(52,152,219,0.3)}.braft-finder .bf-item:hover .bf-item-remove{display:block}.braft-finder .bf-item.active::before{display:block;content:\"\\E912\"}.braft-finder .bf-item.active::after{background-color:rgba(52,152,219,0.6)}.braft-finder .bf-item.active:hover::after{background-color:rgba(52,152,219,0.8)}.braft-finder .bf-item.active:hover .bf-item-remove{display:none}.braft-finder .bf-item-uploading{box-sizing:border-box;position:absolute;z-index:3;top:52px;left:10px;width:93px;height:10px;overflow:hidden;background-color:rgba(255,255,255,0.3);border-radius:5px;box-shadow:0 0 0 100px rgba(0,0,0,0.5)}.braft-finder .bf-item-uploading-bar{height:10px;background-color:#3498db;border-radius:0}.braft-finder .bf-item-remove{display:none;position:absolute;z-index:2;top:0;right:0;width:28px;height:28px;color:#fff;font-size:18px;line-height:28px;text-align:center;cursor:pointer}.braft-finder .bf-item-remove:hover{color:#e74c3c}.braft-finder .bf-item-title{display:none;box-sizing:border-box;position:absolute;z-index:2;bottom:0;left:0;width:100%;height:40px;padding:0 5px;overflow:hidden;background-image:linear-gradient(rgba(0,0,0,0), #000);color:#fff;font-size:12px;line-height:55px;text-align:center;text-overflow:ellipsis;white-space:nowrap}.braft-finder .bf-image{width:100%;height:100%;background-color:#eee;user-select:none}.braft-finder .bf-image img{display:block;width:100%;height:100%;object-fit:cover}.braft-finder .bf-video{background-color:#8e44ad}.braft-finder .bf-audio{background-color:#f39c12}.braft-finder .bf-embed{background-color:#f1c40f}.braft-finder .bf-icon{display:block;width:113px;height:113px;overflow:hidden;color:#fff;text-align:center;text-decoration:none}.braft-finder .bf-icon i,.braft-finder .bf-icon span{display:block}.braft-finder .bf-icon i{margin-top:35px;font-size:24px}.braft-finder .bf-icon span{width:103px;margin:10px auto;overflow:hidden;font-size:12px;text-overflow:ellipsis;white-space:nowrap}.braft-finder .bf-drag-uploader{box-sizing:border-box;position:absolute;z-index:2;top:0;right:15px;left:15px;height:100%;background-color:#fff;border:dashed 1px #bbb;text-align:center;opacity:0;pointer-events:none}.braft-finder .bf-drag-uploader:hover,.braft-finder .bf-drag-uploader.draging{background-color:#f1f2f3}.braft-finder .bf-drag-uploader.active{opacity:1;pointer-events:auto}.braft-finder .bf-uploader-buttons{height:370px;margin:auto;text-align:center}.braft-finder .bf-drag-tip{display:inline-block;margin-top:150px;color:#ccc;text-align:center;font-size:28px;font-weight:normal;line-height:40px}.braft-finder .bf-drag-tip input{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;opacity:0;color:#fff;text-indent:-100px;cursor:pointer}.braft-finder .bf-manager-footer{height:36px;margin:10px 0;padding:0 15px}.braft-finder .bf-manager-footer .button{float:right;height:36px;margin-left:5px;padding:0 35px;font-size:12px;font-weight:700;border:none;border-radius:3px;cursor:pointer}.braft-finder .bf-manager-footer .button-insert{color:#fff;background-color:#3498db}.braft-finder .bf-manager-footer .button-insert:hover{background-color:#2084c7}.braft-finder .bf-manager-footer .button-insert[disabled]{opacity:0.3;pointer-events:none;filter:grayscale(0.4)}.braft-finder .bf-manager-footer .button-cancel{color:#999;background-color:#e8e8e9}.braft-finder .bf-manager-footer .button-cancel:hover{background-color:#d8d8d9}.braft-finder .bf-toggle-external-form{color:#666;font-size:12px;line-height:36px}.braft-finder .bf-toggle-external-form span{color:#bbb;line-height:16px;cursor:pointer;user-select:none}.braft-finder .bf-toggle-external-form span:hover{color:#3498db}.braft-finder .bf-toggle-external-form span i{position:relative;top:2px;font-size:16px}.braft-finder .bf-add-external{position:absolute;z-index:3;top:0;right:0;bottom:0;left:0;background-color:#fff}.braft-finder .bf-add-external input{border:solid 1px rgba(0,0,0,0.3);border:solid 0.5px rgba(0,0,0,0.3);box-shadow:none}.braft-finder .bf-add-external input:focus{border-color:#3498db;box-shadow:none}.braft-finder .bf-external-form{width:500px;max-width:90%;margin:91px auto 0 auto}.braft-finder .bf-external-input{display:flex;position:relative;width:100%;heig