mirror of https://github.com/laurent22/joplin.git
parent
0670ad92d7
commit
6aca77a0ae
|
@ -517,8 +517,7 @@ const SidebarComponent = (props: Props) => {
|
||||||
type: 'SMART_FILTER_SELECT',
|
type: 'SMART_FILTER_SELECT',
|
||||||
id: ALL_NOTES_FILTER_ID,
|
id: ALL_NOTES_FILTER_ID,
|
||||||
});
|
});
|
||||||
folderItem_click(ALL_NOTES_FILTER_ID);
|
}, [props.dispatch]);
|
||||||
}, [props.dispatch, folderItem_click]);
|
|
||||||
|
|
||||||
const anchorItemRef = (type: string, id: string) => {
|
const anchorItemRef = (type: string, id: string) => {
|
||||||
if (!anchorItemRefs.current[type]) anchorItemRefs.current[type] = {};
|
if (!anchorItemRefs.current[type]) anchorItemRefs.current[type] = {};
|
||||||
|
@ -801,7 +800,7 @@ const SidebarComponent = (props: Props) => {
|
||||||
|
|
||||||
|
|
||||||
if (props.folders.length) {
|
if (props.folders.length) {
|
||||||
const allNotesSelected = props.selectedFolderId === ALL_NOTES_FILTER_ID;
|
const allNotesSelected = props.notesParentType === 'SmartFilter' && props.selectedSmartFilterId === ALL_NOTES_FILTER_ID;
|
||||||
const result = renderFolders(props, renderFolderItem);
|
const result = renderFolders(props, renderFolderItem);
|
||||||
const folderItems = [renderAllNotesItem(theme, allNotesSelected)].concat(result.items);
|
const folderItems = [renderAllNotesItem(theme, allNotesSelected)].concat(result.items);
|
||||||
folderItemsOrder_.current = result.order;
|
folderItemsOrder_.current = result.order;
|
||||||
|
|
|
@ -1,18 +1,49 @@
|
||||||
import PerFolderSortOrderService from './PerFolderSortOrderService';
|
import PerFolderSortOrderService from './PerFolderSortOrderService';
|
||||||
import { setNotesSortOrder } from './notesSortOrderUtils';
|
import { setNotesSortOrder } from './notesSortOrderUtils';
|
||||||
import Setting from '@joplin/lib/models/Setting';
|
import Setting from '@joplin/lib/models/Setting';
|
||||||
|
import { AppState, createAppDefaultState } from '../../app.reducer';
|
||||||
|
import eventManager from '@joplin/lib/eventManager';
|
||||||
const { shimInit } = require('@joplin/lib/shim-init-node.js');
|
const { shimInit } = require('@joplin/lib/shim-init-node.js');
|
||||||
|
const { ALL_NOTES_FILTER_ID } = require('@joplin/lib/reserved-ids');
|
||||||
|
|
||||||
const folderId1 = 'aa012345678901234567890123456789';
|
const folderId1 = 'aa012345678901234567890123456789';
|
||||||
const folderId2 = 'bb012345678901234567890123456789';
|
const folderId2 = 'bb012345678901234567890123456789';
|
||||||
|
|
||||||
|
let appState: AppState|null = null;
|
||||||
|
const updateAppState = (update: Partial<AppState>) => {
|
||||||
|
appState = { ...appState, ...update };
|
||||||
|
eventManager.appStateEmit(appState);
|
||||||
|
};
|
||||||
|
|
||||||
|
const switchToFolder = (id: string) => {
|
||||||
|
updateAppState({
|
||||||
|
notesParentType: 'Folder',
|
||||||
|
selectedFolderId: id,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const switchToAllNotes = () => {
|
||||||
|
updateAppState({
|
||||||
|
notesParentType: 'SmartFilter',
|
||||||
|
selectedSmartFilterId: ALL_NOTES_FILTER_ID,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
describe('PerFolderSortOrderService', () => {
|
describe('PerFolderSortOrderService', () => {
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
shimInit();
|
shimInit();
|
||||||
Setting.autoSaveEnabled = false;
|
Setting.autoSaveEnabled = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
PerFolderSortOrderService.initialize();
|
PerFolderSortOrderService.initialize();
|
||||||
Setting.setValue('notes.perFolderSortOrderEnabled', true);
|
Setting.setValue('notes.perFolderSortOrderEnabled', true);
|
||||||
|
updateAppState(createAppDefaultState({}, {}));
|
||||||
|
switchToFolder(folderId1);
|
||||||
|
});
|
||||||
|
afterEach(() => {
|
||||||
|
Setting.setValue('notes.perFolderSortOrders', {});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('get(), isSet() and set()', async () => {
|
test('get(), isSet() and set()', async () => {
|
||||||
|
@ -39,4 +70,71 @@ describe('PerFolderSortOrderService', () => {
|
||||||
// Folder without per-folder sort order has no per-folder sort order
|
// Folder without per-folder sort order has no per-folder sort order
|
||||||
expect(PerFolderSortOrderService.get(folderId2)).toBeUndefined();
|
expect(PerFolderSortOrderService.get(folderId2)).toBeUndefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should allow specifying a sort order specific to a folder', () => {
|
||||||
|
switchToFolder(folderId1);
|
||||||
|
|
||||||
|
expect(PerFolderSortOrderService.isSet(folderId1)).toBe(false);
|
||||||
|
expect(PerFolderSortOrderService.isSet(folderId2)).toBe(false);
|
||||||
|
|
||||||
|
setNotesSortOrder('user_created_time', false);
|
||||||
|
expect(Setting.value('notes.sortOrder.field')).toBe('user_created_time');
|
||||||
|
expect(Setting.value('notes.sortOrder.reverse')).toBe(false);
|
||||||
|
|
||||||
|
// Folder 2 should use the shared sort order.
|
||||||
|
switchToFolder(folderId2);
|
||||||
|
expect(Setting.value('notes.sortOrder.field')).toBe('user_created_time');
|
||||||
|
expect(Setting.value('notes.sortOrder.reverse')).toBe(false);
|
||||||
|
|
||||||
|
// If changing the per-folder sort order for folder 1, folder 2 should continue
|
||||||
|
// to use the shared sort order.
|
||||||
|
switchToFolder(folderId1);
|
||||||
|
PerFolderSortOrderService.set(folderId1, true);
|
||||||
|
|
||||||
|
setNotesSortOrder('title', true);
|
||||||
|
expect(Setting.value('notes.sortOrder.field')).toBe('title');
|
||||||
|
expect(Setting.value('notes.sortOrder.reverse')).toBe(true);
|
||||||
|
|
||||||
|
switchToFolder(folderId2);
|
||||||
|
expect(Setting.value('notes.sortOrder.field')).toBe('user_created_time');
|
||||||
|
expect(Setting.value('notes.sortOrder.reverse')).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should allow setting a sort order specific to All Notes', () => {
|
||||||
|
switchToFolder(folderId1);
|
||||||
|
|
||||||
|
expect(PerFolderSortOrderService.isSet(ALL_NOTES_FILTER_ID)).toBe(false);
|
||||||
|
expect(PerFolderSortOrderService.isSet(folderId1)).toBe(false);
|
||||||
|
|
||||||
|
// Set default shared sort order
|
||||||
|
setNotesSortOrder('user_created_time', false);
|
||||||
|
expect(Setting.value('notes.sortOrder.field')).toBe('user_created_time');
|
||||||
|
expect(Setting.value('notes.sortOrder.reverse')).toBe(false);
|
||||||
|
|
||||||
|
// Switching to all notes should not change the default sort order.
|
||||||
|
switchToAllNotes();
|
||||||
|
|
||||||
|
expect(Setting.value('notes.sortOrder.field')).toBe('user_created_time');
|
||||||
|
expect(Setting.value('notes.sortOrder.reverse')).toBe(false);
|
||||||
|
|
||||||
|
// It should be possible to enable per-folder sorting for all notes.
|
||||||
|
PerFolderSortOrderService.set(ALL_NOTES_FILTER_ID, true);
|
||||||
|
expect(PerFolderSortOrderService.isSet(ALL_NOTES_FILTER_ID)).toBe(true);
|
||||||
|
|
||||||
|
setNotesSortOrder('user_updated_time', true);
|
||||||
|
|
||||||
|
// Per-folder sorting should be respected for all notes
|
||||||
|
switchToFolder(folderId1);
|
||||||
|
|
||||||
|
expect(Setting.value('notes.sortOrder.field')).toBe('user_created_time');
|
||||||
|
expect(Setting.value('notes.sortOrder.reverse')).toBe(false);
|
||||||
|
|
||||||
|
// Shared sort order should be overriden by per-folder sorting
|
||||||
|
setNotesSortOrder('title', false);
|
||||||
|
|
||||||
|
switchToAllNotes();
|
||||||
|
|
||||||
|
expect(Setting.value('notes.sortOrder.field')).toBe('user_updated_time');
|
||||||
|
expect(Setting.value('notes.sortOrder.reverse')).toBe(true);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -13,6 +13,7 @@ export interface SortOrder {
|
||||||
interface FolderState {
|
interface FolderState {
|
||||||
notesParentType: string;
|
notesParentType: string;
|
||||||
selectedFolderId: string;
|
selectedFolderId: string;
|
||||||
|
selectedSmartFilterId: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface SortOrderPool {
|
interface SortOrderPool {
|
||||||
|
@ -21,8 +22,10 @@ interface SortOrderPool {
|
||||||
|
|
||||||
export default class PerFolderSortOrderService {
|
export default class PerFolderSortOrderService {
|
||||||
|
|
||||||
|
// To support a custom sort order in "all notebooks", previousFolderId
|
||||||
|
// can also be a smart filter ID.
|
||||||
private static previousFolderId: string = null;
|
private static previousFolderId: string = null;
|
||||||
private static folderState: FolderState = { notesParentType: '', selectedFolderId: '' };
|
private static folderState: FolderState = { notesParentType: '', selectedFolderId: '', selectedSmartFilterId: '' };
|
||||||
// Since perFolderSortOrders and sharedSortOrder is persisted using Setting,
|
// Since perFolderSortOrders and sharedSortOrder is persisted using Setting,
|
||||||
// their structures are not nested.
|
// their structures are not nested.
|
||||||
private static perFolderSortOrders: SortOrderPool = null;
|
private static perFolderSortOrders: SortOrderPool = null;
|
||||||
|
@ -40,6 +43,7 @@ export default class PerFolderSortOrderService {
|
||||||
this.loadSharedSortOrder();
|
this.loadSharedSortOrder();
|
||||||
eventManager.appStateOn('notesParentType', this.onFolderSelectionMayChange.bind(this, 'notesParentType'));
|
eventManager.appStateOn('notesParentType', this.onFolderSelectionMayChange.bind(this, 'notesParentType'));
|
||||||
eventManager.appStateOn('selectedFolderId', this.onFolderSelectionMayChange.bind(this, 'selectedFolderId'));
|
eventManager.appStateOn('selectedFolderId', this.onFolderSelectionMayChange.bind(this, 'selectedFolderId'));
|
||||||
|
eventManager.appStateOn('selectedSmartFilterId', this.onFolderSelectionMayChange.bind(this, 'selectedSmartFilterId'));
|
||||||
this.previousFolderId = Setting.value('activeFolderId');
|
this.previousFolderId = Setting.value('activeFolderId');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +97,9 @@ export default class PerFolderSortOrderService {
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
private static onFolderSelectionMayChange(cause: string, event: any) {
|
private static onFolderSelectionMayChange(cause: string, event: any) {
|
||||||
if (cause !== 'notesParentType' && cause !== 'selectedFolderId') return;
|
if (cause !== 'notesParentType' && cause !== 'selectedFolderId' && cause !== 'selectedSmartFilterId') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.folderState[cause] = event.value;
|
this.folderState[cause] = event.value;
|
||||||
const selectedId = this.getSelectedFolderId();
|
const selectedId = this.getSelectedFolderId();
|
||||||
if (this.previousFolderId === selectedId) return;
|
if (this.previousFolderId === selectedId) return;
|
||||||
|
@ -127,6 +133,8 @@ export default class PerFolderSortOrderService {
|
||||||
private static getSelectedFolderId(): string {
|
private static getSelectedFolderId(): string {
|
||||||
if (this.folderState.notesParentType === 'Folder') {
|
if (this.folderState.notesParentType === 'Folder') {
|
||||||
return this.folderState.selectedFolderId;
|
return this.folderState.selectedFolderId;
|
||||||
|
} else if (this.folderState.notesParentType === 'SmartFilter') {
|
||||||
|
return this.folderState.selectedSmartFilterId;
|
||||||
} else {
|
} else {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue