From 4af3f85e64e795e8ae1d87d4caee8185028294ac Mon Sep 17 00:00:00 2001 From: Ariel Leyva Date: Fri, 6 Mar 2026 09:26:13 -0500 Subject: [PATCH] fix(csv-viewer): add support for missing text encodings in dropdown list (#5795) --- frontend/src/components/DropdownModal.vue | 142 ++++++++++++++++ frontend/src/components/files/CsvViewer.vue | 107 ++++++++++-- frontend/src/types/global.d.ts | 4 + frontend/src/utils/encodings.ts | 173 ++++++++++++++++++++ frontend/src/utils/index.ts | 22 +++ frontend/src/views/files/Preview.vue | 6 +- http/resource.go | 2 +- 7 files changed, 439 insertions(+), 17 deletions(-) create mode 100644 frontend/src/components/DropdownModal.vue diff --git a/frontend/src/components/DropdownModal.vue b/frontend/src/components/DropdownModal.vue new file mode 100644 index 00000000..66780120 --- /dev/null +++ b/frontend/src/components/DropdownModal.vue @@ -0,0 +1,142 @@ + + + + + + + diff --git a/frontend/src/components/files/CsvViewer.vue b/frontend/src/components/files/CsvViewer.vue index 38c2de59..9e1904af 100644 --- a/frontend/src/components/files/CsvViewer.vue +++ b/frontend/src/components/files/CsvViewer.vue @@ -21,19 +21,37 @@
- +
+ {{ selectedEncoding }} +
+ +
@@ -74,10 +92,11 @@ diff --git a/frontend/src/types/global.d.ts b/frontend/src/types/global.d.ts index 5475c908..287388f0 100644 --- a/frontend/src/types/global.d.ts +++ b/frontend/src/types/global.d.ts @@ -10,4 +10,8 @@ declare global { // TODO: no idea what the exact type is __vue__: any; } + + interface HTMLElement { + clickOutsideEvent?: (event: Event) => void; + } } diff --git a/frontend/src/utils/encodings.ts b/frontend/src/utils/encodings.ts index 80f1e219..9be1017a 100644 --- a/frontend/src/utils/encodings.ts +++ b/frontend/src/utils/encodings.ts @@ -1,4 +1,5 @@ export const availableEncodings = [ + // encodings "utf-8", "ibm866", "iso-8859-2", @@ -37,6 +38,178 @@ export const availableEncodings = [ "euc-kr", "utf-16be", "utf-16le", + // label encodings + "unicode-1-1-utf-8", + "utf8", + "866", + "cp866", + "csibm866", + "csisolatin2", + "iso-ir-101", + "iso8859-2", + "iso88592", + "iso_8859-2", + "iso_8859-2:1987", + "l2", + "latin2", + "csisolatin3", + "iso-ir-109", + "iso8859-3", + "iso88593", + "iso_8859-3", + "iso_8859-3:1988", + "l3", + "latin3", + "csisolatin4", + "iso-ir-110", + "iso8859-4", + "iso88594", + "iso_8859-4", + "iso_8859-4:1988", + "l4", + "latin4", + "csisolatincyrillic", + "cyrillic", + "iso-ir-144", + "iso88595", + "iso_8859-5", + "iso_8859-5:1988", + "arabic", + "asmo-708", + "csiso88596e", + "csiso88596i", + "csisolatinarabic", + "ecma-114", + "iso-8859-6-e", + "iso-8859-6-i", + "iso-ir-127", + "iso8859-6", + "iso88596", + "iso_8859-6", + "iso_8859-6:1987", + "csisolatingreek", + "ecma-118", + "elot_928", + "greek", + "greek8", + "iso-ir-126", + "iso8859-7", + "iso88597", + "iso_8859-7", + "iso_8859-7:1987", + "sun_eu_greek", + "csiso88598e", + "csisolatinhebrew", + "hebrew", + "iso-8859-8-e", + "iso-ir-138", + "iso8859-8", + "iso88598", + "iso_8859-8", + "iso_8859-8:1988", + "visual", + "csiso88598i", + "logical", + "csisolatin6", + "iso-ir-157", + "iso8859-10", + "iso885910", + "l6", + "latin6", + "iso8859-13", + "iso885913", + "iso8859-14", + "iso885914", + "csisolatin9", + "iso8859-15", + "iso885915", + "l9", + "latin9", + "cskoi8r", + "koi", + "koi8", + "koi8_r", + "csmacintosh", + "mac", + "x-mac-roman", + "dos-874", + "iso-8859-11", + "iso8859-11", + "iso885911", + "tis-620", + "cp1250", + "x-cp1250", + "cp1251", + "x-cp1251", + "ansi_x3.4-1968", + "ascii", + "cp1252", + "cp819", + "csisolatin1", + "ibm819", + "iso-8859-1", + "iso-ir-100", + "iso8859-1", + "iso88591", + "iso_8859-1", + "iso_8859-1:1987", + "l1", + "latin1", + "us-ascii", + "x-cp1252", + "cp1253", + "x-cp1253", + "cp1254", + "csisolatin5", + "iso-8859-9", + "iso-ir-148", + "iso8859-9", + "iso88599", + "iso_8859-9", + "iso_8859-9:1989", + "l5", + "latin5", + "x-cp1254", + "cp1255", + "x-cp1255", + "cp1256", + "x-cp1256", + "cp1257", + "x-cp1257", + "cp1258", + "x-cp1258", + "x-mac-ukrainian", + "chinese", + "csgb2312", + "csiso58gb231280", + "gb2312", + "gb_2312", + "gb_2312-80", + "iso-ir-58", + "x-gbk", + "big5-hkscs", + "cn-big5", + "csbig5", + "x-x-big5", + "cseucpkdfmtjapanese", + "x-euc-jp", + "csiso2022jp", + "csshiftjis", + "ms_kanji", + "shift-jis", + "sjis", + "windows-31j", + "x-sjis", + "cseuckr", + "csksc56011987", + "iso-ir-149", + "korean", + "ks_c_5601-1987", + "ks_c_5601-1989", + "ksc5601", + "ksc_5601", + "windows-949", + "utf-16", ]; export function decode(content: ArrayBuffer, encoding: string): string { diff --git a/frontend/src/utils/index.ts b/frontend/src/utils/index.ts index d7f0bd9b..faca1539 100644 --- a/frontend/src/utils/index.ts +++ b/frontend/src/utils/index.ts @@ -4,3 +4,25 @@ import { partial } from "filesize"; * Formats filesize as KiB/MiB/... */ export const filesize = partial({ base: 2 }); + +export const vClickOutside = { + created(el: HTMLElement, binding: any) { + el.clickOutsideEvent = (event: Event) => { + const target = event.target; + + if (target instanceof Node) { + if (!el.contains(target)) { + binding.value(event); + } + } + }; + + document.addEventListener("click", el.clickOutsideEvent); + }, + + unmounted(el: HTMLElement) { + if (el.clickOutsideEvent) { + document.removeEventListener("click", el.clickOutsideEvent); + } + }, +}; diff --git a/frontend/src/views/files/Preview.vue b/frontend/src/views/files/Preview.vue index 9a67de2d..2a60e7df 100644 --- a/frontend/src/views/files/Preview.vue +++ b/frontend/src/views/files/Preview.vue @@ -311,7 +311,11 @@ const isPdf = computed(() => fileStore.req?.extension.toLowerCase() == ".pdf"); const isEpub = computed( () => fileStore.req?.extension.toLowerCase() == ".epub" ); -const isCsv = computed(() => fileStore.req?.extension.toLowerCase() == ".csv"); +const isCsv = computed( + () => + fileStore.req?.extension.toLowerCase() == ".csv" && + fileStore.req.size <= CSV_MAX_SIZE +); const isResizeEnabled = computed(() => resizePreview); diff --git a/http/resource.go b/http/resource.go index 7066f35a..f528473d 100644 --- a/http/resource.go +++ b/http/resource.go @@ -43,7 +43,7 @@ var resourceGetHandler = withUser(func(w http.ResponseWriter, r *http.Request, d return renderJSON(w, r, file) } else if encoding == "true" { if file.Type != "text" { - return http.StatusUnsupportedMediaType, fmt.Errorf("file is not a text file") + return renderJSON(w, r, file) } f, err := d.user.Fs.Open(r.URL.Path)