> {
+ self.db
+ .prepare_cached("SELECT name FROM fields WHERE ntid = ? ORDER BY ord")?
+ .query_and_then([notetype_id], |row| Ok(row.get(0)?))?
+ //.map_err(Into::into)
+ .collect()
+ }
}
diff --git a/ts/import-csv/BUILD.bazel b/ts/import-csv/BUILD.bazel
new file mode 100644
index 000000000..0fc054feb
--- /dev/null
+++ b/ts/import-csv/BUILD.bazel
@@ -0,0 +1,87 @@
+load("//ts:prettier.bzl", "prettier_test")
+load("//ts:eslint.bzl", "eslint_test")
+load("//ts/svelte:svelte.bzl", "compile_svelte", "svelte_check")
+load("//ts:esbuild.bzl", "esbuild")
+load("//ts:generate_page.bzl", "generate_page")
+load("//ts:compile_sass.bzl", "compile_sass")
+load("//ts:typescript.bzl", "typescript")
+load("//ts:jest.bzl", "jest_test")
+
+generate_page(page = "import-csv")
+
+compile_sass(
+ srcs = ["import-csv-base.scss"],
+ group = "base_css",
+ visibility = ["//visibility:public"],
+ deps = [
+ "//sass:base_lib",
+ "//sass:scrollbar_lib",
+ "//sass/bootstrap",
+ ],
+)
+
+_ts_deps = [
+ "//ts/components",
+ "//ts/lib",
+ "//ts/sveltelib",
+ "@npm//@fluent",
+ "@npm//@types/jest",
+ "@npm//lodash-es",
+ "@npm//svelte",
+ "@npm//marked",
+]
+
+compile_svelte(deps = _ts_deps)
+
+typescript(
+ name = "index",
+ deps = _ts_deps + [
+ ":svelte",
+ ],
+)
+
+esbuild(
+ name = "import-csv",
+ args = {
+ "globalName": "anki",
+ "loader": {".svg": "text"},
+ },
+ entry_point = "index.ts",
+ output_css = "import-csv.css",
+ visibility = ["//visibility:public"],
+ deps = [
+ ":base_css",
+ ":index",
+ ":svelte",
+ "@npm//bootstrap-icons",
+ ],
+)
+
+# Tests
+################
+
+prettier_test()
+
+eslint_test()
+
+svelte_check(
+ name = "svelte_check",
+ srcs = glob([
+ "*.ts",
+ "*.svelte",
+ ]) + [
+ "//sass:button_mixins_lib",
+ "//sass/bootstrap",
+ "@npm//@types/bootstrap",
+ "@npm//@types/lodash-es",
+ "@npm//@types/marked",
+ "//ts/components",
+ ],
+)
+
+jest_test(
+ protobuf = True,
+ deps = [
+ ":index",
+ ],
+)
diff --git a/ts/import-csv/DeckSelector.svelte b/ts/import-csv/DeckSelector.svelte
new file mode 100644
index 000000000..6638588a1
--- /dev/null
+++ b/ts/import-csv/DeckSelector.svelte
@@ -0,0 +1,38 @@
+
+
+
+
+
+ {tr.decksDeck()}
+
+
+
+
+ {#each deckNameIds as entry, idx}
+
+ {entry.name}
+
+ {/each}
+
+
+
+
diff --git a/ts/import-csv/DelimiterSelector.svelte b/ts/import-csv/DelimiterSelector.svelte
new file mode 100644
index 000000000..29980c21d
--- /dev/null
+++ b/ts/import-csv/DelimiterSelector.svelte
@@ -0,0 +1,54 @@
+
+
+
+
+
+ {tr.importingFieldDelimiter()}
+
+
+
+
+ {#each delimiters as delimiterName, idx}
+
+ {delimiterName[1]}
+
+ {/each}
+
+
+
+
diff --git a/ts/import-csv/FieldMapper.svelte b/ts/import-csv/FieldMapper.svelte
new file mode 100644
index 000000000..41590ac4f
--- /dev/null
+++ b/ts/import-csv/FieldMapper.svelte
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+ {#each fieldNames as label, idx}
+ {#if idx === 0}
+
+ {:else}
+
+ {/if}
+ {/each}
+
diff --git a/ts/import-csv/Header.svelte b/ts/import-csv/Header.svelte
new file mode 100644
index 000000000..03ea8d456
--- /dev/null
+++ b/ts/import-csv/Header.svelte
@@ -0,0 +1,21 @@
+
+
+
+
+
+ {heading}
+
+
+
+
diff --git a/ts/import-csv/ImportButton.svelte b/ts/import-csv/ImportButton.svelte
new file mode 100644
index 000000000..453ec8162
--- /dev/null
+++ b/ts/import-csv/ImportButton.svelte
@@ -0,0 +1,33 @@
+
+
+
+
+ {tr.actionsImport()}
+
+
diff --git a/ts/import-csv/ImportCsvPage.svelte b/ts/import-csv/ImportCsvPage.svelte
new file mode 100644
index 000000000..f3df72c71
--- /dev/null
+++ b/ts/import-csv/ImportCsvPage.svelte
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {tr.importingAllowHtmlInFields()}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ts/import-csv/MapperRow.svelte b/ts/import-csv/MapperRow.svelte
new file mode 100644
index 000000000..7329abd40
--- /dev/null
+++ b/ts/import-csv/MapperRow.svelte
@@ -0,0 +1,29 @@
+
+
+
+
+
+ {label}
+
+
+
+
+
+
diff --git a/ts/import-csv/MetaMapper.svelte b/ts/import-csv/MetaMapper.svelte
new file mode 100644
index 000000000..c6ece82f5
--- /dev/null
+++ b/ts/import-csv/MetaMapper.svelte
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/ts/import-csv/NotetypeSelector.svelte b/ts/import-csv/NotetypeSelector.svelte
new file mode 100644
index 000000000..6fd555ba8
--- /dev/null
+++ b/ts/import-csv/NotetypeSelector.svelte
@@ -0,0 +1,41 @@
+
+
+
+
+
+ {tr.notetypesNotetype()}
+
+
+
+
+ {#each notetypeNameIds as entry, idx}
+
+ {entry.name}
+
+ {/each}
+
+
+
+
diff --git a/ts/import-csv/import-csv-base.scss b/ts/import-csv/import-csv-base.scss
new file mode 100644
index 000000000..4172fdd13
--- /dev/null
+++ b/ts/import-csv/import-csv-base.scss
@@ -0,0 +1,34 @@
+@use "sass/vars";
+@use "sass/bootstrap-dark";
+
+@import "sass/base";
+
+@import "sass/bootstrap/scss/alert";
+@import "sass/bootstrap/scss/buttons";
+@import "sass/bootstrap/scss/button-group";
+@import "sass/bootstrap/scss/close";
+@import "sass/bootstrap/scss/grid";
+@import "sass/bootstrap-forms";
+
+.night-mode {
+ @include bootstrap-dark.night-mode;
+}
+
+body {
+ width: min(100vw, 70em);
+ margin: 0 auto;
+}
+
+html {
+ overflow-x: hidden;
+}
+
+#main {
+ padding: 0.5em 0.5em 1em 0.5em;
+ height: 100vh;
+}
+
+// override the default down arrow colour in