Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Desktop: Fixes #10230: Fix new note and to-do buttons greyed when initial selection is "all notes" or a tag #10434

23 changes: 3 additions & 20 deletions packages/app-mobile/components/screens/Notes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ const { BackButtonService } = require('../../services/back-button.js');
import { AppState } from '../../utils/types';
import { NoteEntity } from '@joplin/lib/services/database/types';
import { itemIsInTrash } from '@joplin/lib/services/trash';
const { ALL_NOTES_FILTER_ID } = require('@joplin/lib/reserved-ids.js');

// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
class NotesScreenComponent extends BaseScreenComponent<any> {
Expand Down Expand Up @@ -230,34 +229,19 @@ class NotesScreenComponent extends BaseScreenComponent<any> {
let buttonFolderId = this.props.selectedFolderId !== Folder.conflictFolderId() ? this.props.selectedFolderId : null;
if (!buttonFolderId) buttonFolderId = this.props.activeFolderId;

const isAllNotes =
this.props.notesParentType === 'SmartFilter'
&& this.props.selectedSmartFilterId === ALL_NOTES_FILTER_ID;

// Usually, when showing all notes, activeFolderId/selectedFolderId is set to the last
// active folder.
// If the app starts showing all notes, activeFolderId/selectedFolderId are
// empty or null. As such, we need a special case to show the buttons:
const addFolderNoteButtons = !!buttonFolderId || isAllNotes;
const addFolderNoteButtons = !!buttonFolderId;
const thisComp = this;

const makeActionButtonComp = () => {
if ((this.props.notesParentType === 'Folder' && itemIsInTrash(parent)) || !Folder.atLeastOneRealFolderExists(this.props.folders)) return null;

const getTargetFolderId = async () => {
if (!buttonFolderId && isAllNotes) {
return (await Folder.defaultFolder()).id;
}
return buttonFolderId;
};
if (addFolderNoteButtons && this.props.folders.length > 0) {
const buttons = [];
buttons.push({
label: _('New to-do'),
onPress: async () => {
const folderId = await getTargetFolderId();
const isTodo = true;
void this.newNoteNavigate(folderId, isTodo);
void this.newNoteNavigate(buttonFolderId, isTodo);
},
color: '#9b59b6',
icon: 'checkbox-outline',
Expand All @@ -266,9 +250,8 @@ class NotesScreenComponent extends BaseScreenComponent<any> {
buttons.push({
label: _('New note'),
onPress: async () => {
const folderId = await getTargetFolderId();
const isTodo = false;
void this.newNoteNavigate(folderId, isTodo);
void this.newNoteNavigate(buttonFolderId, isTodo);
},
color: '#9b59b6',
icon: 'document',
Expand Down
25 changes: 20 additions & 5 deletions packages/app-mobile/root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,10 @@ const generalMiddleware = (store: any) => (next: any) => async (action: any) =>
}

if (action.type === 'NAV_GO' && action.routeName === 'Notes') {
Setting.setValue('activeFolderId', newState.selectedFolderId);
if ('selectedFolderId' in newState) {
Setting.setValue('activeFolderId', newState.selectedFolderId);
}

const notesParent: NotesParent = {
type: action.smartFilterId ? 'SmartFilter' : 'Folder',
selectedItemId: action.smartFilterId ? action.smartFilterId : newState.selectedFolderId,
Expand Down Expand Up @@ -469,6 +472,21 @@ const initializeTempDir = async () => {
return tempDir;
};

const getInitialActiveFolder = async () => {
let folderId = Setting.value('activeFolderId');

// In some cases (e.g. new profile/install), activeFolderId hasn't been set yet.
// Because activeFolderId is used to determine the parent for new notes, initialize
// it here:
if (!folderId) {
folderId = (await Folder.defaultFolder())?.id;
if (folderId) {
Setting.setValue('activeFolderId', folderId);
}
}
return await Folder.load(folderId);
};

// eslint-disable-next-line @typescript-eslint/ban-types -- Old code before rule was applied
async function initialize(dispatch: Function) {
shimInit();
Expand Down Expand Up @@ -686,10 +704,7 @@ async function initialize(dispatch: Function) {
// items: masterKeys,
// });

const folderId = Setting.value('activeFolderId');
let folder = await Folder.load(folderId);

if (!folder) folder = await Folder.defaultFolder();
const folder = await getInitialActiveFolder();

dispatch({
type: 'FOLDER_SET_COLLAPSED_ALL',
Expand Down
6 changes: 6 additions & 0 deletions packages/lib/reducer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1335,6 +1335,12 @@ const reducer = produce((draft: Draft<State> = defaultState, action: any) => {
handleHistory(draft, action);
}

if (action.type === 'SETTING_UPDATE_ALL' || (action.type === 'SETTING_UPDATE_ONE' && action.key === 'activeFolderId')) {
// To allow creating notes when opening the app with all notes and/or tags,
// a "last selected folder ID" needs to be set.
draft.selectedFolderId ??= draft.settings.activeFolderId;
}

for (const additionalReducer of additionalReducers) {
additionalReducer.reducer(draft, action);
}
Expand Down
Loading