diff --git a/datasette/static/app.css b/datasette/static/app.css index b430e208..30c4855c 100644 --- a/datasette/static/app.css +++ b/datasette/static/app.css @@ -1865,6 +1865,7 @@ textarea.row-edit-input { margin: 0; } +.row-edit-bulk-note label, .row-edit-bulk-note .button-as-link { font: inherit; } @@ -1924,10 +1925,11 @@ textarea.row-edit-input { border-bottom: 1px solid var(--rule); border-right: 1px solid var(--rule); max-width: 18rem; + overflow-wrap: anywhere; padding: 6px 8px; text-align: left; vertical-align: top; - white-space: nowrap; + white-space: normal; } .row-edit-bulk-preview-table th { @@ -2296,6 +2298,11 @@ select.table-create-input { margin: 0; } +.table-create-data-note label, +.table-create-data-note .button-as-link { + font: inherit; +} + .table-create-data-preview { display: grid; gap: 10px; @@ -2335,10 +2342,11 @@ select.table-create-input { border-bottom: 1px solid var(--rule); border-right: 1px solid var(--rule); max-width: 18rem; + overflow-wrap: anywhere; padding: 6px 8px; text-align: left; vertical-align: top; - white-space: nowrap; + white-space: normal; } .table-create-data-preview-table th { diff --git a/datasette/static/edit-tools.js b/datasette/static/edit-tools.js index 0415d772..87b63838 100644 --- a/datasette/static/edit-tools.js +++ b/datasette/static/edit-tools.js @@ -1850,6 +1850,36 @@ function resetTableCreateDataPreview(state) { syncTableCreateModeUi(state); } +function tableCreateTableNameFromFileName(fileName) { + var baseName = (fileName || "").replace(/^.*[\\/]/, ""); + var nameWithoutExtension = baseName.replace(/\.[^.]*$/, ""); + return nameWithoutExtension + .trim() + .replace(/\s+/g, "_") + .toLowerCase() + .replace(/[^a-z0-9_]/g, ""); +} + +async function loadTableCreateDataTextFile(state, file) { + if (!file) { + return; + } + try { + var text = await readTextFile(file); + var tableName = tableCreateTableNameFromFileName(file.name); + if (tableName) { + state.tableName.value = tableName; + state.tableName.dispatchEvent(new Event("input", { bubbles: true })); + } + state.dataTextarea.value = text; + state.dataTextarea.dispatchEvent(new Event("input", { bubbles: true })); + clearTableCreateDialogError(state); + state.dataTextarea.focus(); + } catch (_error) { + showTableCreateDialogError(state, "Could not read that text file."); + } +} + function previewTableCreateDataRows(state) { clearTableCreateDialogError(state); resetTableCreateDataPreview(state); @@ -2152,9 +2182,9 @@ function ensureTableCreateDialog(manager) {
. You can also or drop it onto this textarea
+ -Paste TSV, CSV, or JSON. You can also drop a text file onto this textarea.
Paste TSV, CSV, or JSON. You can also or drop it onto this textarea
+. You can also or drop it onto this textarea
- +