Skip to content

Commit 9a6292c

Browse files
authored
Add an indicator to attachments that have been inserted (#6577)
* Add an indicator to attachments that have been inserted See https://www.woltlab.com/community/thread/307691/ * Remove the check for the indicator This was a left-over from an earlier approach.
1 parent 24d99dd commit 9a6292c

9 files changed

Lines changed: 130 additions & 10 deletions

File tree

com.woltlab.wcf/templates/shared_messageFormAttachments.tpl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
<script data-relocate="true">
2121
{jsphrase name='wcf.attachment.insert'}
22+
{jsphrase name='wcf.attachment.inserted'}
2223
{jsphrase name='wcf.attachment.insertFull'}
2324
{jsphrase name='wcf.attachment.moreOptions'}
2425

ts/WoltLabSuite/Core/Component/Attachment/Entry.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
updateFileInformation,
1313
} from "WoltLabSuite/Core/Component/File/Helper";
1414

15-
type FileProcessorData = {
15+
export type FileProcessorData = {
1616
attachmentID: number;
1717
messageObjectID: number | null;
1818
};

ts/WoltLabSuite/Core/Component/Attachment/List.ts

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import WoltlabCoreFileElement from "../File/woltlab-core-file";
22
import { CkeditorDropEvent } from "../File/Upload";
3-
import { createAttachmentFromFile } from "./Entry";
3+
import { createAttachmentFromFile, FileProcessorData } from "./Entry";
44
import { listenToCkeditor } from "../Ckeditor/Event";
55
import { getTabMenu } from "../Message/MessageTabMenu";
66
import Sortable from "sortablejs";
77
import { promiseMutex } from "WoltLabSuite/Core/Helper/PromiseMutex";
88
import { postObject } from "WoltLabSuite/Core/Api/PostObject";
9+
import { debounce } from "WoltLabSuite/Core/Core";
10+
import { getCkeditor } from "../Ckeditor";
911

1012
function fileToAttachment(fileList: HTMLElement, file: WoltlabCoreFileElement, editor: HTMLElement): void {
1113
fileList.append(createAttachmentFromFile(file, editor));
@@ -146,4 +148,51 @@ export function setup(editorId: string): void {
146148
childList: true,
147149
subtree: true,
148150
});
151+
152+
listenToCkeditor(editor)
153+
.changeData(
154+
debounce(() => {
155+
observeInsertedAttachments(editor, files);
156+
}, 500),
157+
)
158+
.ready(() => {
159+
observeInsertedAttachments(editor, files);
160+
});
161+
}
162+
163+
function observeInsertedAttachments(element: HTMLElement, files: HTMLCollectionOf<WoltlabCoreFileElement>): void {
164+
const editor = getCkeditor(element);
165+
if (editor === undefined) {
166+
throw new Error(`Could not find the CKEditor for element '${element.id}'.`);
167+
}
168+
169+
const embeddedAttachments: Set<number> = new Set();
170+
editor.element.querySelectorAll(".woltlabAttachment[data-attachment-id]").forEach((img: HTMLImageElement) => {
171+
const attachmentId = parseInt(img.dataset.attachmentId!);
172+
embeddedAttachments.add(attachmentId);
173+
});
174+
175+
const bbcodeMatches = editor.element.innerText.matchAll(/\[attach=('\d+'|"\d+"|\d+)(?:,[^]]+?)?\]\[\/attach\]/g);
176+
for (const match of bbcodeMatches) {
177+
const attachmentId = parseInt(match[1]);
178+
embeddedAttachments.add(attachmentId);
179+
}
180+
181+
for (const file of files) {
182+
if (file.isFailedUpload()) {
183+
continue;
184+
}
185+
186+
const wrapper = file.closest(".fileList__item");
187+
if (wrapper === null) {
188+
continue;
189+
}
190+
191+
const { attachmentID } = file.data as FileProcessorData;
192+
if (embeddedAttachments.has(attachmentID)) {
193+
wrapper.classList.add("fileList__item--inserted");
194+
} else {
195+
wrapper.classList.remove("fileList__item--inserted");
196+
}
197+
}
149198
}

