Restore and save last dupe resolution setting (#1930)

* Restore dupe resolution setting

* Save dupe resolution setting

* Push config logic into backend (dae)
This commit is contained in:
RumovZ 2022-06-24 07:10:06 +02:00 committed by GitHub
parent dd0e56afb3
commit b6a7760cb4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 51 additions and 5 deletions

View file

@ -106,8 +106,8 @@ message MediaEntries {
message ImportCsvRequest {
enum DupeResolution {
UPDATE = 0;
ADD = 1;
IGNORE = 2;
IGNORE = 1;
ADD = 2;
// UPDATE_IF_NEWER = 3;
}
string path = 1;
@ -166,6 +166,7 @@ message CsvMetadata {
bool force_is_html = 12;
repeated generic.StringList preview = 13;
uint32 guid_column = 14;
ImportCsvRequest.DupeResolution dupe_resolution = 15;
}
message ExportCardCsvRequest {

View file

@ -4,6 +4,7 @@
mod bool;
mod deck;
mod notetype;
mod number;
pub(crate) mod schema11;
mod string;
pub(crate) mod undo;
@ -14,7 +15,8 @@ use slog::warn;
use strum::IntoStaticStr;
pub use self::{
bool::BoolKey, deck::DeckConfigKey, notetype::get_aux_notetype_config_key, string::StringKey,
bool::BoolKey, deck::DeckConfigKey, notetype::get_aux_notetype_config_key,
number::I32ConfigKey, string::StringKey,
};
use crate::{backend_proto::preferences::BackupLimits, prelude::*};

View file

@ -0,0 +1,27 @@
// Copyright: Ankitects Pty Ltd and contributors
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
use strum::IntoStaticStr;
use crate::prelude::*;
#[derive(Debug, Clone, Copy, IntoStaticStr)]
#[strum(serialize_all = "camelCase")]
pub enum I32ConfigKey {
CsvDuplicateResolution,
}
impl Collection {
pub fn get_config_i32(&self, key: I32ConfigKey) -> i32 {
#[allow(clippy::match_single_binding)]
self.get_config_optional(key).unwrap_or_else(|| match key {
_other => 0,
})
}
}
impl Collection {
pub(crate) fn set_config_i32_inner(&mut self, key: I32ConfigKey, value: i32) -> Result<bool> {
self.set_config(key, &value)
}
}

View file

@ -276,6 +276,7 @@ mod test {
field_columns: vec![1, 2],
})),
preview: Vec::new(),
dupe_resolution: 0,
}
}
}

View file

@ -13,10 +13,12 @@ use strum::IntoEnumIterator;
use super::import::build_csv_reader;
pub use crate::backend_proto::import_export::{
csv_metadata::{Deck as CsvDeck, Delimiter, MappedNotetype, Notetype as CsvNotetype},
import_csv_request::DupeResolution,
CsvMetadata,
};
use crate::{
backend_proto::StringList,
config::I32ConfigKey,
error::ImportError,
import_export::text::NameOrId,
notetype::NoteField,
@ -48,7 +50,14 @@ impl Collection {
notetype_id: Option<NotetypeId>,
is_html: Option<bool>,
) -> Result<CsvMetadata> {
let mut metadata = CsvMetadata::default();
let dupe_resolution =
DupeResolution::from_i32(self.get_config_i32(I32ConfigKey::CsvDuplicateResolution))
.map(|r| r as i32)
.unwrap_or_default();
let mut metadata = CsvMetadata {
dupe_resolution,
..Default::default()
};
let meta_len = self.parse_meta_lines(&mut reader, &mut metadata)? as u64;
maybe_set_fallback_delimiter(delimiter, &mut metadata, &mut reader, meta_len)?;
let records = collect_preview_records(&mut metadata, reader)?;

View file

@ -11,6 +11,7 @@ use std::{
use super::NameOrId;
use crate::{
card::{CardQueue, CardType},
config::I32ConfigKey,
import_export::{
text::{
DupeResolution, ForeignCard, ForeignData, ForeignNote, ForeignNotetype, ForeignTemplate,
@ -31,6 +32,10 @@ impl ForeignData {
let mut progress = IncrementableProgress::new(progress_fn);
progress.call(ImportProgress::File)?;
col.transact(Op::Import, |col| {
col.set_config_i32_inner(
I32ConfigKey::CsvDuplicateResolution,
self.dupe_resolution as i32,
)?;
let mut ctx = Context::new(&self, col)?;
ctx.import_foreign_notetypes(self.notetypes)?;
ctx.import_foreign_notes(

View file

@ -30,6 +30,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
export let path: string;
export let notetypeNameIds: Notetypes.NotetypeNameId[];
export let deckNameIds: Decks.DeckNameId[];
export let dupeResolution: ImportExport.ImportCsvRequest.DupeResolution;
export let delimiter: ImportExport.CsvMetadata.Delimiter;
export let forceDelimiter: boolean;
@ -47,7 +48,6 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
export let deckId: number | null;
export let deckColumn: number | null;
let dupeResolution: ImportExport.ImportCsvRequest.DupeResolution;
let lastNotetypeId = globalNotetype?.id;
let lastDelimeter = delimiter;

View file

@ -51,6 +51,7 @@ export async function setupImportCsvPage(path: string): Promise<ImportCsvPage> {
path: path,
deckNameIds: decks.entries,
notetypeNameIds: notetypes.entries,
dupeResolution: metadata.dupeResolution,
delimiter: metadata.delimiter,
forceDelimiter: metadata.forceDelimiter,
isHtml: metadata.isHtml,