feat: daily notes (dev only) (#1894)
This commit is contained in:
@@ -20,6 +20,8 @@ import {
|
||||
WebAppEvent,
|
||||
NewNoteTitleFormat,
|
||||
useBoolean,
|
||||
TemplateNoteViewAutofocusBehavior,
|
||||
isTag,
|
||||
} from '@standardnotes/snjs'
|
||||
import { action, computed, makeObservable, observable, reaction, runInAction } from 'mobx'
|
||||
import { WebApplication } from '../../Application/Application'
|
||||
@@ -165,18 +167,20 @@ export class ItemListController
|
||||
|
||||
this.disposers.push(
|
||||
application.addEventObserver(async () => {
|
||||
void this.reloadItems(ItemsReloadSource.SyncEvent).then(() => {
|
||||
if (
|
||||
this.notes.length === 0 &&
|
||||
this.navigationController.selected instanceof SmartView &&
|
||||
this.navigationController.selected.uuid === SystemViewId.AllNotes &&
|
||||
this.noteFilterText === '' &&
|
||||
!this.getActiveItemController()
|
||||
) {
|
||||
this.createPlaceholderNote()?.catch(console.error)
|
||||
}
|
||||
})
|
||||
this.setCompletedFullSync(true)
|
||||
if (!this.completedFullSync) {
|
||||
void this.reloadItems(ItemsReloadSource.SyncEvent).then(() => {
|
||||
if (
|
||||
this.notes.length === 0 &&
|
||||
this.navigationController.selected instanceof SmartView &&
|
||||
this.navigationController.selected.uuid === SystemViewId.AllNotes &&
|
||||
this.noteFilterText === '' &&
|
||||
!this.getActiveItemController()
|
||||
) {
|
||||
this.createPlaceholderNote()?.catch(console.error)
|
||||
}
|
||||
})
|
||||
this.setCompletedFullSync(true)
|
||||
}
|
||||
}, ApplicationEvent.CompletedFullSync),
|
||||
)
|
||||
|
||||
@@ -211,6 +215,7 @@ export class ItemListController
|
||||
notesToDisplay: observable,
|
||||
panelTitle: observable,
|
||||
panelWidth: observable,
|
||||
items: observable,
|
||||
renderedItems: observable,
|
||||
showDisplayOptionsMenu: observable,
|
||||
|
||||
@@ -253,7 +258,7 @@ export class ItemListController
|
||||
async handleEvent(event: InternalEventInterface): Promise<void> {
|
||||
if (event.type === CrossControllerEvent.TagChanged) {
|
||||
const payload = event.payload as { userTriggered: boolean }
|
||||
this.handleTagChange(payload.userTriggered)
|
||||
await this.handleTagChange(payload.userTriggered)
|
||||
} else if (event.type === CrossControllerEvent.ActiveEditorChanged) {
|
||||
this.handleEditorChange().catch(console.error)
|
||||
}
|
||||
@@ -375,12 +380,6 @@ export class ItemListController
|
||||
)
|
||||
}
|
||||
|
||||
private shouldSelectFirstItem = (itemsReloadSource: ItemsReloadSource) => {
|
||||
return (
|
||||
itemsReloadSource === ItemsReloadSource.UserTriggeredTagChange || !this.selectionController.selectedUuids.size
|
||||
)
|
||||
}
|
||||
|
||||
private shouldCloseActiveItem = (activeItem: SNNote | FileItem | undefined) => {
|
||||
const isSearching = this.noteFilterText.length > 0
|
||||
const itemExistsInUpdatedResults = this.items.find((item) => item.uuid === activeItem?.uuid)
|
||||
@@ -404,6 +403,18 @@ export class ItemListController
|
||||
return activeItem && !this.selectionController.isItemSelected(activeItem)
|
||||
}
|
||||
|
||||
private shouldSelectFirstItem = (itemsReloadSource: ItemsReloadSource) => {
|
||||
const selectedTag = this.navigationController.selected
|
||||
const isDailyEntry = selectedTag && isTag(selectedTag) && selectedTag.isDailyEntry
|
||||
if (isDailyEntry) {
|
||||
return false
|
||||
}
|
||||
|
||||
const userChangedTag = itemsReloadSource === ItemsReloadSource.UserTriggeredTagChange
|
||||
const hasNoSelectedItem = !this.selectionController.selectedUuids.size
|
||||
return userChangedTag || hasNoSelectedItem
|
||||
}
|
||||
|
||||
private async recomputeSelectionAfterItemsReload(itemsReloadSource: ItemsReloadSource) {
|
||||
const activeController = this.getActiveItemController()
|
||||
|
||||
@@ -561,48 +572,65 @@ export class ItemListController
|
||||
return { didReloadItems: true }
|
||||
}
|
||||
|
||||
async createNewNoteController(title?: string) {
|
||||
async createNewNoteController(
|
||||
title?: string,
|
||||
createdAt?: Date,
|
||||
autofocusBehavior?: TemplateNoteViewAutofocusBehavior,
|
||||
) {
|
||||
const selectedTag = this.navigationController.selected
|
||||
|
||||
const activeRegularTagUuid = selectedTag instanceof SNTag ? selectedTag.uuid : undefined
|
||||
|
||||
await this.application.itemControllerGroup.createItemController({
|
||||
return this.application.itemControllerGroup.createItemController({
|
||||
title,
|
||||
tag: activeRegularTagUuid,
|
||||
createdAt,
|
||||
autofocusBehavior,
|
||||
})
|
||||
}
|
||||
|
||||
createNewNote = async () => {
|
||||
this.notesController.unselectNotes()
|
||||
|
||||
if (this.navigationController.isInSmartView() && !this.navigationController.isInHomeView()) {
|
||||
await this.navigationController.selectHomeNavigationView()
|
||||
titleForNewNote = (createdAt?: Date) => {
|
||||
if (this.isFiltering) {
|
||||
return this.noteFilterText
|
||||
}
|
||||
|
||||
const titleFormat =
|
||||
this.navigationController.selected?.preferences?.newNoteTitleFormat ||
|
||||
this.application.getPreference(PrefKey.NewNoteTitleFormat, PrefDefaults[PrefKey.NewNoteTitleFormat])
|
||||
|
||||
let title = formatDateAndTimeForNote(new Date())
|
||||
|
||||
if (titleFormat === NewNoteTitleFormat.CurrentNoteCount) {
|
||||
title = `Note ${this.notes.length + 1}`
|
||||
} else if (titleFormat === NewNoteTitleFormat.CustomFormat) {
|
||||
return `Note ${this.notes.length + 1}`
|
||||
}
|
||||
|
||||
if (titleFormat === NewNoteTitleFormat.CustomFormat) {
|
||||
const customFormat =
|
||||
this.navigationController.selected?.preferences?.customNoteTitleFormat ||
|
||||
this.application.getPreference(PrefKey.CustomNoteTitleFormat, PrefDefaults[PrefKey.CustomNoteTitleFormat])
|
||||
title = dayjs().format(customFormat)
|
||||
} else if (titleFormat === NewNoteTitleFormat.Empty) {
|
||||
title = ''
|
||||
|
||||
return dayjs(createdAt).format(customFormat)
|
||||
}
|
||||
|
||||
if (this.isFiltering) {
|
||||
title = this.noteFilterText
|
||||
if (titleFormat === NewNoteTitleFormat.Empty) {
|
||||
return ''
|
||||
}
|
||||
|
||||
await this.createNewNoteController(title)
|
||||
return formatDateAndTimeForNote(createdAt || new Date())
|
||||
}
|
||||
|
||||
createNewNote = async (title?: string, createdAt?: Date, autofocusBehavior?: TemplateNoteViewAutofocusBehavior) => {
|
||||
this.notesController.unselectNotes()
|
||||
|
||||
if (this.navigationController.isInSmartView() && !this.navigationController.isInHomeView()) {
|
||||
await this.navigationController.selectHomeNavigationView()
|
||||
}
|
||||
|
||||
const useTitle = title || this.titleForNewNote(createdAt)
|
||||
|
||||
const controller = await this.createNewNoteController(useTitle, createdAt, autofocusBehavior)
|
||||
|
||||
this.linkingController.reloadAllLinks()
|
||||
|
||||
this.selectionController.scrollToItem(controller.item)
|
||||
}
|
||||
|
||||
createPlaceholderNote = () => {
|
||||
@@ -721,7 +749,7 @@ export class ItemListController
|
||||
this.application.itemControllerGroup.closeItemController(controller)
|
||||
}
|
||||
|
||||
handleTagChange = (userTriggered: boolean) => {
|
||||
handleTagChange = async (userTriggered: boolean) => {
|
||||
const activeNoteController = this.getActiveItemController()
|
||||
if (activeNoteController instanceof NoteViewController && activeNoteController.isTemplateNote) {
|
||||
this.closeItemController(activeNoteController)
|
||||
@@ -739,7 +767,7 @@ export class ItemListController
|
||||
|
||||
this.reloadNotesDisplayOptions()
|
||||
|
||||
void this.reloadItems(userTriggered ? ItemsReloadSource.UserTriggeredTagChange : ItemsReloadSource.TagChange)
|
||||
await this.reloadItems(userTriggered ? ItemsReloadSource.UserTriggeredTagChange : ItemsReloadSource.TagChange)
|
||||
}
|
||||
|
||||
onFilterEnter = () => {
|
||||
|
||||
@@ -15,6 +15,7 @@ import {
|
||||
InternalEventBus,
|
||||
InternalEventPublishStrategy,
|
||||
VectorIconNameOrEmoji,
|
||||
isTag,
|
||||
} from '@standardnotes/snjs'
|
||||
import { action, computed, makeAutoObservable, makeObservable, observable, reaction, runInAction } from 'mobx'
|
||||
import { WebApplication } from '../../Application/Application'
|
||||
@@ -268,6 +269,13 @@ export class NavigationController
|
||||
return this.selected instanceof SmartView && this.selected.uuid === id
|
||||
}
|
||||
|
||||
public get selectedAsTag(): SNTag | undefined {
|
||||
if (!this.selected || !isTag(this.selected)) {
|
||||
return undefined
|
||||
}
|
||||
return this.selected
|
||||
}
|
||||
|
||||
setAddingSubtagTo(tag: SNTag | undefined): void {
|
||||
this.addingSubtagTo = tag
|
||||
}
|
||||
@@ -440,19 +448,21 @@ export class NavigationController
|
||||
|
||||
this.previouslySelected_ = this.selected_
|
||||
|
||||
this.setSelectedTagInstance(tag)
|
||||
await runInAction(async () => {
|
||||
this.setSelectedTagInstance(tag)
|
||||
|
||||
if (tag && this.application.items.isTemplateItem(tag)) {
|
||||
return
|
||||
}
|
||||
if (tag && this.application.items.isTemplateItem(tag)) {
|
||||
return
|
||||
}
|
||||
|
||||
await this.eventBus.publishSync(
|
||||
{
|
||||
type: CrossControllerEvent.TagChanged,
|
||||
payload: { tag, previousTag: this.previouslySelected_, userTriggered: userTriggered },
|
||||
},
|
||||
InternalEventPublishStrategy.SEQUENCE,
|
||||
)
|
||||
await this.eventBus.publishSync(
|
||||
{
|
||||
type: CrossControllerEvent.TagChanged,
|
||||
payload: { tag, previousTag: this.previouslySelected_, userTriggered: userTriggered },
|
||||
},
|
||||
InternalEventPublishStrategy.SEQUENCE,
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
public async selectHomeNavigationView(): Promise<void> {
|
||||
|
||||
@@ -287,18 +287,22 @@ export class SelectedItemsController
|
||||
item: {
|
||||
uuid: ListableContentItem['uuid']
|
||||
},
|
||||
{ userTriggered = false, scrollIntoView = true },
|
||||
{ userTriggered = false, scrollIntoView = true, animated = true },
|
||||
): Promise<void> => {
|
||||
const { didSelect } = await this.selectItem(item.uuid, userTriggered)
|
||||
|
||||
if (didSelect && scrollIntoView) {
|
||||
const itemElement = document.getElementById(item.uuid)
|
||||
itemElement?.scrollIntoView({
|
||||
behavior: 'smooth',
|
||||
})
|
||||
this.scrollToItem(item, animated)
|
||||
}
|
||||
}
|
||||
|
||||
scrollToItem = (item: { uuid: ListableContentItem['uuid'] }, animated = true): void => {
|
||||
const itemElement = document.getElementById(item.uuid)
|
||||
itemElement?.scrollIntoView({
|
||||
behavior: animated ? 'smooth' : 'auto',
|
||||
})
|
||||
}
|
||||
|
||||
selectUuids = async (uuids: UuidString[], userTriggered = false) => {
|
||||
const itemsForUuids = this.application.items.findItems(uuids)
|
||||
if (itemsForUuids.length < 1) {
|
||||
|
||||
Reference in New Issue
Block a user