fix: Don't trigger email and slack notifications when mass importing
feat: Show success message after import
This commit is contained in:
@ -23,17 +23,22 @@ function ImportExport() {
|
||||
const { showToast } = ui;
|
||||
const [isLoading, setLoading] = React.useState(false);
|
||||
const [isImporting, setImporting] = React.useState(false);
|
||||
const [importedDetails, setImported] = React.useState(false);
|
||||
const [isExporting, setExporting] = React.useState(false);
|
||||
const [file, setFile] = React.useState();
|
||||
const [importDetails, setImportDetails] = React.useState();
|
||||
|
||||
const handleImport = React.useCallback(
|
||||
async (ev) => {
|
||||
setImported(undefined);
|
||||
setImporting(true);
|
||||
|
||||
try {
|
||||
await documents.batchImport(file);
|
||||
const { documentCount, collectionCount } = await documents.batchImport(
|
||||
file
|
||||
);
|
||||
showToast(t("Import completed"));
|
||||
setImported({ documentCount, collectionCount });
|
||||
} catch (err) {
|
||||
showToast(err.message);
|
||||
} finally {
|
||||
@ -116,6 +121,17 @@ function ImportExport() {
|
||||
accept="application/zip"
|
||||
/>
|
||||
</VisuallyHidden>
|
||||
{importedDetails && (
|
||||
<Notice>
|
||||
<Trans
|
||||
count={importedDetails.documentCount}
|
||||
i18nKey="importSuccessful"
|
||||
>
|
||||
Import successful, {{ count: importedDetails.documentCount }}{" "}
|
||||
documents were imported to your knowledge base.
|
||||
</Trans>
|
||||
</Notice>
|
||||
)}
|
||||
{file && !isImportable && (
|
||||
<ImportPreview>
|
||||
<Trans>
|
||||
@ -126,7 +142,7 @@ function ImportExport() {
|
||||
)}
|
||||
{file && importDetails && isImportable ? (
|
||||
<>
|
||||
<ImportPreview>
|
||||
<ImportPreview as="div">
|
||||
<Trans>
|
||||
<strong>{{ fileName: file.name }}</strong> looks good, the
|
||||
following collections and their documents will be imported:
|
||||
|
@ -508,6 +508,8 @@ export default class DocumentsStore extends BaseStore<Document> {
|
||||
|
||||
this.addPolicies(res.policies);
|
||||
res.data.collections.forEach(this.rootStore.collections.add);
|
||||
|
||||
return res.data;
|
||||
};
|
||||
|
||||
@action
|
||||
|
@ -1124,7 +1124,7 @@ router.post("documents.batchImport", auth(), async (ctx) => {
|
||||
const user = ctx.state.user;
|
||||
authorize(user, "batchImport", Document);
|
||||
|
||||
const { collections } = await documentBatchImporter({
|
||||
const { documents, attachments, collections } = await documentBatchImporter({
|
||||
file,
|
||||
user,
|
||||
type,
|
||||
@ -1133,6 +1133,9 @@ router.post("documents.batchImport", auth(), async (ctx) => {
|
||||
|
||||
ctx.body = {
|
||||
data: {
|
||||
attachmentCount: attachments.length,
|
||||
documentCount: documents.length,
|
||||
collectionCount: collections.length,
|
||||
collections: collections.map((collection) =>
|
||||
presentCollection(collection)
|
||||
),
|
||||
@ -1189,6 +1192,7 @@ router.post("documents.import", auth(), async (ctx) => {
|
||||
});
|
||||
|
||||
const document = await documentCreator({
|
||||
source: "import",
|
||||
title,
|
||||
text,
|
||||
publish,
|
||||
|
@ -8,12 +8,14 @@ export default async function attachmentCreator({
|
||||
type,
|
||||
buffer,
|
||||
user,
|
||||
source,
|
||||
ip,
|
||||
}: {
|
||||
name: string,
|
||||
type: string,
|
||||
buffer: Buffer,
|
||||
user: User,
|
||||
source?: "import",
|
||||
ip: string,
|
||||
}) {
|
||||
const key = `uploads/${user.id}/${uuid.v4()}/${name}`;
|
||||
@ -32,7 +34,7 @@ export default async function attachmentCreator({
|
||||
|
||||
await Event.create({
|
||||
name: "attachments.create",
|
||||
data: { name },
|
||||
data: { name, source },
|
||||
modelId: attachment.id,
|
||||
teamId: user.teamId,
|
||||
actorId: user.id,
|
||||
|
@ -114,6 +114,7 @@ export default async function documentBatchImporter({
|
||||
}
|
||||
|
||||
const document = await documentCreator({
|
||||
source: "import",
|
||||
title,
|
||||
text,
|
||||
publish: true,
|
||||
@ -134,6 +135,7 @@ export default async function documentBatchImporter({
|
||||
if (item.type === "attachment") {
|
||||
const buffer = await item.item.async("nodebuffer");
|
||||
const attachment = await attachmentCreator({
|
||||
source: "import",
|
||||
name: item.name,
|
||||
type,
|
||||
buffer,
|
||||
|
@ -14,6 +14,7 @@ export default async function documentCreator({
|
||||
index,
|
||||
user,
|
||||
editorVersion,
|
||||
source,
|
||||
ip,
|
||||
}: {
|
||||
title: string,
|
||||
@ -28,6 +29,7 @@ export default async function documentCreator({
|
||||
index?: number,
|
||||
user: User,
|
||||
editorVersion?: string,
|
||||
source?: "import",
|
||||
ip: string,
|
||||
}): Document {
|
||||
const templateId = templateDocument ? templateDocument.id : undefined;
|
||||
@ -53,7 +55,7 @@ export default async function documentCreator({
|
||||
collectionId: document.collectionId,
|
||||
teamId: document.teamId,
|
||||
actorId: user.id,
|
||||
data: { title: document.title, templateId },
|
||||
data: { source, title: document.title, templateId },
|
||||
ip,
|
||||
});
|
||||
|
||||
@ -66,7 +68,7 @@ export default async function documentCreator({
|
||||
collectionId: document.collectionId,
|
||||
teamId: document.teamId,
|
||||
actorId: user.id,
|
||||
data: { title: document.title },
|
||||
data: { source, title: document.title },
|
||||
ip,
|
||||
});
|
||||
}
|
||||
|
@ -47,6 +47,10 @@ export type DocumentEvent =
|
||||
teamId: string,
|
||||
actorId: string,
|
||||
ip: string,
|
||||
data: {
|
||||
title: string,
|
||||
source?: "import",
|
||||
},
|
||||
}
|
||||
| {
|
||||
name: "documents.move",
|
||||
|
@ -27,6 +27,9 @@ export default class Notifications {
|
||||
}
|
||||
|
||||
async documentUpdated(event: DocumentEvent) {
|
||||
// never send notifications when batch importing documents
|
||||
if (event.data && event.data.source === "import") return;
|
||||
|
||||
const document = await Document.findByPk(event.documentId);
|
||||
if (!document) return;
|
||||
|
||||
|
@ -55,6 +55,9 @@ export default class Slack {
|
||||
}
|
||||
|
||||
async documentUpdated(event: DocumentEvent) {
|
||||
// never send notifications when batch importing documents
|
||||
if (event.data && event.data.source === "import") return;
|
||||
|
||||
const document = await Document.findByPk(event.documentId);
|
||||
if (!document) return;
|
||||
|
||||
|
@ -279,6 +279,8 @@
|
||||
"Export in progress…": "Export in progress…",
|
||||
"Import": "Import",
|
||||
"It is possible to import a zip file of folders and Markdown files previously exported from an Outline instance. Support will soon be added for importing from other services.": "It is possible to import a zip file of folders and Markdown files previously exported from an Outline instance. Support will soon be added for importing from other services.",
|
||||
"importSuccessful": "Import successful, {{ count }} document was imported into your knowledge base.",
|
||||
"importSuccessful_plural": "Import successful, {{ count }} documents were imported into your knowledge base.",
|
||||
"Sorry, the file <1>{{fileName}}</1> is missing valid collections or documents.": "Sorry, the file <1>{{fileName}}</1> is missing valid collections or documents.",
|
||||
"<0>{{fileName}}</0> looks good, the following collections and their documents will be imported:": "<0>{{fileName}}</0> looks good, the following collections and their documents will be imported:",
|
||||
"Importing": "Importing",
|
||||
@ -309,4 +311,4 @@
|
||||
"Suspended": "Suspended",
|
||||
"Edit Profile": "Edit Profile",
|
||||
"{{ userName }} hasn’t updated any documents yet.": "{{ userName }} hasn’t updated any documents yet."
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user