ts/WoltLabSuite/Core/Component/File/Helper.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,19 @@ export function insertFileInformation(container: HTMLElement, file: WoltlabCoreF
9797
filename.classList.add("fileList__item__filename");
9898
filename.textContent = file.filename || file.dataset.filename!;
9999

100+
const indicatorIcon = document.createElement("fa-icon");
101+
indicatorIcon.setIcon("circle-check");
102+
const fileIndicator = document.createElement("div");
103+
fileIndicator.classList.add("fileList__item__indicator", "green", "jsTooltip");
104+
fileIndicator.setAttribute("aria-hidden", "true");
105+
fileIndicator.title = getPhrase("wcf.attachment.inserted");
106+
fileIndicator.append(indicatorIcon);
107+
100108
const fileSize = document.createElement("div");
101109
fileSize.classList.add("fileList__item__fileSize");
102110
fileSize.textContent = formatFilesize(file.fileSize || parseInt(file.dataset.fileSize!));
103111

104-
container.append(fileWrapper, filename, fileSize);
112+
container.append(fileWrapper, filename, fileIndicator, fileSize);
105113
}
106114

107115
export function updateFileInformation(container: HTMLElement, file: WoltlabCoreFileElement): void {

wcfsetup/install/files/js/WoltLabSuite/Core/Component/Attachment/List.js

Lines changed: 40 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

wcfsetup/install/files/js/WoltLabSuite/Core/Component/File/Helper.js

Lines changed: 8 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

wcfsetup/install/files/style/ui/fileList.scss

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,16 @@
2323
box-shadow: var(--wcfBoxShadowCard);
2424
display: grid;
2525
grid-template-areas:
26-
"file filename"
27-
"file fileSize"
28-
"file buttons"
29-
"file error";
30-
grid-template-columns: 80px auto;
26+
"file filename indicator"
27+
"file fileSize fileSize"
28+
"file buttons buttons"
29+
"file error error";
30+
grid-template-columns: 80px auto 0;
3131
padding: 10px;
3232
}
33+
.fileList__item--inserted {
34+
grid-template-columns: 80px auto 20px;
35+
}
3336

3437
.fileList__item--error {
3538
border-color: var(--wcfStatusErrorBorder);
@@ -58,7 +61,18 @@
5861
margin-right: 10px;
5962
}
6063

64+
.fileList__item__indicator {
65+
grid-area: indicator;
66+
margin-left: 5px;
67+
visibility: hidden;
68+
}
69+
70+
.fileList__item--inserted .fileList__item__indicator {
71+
visibility: visible;
72+
}
73+
6174
.fileList__item__filename {
75+
align-self: center;
6276
font-size: 12px;
6377
grid-area: filename;
6478
overflow: hidden;

wcfsetup/install/lang/de.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3369,6 +3369,7 @@ freigeschaltet. {if LANGUAGE_USE_INFORMAL_VARIANT}Du kannst{else}Sie können{/if
33693369
Maximale Dateigröße: {@$attachmentHandler->getMaxSize()|filesize}<br>
33703370
Erlaubte Dateiendungen: {', '|implode:$attachmentHandler->getFormattedAllowedExtensions()}]]></item>
33713371
<item name="wcf.attachment.insert"><![CDATA[In Text einfügen]]></item>
3372+
<item name="wcf.attachment.inserted"><![CDATA[Eingefügt]]></item>
33723373
<item name="wcf.attachment.insertAll"><![CDATA[Alle einfügen]]></item>
33733374
<item name="wcf.attachment.insertFull"><![CDATA[Original einfügen]]></item>
33743375
<item name="wcf.attachment.insertThumbnail"><![CDATA[Vorschau einfügen]]></item>

wcfsetup/install/lang/en.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3292,6 +3292,7 @@ Your account on {@PAGE_TITLE|phrase} [URL:{link isEmail=true}{/link}] has been a
32923292
Maximum file size: {@$attachmentHandler->getMaxSize()|filesize}<br>
32933293
Allowed extensions: {', '|implode:$attachmentHandler->getFormattedAllowedExtensions()}]]></item>
32943294
<item name="wcf.attachment.insert"><![CDATA[Insert into message]]></item>
3295+
<item name="wcf.attachment.inserted"><![CDATA[Inserted]]></item>
32953296
<item name="wcf.attachment.insertAll"><![CDATA[Insert All]]></item>
32963297
<item name="wcf.attachment.insertFull"><![CDATA[Full Image]]></item>
32973298
<item name="wcf.attachment.insertThumbnail"><![CDATA[Thumbnail]]></item>

0 commit comments

Comments
 (0)