1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-21 11:27:18 +00:00

image_caption (#6657)

* image_caption

* update

* update

* update

* update

* update

---------

Co-authored-by: zheng.shen <zheng.shen@seafile.com>
This commit is contained in:
shenzheng-1
2024-08-30 14:36:52 +08:00
committed by GitHub
parent 1e5b5565e8
commit d26c6d119c
10 changed files with 268 additions and 132 deletions

View File

@@ -15,6 +15,7 @@ const OPERATION = {
OPEN_PARENT_FOLDER: 'open-parent-folder',
OPEN_IN_NEW_TAB: 'open-new-tab',
GENERATE_SUMMARY: 'generate-summary',
IMAGE_CAPTION: 'image-caption',
};
const ContextMenu = ({
@@ -90,6 +91,8 @@ const ContextMenu = ({
const fileName = record[PRIVATE_COLUMN_KEY.FILE_NAME];
if (Utils.isSdocFile(fileName) && canModifyRow(record)) {
list.push({ value: OPERATION.GENERATE_SUMMARY, label: gettext('Generate summary') });
} else if (Utils.imageCheck(fileName) && canModifyRow(record)) {
list.push({ value: OPERATION.IMAGE_CAPTION, label: gettext('Generate image description') });
}
}
@@ -134,63 +137,65 @@ const ContextMenu = ({
const generateSummary = useCallback(() => {
const canModifyRow = window.sfMetadataContext.canModifyRow;
const selectedRecords = Object.keys(recordMetrics.idSelectedRecordMap);
const summaryColumnKey = PRIVATE_COLUMN_KEY.FILE_SUMMARY;
let paths = [];
let path = '';
let idOldRecordData = {};
let idOriginalOldRecordData = {};
if (selectedRange) {
const { topLeft, bottomRight } = selectedRange;
for (let i = topLeft.rowIdx; i <= bottomRight.rowIdx; i++) {
const record = recordGetterByIndex({ isGroupView, groupRecordIndex: topLeft.groupRecordIndex, recordIndex: i });
if (!canModifyRow(record)) continue;
const fileName = record[PRIVATE_COLUMN_KEY.FILE_NAME];
if (!Utils.isSdocFile(fileName)) continue;
const parentDir = record[PRIVATE_COLUMN_KEY.PARENT_DIR];
paths.push(Utils.joinPath(parentDir, fileName));
idOldRecordData[record[PRIVATE_COLUMN_KEY.ID]] = { [summaryColumnKey]: record[summaryColumnKey] };
idOriginalOldRecordData[record[PRIVATE_COLUMN_KEY.ID]] = { [summaryColumnKey]: record[summaryColumnKey] };
}
} else if (selectedRecords.length > 0) {
selectedRecords.forEach(recordId => {
const record = metadata.id_row_map[recordId];
const fileName = record[PRIVATE_COLUMN_KEY.FILE_NAME];
if (Utils.isSdocFile(fileName) && canModifyRow(record)) {
const parentDir = record[PRIVATE_COLUMN_KEY.PARENT_DIR];
paths.push(Utils.joinPath(parentDir, fileName));
idOldRecordData[record[PRIVATE_COLUMN_KEY.ID]] = { [summaryColumnKey]: record[summaryColumnKey] };
idOriginalOldRecordData[record[PRIVATE_COLUMN_KEY.ID]] = { [summaryColumnKey]: record[summaryColumnKey] };
}
});
} else if (selectedPosition) {
const { groupRecordIndex, rowIdx } = selectedPosition;
const record = recordGetterByIndex({ isGroupView, groupRecordIndex, recordIndex: rowIdx });
const fileName = record[PRIVATE_COLUMN_KEY.FILE_NAME];
if (Utils.isSdocFile(fileName) && canModifyRow(record)) {
const parentDir = record[PRIVATE_COLUMN_KEY.PARENT_DIR];
paths.push(Utils.joinPath(parentDir, fileName));
idOldRecordData[record[PRIVATE_COLUMN_KEY.ID]] = { [summaryColumnKey]: record[summaryColumnKey] };
idOriginalOldRecordData[record[PRIVATE_COLUMN_KEY.ID]] = { [summaryColumnKey]: record[summaryColumnKey] };
}
const { groupRecordIndex, rowIdx } = selectedPosition;
const record = recordGetterByIndex({ isGroupView, groupRecordIndex, recordIndex: rowIdx });
const fileName = record[PRIVATE_COLUMN_KEY.FILE_NAME];
if (Utils.isSdocFile(fileName) && canModifyRow(record)) {
const parentDir = record[PRIVATE_COLUMN_KEY.PARENT_DIR];
path = Utils.joinPath(parentDir, fileName);
idOldRecordData[record[PRIVATE_COLUMN_KEY.ID]] = { [summaryColumnKey]: record[summaryColumnKey] };
idOriginalOldRecordData[record[PRIVATE_COLUMN_KEY.ID]] = { [summaryColumnKey]: record[summaryColumnKey] };
}
if (paths.length === 0) return;
window.sfMetadataContext.generateSummary(paths).then(res => {
const updatedRecords = res.data.rows;
let recordIds = [];
if (path === '') return;
window.sfMetadataContext.generateSummary(path).then(res => {
const summary = res.data.summary;
const updateRecordId = record[PRIVATE_COLUMN_KEY.ID];
const recordIds = [updateRecordId];
let idRecordUpdates = {};
let idOriginalRecordUpdates = {};
updatedRecords.forEach(updatedRecord => {
const { _id: updateRecordId, _summary } = updatedRecord;
recordIds.push(updateRecordId);
idRecordUpdates[updateRecordId] = { [summaryColumnKey]: _summary };
idOriginalRecordUpdates[updateRecordId] = { [summaryColumnKey]: _summary };
});
idRecordUpdates[updateRecordId] = { [summaryColumnKey]: summary };
idOriginalRecordUpdates[updateRecordId] = { [summaryColumnKey]: summary };
updateRecords({ recordIds, idRecordUpdates, idOriginalRecordUpdates, idOldRecordData, idOriginalOldRecordData });
}).catch(error => {
const errorMessage = gettext('Failed to generate summary');
toaster.danger(errorMessage);
});
}, [isGroupView, selectedRange, selectedPosition, recordMetrics, metadata, recordGetterByIndex, updateRecords]);
}, [isGroupView, selectedPosition, recordGetterByIndex, updateRecords]);
const imageCaption = useCallback(() => {
const canModifyRow = window.sfMetadataContext.canModifyRow;
const summaryColumnKey = PRIVATE_COLUMN_KEY.FILE_SUMMARY;
let path = '';
let idOldRecordData = {};
let idOriginalOldRecordData = {};
const { groupRecordIndex, rowIdx } = selectedPosition;
const record = recordGetterByIndex({ isGroupView, groupRecordIndex, recordIndex: rowIdx });
const fileName = record[PRIVATE_COLUMN_KEY.FILE_NAME];
if (Utils.imageCheck(fileName) && canModifyRow(record)) {
const parentDir = record[PRIVATE_COLUMN_KEY.PARENT_DIR];
path = Utils.joinPath(parentDir, fileName);
idOldRecordData[record[PRIVATE_COLUMN_KEY.ID]] = { [summaryColumnKey]: record[summaryColumnKey] };
idOriginalOldRecordData[record[PRIVATE_COLUMN_KEY.ID]] = { [summaryColumnKey]: record[summaryColumnKey] };
}
if (path === '') return;
window.sfMetadataContext.imageCaption(path).then(res => {
const desc = res.data.desc;
const updateRecordId = record[PRIVATE_COLUMN_KEY.ID];
const recordIds = [updateRecordId];
let idRecordUpdates = {};
let idOriginalRecordUpdates = {};
idRecordUpdates[updateRecordId] = { [summaryColumnKey]: desc };
idOriginalRecordUpdates[updateRecordId] = { [summaryColumnKey]: desc };
updateRecords({ recordIds, idRecordUpdates, idOriginalRecordUpdates, idOldRecordData, idOriginalOldRecordData });
}).catch(error => {
const errorMessage = gettext('Failed to generate image description');
toaster.danger(errorMessage);
});
}, [isGroupView, selectedPosition, recordGetterByIndex, updateRecords]);
const handleOptionClick = useCallback((event, option) => {
event.stopPropagation();
@@ -215,12 +220,16 @@ const ContextMenu = ({
generateSummary && generateSummary();
break;
}
case OPERATION.IMAGE_CAPTION: {
imageCaption && imageCaption();
break;
}
default: {
break;
}
}
setVisible(false);
}, [onOpenFileInNewTab, onOpenParentFolder, onCopySelected, onClearSelected, generateSummary]);
}, [onOpenFileInNewTab, onOpenParentFolder, onCopySelected, onClearSelected, generateSummary, imageCaption]);
const getMenuPosition = useCallback((x = 0, y = 0) => {
let menuStyles = {