From dc33aef6608a364107a884ad2f26c14bceea23b7 Mon Sep 17 00:00:00 2001 From: Aman Harwara Date: Tue, 27 Dec 2022 23:33:08 +0530 Subject: [PATCH] feat: Allow changing per-view display preferences for system views (#2120) --- .../src/Domain/Syncable/UserPrefs/PrefKey.ts | 4 + .../Header/DisplayOptionsMenu.tsx | 79 +++++++++++++++---- .../Header/NewNotePreferences.tsx | 37 ++++++--- .../ItemList/ItemListController.ts | 34 +++++--- 4 files changed, 115 insertions(+), 39 deletions(-) diff --git a/packages/models/src/Domain/Syncable/UserPrefs/PrefKey.ts b/packages/models/src/Domain/Syncable/UserPrefs/PrefKey.ts index ef39c08f0..0e4a746dd 100644 --- a/packages/models/src/Domain/Syncable/UserPrefs/PrefKey.ts +++ b/packages/models/src/Domain/Syncable/UserPrefs/PrefKey.ts @@ -1,5 +1,7 @@ import { CollectionSortProperty } from '../../Runtime/Collection/CollectionSort' import { EditorIdentifier, FeatureIdentifier } from '@standardnotes/features' +import { SystemViewId } from '../SmartView' +import { TagPreferences } from '../Tag' export enum PrefKey { TagsPanelWidth = 'tagsPanelWidth', @@ -40,6 +42,7 @@ export enum PrefKey { DarkMode = 'darkMode', DefaultEditorIdentifier = 'defaultEditorIdentifier', MomentsDefaultTagUuid = 'momentsDefaultTagUuid', + SystemViewPreferences = 'systemViewPreferences', } export enum NewNoteTitleFormat { @@ -105,4 +108,5 @@ export type PrefValue = { [PrefKey.DarkMode]: boolean [PrefKey.DefaultEditorIdentifier]: EditorIdentifier [PrefKey.MomentsDefaultTagUuid]: string | undefined + [PrefKey.SystemViewPreferences]: Partial> } diff --git a/packages/web/src/javascripts/Components/ContentListView/Header/DisplayOptionsMenu.tsx b/packages/web/src/javascripts/Components/ContentListView/Header/DisplayOptionsMenu.tsx index ed985905a..7d1e9c5ca 100644 --- a/packages/web/src/javascripts/Components/ContentListView/Header/DisplayOptionsMenu.tsx +++ b/packages/web/src/javascripts/Components/ContentListView/Header/DisplayOptionsMenu.tsx @@ -35,11 +35,14 @@ const DisplayOptionsMenu: FunctionComponent = ({ selectedTag, }) => { const isSystemTag = isSmartView(selectedTag) && isSystemView(selectedTag) - const [currentMode, setCurrentMode] = useState(selectedTag.preferences ? 'tag' : 'global') + const selectedTagPreferences = isSystemTag + ? application.getPreference(PrefKey.SystemViewPreferences)?.[selectedTag.uuid as SystemViewId] + : selectedTag.preferences + const [currentMode, setCurrentMode] = useState(selectedTagPreferences ? 'tag' : 'global') const [preferences, setPreferences] = useState({}) const hasSubscription = application.hasValidSubscription() const controlsDisabled = currentMode === 'tag' && !hasSubscription - const isDailyEntry = selectedTag.preferences?.entryMode === 'daily' + const isDailyEntry = selectedTagPreferences?.entryMode === 'daily' const reloadPreferences = useCallback(() => { const globalValues: TagPreferences = { @@ -71,24 +74,59 @@ const DisplayOptionsMenu: FunctionComponent = ({ } else { setPreferences({ ...globalValues, - ...selectedTag.preferences, + ...selectedTagPreferences, }) } - }, [currentMode, setPreferences, selectedTag, application]) + }, [application, currentMode, selectedTagPreferences]) useEffect(() => { reloadPreferences() }, [reloadPreferences]) + const changeGlobalPreferences = useCallback( + async (properties: Partial) => { + for (const key of Object.keys(properties)) { + const value = properties[key as keyof TagPreferences] + await application.setPreference(key as PrefKey, value).catch(console.error) + + reloadPreferences() + } + }, + [application, reloadPreferences], + ) + + const changeSystemViewPreferences = useCallback( + async (properties: Partial) => { + if (!selectedTag) { + return + } + + if (!isSystemTag) { + return + } + + const systemViewPreferences = application.getPreference(PrefKey.SystemViewPreferences) || {} + const systemViewPreferencesForTag = systemViewPreferences[selectedTag.uuid as SystemViewId] || {} + + await application.setPreference(PrefKey.SystemViewPreferences, { + ...systemViewPreferences, + [selectedTag.uuid as SystemViewId]: { + ...systemViewPreferencesForTag, + ...properties, + }, + }) + + reloadPreferences() + }, + [application, isSystemTag, reloadPreferences, selectedTag], + ) + const changePreferences = useCallback( async (properties: Partial) => { if (currentMode === 'global') { - for (const key of Object.keys(properties)) { - const value = properties[key as keyof TagPreferences] - await application.setPreference(key as PrefKey, value).catch(console.error) - - reloadPreferences() - } + await changeGlobalPreferences(properties) + } else if (isSystemTag) { + await changeSystemViewPreferences(properties) } else { await application.mutator.changeAndSaveItem(selectedTag, (mutator) => { mutator.preferences = { @@ -98,14 +136,23 @@ const DisplayOptionsMenu: FunctionComponent = ({ }) } }, - [reloadPreferences, application, currentMode, selectedTag], + [currentMode, isSystemTag, changeGlobalPreferences, changeSystemViewPreferences, application.mutator, selectedTag], ) - const resetTagPreferences = useCallback(() => { + const resetTagPreferences = useCallback(async () => { + if (isSystemTag) { + await application.setPreference(PrefKey.SystemViewPreferences, { + ...application.getPreference(PrefKey.SystemViewPreferences), + [selectedTag.uuid as SystemViewId]: undefined, + }) + reloadPreferences() + return + } + void application.mutator.changeAndSaveItem(selectedTag, (mutator) => { mutator.preferences = undefined }) - }, [application, selectedTag]) + }, [application, isSystemTag, reloadPreferences, selectedTag]) const toggleSortReverse = useCallback(() => { void changePreferences({ sortReverse: !preferences.sortReverse }) @@ -212,7 +259,7 @@ const DisplayOptionsMenu: FunctionComponent = ({
- {!isSystemTag && } +
{currentMode === 'tag' && (