Skip to content

Commit

Permalink
Bookmarks++: Add edit dialog
Browse files Browse the repository at this point in the history
Create an edit dialog, ultimately to be used by both a "move to another
folder" button in bulk edit mode (included in this CL) and an "edit"
context menu item (not included in this CL). Dialog is incomplete, will
be fleshed out in follow-ups.

Bug: 1365606
Change-Id: Ief2835e0a74b222101e8195200309ef177c0650e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4166360
Commit-Queue: Emily Shack <emshack@chromium.org>
Reviewed-by: John Lee <johntlee@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1096604}
  • Loading branch information
Emily Shack authored and Chromium LUCI CQ committed Jan 25, 2023
1 parent 755b84e commit 7d6cdd4
Show file tree
Hide file tree
Showing 19 changed files with 431 additions and 56 deletions.
15 changes: 15 additions & 0 deletions chrome/app/generated_resources.grd
Expand Up @@ -7406,9 +7406,24 @@ Keep your key file in a safe place. You will need it to create new versions of y
<message name="IDS_BOOKMARK_FOLDER_CHILD_COUNT" desc="Text description for the number of children of a bookmark folder">
{NUM_BOOKMARKS, plural, =1 {1 bookmark} other {# bookmarks}}
</message>
<message name="IDS_BOOKMARKS_EDIT_MOVE_TO_ANOTHER_FOLDER" desc="Tooltip for the button in the bookmarks side panel bulk edit mode that allows the user to move the selected bookmarks to a different folder.">
Move to another folder
</message>
<message name="IDS_BOOKMARKS_EDIT_MORE" desc="Tooltip for the menu button in the bookmarks side panel bulk edit mode that shows more actions the user can take on selected bookmarks.">
More
</message>
<message name="IDS_BOOKMARKS_EDIT_MOVE_TO" desc="Title for the bookmarks side panel edit dialog when there are multiple selected bookmarks">
Move to…
</message>
<message name="IDS_BOOKMARKS_EDIT_NEW_FOLDER" desc="Label for the button to add a new folder in the bookmarks side panel edit dialog">
New Folder
</message>
<message name="IDS_BOOKMARKS_EDIT_CANCEL" desc="Label for the button to close the bookmarks side panel edit dialog">
Cancel
</message>
<message name="IDS_BOOKMARKS_EDIT_SAVE" desc="Label for the button to save changes from the bookmarks side panel edit dialog">
Save
</message>
<message name="IDS_BOOKMARK_DELETION_COUNT" desc="Text description for the number of deleted bookmarks">
{NUM_BOOKMARKS, plural, =1 {1 bookmark deleted} other {# bookmarks deleted}}
</message>
Expand Down
@@ -0,0 +1 @@
fe5b327c457d6a3192928c3b35fdd90e5e8e8463
@@ -0,0 +1 @@
fe5b327c457d6a3192928c3b35fdd90e5e8e8463
@@ -0,0 +1 @@
57c9ca09e43e40316ea3cbea3d011385594deeba
@@ -0,0 +1 @@
fe5b327c457d6a3192928c3b35fdd90e5e8e8463
@@ -0,0 +1 @@
fe5b327c457d6a3192928c3b35fdd90e5e8e8463
1 change: 1 addition & 0 deletions chrome/browser/resources/side_panel/bookmarks/BUILD.gn
Expand Up @@ -23,6 +23,7 @@ build_webui("build") {
"commerce/shopping_list.ts",
"power_bookmark_row.ts",
"power_bookmarks_context_menu.ts",
"power_bookmarks_edit_dialog.ts",
"power_bookmarks_list.ts",
]

Expand Down
3 changes: 3 additions & 0 deletions chrome/browser/resources/side_panel/bookmarks/icons.html
Expand Up @@ -19,6 +19,9 @@
<g id="format-list" viewBox="0 0 24 24">
<path d="M3 6c0-.83.67-1.5 1.5-1.5S6 5.17 6 6s-.67 1.5-1.5 1.5S3 6.83 3 6Zm0 6c0-.83.67-1.5 1.5-1.5S6 11.17 6 12s-.67 1.5-1.5 1.5S3 12.83 3 12Zm1.5 4.5c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5S6 18.82 6 18s-.67-1.5-1.5-1.5ZM21 19H8v-2h13v2ZM8 13h13v-2H8v2Zm0-6V5h13v2H8Z"></path>
</g>
<g id="move" viewBox="0 0 24 24">
<path d="M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2Zm0 12H4V8h16v10Zm-8.01-9-1.41 1.41L12.16 12H8v2h4.16l-1.59 1.59L11.99 17 16 13.01 11.99 9Z"></path>
</g>
<g id="price-tracking">
<path d="M12 11.333v-4c0-2.046-1.087-3.76-3-4.213v-.453c0-.554-.447-1-1-1-.554 0-1 .446-1 1v.453c-1.907.453-3 2.16-3 4.213v4H2.666v1.334h10.667v-1.334H12Zm-1.334 0H5.333v-4c0-1.653 1.007-3 2.667-3s2.666 1.347 2.666 3v4ZM8 14.667c.733 0 1.333-.6 1.333-1.334H6.666c0 .734.6 1.334 1.334 1.334Zm6.666-7.334h-1.333c0-1.826-.82-3.46-2.107-4.56l.94-.94c1.527 1.347 2.5 3.307 2.5 5.5Zm-9.893-4.56-.94-.94c-1.527 1.347-2.5 3.307-2.5 5.5h1.333c0-1.826.82-3.46 2.107-4.56Z"></path>
</g>
Expand Down
@@ -0,0 +1,64 @@
<style include="cr-shared-style">
:host {
--cr-dialog-body-padding-horizontal: 16px;
--cr-dialog-title-slot-padding-start: 16px;
--cr-dialog-width: 300px;
}

.body {
display: flex;
flex-direction: column;
gap: 8px;
}

.button-row {
font-size: 12px;
justify-content: space-between;
}

.folder-header {
color: var(--cr-primary-text-color);
font-size: 14px;
font-weight: 500;
}

.folder-row {
display: flex;
width: auto;
}

.folder-selector {
border: 1px solid var(--scrollable-border-color);
border-radius: 2px;
height: 160px;
}
</style>

<cr-dialog id="dialog">
<div slot="title">$i18n{editMoveFolderTo}</div>
<div slot="body" class="body">
<div class="folder-header">
<template is="dom-if" if="[[activeFolder_]]" restamp>
TODO: Back Button
</template>
[[getActiveFolderTitle_(activeFolder_)]]
</div>
<div id="folder-selector" class="folder-selector">
<iron-list scroll-target="folder-selector"
items="[[getShownFolders_(activeFolder_, topLevelBookmarks_)]]">
<template>
<div class="folder-row">TODO: Folder row</div>
</template>
</iron-list>
</div>
</div>
<div class="button-row" slot="button-container">
<cr-button on-click="onNewFolder_">$i18n{editNewFolder}</cr-button>
<div>
<cr-button on-click="onCancel_">$i18n{editCancel}</cr-button>
<cr-button class="action-button cr-button-gap" on-click="onSave_">
$i18n{editSave}
</cr-button>
</div>
</div>
</cr-dialog>
@@ -0,0 +1,115 @@
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import '../strings.m.js';
import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
import 'chrome://resources/cr_elements/cr_shared_style.css.js';
import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';

import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
import {assertNotReached} from 'chrome://resources/js/assert_ts.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';

import {getTemplate} from './power_bookmarks_edit_dialog.html.js';

export interface PowerBookmarksEditDialogElement {
$: {
dialog: CrDialogElement,
};
}

function isFolder(node: chrome.bookmarks.BookmarkTreeNode) {
return !node.url;
}

export class PowerBookmarksEditDialogElement extends PolymerElement {
static get is() {
return 'power-bookmarks-edit-dialog';
}

static get template() {
return getTemplate();
}

static get properties() {
return {
topLevelBookmarks_: {
type: Array,
value: () => [],
},

selectedBookmarks_: {
type: Array,
value: () => [],
},

selectedFolder_: {
type: Object,
value: null,
},

activeFolder_: {
type: Object,
value: null,
},
};
}

private topLevelBookmarks_: chrome.bookmarks.BookmarkTreeNode[];
private selectedBookmarks_: chrome.bookmarks.BookmarkTreeNode[];
private selectedFolder_: chrome.bookmarks.BookmarkTreeNode|undefined;
private activeFolder_: chrome.bookmarks.BookmarkTreeNode|undefined;

showDialog(
activeFolder: chrome.bookmarks.BookmarkTreeNode|undefined,
topLevelBookmarks: chrome.bookmarks.BookmarkTreeNode[],
selectedBookmarks: chrome.bookmarks.BookmarkTreeNode[]) {
this.activeFolder_ = activeFolder;
this.topLevelBookmarks_ = topLevelBookmarks;
this.selectedBookmarks_ = selectedBookmarks;
this.$.dialog.showModal();
}

private getActiveFolderTitle_() {
if (this.activeFolder_ &&
this.activeFolder_.id !== loadTimeData.getString('otherBookmarksId') &&
this.activeFolder_.id !== loadTimeData.getString('mobileBookmarksId')) {
return this.activeFolder_!.title;
} else {
return loadTimeData.getString('allBookmarks');
}
}

private getShownFolders_(): chrome.bookmarks.BookmarkTreeNode[] {
if (this.activeFolder_ && this.activeFolder_.children) {
return this.activeFolder_.children!.filter(isFolder);
} else if (!this.activeFolder_ && this.topLevelBookmarks_) {
return this.topLevelBookmarks_.filter(isFolder);
}
assertNotReached('No bookmarks to display in edit menu');
}

private onNewFolder_() {
// TODO
}

private onCancel_() {
this.$.dialog.close();
}

private onSave_() {
// TODO
this.$.dialog.close();
}
}

declare global {
interface HTMLElementTagNameMap {
'power-bookmarks-edit-dialog': PowerBookmarksEditDialogElement;
}
}

customElements.define(
PowerBookmarksEditDialogElement.is, PowerBookmarksEditDialogElement);
Expand Up @@ -202,6 +202,11 @@ <h1 slot="heading">[[getActiveFolderLabel_(activeFolderPath_.*)]]</h1>
title="$i18n{tooltipDelete}" aria-label="$i18n{tooltipDelete}"
on-click="onDeleteClicked_">
</cr-icon-button>
<cr-icon-button iron-icon="bookmarks:move"
disabled="[[!selectedBookmarks_.length]]"
title="$i18n{tooltipMove}" aria-label="$i18n{tooltipMove}"
on-click="onMoveClicked_">
</cr-icon-button>
<cr-icon-button iron-icon="cr:more-vert"
disabled="[[!selectedBookmarks_.length]]"
title="$i18n{tooltipMore}" aria-label="$i18n{tooltipMore}"
Expand Down Expand Up @@ -231,6 +236,8 @@ <h1 slot="heading">[[getActiveFolderLabel_(activeFolderPath_.*)]]</h1>
</button>
</cr-action-menu>

<power-bookmarks-edit-dialog id="editDialog"></power-bookmarks-edit-dialog>

<cr-lazy-render id="contextMenu">
<template>
<power-bookmarks-context-menu
Expand Down
Expand Up @@ -7,6 +7,8 @@ import './commerce/shopping_list.js';
import './icons.html.js';
import './power_bookmarks_context_menu.js';
import './power_bookmark_row.js';
import './power_bookmarks_context_menu.js';
import './power_bookmarks_edit_dialog.js';
import '//bookmarks-side-panel.top-chrome/shared/sp_empty_state.js';
import '//bookmarks-side-panel.top-chrome/shared/sp_filter_chip.js';
import '//bookmarks-side-panel.top-chrome/shared/sp_footer.js';
Expand Down Expand Up @@ -34,6 +36,7 @@ import {DomRepeatEvent, PolymerElement} from '//resources/polymer/v3_0/polymer/p
import {ActionSource} from './bookmarks.mojom-webui.js';
import {BookmarksApiProxy, BookmarksApiProxyImpl} from './bookmarks_api_proxy.js';
import {PowerBookmarksContextMenuElement} from './power_bookmarks_context_menu.js';
import {PowerBookmarksEditDialogElement} from './power_bookmarks_edit_dialog.js';
import {getTemplate} from './power_bookmarks_list.html.js';
import {Label, PowerBookmarksService} from './power_bookmarks_service.js';

Expand All @@ -47,6 +50,7 @@ export interface PowerBookmarksListElement {
deletionToast: CrLazyRenderElement<CrToastElement>,
powerBookmarksContainer: HTMLElement,
sortMenu: CrActionMenuElement,
editDialog: PowerBookmarksEditDialogElement,
};
}

Expand Down Expand Up @@ -528,6 +532,14 @@ export class PowerBookmarksListElement extends PolymerElement {
this.$.deletionToast.get().hide();
}

private onMoveClicked_(event: MouseEvent) {
event.preventDefault();
event.stopPropagation();
this.$.editDialog.showDialog(
this.getActiveFolder_(), this.bookmarksService_.getTopLevelBookmarks(),
this.selectedBookmarks_);
}

private onEditMenuClicked_(event: MouseEvent) {
event.preventDefault();
event.stopPropagation();
Expand Down
Expand Up @@ -116,6 +116,21 @@ export class PowerBookmarksService {
id => this.shoppingListApi_.getCallbackRouter().removeListener(id));
}

/**
* Returns a list of all root bookmark folders.
*/
getFolders() {
return this.folders_;
}

/**
* Returns a list of all bookmarks defaulted to if no filter criteria are
* provided.
*/
getTopLevelBookmarks() {
return this.filterBookmarks(undefined, 0, undefined, []);
}

/**
* Returns a list of bookmarks and folders filtered by the provided criteria.
*/
Expand Down
Expand Up @@ -55,6 +55,7 @@ BookmarksSidePanelUI::BookmarksSidePanelUI(content::WebUI* web_ui)
{"tooltipClose", IDS_CLOSE},
{"tooltipDelete", IDS_DELETE},
{"tooltipMore", IDS_BOOKMARKS_EDIT_MORE},
{"tooltipMove", IDS_BOOKMARKS_EDIT_MOVE_TO_ANOTHER_FOLDER},
{"shoppingListFolderTitle", IDS_SIDE_PANEL_TRACKED_PRODUCTS},
{"shoppingListTrackPriceButtonDescription",
IDS_PRICE_TRACKING_TRACK_PRODUCT_ACCESSIBILITY},
Expand Down Expand Up @@ -98,6 +99,10 @@ BookmarksSidePanelUI::BookmarksSidePanelUI(content::WebUI* web_ui)
{"newFolderTitle", IDS_BOOKMARK_EDITOR_NEW_FOLDER_NAME},
{"undoBookmarkDeletion", IDS_UNDO_BOOKMARK_DELETION},
{"urlFolderDescription", IDS_BOOKMARKS_URL_FOLDER_DESCRIPTION},
{"editMoveFolderTo", IDS_BOOKMARKS_EDIT_MOVE_TO},
{"editNewFolder", IDS_BOOKMARKS_EDIT_NEW_FOLDER},
{"editCancel", IDS_BOOKMARKS_EDIT_CANCEL},
{"editSave", IDS_BOOKMARKS_EDIT_SAVE},
};
for (const auto& str : kLocalizedStrings)
webui::AddLocalizedString(source, str.name, str.id);
Expand Down
2 changes: 2 additions & 0 deletions chrome/test/data/webui/side_panel/BUILD.gn
Expand Up @@ -12,9 +12,11 @@ build_webui_tests("build") {
"bookmarks/bookmarks_drag_manager_test.ts",
"bookmarks/bookmarks_list_interactive_ui_test.ts",
"bookmarks/bookmarks_list_test.ts",
"bookmarks/power_bookmarks_edit_dialog_test.ts",
"bookmarks/power_bookmarks_list_test.ts",
"bookmarks/power_bookmarks_service_test.ts",
"bookmarks/test_bookmarks_api_proxy.ts",
"bookmarks/test_power_bookmarks_delegate.ts",
"bookmarks/commerce/shopping_list_test.ts",
"bookmarks/commerce/test_shopping_list_api_proxy.ts",
"reading_list/reading_list_app_test.ts",
Expand Down

0 comments on commit 7d6cdd4

Please sign in to comment.