1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-11-27 08:21:03 +02:00

Desktop, Mobile: Sort sync target options

This commit is contained in:
Laurent Cozic 2022-05-05 13:19:23 +01:00
parent 5adee9085c
commit 814a5a0cd8
4 changed files with 57 additions and 34 deletions

View File

@ -125,19 +125,6 @@ class ConfigScreenComponent extends React.Component<any, any> {
this.switchSection(event.section.name);
}
keyValueToArray(kv: any) {
const output = [];
for (const k in kv) {
if (!kv.hasOwnProperty(k)) continue;
output.push({
key: k,
label: kv[k],
});
}
return output;
}
renderSectionDescription(section: any) {
const description = Setting.sectionDescription(section.name);
if (!description) return null;
@ -376,7 +363,11 @@ class ConfigScreenComponent extends React.Component<any, any> {
} else if (md.isEnum) {
const items = [];
const settingOptions = md.options();
const array = this.keyValueToArray(settingOptions);
const array = Setting.enumOptionsToValueLabels(settingOptions, md.optionsOrder ? md.optionsOrder() : [], {
valueKey: 'key',
labelKey: 'label',
});
for (let i = 0; i < array.length; i++) {
const e = array[i];
items.push(

View File

@ -413,12 +413,7 @@ class ConfigScreenComponent extends BaseScreenComponent {
if (md.isEnum) {
value = value.toString();
const items = [];
const settingOptions = md.options();
for (const k in settingOptions) {
if (!settingOptions.hasOwnProperty(k)) continue;
items.push({ label: settingOptions[k], value: k.toString() });
}
const items = Setting.enumOptionsToValueLabels(md.options(), md.optionsOrder ? md.optionsOrder() : []);
return (
<View key={key} style={{ flexDirection: 'column', borderBottomWidth: 1, borderBottomColor: theme.dividerColor }}>

View File

@ -83,16 +83,15 @@ export default class SyncTargetRegistry {
}
return output;
// const sorted: Record<string, string> = {};
// for (const o of syncTargetOrder) {
// sorted[o] = output[o];
// }
// for (const [name, value] of Object.entries(output)) {
// if (!sorted[name]) sorted[name] = value;
// }
// return sorted;
}
public static optionsOrder(): string[] {
return [
'0', // None
'10', // Joplin Cloud
'7', // Dropbox
'3', // OneDrive
];
}
}

View File

@ -25,6 +25,11 @@ export enum SettingItemType {
Button = 6,
}
interface OptionsToValueLabelsOptions {
valueKey: string;
labelKey: string;
}
export enum SettingItemSubType {
FilePathAndArgs = 'file_path_and_args',
FilePath = 'file_path', // Not supported on mobile!
@ -53,6 +58,7 @@ export interface SettingItem {
label?(): string;
description?: Function;
options?(): any;
optionsOrder?(): string[];
appTypes?: AppType[];
show?(settings: any): boolean;
filter?(value: any): any;
@ -421,6 +427,9 @@ class Setting extends BaseModel {
options: () => {
return SyncTargetRegistry.idAndLabelPlainObject(platform);
},
optionsOrder: () => {
return SyncTargetRegistry.optionsOrder();
},
storage: SettingStorage.File,
},
@ -905,7 +914,7 @@ class Setting extends BaseModel {
},
'notes.sortOrder.reverse': { value: true, type: SettingItemType.Bool, storage: SettingStorage.File, isGlobal: true, section: 'note', public: true, label: () => _('Reverse sort order'), appTypes: [AppType.Cli] },
// NOTE: A setting whose name starts with 'notes.sortOrder' is special,
// which implies changing the setting automatically triggers the reflesh of notes.
// which implies changing the setting automatically triggers the refresh of notes.
// See lib/BaseApplication.ts/generalMiddleware() for details.
'notes.sortOrder.buttonsVisible': {
value: true,
@ -1735,7 +1744,7 @@ class Setting extends BaseModel {
// Keys in the database takes precedence over keys in the keychain because
// they are more likely to be up to date (saving to keychain can fail, but
// saving to database shouldn't). When the keychain works, the secure keys
// are deleted from the database and transfered to the keychain in saveAll().
// are deleted from the database and transferred to the keychain in saveAll().
const rowKeys = rows.map((r: any) => r.key);
const secureKeys = this.keys(false, null, { secureOnly: true });
@ -1901,6 +1910,35 @@ class Setting extends BaseModel {
}
}
public static enumOptionsToValueLabels(enumOptions: Record<string, string>, order: string[], options: OptionsToValueLabelsOptions = null) {
options = {
labelKey: 'label',
valueKey: 'value',
...options,
};
const output = [];
for (const value of order) {
output.push({
[options.valueKey]: value,
[options.labelKey]: enumOptions[value],
});
}
for (const k in enumOptions) {
if (!enumOptions.hasOwnProperty(k)) continue;
if (order.includes(k)) continue;
output.push({
[options.valueKey]: k,
[options.labelKey]: enumOptions[k],
});
}
return output;
}
static valueToString(key: string, value: any) {
const md = this.settingMetadata(key);
value = this.formatValue(key, value);
@ -2078,7 +2116,7 @@ class Setting extends BaseModel {
// We need to be careful here because there's a bug in the macOS keychain that can
// make it fail to save a password. https://github.com/desktop/desktop/issues/3263
// So we try to set it and if it fails, we set it on the database instead. This is not
// ideal because they won't be crypted, but better than losing all the user's passwords.
// ideal because they won't be encrypted, but better than losing all the user's passwords.
// The passwords would be set again on the keychain once it starts working again (probably
// after the user switch their computer off and on again).
//