"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var uuid_1 = require("oak-domain/lib/utils/uuid"); var assert_1 = tslib_1.__importDefault(require("assert")); var index_1 = tslib_1.__importDefault(require("../../../utils/dialog/index")); var extraFile_1 = require("../../../utils/extraFile"); exports.default = OakComponent({ entity: 'extraFile', isList: true, projection: { id: 1, tag1: 1, tag2: 1, origin: 1, bucket: 1, objectId: 1, filename: 1, extra1: 1, extension: 1, type: 1, entity: 1, }, formData: function (_a) { var _b; var originalFiles = _a.data, features = _a.features; return tslib_1.__awaiter(this, void 0, void 0, function () { var application, files; var _this = this; return tslib_1.__generator(this, function (_c) { switch (_c.label) { case 0: return [4 /*yield*/, features.application.getApplication()]; case 1: application = _c.sent(); files = originalFiles; if (this.props.tag1) { files = files === null || files === void 0 ? void 0 : files.filter(function (ele) { return (ele === null || ele === void 0 ? void 0 : ele.tag1) === _this.props.tag1; }); } if (this.props.tag2) { files = files === null || files === void 0 ? void 0 : files.filter(function (ele) { return (ele === null || ele === void 0 ? void 0 : ele.tag2) === _this.props.tag2; }); } return [2 /*return*/, { files: files, disableInsert: this.props.maxNumber === 0 || (files === null || files === void 0 ? void 0 : files.length) >= this.props.maxNumber, systemConfig: (_b = application === null || application === void 0 ? void 0 : application.system) === null || _b === void 0 ? void 0 : _b.config, }]; } }); }); }, data: { selected: -1, // 根据 size 不同,计算的图片显示大小不同 itemSizePercentage: '', newUploadFiles: [], }, wechatMp: { externalClasses: ['l-class', 'l-item-class'], }, properties: { removeLater: Boolean, autoUpload: { type: Boolean, value: false, }, maxNumber: { type: Number, value: 20, }, selectCount: { //小程序独有 文件一次选择几个 type: Number, value: 1, }, sourceType: { type: Array, value: ['album', 'camera'], }, mediaType: { //小程序独有 文件上传类型 type: Array, value: ['image'], }, showUploadList: { // web独有 是否展示文件列表, 可设为一个对象 type: Boolean, value: true, }, accept: { // web独有 文件上传类型 type: String, value: 'image/*', }, // 图片显示模式 mode: { //小程序独有 type: String, value: 'aspectFit', }, // 图片是否可预览 preview: { type: Boolean, value: true, }, // 每行可显示的个数 size: { // 小程序独有 type: Number, value: 3, }, // 图片是否可删除 disableDelete: { type: Boolean, value: false, }, type: String, origin: String, tag1: String, tag2: String, entity: String, entityId: String, }, methods: { /** * 获取组件内部节点位置信息(单个) * @param component 组件实例 * @param selector {String} css选择器 * @returns boundingClientRect() 回调函数的值 */ getNodeRectFromComponent: function (component, selector) { return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, new Promise(function (resolve) { component .createSelectorQuery() .select(selector) .boundingClientRect(function (res) { resolve(res); }) .exec(); })]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }, /** // * px 转 rpx // * @param px 像素值 // */ px2rpx: function (px) { var windowWidth = wx.getSystemInfoSync().windowWidth; return (750 / windowWidth) * px; }, onPickByMp: function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var _a, selectCount, mediaType, sourceType, _b, errMsg, tempFiles, err_1; var _this = this; return tslib_1.__generator(this, function (_c) { switch (_c.label) { case 0: _a = this.props, selectCount = _a.selectCount, mediaType = _a.mediaType, sourceType = _a.sourceType; _c.label = 1; case 1: _c.trys.push([1, 6, , 7]); return [4 /*yield*/, wx.chooseMedia({ count: selectCount, mediaType: mediaType, sourceType: sourceType, })]; case 2: _b = _c.sent(), errMsg = _b.errMsg, tempFiles = _b.tempFiles; if (!(errMsg !== 'chooseMedia:ok')) return [3 /*break*/, 3]; this.triggerEvent('error', { level: 'warning', msg: errMsg, }); return [3 /*break*/, 5]; case 3: return [4 /*yield*/, Promise.all(tempFiles.map(function (tempExtraFile) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var tempFilePath, thumbTempFilePath, fileType, size, filePath, fileFullName; return tslib_1.__generator(this, function (_a) { tempFilePath = tempExtraFile.tempFilePath, thumbTempFilePath = tempExtraFile.thumbTempFilePath, fileType = tempExtraFile.fileType, size = tempExtraFile.size; filePath = tempFilePath || thumbTempFilePath; fileFullName = filePath.match(/[^/]+(?!.*\/)/g)[0]; this.pushExtraFile({ name: fileFullName, fileType: fileType, size: size, extra1: filePath, }); return [2 /*return*/]; }); }); }))]; case 4: _c.sent(); _c.label = 5; case 5: return [3 /*break*/, 7]; case 6: err_1 = _c.sent(); console.error(err_1); if (err_1.errMsg !== 'chooseMedia:fail cancel') { this.triggerEvent('error', { level: 'error', msg: err_1.errMsg, }); } return [3 /*break*/, 7]; case 7: return [2 /*return*/]; } }); }); }, onPickByWeb: function (uploadFiles, callback) { return tslib_1.__awaiter(this, void 0, void 0, function () { var _this = this; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, Promise.all(uploadFiles.map(function (uploadFile) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var name, fileType, size, raw, originFileObj; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: name = uploadFile.name, fileType = uploadFile.type, size = uploadFile.size, raw = uploadFile.raw, originFileObj = uploadFile.originFileObj; return [4 /*yield*/, this.pushExtraFile({ name: name, fileType: fileType, size: size, extra1: originFileObj, }, callback)]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }))]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }, pushExtraFile: function (options, callback) { return tslib_1.__awaiter(this, void 0, void 0, function () { var _a, type, origin, tag1, tag2, entity, entityId, autoUpload, name, extra1, fileType, size, extension, filename, updateData, bucket, error_1; var _this = this; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: _a = this.props, type = _a.type, origin = _a.origin, tag1 = _a.tag1, tag2 = _a.tag2, entity = _a.entity, entityId = _a.entityId, autoUpload = _a.autoUpload; name = options.name, extra1 = options.extra1, fileType = options.fileType, size = options.size; extension = name.substring(name.lastIndexOf('.') + 1); filename = name.substring(0, name.lastIndexOf('.')); (0, assert_1.default)(entity, '必须传入entity'); (0, assert_1.default)(origin === 'qiniu', '目前只支持七牛上传'); // 目前只支持七牛上传 updateData = { extra1: extra1, origin: origin, type: type || 'file', tag1: tag1, tag2: tag2, objectId: (0, uuid_1.generateNewId)(), entity: entity, filename: filename, size: size, extension: extension, fileType: fileType, id: (0, uuid_1.generateNewId)(), entityId: entityId, }; if (!autoUpload) return [3 /*break*/, 7]; if (callback) { callback(updateData, 'uploading'); } _b.label = 1; case 1: _b.trys.push([1, 3, , 4]); return [4 /*yield*/, this.features.extraFile.upload(updateData)]; case 2: bucket = (_b.sent()).bucket; Object.assign(updateData, { bucket: bucket, extra1: null, }); if (callback) { callback(updateData, 'success'); } return [3 /*break*/, 4]; case 3: error_1 = _b.sent(); if (callback) { callback(updateData, 'failed'); } //todo 保存extraFile失败 需要remove七牛图片 throw error_1; case 4: return [4 /*yield*/, this.addItem(updateData)]; case 5: _b.sent(); return [4 /*yield*/, this.execute()]; case 6: _b.sent(); return [3 /*break*/, 9]; case 7: return [4 /*yield*/, this.addItem(updateData, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var bucket; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (updateData.bucket) { // 说明本函数已经执行过了 return [2 /*return*/]; } return [4 /*yield*/, this.features.extraFile.upload(updateData)]; case 1: bucket = (_a.sent()).bucket; Object.assign(updateData, { bucket: bucket, extra1: null, }); return [2 /*return*/]; } }); }); })]; case 8: _b.sent(); _b.label = 9; case 9: return [2 /*return*/]; } }); }); }, onItemTapped: function (event) { return tslib_1.__awaiter(this, void 0, void 0, function () { var _a, files, systemConfig, index, imageUrl, urls, detail, result; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: _a = this.state, files = _a.files, systemConfig = _a.systemConfig; index = event.currentTarget.dataset.index; imageUrl = (0, extraFile_1.composeFileUrl)(files[index], systemConfig); urls = files === null || files === void 0 ? void 0 : files.filter(function (ele) { return !!ele; }).map(function (ele) { return (0, extraFile_1.composeFileUrl)(ele, systemConfig); }); detail = { all: files, index: index, urls: urls, current: imageUrl, }; this.triggerEvent('tap', detail); if (!this.props.preview) return [3 /*break*/, 2]; return [4 /*yield*/, wx.previewImage({ urls: urls, current: imageUrl, })]; case 1: result = _b.sent(); this.triggerEvent('preview', detail); _b.label = 2; case 2: return [2 /*return*/]; } }); }); }, onDeleteByMp: function (event) { return tslib_1.__awaiter(this, void 0, void 0, function () { var value, id, bucket, result, confirm_1; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: value = event.currentTarget.dataset.value; id = value.id, bucket = value.bucket; if (!(this.props.removeLater || (origin !== 'unknown' && !bucket))) return [3 /*break*/, 2]; return [4 /*yield*/, this.removeItem(id)]; case 1: _a.sent(); return [3 /*break*/, 6]; case 2: return [4 /*yield*/, wx.showModal({ title: '确认删除吗', content: '删除现有文件', })]; case 3: result = _a.sent(); confirm_1 = result.confirm; if (!confirm_1) return [3 /*break*/, 6]; return [4 /*yield*/, this.removeItem(id)]; case 4: _a.sent(); return [4 /*yield*/, this.execute()]; case 5: _a.sent(); _a.label = 6; case 6: return [2 /*return*/]; } }); }); }, onDeleteByWeb: function (value) { return tslib_1.__awaiter(this, void 0, void 0, function () { var id, bucket, confirm_2; var _this = this; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: id = value.id, bucket = value.bucket; if (!(this.props.removeLater || (origin !== 'unknown' && !bucket))) return [3 /*break*/, 2]; return [4 /*yield*/, this.removeItem(id)]; case 1: _a.sent(); return [3 /*break*/, 3]; case 2: confirm_2 = index_1.default.confirm({ title: '确认删除当前文件?', content: '删除后,文件不可恢复', cancelText: '取消', okText: '确定', onOk: function (e) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.removeItem(id)]; case 1: _a.sent(); return [4 /*yield*/, this.execute()]; case 2: _a.sent(); confirm_2.destroy(); return [2 /*return*/]; } }); }); }, onCancel: function (e) { confirm_2.destroy(); }, }); _a.label = 3; case 3: return [2 /*return*/]; } }); }); }, setNewUploadFiles: function (file, status) { var filename = file.filename, size = file.size, id = file.id; var newUploadFiles = this.state.newUploadFiles; var file2 = newUploadFiles.find(function (ele) { return (ele.filename = filename && ele.size === size); }); Object.assign(file2, { status: status, id: id, }); this.setState({ newUploadFiles: newUploadFiles, }); }, customDelete: function (index) { return tslib_1.__awaiter(this, void 0, void 0, function () { var newUploadFiles, arr; return tslib_1.__generator(this, function (_a) { newUploadFiles = this.state.newUploadFiles; arr = tslib_1.__spreadArray([], tslib_1.__read(newUploadFiles), false); arr.splice(index, 1); this.setState({ newUploadFiles: arr, }); return [2 /*return*/]; }); }); }, }, observers: { maxNumber: function () { this.reRender(); }, /** * size 属性变化时,重新调整图片大小 * @param size 新值 */ size: function (size) { return tslib_1.__awaiter(this, void 0, void 0, function () { var res, widthRpx, itemSizePercentage; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (!size) { this.setState({ itemSizePercentage: '' }); return [2 /*return*/]; } return [4 /*yield*/, this.getNodeRectFromComponent(this, '.file-list__container')]; case 1: res = _a.sent(); widthRpx = this.px2rpx(res.right - res.left); itemSizePercentage = (10 / size) * 10 - (20 / widthRpx) * 100 + '%;'; this.setState({ itemSizePercentage: itemSizePercentage }); return [2 /*return*/]; } }); }); }, }, });