feat: Rename ocr-text asset type to text-content across the application
This commit is contained in:
@@ -0,0 +1,3 @@
|
|||||||
|
UPDATE tenant.document_assets
|
||||||
|
SET asset_type = 'ocr-text'
|
||||||
|
WHERE asset_type = 'text-content';
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
UPDATE tenant.document_assets
|
||||||
|
SET asset_type = 'text-content'
|
||||||
|
WHERE asset_type = 'ocr-text';
|
||||||
@@ -16,7 +16,7 @@ use super::{
|
|||||||
index::IndexDocumentTask,
|
index::IndexDocumentTask,
|
||||||
issued_at::DetermineIssuedAtTask,
|
issued_at::DetermineIssuedAtTask,
|
||||||
job_execution_from_task_error,
|
job_execution_from_task_error,
|
||||||
ocr::{GenerateOcrTask, OCR_TEXT_ASSET_TYPE},
|
ocr::{GenerateOcrTask, TEXT_CONTENT_ASSET_TYPE},
|
||||||
taskflow::{
|
taskflow::{
|
||||||
document::DocumentVersionTaskContext, BoxedTask, Task, TaskError, TaskExecutor,
|
document::DocumentVersionTaskContext, BoxedTask, Task, TaskError, TaskExecutor,
|
||||||
TaskPlanner, TaskResult,
|
TaskPlanner, TaskResult,
|
||||||
@@ -126,7 +126,7 @@ impl TaskPlanner<DocumentVersionTaskContext> for AnalyzePlanner {
|
|||||||
tasks.push(Box::new(GenerateThumbnailsTask::new(self.force)));
|
tasks.push(Box::new(GenerateThumbnailsTask::new(self.force)));
|
||||||
}
|
}
|
||||||
|
|
||||||
let existing_ocr = ctx.asset(OCR_TEXT_ASSET_TYPE).await?.is_some();
|
let existing_ocr = ctx.asset(TEXT_CONTENT_ASSET_TYPE).await?.is_some();
|
||||||
let mut should_index = existing_ocr;
|
let mut should_index = existing_ocr;
|
||||||
|
|
||||||
if document_supports_ocr(&document) {
|
if document_supports_ocr(&document) {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use reqwest::Client;
|
|||||||
use crate::documents::search::{build_quickwit_ingest_record, quickwit_ingest};
|
use crate::documents::search::{build_quickwit_ingest_record, quickwit_ingest};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
ocr::OCR_TEXT_ASSET_TYPE,
|
ocr::TEXT_CONTENT_ASSET_TYPE,
|
||||||
taskflow::{document::DocumentVersionTaskContext, Task, TaskError, TaskResult},
|
taskflow::{document::DocumentVersionTaskContext, Task, TaskError, TaskResult},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ impl Task<DocumentVersionTaskContext> for IndexDocumentTask {
|
|||||||
.ok_or_else(|| TaskError::fail("tenant quickwit index not configured"))?;
|
.ok_or_else(|| TaskError::fail("tenant quickwit index not configured"))?;
|
||||||
|
|
||||||
let asset = ctx
|
let asset = ctx
|
||||||
.asset(OCR_TEXT_ASSET_TYPE)
|
.asset(TEXT_CONTENT_ASSET_TYPE)
|
||||||
.await?
|
.await?
|
||||||
.ok_or_else(|| TaskError::fail("missing OCR text asset"))?;
|
.ok_or_else(|| TaskError::fail("missing OCR text asset"))?;
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ use uuid::Uuid;
|
|||||||
|
|
||||||
use crate::issued_at::{DateOrder, IssuedAtSettings};
|
use crate::issued_at::{DateOrder, IssuedAtSettings};
|
||||||
use crate::schema::documents::dsl as documents_dsl;
|
use crate::schema::documents::dsl as documents_dsl;
|
||||||
use crate::workers::ocr::OCR_TEXT_ASSET_TYPE;
|
use crate::workers::ocr::TEXT_CONTENT_ASSET_TYPE;
|
||||||
use crate::workers::taskflow::document::DocumentVersionTaskContext;
|
use crate::workers::taskflow::document::DocumentVersionTaskContext;
|
||||||
use crate::workers::taskflow::{Task, TaskContext, TaskError, TaskResult};
|
use crate::workers::taskflow::{Task, TaskContext, TaskError, TaskResult};
|
||||||
|
|
||||||
@@ -427,10 +427,8 @@ fn month_name_to_number(value: &str, settings: &IssuedAtSettings) -> Option<u32>
|
|||||||
|
|
||||||
async fn load_document_text(ctx: &mut DocumentVersionTaskContext) -> TaskResult<Option<String>> {
|
async fn load_document_text(ctx: &mut DocumentVersionTaskContext) -> TaskResult<Option<String>> {
|
||||||
let object_key = {
|
let object_key = {
|
||||||
let assets = ctx.assets().await?;
|
let asset = ctx.asset(TEXT_CONTENT_ASSET_TYPE).await?;
|
||||||
assets
|
asset.map(|a| a.asset.s3_key.clone())
|
||||||
.get(OCR_TEXT_ASSET_TYPE)
|
|
||||||
.map(|asset| asset.asset.s3_key.clone())
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let Some(key) = object_key else {
|
let Some(key) = object_key else {
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ use super::taskflow::{
|
|||||||
document::DocumentVersionTaskContext, Task, TaskContext, TaskError, TaskResult,
|
document::DocumentVersionTaskContext, Task, TaskContext, TaskError, TaskResult,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const OCR_TEXT_ASSET_TYPE: &str = "ocr-text";
|
pub const TEXT_CONTENT_ASSET_TYPE: &str = "text-content";
|
||||||
const MIN_TEXT_LENGTH: usize = 50;
|
const MIN_TEXT_LENGTH: usize = 50;
|
||||||
|
|
||||||
pub struct GenerateOcrTask {
|
pub struct GenerateOcrTask {
|
||||||
@@ -83,7 +83,7 @@ impl Task<DocumentVersionTaskContext> for GenerateOcrTask {
|
|||||||
let s3_key = document_asset_key(
|
let s3_key = document_asset_key(
|
||||||
context.document.id,
|
context.document.id,
|
||||||
context.version.version_number,
|
context.version.version_number,
|
||||||
OCR_TEXT_ASSET_TYPE,
|
TEXT_CONTENT_ASSET_TYPE,
|
||||||
asset_id,
|
asset_id,
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -129,7 +129,7 @@ async fn build_ocr_context(
|
|||||||
) -> TaskResult<OcrContext> {
|
) -> TaskResult<OcrContext> {
|
||||||
let document = ctx.document().await?.clone();
|
let document = ctx.document().await?.clone();
|
||||||
let version = ctx.version().await?.clone();
|
let version = ctx.version().await?.clone();
|
||||||
let asset = ctx.asset(OCR_TEXT_ASSET_TYPE).await?;
|
let asset = ctx.asset(TEXT_CONTENT_ASSET_TYPE).await?;
|
||||||
|
|
||||||
let existing_asset = asset.map(|asset| asset.asset.clone());
|
let existing_asset = asset.map(|asset| asset.asset.clone());
|
||||||
|
|
||||||
@@ -226,7 +226,7 @@ fn persist_ocr_metadata(
|
|||||||
let new_asset = NewDocumentAsset {
|
let new_asset = NewDocumentAsset {
|
||||||
id: asset_id,
|
id: asset_id,
|
||||||
document_version_id,
|
document_version_id,
|
||||||
asset_type: OCR_TEXT_ASSET_TYPE.to_string(),
|
asset_type: TEXT_CONTENT_ASSET_TYPE.to_string(),
|
||||||
mime_type: "text/plain".to_string(),
|
mime_type: "text/plain".to_string(),
|
||||||
metadata,
|
metadata,
|
||||||
s3_key: s3_key.to_string(),
|
s3_key: s3_key.to_string(),
|
||||||
|
|||||||
@@ -194,7 +194,7 @@ const DocumentInfoPanel: React.FC<DocumentInfoPanelProps> = ({
|
|||||||
render: () => {
|
render: () => {
|
||||||
const messageClass = `${base}__message`;
|
const messageClass = `${base}__message`;
|
||||||
const errorClass = `${base}__message ${base}__message--error`;
|
const errorClass = `${base}__message ${base}__message--error`;
|
||||||
const objectClass = `${base}__object ${base}__object--ocr-text`;
|
const objectClass = `${base}__object ${base}__object--text-content`;
|
||||||
|
|
||||||
if (!contentEnabled || !contentConfig.loadContent) {
|
if (!contentEnabled || !contentConfig.loadContent) {
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { openOcrTextInNewTab } from '../utils/ocr';
|
import { openTextContentInNewTab } from '../utils/ocr';
|
||||||
import type {
|
import type {
|
||||||
EnsureAssetUrl,
|
EnsureAssetUrl,
|
||||||
EnsurePreviewData,
|
EnsurePreviewData,
|
||||||
@@ -21,11 +21,11 @@ const resolveDocumentDownloadHref = (document?: Document | null): string | null
|
|||||||
return downloadUrl;
|
return downloadUrl;
|
||||||
};
|
};
|
||||||
|
|
||||||
const hasDocumentOcrAsset = (document?: Document | null, getDocumentAsset?: GetDocumentAsset | null): boolean => {
|
const hasDocumentTextContentAsset = (document?: Document | null, getDocumentAsset?: GetDocumentAsset | null): boolean => {
|
||||||
if (!document || !getDocumentAsset) {
|
if (!document || !getDocumentAsset) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return Boolean(getDocumentAsset(document, 'ocr-text'));
|
return Boolean(getDocumentAsset(document, 'text-content'));
|
||||||
};
|
};
|
||||||
|
|
||||||
interface CreateDocumentActionStateArgs {
|
interface CreateDocumentActionStateArgs {
|
||||||
@@ -43,7 +43,7 @@ export const createDocumentActionState = ({
|
|||||||
ensureAssetUrl,
|
ensureAssetUrl,
|
||||||
getDocumentAsset,
|
getDocumentAsset,
|
||||||
notifyApiError,
|
notifyApiError,
|
||||||
ocrErrorMessage = 'Unable to open OCR text.',
|
ocrErrorMessage = 'Unable to open text content.',
|
||||||
}: CreateDocumentActionStateArgs) => {
|
}: CreateDocumentActionStateArgs) => {
|
||||||
if (!document) {
|
if (!document) {
|
||||||
return {
|
return {
|
||||||
@@ -54,19 +54,19 @@ export const createDocumentActionState = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const downloadHref = resolveDocumentDownloadHref(document);
|
const downloadHref = resolveDocumentDownloadHref(document);
|
||||||
const hasOcr = hasDocumentOcrAsset(document, getDocumentAsset);
|
const hasOcr = hasDocumentTextContentAsset(document, getDocumentAsset);
|
||||||
|
|
||||||
const openOcr = hasOcr
|
const openOcr = hasOcr
|
||||||
? async () => {
|
? async () => {
|
||||||
try {
|
try {
|
||||||
const success = await openOcrTextInNewTab({
|
const success = await openTextContentInNewTab({
|
||||||
document,
|
document,
|
||||||
ensurePreviewData,
|
ensurePreviewData,
|
||||||
getDocumentAsset,
|
getDocumentAsset,
|
||||||
ensureAssetUrl,
|
ensureAssetUrl,
|
||||||
});
|
});
|
||||||
if (!success) {
|
if (!success) {
|
||||||
notifyApiError?.(new Error('OCR text URL unavailable.'), ocrErrorMessage);
|
notifyApiError?.(new Error('Text content URL unavailable.'), ocrErrorMessage);
|
||||||
}
|
}
|
||||||
return success;
|
return success;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -85,5 +85,5 @@ export const createDocumentActionState = ({
|
|||||||
|
|
||||||
export const documentActionsTestExports = {
|
export const documentActionsTestExports = {
|
||||||
resolveDocumentDownloadHref,
|
resolveDocumentDownloadHref,
|
||||||
hasDocumentOcrAsset,
|
hasDocumentTextContentAsset,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ const DocumentViewerPanel: React.FC<DocumentViewerPanelProps> = ({
|
|||||||
if (!document || !getDocumentAsset) {
|
if (!document || !getDocumentAsset) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return Boolean(getDocumentAsset(document, 'ocr-text'));
|
return Boolean(getDocumentAsset(document, 'text-content'));
|
||||||
}, [document, getDocumentAsset]);
|
}, [document, getDocumentAsset]);
|
||||||
|
|
||||||
const navigateToFolder = useCallback(
|
const navigateToFolder = useCallback(
|
||||||
@@ -183,12 +183,12 @@ const DocumentViewerPanel: React.FC<DocumentViewerPanelProps> = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const updateUrl = () =>
|
const updateUrl = () =>
|
||||||
resolveDocumentAssetUrl(document, 'ocr-text', {
|
resolveDocumentAssetUrl(document, 'text-content', {
|
||||||
ensureAssetUrl,
|
ensureAssetUrl,
|
||||||
getAsset: getDocumentAsset,
|
getAsset: getDocumentAsset,
|
||||||
});
|
});
|
||||||
|
|
||||||
const asset = getDocumentAsset(document, 'ocr-text');
|
const asset = getDocumentAsset(document, 'text-content');
|
||||||
let url = updateUrl();
|
let url = updateUrl();
|
||||||
|
|
||||||
if (!url && document.id && asset?.id && ensureAssetUrl) {
|
if (!url && document.id && asset?.id && ensureAssetUrl) {
|
||||||
@@ -223,10 +223,10 @@ const DocumentViewerPanel: React.FC<DocumentViewerPanelProps> = ({
|
|||||||
id: 'content',
|
id: 'content',
|
||||||
label: 'Content',
|
label: 'Content',
|
||||||
loadContent: loadOcrContent,
|
loadContent: loadOcrContent,
|
||||||
loadingMessage: 'Loading OCR content…',
|
loadingMessage: 'Loading text content…',
|
||||||
emptyMessage: 'No OCR content available.',
|
emptyMessage: 'No text content available.',
|
||||||
unavailableMessage: 'No OCR content available.',
|
unavailableMessage: 'No text content available.',
|
||||||
errorMessage: 'Failed to load OCR content.',
|
errorMessage: 'Failed to load text content.',
|
||||||
}),
|
}),
|
||||||
[hasOcr, loadOcrContent],
|
[hasOcr, loadOcrContent],
|
||||||
);
|
);
|
||||||
@@ -282,7 +282,7 @@ const DocumentViewerPanel: React.FC<DocumentViewerPanelProps> = ({
|
|||||||
ensureAssetUrl,
|
ensureAssetUrl,
|
||||||
getDocumentAsset,
|
getDocumentAsset,
|
||||||
notifyApiError,
|
notifyApiError,
|
||||||
ocrErrorMessage: 'Unable to open OCR text.',
|
ocrErrorMessage: 'Unable to open text content.',
|
||||||
})
|
})
|
||||||
: null,
|
: null,
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -357,7 +357,7 @@
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.document-viewer__object--ocr-text {
|
.document-viewer__object--text-content {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ export type EnsureAssetUrl = (
|
|||||||
) => Promise<AssetLike | null>;
|
) => Promise<AssetLike | null>;
|
||||||
export type GetDocumentAsset = AssetManagerGetAsset;
|
export type GetDocumentAsset = AssetManagerGetAsset;
|
||||||
|
|
||||||
interface ResolveOcrTextUrlOptions {
|
interface ResolveTextContentUrlOptions {
|
||||||
document: Document | null;
|
document: Document | null;
|
||||||
ensurePreviewData?: EnsurePreviewData;
|
ensurePreviewData?: EnsurePreviewData;
|
||||||
getDocumentAsset?: GetDocumentAsset;
|
getDocumentAsset?: GetDocumentAsset;
|
||||||
@@ -29,15 +29,15 @@ const pickAsset = (doc?: Document | null, getDocumentAsset?: GetDocumentAsset):
|
|||||||
if (!doc || !getDocumentAsset) {
|
if (!doc || !getDocumentAsset) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return getDocumentAsset(doc, 'ocr-text') || null;
|
return getDocumentAsset(doc, 'text-content') || null;
|
||||||
};
|
};
|
||||||
|
|
||||||
export async function resolveOcrTextUrl({
|
export async function resolveTextContentUrl({
|
||||||
document,
|
document,
|
||||||
ensurePreviewData,
|
ensurePreviewData,
|
||||||
getDocumentAsset,
|
getDocumentAsset,
|
||||||
ensureAssetUrl,
|
ensureAssetUrl,
|
||||||
}: ResolveOcrTextUrlOptions): Promise<string | null> {
|
}: ResolveTextContentUrlOptions): Promise<string | null> {
|
||||||
if (!document?.id) {
|
if (!document?.id) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -75,7 +75,7 @@ export async function resolveOcrTextUrl({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
resolveDocumentAssetUrl(docRef, 'ocr-text', {
|
resolveDocumentAssetUrl(docRef, 'text-content', {
|
||||||
ensureAssetUrl,
|
ensureAssetUrl,
|
||||||
getAsset: getDocumentAsset,
|
getAsset: getDocumentAsset,
|
||||||
ensureOptions: { force: true },
|
ensureOptions: { force: true },
|
||||||
@@ -83,7 +83,7 @@ export async function resolveOcrTextUrl({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function openOcrTextInNewTab(options: ResolveOcrTextUrlOptions): Promise<boolean> {
|
export async function openTextContentInNewTab(options: ResolveTextContentUrlOptions): Promise<boolean> {
|
||||||
const popup = window.open('', '_blank');
|
const popup = window.open('', '_blank');
|
||||||
const popupAvailable = Boolean(popup);
|
const popupAvailable = Boolean(popup);
|
||||||
|
|
||||||
@@ -96,7 +96,7 @@ export async function openOcrTextInNewTab(options: ResolveOcrTextUrlOptions): Pr
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const url = await resolveOcrTextUrl(options);
|
const url = await resolveTextContentUrl(options);
|
||||||
if (!url) {
|
if (!url) {
|
||||||
if (popupAvailable) {
|
if (popupAvailable) {
|
||||||
popup.close();
|
popup.close();
|
||||||
|
|||||||
Reference in New Issue
Block a user