From 4c98891a2ea5f7ba911a879ca052a12ec5c2cdb7 Mon Sep 17 00:00:00 2001 From: Oliver Sauter Date: Tue, 27 Feb 2024 10:56:28 +0100 Subject: [PATCH 1/5] fix link clicks not working in annotations --- external/@worldbrain/memex-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/@worldbrain/memex-common b/external/@worldbrain/memex-common index 15fdcbed55..ce6bf0414e 160000 --- a/external/@worldbrain/memex-common +++ b/external/@worldbrain/memex-common @@ -1 +1 @@ -Subproject commit 15fdcbed55ac7095b9c876a4ee3b11910f08c7c7 +Subproject commit ce6bf0414e513a0821fde7ae3d82477e8a367d03 From ef72ed6fd4fe7c9eff23001bf7c9a9e17768a42f Mon Sep 17 00:00:00 2001 From: Oliver Sauter Date: Tue, 27 Feb 2024 21:03:31 +0100 Subject: [PATCH 2/5] move the expand/compress on video one level up --- external/@worldbrain/memex-common | 2 +- .../search-results/components/page-result.tsx | 67 ++++++++++++++++++- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/external/@worldbrain/memex-common b/external/@worldbrain/memex-common index ce6bf0414e..0ee8cb8c76 160000 --- a/external/@worldbrain/memex-common +++ b/external/@worldbrain/memex-common @@ -1 +1 @@ -Subproject commit ce6bf0414e513a0821fde7ae3d82477e8a367d03 +Subproject commit 0ee8cb8c760fe9a5a02bc691b969f21749976637 diff --git a/src/dashboard-refactor/search-results/components/page-result.tsx b/src/dashboard-refactor/search-results/components/page-result.tsx index dd386ddbe1..6f17141632 100644 --- a/src/dashboard-refactor/search-results/components/page-result.tsx +++ b/src/dashboard-refactor/search-results/components/page-result.tsx @@ -99,6 +99,8 @@ export default class PageResultView extends PureComponent { state = { matchingTextContainerHeight: 100, + confirmRemoveFromList: false, + showVideoFullSize: false, } componentDidMount() { @@ -318,6 +320,42 @@ export default class PageResultView extends PureComponent { } } + private renderVideoResizeButton() { + if (!this.props.fullUrl.includes('youtube.com')) { + return + } + + return ( + + { + { + this.setState({ + showVideoFullSize: !this.state + .showVideoFullSize, + }) + event.preventDefault() + } + }} + /> + + ) + } + private renderRemoveFromListBtn(): JSX.Element { if ( !this.props.isSearchFilteredByList || @@ -326,6 +364,28 @@ export default class PageResultView extends PureComponent { return undefined } + if (this.state.confirmRemoveFromList) { + return ( + + { + { + this.props.onRemoveFromListBtnClick(event) + this.setState({ confirmRemoveFromList: true }) + event.preventDefault() + } + }} + /> + + ) + } + return ( { { { - this.props.onRemoveFromListBtnClick(event) + this.setState({ confirmRemoveFromList: true }) event.preventDefault() } }} @@ -730,6 +789,8 @@ export default class PageResultView extends PureComponent { filePath={icons.trash} onClick={this.props.onTrashBtnClick} /> + {this.renderVideoResizeButton()} + {this.renderRemoveFromListBtn()} )} @@ -745,9 +806,9 @@ export default class PageResultView extends PureComponent { fullTitle={this.props.fullTitle} pdfUrl={this.props.fullPdfUrl} favIcon={this.props.favIconURI} + showVideoFullScreen={this.state.showVideoFullSize} inPageMode={this.props.inPageMode} youtubeService={this.props.youtubeService} - removeFromList={this.renderRemoveFromListBtn()} mainContentHover={ this.props.hoverState != null ? this.props.hoverState From ea93f6b5fbe0ef7353ecc222030472e58789d1a3 Mon Sep 17 00:00:00 2001 From: Oliver Sauter Date: Tue, 27 Feb 2024 21:23:53 +0100 Subject: [PATCH 3/5] clean up the action bar a bit and add confirmation + shift to insta remove items --- external/@worldbrain/memex-common | 2 +- src/dashboard-refactor/index.tsx | 5 +- src/dashboard-refactor/logic.ts | 57 +++++++++++- .../search-results/components/page-result.tsx | 93 ++++++++++++++----- .../search-results/types.ts | 2 +- src/dashboard-refactor/types.ts | 2 +- 6 files changed, 131 insertions(+), 30 deletions(-) diff --git a/external/@worldbrain/memex-common b/external/@worldbrain/memex-common index 0ee8cb8c76..a00eccf898 160000 --- a/external/@worldbrain/memex-common +++ b/external/@worldbrain/memex-common @@ -1 +1 @@ -Subproject commit 0ee8cb8c760fe9a5a02bc691b969f21749976637 +Subproject commit a00eccf89827042707ff410b6f4727c1b92c540a diff --git a/src/dashboard-refactor/index.tsx b/src/dashboard-refactor/index.tsx index 4c2341a1b2..aa50a09046 100644 --- a/src/dashboard-refactor/index.tsx +++ b/src/dashboard-refactor/index.tsx @@ -1073,10 +1073,11 @@ export class DashboardContainer extends StatefulUIElement< ].isCopyPasterShown, event: event, }), - onTrashBtnClick: (day, pageId) => () => + onTrashBtnClick: (day, pageId) => (instaDelete) => this.processEvent('setDeletingPageArgs', { day, pageId, + instaDelete, }), onShareBtnClick: (day, pageId) => () => this.processEvent('setPageShareMenuShown', { @@ -1347,7 +1348,7 @@ export class DashboardContainer extends StatefulUIElement< }, ) }, - onTrashBtnClick: (noteId, day, pageId) => () => + onTrashBtnClick: (noteId, day, pageId) => (instaDelete) => this.processEvent('setDeletingNoteArgs', { noteId, pageId, diff --git a/src/dashboard-refactor/logic.ts b/src/dashboard-refactor/logic.ts index b99be45020..881f5d1a5c 100644 --- a/src/dashboard-refactor/logic.ts +++ b/src/dashboard-refactor/logic.ts @@ -1573,10 +1573,61 @@ export class DashboardLogic extends UILogic { setDeletingPageArgs: EventHandler<'setDeletingPageArgs'> = async ({ event, + previousState, }) => { - this.emitMutation({ - modals: { deletingPageArgs: { $set: event } }, - }) + if (event.instaDelete) { + await executeUITask( + this, + (taskState) => ({ + searchResults: { pageDeleteState: { $set: taskState } }, + }), + async () => { + const resultsMutation: UIMutation< + State['searchResults'] + > = { + pageData: { + byId: { $unset: [event.pageId] }, + allIds: { + $set: previousState.searchResults.pageData.allIds.filter( + (id) => id !== event.pageId, + ), + }, + }, + } + + if (event.day === PAGE_SEARCH_DUMMY_DAY) { + resultsMutation.results = { + [event.day]: { + pages: { + byId: { $unset: [event.pageId] }, + allIds: { + $set: previousState.searchResults.results[ + event.day + ].pages.allIds.filter( + (id) => id !== event.pageId, + ), + }, + }, + }, + } + } else { + resultsMutation.results = removeAllResultOccurrencesOfPage( + previousState.searchResults.results, + event.pageId, + ) + } + + this.emitMutation({ + searchResults: resultsMutation, + }) + await this.options.searchBG.delPages([event.pageId]) + }, + ) + } else { + this.emitMutation({ + modals: { deletingPageArgs: { $set: event } }, + }) + } } setPrivatizeNoteConfirmArgs: EventHandler< diff --git a/src/dashboard-refactor/search-results/components/page-result.tsx b/src/dashboard-refactor/search-results/components/page-result.tsx index 6f17141632..519c39f8dc 100644 --- a/src/dashboard-refactor/search-results/components/page-result.tsx +++ b/src/dashboard-refactor/search-results/components/page-result.tsx @@ -389,9 +389,21 @@ export default class PageResultView extends PureComponent { return ( + Remove from Inbox +
+ + shift to remove without + confirmation + + ) : ( + + Remove from Space +
+ + shift to remove without + confirmation +
+ ) } placement="bottom" getPortalRoot={this.props.getRootElement} @@ -400,7 +412,10 @@ export default class PageResultView extends PureComponent { heightAndWidth="22px" filePath={icons.removeX} onClick={(event) => { - { + if (event.shiftKey) { + this.props.onRemoveFromListBtnClick(event) + this.setState({ confirmRemoveFromList: true }) + } else { this.setState({ confirmRemoveFromList: true }) event.preventDefault() } @@ -730,6 +745,56 @@ export default class PageResultView extends PureComponent { )) } + private renderDeleteButton() { + return ( + + Delete from Memex +
+ + shiftto delete without confirmation + + } + placement="bottom" + getPortalRoot={this.props.getRootElement} + > + { + let instaDelete = false + + if (event.shiftKey) { + instaDelete = true + } + this.props.onTrashBtnClick(instaDelete) + }} + /> +
+ ) + } + + private renderEditButton() { + return ( + Edit Title} + placement="bottom" + getPortalRoot={this.props.getRootElement} + > + { + this.props.onEditTitleChange( + this.props.normalizedUrl, + this.props.fullTitle ?? this.props.normalizedUrl, + ) + }} + /> + + ) + } + render() { const hasTitle = this.props.fullTitle && this.props.fullTitle.length > 0 @@ -771,25 +836,9 @@ export default class PageResultView extends PureComponent { {this.props.hoverState != null && ( - {' '} - { - this.props.onEditTitleChange( - this.props.normalizedUrl, - this.props.fullTitle ?? - this.props - .normalizedUrl, - ) - }} - /> - + {this.renderEditButton()} {this.renderVideoResizeButton()} + {this.renderDeleteButton()} {this.renderRemoveFromListBtn()} )} diff --git a/src/dashboard-refactor/search-results/types.ts b/src/dashboard-refactor/search-results/types.ts index 32d03650b2..092667e2ca 100644 --- a/src/dashboard-refactor/search-results/types.ts +++ b/src/dashboard-refactor/search-results/types.ts @@ -28,7 +28,7 @@ export interface CommonInteractionProps { onListPickerFooterBtnClick: React.MouseEventHandler onShareBtnClick: React.MouseEventHandler - onTrashBtnClick: React.MouseEventHandler + onTrashBtnClick: (instaDelete: boolean) => void } export type PageInteractionProps = Omit< diff --git a/src/dashboard-refactor/types.ts b/src/dashboard-refactor/types.ts index b1171e07bf..e43e26858b 100644 --- a/src/dashboard-refactor/types.ts +++ b/src/dashboard-refactor/types.ts @@ -182,7 +182,7 @@ export type DashboardModalsEvents = UIEvent<{ setShowNoteShareOnboardingModal: { isShown: boolean } setDeletingListId: { listId: string } - setDeletingPageArgs: PageEventArgs + setDeletingPageArgs: PageEventArgs & { instaDelete: boolean } setDeletingNoteArgs: NoteDataEventArgs checkSharingAccess: null setSpaceSidebarWidth: { width: string } From 7620d75a27a99e70107ada68e8c41733f39516dd Mon Sep 17 00:00:00 2001 From: Oliver Sauter Date: Tue, 27 Feb 2024 21:24:53 +0100 Subject: [PATCH 4/5] bump version to 3.13.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2f2e5031d0..1a1c027d16 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "worldbrain-extension", - "version": "3.13.4", + "version": "3.13.5", "homepage": "https://memex.garden", "repository": "https://github.com/WorldBrain/Memex", "scripts": { From ec2c6ae71a0d303beb3b7fe148e6512f915c5a03 Mon Sep 17 00:00:00 2001 From: Oliver Sauter Date: Tue, 27 Feb 2024 21:28:15 +0100 Subject: [PATCH 5/5] fix up type errors --- src/annotations/components/AnnotationFooter.tsx | 2 +- src/dashboard-refactor/search-results/logic.test.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/annotations/components/AnnotationFooter.tsx b/src/annotations/components/AnnotationFooter.tsx index 707e3759a8..94a46b0dc8 100644 --- a/src/annotations/components/AnnotationFooter.tsx +++ b/src/annotations/components/AnnotationFooter.tsx @@ -3,7 +3,7 @@ import * as React from 'react' export interface AnnotationFooterEventProps { onDeleteConfirm: React.MouseEventHandler onDeleteCancel: React.MouseEventHandler - onDeleteIconClick: React.MouseEventHandler + onDeleteIconClick: (instaDelete?: boolean) => void onEditIconClick: React.MouseEventHandler onEditHighlightIconClick: React.MouseEventHandler onShareClick: React.MouseEventHandler diff --git a/src/dashboard-refactor/search-results/logic.test.ts b/src/dashboard-refactor/search-results/logic.test.ts index e5eee16966..3b027d1c58 100644 --- a/src/dashboard-refactor/search-results/logic.test.ts +++ b/src/dashboard-refactor/search-results/logic.test.ts @@ -260,6 +260,7 @@ describe('Dashboard search results logic', () => { await searchResults.processEvent('setDeletingPageArgs', { pageId, day: PAGE_SEARCH_DUMMY_DAY, + instaDelete: false, }) expect(searchResults.state.modals.deletingPageArgs).toEqual({ pageId, @@ -331,6 +332,7 @@ describe('Dashboard search results logic', () => { await searchResults.processEvent('setDeletingPageArgs', { pageId, day: PAGE_SEARCH_DUMMY_DAY, + instaDelete: true, }) expect(searchResults.state.modals.deletingPageArgs).toEqual({ pageId, @@ -1434,6 +1436,7 @@ describe('Dashboard search results logic', () => { await searchResults.processEvent('setDeletingPageArgs', { pageId, day: DATA.DAY_1, + instaDelete: false, }) expect(searchResults.state.modals.deletingPageArgs).toEqual( {