Skip to content

Commit 53b4c2b

Browse files
ktranDevtools-frontend LUCI CQ
authored andcommitted
[GM3Restyling] Update workspace settings page
Before: https://i.imgur.com/M7vIlO6.png After: https://i.imgur.com/ywKVbZ4.png Bug: 368238837 Change-Id: I793c6cfe0f62d8bcbe932ecdaf860fb39177ffbe Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/5973211 Commit-Queue: Kim-Anh Tran <[email protected]> Reviewed-by: Kateryna Prokopenko <[email protected]>
1 parent 2c8e952 commit 53b4c2b

File tree

7 files changed

+128
-166
lines changed

7 files changed

+128
-166
lines changed

front_end/models/persistence/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ devtools_module("persistence") {
4141
"../../models/breakpoints:bundle",
4242
"../../models/text_utils:bundle",
4343
"../../models/workspace:bundle",
44+
"../../ui/components/cards:bundle",
4445
"../../ui/legacy:bundle",
4546
"../../ui/legacy/components/utils:bundle",
4647
]

front_end/models/persistence/EditFileSystemView.ts

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,18 @@ import {Events, IsolatedFileSystemManager} from './IsolatedFileSystemManager.js'
3838
import type {PlatformFileSystem} from './PlatformFileSystem.js';
3939

4040
const UIStrings = {
41+
/**
42+
*@description Text in Edit File System View of the Workspace settings in Settings to indicate that the following string is a folder URL
43+
*/
44+
url: 'URL',
4145
/**
4246
*@description Text in Edit File System View of the Workspace settings in Settings
4347
*/
44-
excludedFolders: 'Excluded folders',
48+
excludedFolders: 'Excluded sub-folders',
4549
/**
4650
*@description Text to add something
4751
*/
48-
add: 'Add',
52+
add: 'Add folder',
4953
/**
5054
* @description Placeholder text for an area of the UI that shows which folders have been excluded
5155
* from being show in DevTools. When the user has not yet chosen any folders to exclude, this text
@@ -91,13 +95,13 @@ export class EditFileSystemView extends UI.Widget.VBox implements UI.ListWidget.
9195
IsolatedFileSystemManager.instance().addEventListener(Events.ExcludedFolderRemoved, this.update, this),
9296
];
9397

94-
const excludedFoldersHeader = this.contentElement.createChild('div', 'file-system-header');
95-
excludedFoldersHeader.createChild('div', 'file-system-header-text').textContent =
96-
i18nString(UIStrings.excludedFolders);
97-
const addButton = UI.UIUtils.createTextButton(
98-
i18nString(UIStrings.add), this.addExcludedFolderButtonClicked.bind(this),
99-
{className: 'add-button', jslogContext: 'settings.add-excluded-folder'});
100-
excludedFoldersHeader.appendChild(addButton);
98+
const excludedFoldersHeader = this.contentElement.createChild('div', 'excluded-folder-header');
99+
excludedFoldersHeader.createChild('span').textContent = i18nString(UIStrings.url);
100+
excludedFoldersHeader.createChild('span', 'excluded-folder-url').textContent = fileSystemPath;
101+
102+
const excludeSubFoldersText = this.contentElement.createChild('span', 'exclude-subfolders-text');
103+
excludeSubFoldersText.textContent = i18nString(UIStrings.excludedFolders);
104+
101105
this.excludedFoldersList = new UI.ListWidget.ListWidget(this);
102106
this.excludedFoldersList.element.classList.add('file-system-list');
103107

@@ -107,6 +111,12 @@ export class EditFileSystemView extends UI.Widget.VBox implements UI.ListWidget.
107111
this.excludedFoldersList.setEmptyPlaceholder(excludedFoldersPlaceholder);
108112
this.excludedFoldersList.show(this.contentElement);
109113

114+
const addButton = UI.UIUtils.createTextButton(
115+
i18nString(UIStrings.add), this.addExcludedFolderButtonClicked.bind(this),
116+
{className: 'add-button', jslogContext: 'settings.add-excluded-folder'});
117+
118+
this.contentElement.appendChild(addButton);
119+
110120
this.update();
111121
}
112122

front_end/models/persistence/WorkspaceSettingsTab.ts

Lines changed: 50 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import * as i18n from '../../core/i18n/i18n.js';
66
import type * as Platform from '../../core/platform/platform.js';
7+
import * as Cards from '../../ui/components/cards/cards.js';
78
import * as UI from '../../ui/legacy/legacy.js';
89
import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
910

@@ -27,11 +28,11 @@ const UIStrings = {
2728
/**
2829
*@description Text of the add button in Workspace Settings Tab of the Workspace settings in Settings
2930
*/
30-
addFolder: 'Add folder',
31+
addFolder: 'Add folder',
3132
/**
3233
*@description Label element text content in Workspace Settings Tab of the Workspace settings in Settings
3334
*/
34-
folderExcludePattern: 'Folder exclude pattern',
35+
folderExcludePattern: 'Exclude from workspace',
3536
/**
3637
*@description Label for an item to remove something
3738
*/
@@ -42,7 +43,7 @@ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
4243

4344
export class WorkspaceSettingsTab extends UI.Widget.VBox {
4445
containerElement: HTMLElement;
45-
private readonly fileSystemsListContainer: HTMLElement;
46+
#addButtonContainer: HTMLElement;
4647
private readonly elementByPath: Map<Platform.DevToolsPath.UrlString, Element>;
4748
private readonly mappingViewByPath: Map<Platform.DevToolsPath.UrlString, EditFileSystemView>;
4849

@@ -51,12 +52,9 @@ export class WorkspaceSettingsTab extends UI.Widget.VBox {
5152

5253
this.element.setAttribute('jslog', `${VisualLogging.pane('workspace')}`);
5354

54-
this.element.classList.add('workspace-settings-tab');
55-
const header = this.element.createChild('header');
56-
UI.UIUtils.createTextChild(header.createChild('h1'), i18nString(UIStrings.workspace));
57-
58-
this.containerElement = this.element.createChild('div', 'settings-container-wrapper')
59-
.createChild('div', 'settings-tab settings-content settings-container');
55+
this.containerElement =
56+
this.contentElement.createChild('div', 'settings-card-container-wrapper').createChild('div');
57+
this.containerElement.classList.add('settings-card-container');
6058

6159
IsolatedFileSystemManager.instance().addEventListener(
6260
Events.FileSystemAdded, event => this.fileSystemAdded(event.data), this);
@@ -65,47 +63,52 @@ export class WorkspaceSettingsTab extends UI.Widget.VBox {
6563

6664
const folderExcludePatternInput = this.createFolderExcludePatternInput();
6765
folderExcludePatternInput.classList.add('folder-exclude-pattern');
68-
this.containerElement.appendChild(folderExcludePatternInput);
69-
70-
const div = this.containerElement.createChild('div', 'settings-info-message');
71-
UI.UIUtils.createTextChild(div, i18nString(UIStrings.mappingsAreInferredAutomatically));
66+
const mappingsAreInferredInfo = document.createElement('div');
67+
mappingsAreInferredInfo.classList.add('mappings-info');
68+
UI.UIUtils.createTextChild(mappingsAreInferredInfo, i18nString(UIStrings.mappingsAreInferredAutomatically));
7269

73-
this.fileSystemsListContainer = this.containerElement.createChild('div', '');
74-
75-
const addButton = UI.UIUtils.createTextButton(
76-
i18nString(UIStrings.addFolder), this.addFileSystemClicked.bind(this),
77-
{jslogContext: 'sources.add-folder-to-workspace'});
78-
this.containerElement.appendChild(addButton);
79-
this.setDefaultFocusedElement(addButton);
70+
const card = new Cards.Card.Card();
71+
this.containerElement.appendChild(card);
72+
card.data = {
73+
heading: i18nString(UIStrings.workspace),
74+
content: [folderExcludePatternInput, mappingsAreInferredInfo],
75+
};
8076

8177
this.elementByPath = new Map();
82-
8378
this.mappingViewByPath = new Map();
8479

8580
const fileSystems = IsolatedFileSystemManager.instance().fileSystems();
8681
for (let i = 0; i < fileSystems.length; ++i) {
8782
this.addItem(fileSystems[i]);
8883
}
84+
85+
this.#addButtonContainer = this.containerElement.createChild('div', 'add-button-container');
86+
const addButton = UI.UIUtils.createTextButton(
87+
i18nString(UIStrings.addFolder), this.addFileSystemClicked.bind(this),
88+
{jslogContext: 'sources.add-folder-to-workspace'});
89+
addButton.classList.add('add-folder');
90+
this.#addButtonContainer.appendChild(addButton);
8991
}
9092

9193
override wasShown(): void {
9294
super.wasShown();
9395
this.registerCSSFiles([workspaceSettingsTabStyles]);
9496
}
9597

96-
private createFolderExcludePatternInput(): Element {
97-
const p = document.createElement('p');
98-
const labelElement = p.createChild('label');
98+
private createFolderExcludePatternInput(): HTMLElement {
99+
const excludePatternElement = document.createElement('div');
100+
excludePatternElement.classList.add('folder-exclude-pattern');
101+
const labelElement = excludePatternElement.createChild('label');
99102
labelElement.textContent = i18nString(UIStrings.folderExcludePattern);
100103
const folderExcludeSetting = IsolatedFileSystemManager.instance().workspaceFolderExcludePatternSetting();
101104
const inputElement = UI.UIUtils.createInput('', 'text', folderExcludeSetting.name);
102105
UI.ARIAUtils.bindLabelToControl(labelElement, inputElement);
103-
p.appendChild(inputElement);
106+
excludePatternElement.appendChild(inputElement);
104107
const setValue =
105108
UI.UIUtils.bindInput(inputElement, folderExcludeSetting.set.bind(folderExcludeSetting), regexValidator, false);
106109
folderExcludeSetting.addChangeListener(() => setValue.call(null, folderExcludeSetting.get()));
107110
setValue(folderExcludeSetting.get());
108-
return p;
111+
return excludePatternElement;
109112

110113
function regexValidator(value: string): {valid: boolean, errorMessage: (string|undefined)} {
111114
let regex;
@@ -129,41 +132,34 @@ export class WorkspaceSettingsTab extends UI.Widget.VBox {
129132
fileSystem) {
130133
return;
131134
}
132-
const element = this.renderFileSystem(fileSystem);
133-
this.elementByPath.set(fileSystem.path(), element);
134-
135-
this.fileSystemsListContainer.appendChild(element);
136-
135+
const filename = this.getFilename(fileSystem);
136+
const removeButton = UI.UIUtils.createTextButton(
137+
i18nString(UIStrings.remove), this.removeFileSystemClicked.bind(this, fileSystem),
138+
{jslogContext: 'settings.remove-file-system'});
139+
140+
const mappingViewContainer = document.createElement('div');
141+
mappingViewContainer.classList.add('mapping-view-container');
142+
const fileSystemExcludeCard = new Cards.Card.Card();
143+
this.containerElement.insertBefore(fileSystemExcludeCard, this.#addButtonContainer);
144+
fileSystemExcludeCard.data = {
145+
heading: filename,
146+
headingIconName: 'folder',
147+
headingSuffix: removeButton,
148+
content: [mappingViewContainer],
149+
};
137150
const mappingView = new EditFileSystemView(fileSystem.path());
138151
this.mappingViewByPath.set(fileSystem.path(), mappingView);
139152
mappingView.element.classList.add('file-system-mapping-view');
140-
mappingView.show(element);
153+
154+
mappingView.show(mappingViewContainer);
155+
156+
this.elementByPath.set(fileSystem.path(), fileSystemExcludeCard);
141157
}
142158

143-
private renderFileSystem(fileSystem: PlatformFileSystem): Element {
159+
private getFilename(fileSystem: PlatformFileSystem): string {
144160
const fileSystemPath = fileSystem.path();
145161
const lastIndexOfSlash = fileSystemPath.lastIndexOf('/');
146-
const folderName = fileSystemPath.substr(lastIndexOfSlash + 1);
147-
148-
const element = document.createElement('div');
149-
element.classList.add('file-system-container');
150-
const header = element.createChild('div', 'file-system-header');
151-
152-
const nameElement = header.createChild('div', 'file-system-name');
153-
nameElement.textContent = folderName;
154-
UI.ARIAUtils.markAsHeading(nameElement, 2);
155-
const path = header.createChild('div', 'file-system-path');
156-
path.textContent = fileSystemPath;
157-
UI.Tooltip.Tooltip.install(path, fileSystemPath);
158-
159-
const toolbar = new UI.Toolbar.Toolbar('');
160-
const button =
161-
new UI.Toolbar.ToolbarButton(i18nString(UIStrings.remove), 'cross', undefined, 'settings.remove-file-system');
162-
button.addEventListener(UI.Toolbar.ToolbarButton.Events.CLICK, this.removeFileSystemClicked.bind(this, fileSystem));
163-
toolbar.appendToolbarItem(button);
164-
header.appendChild(toolbar.element);
165-
166-
return element;
162+
return fileSystemPath.substr(lastIndexOfSlash + 1);
167163
}
168164

169165
private removeFileSystemClicked(fileSystem: PlatformFileSystem): void {

front_end/models/persistence/editFileSystemView.css

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,32 @@
44
* found in the LICENSE file.
55
*/
66

7-
.file-system-header {
7+
.excluded-folder-header {
88
display: flex;
9-
flex-direction: row;
10-
align-items: center;
11-
flex: auto;
12-
margin: 10px 0;
9+
flex-direction: column;
10+
height: var(--sys-size-16);
11+
border-bottom: var(--sys-size-1) solid var(--sys-color-divider);
12+
padding: var(--sys-size-5) var(--sys-size-6);
13+
14+
& > .excluded-folder-url {
15+
color: var(--sys-color-on-surface-subtle);
16+
overflow: hidden;
17+
text-overflow: ellipsis;
18+
}
1319
}
1420

15-
.file-system-header-text {
16-
flex: 1 0 auto;
21+
.exclude-subfolders-text, .file-system-list-empty {
22+
padding: 0 var(--sys-size-6);
23+
height: var(--sys-size-13);
24+
}
25+
26+
.exclude-subfolders-text {
27+
align-items: center;
28+
display: flex;
1729
}
1830

1931
.add-button {
20-
margin-left: 10px;
32+
padding: var(--sys-size-4) var(--sys-size-6);
2133
align-self: flex-start;
2234
}
2335

@@ -26,17 +38,12 @@
2638
}
2739

2840
.file-system-list-empty {
29-
flex: auto;
30-
height: 30px;
3141
display: flex;
3242
align-items: center;
33-
justify-content: center;
34-
text-align: center;
3543
}
3644

3745
.file-system-list-item {
38-
padding: 3px 5px;
39-
height: 30px;
46+
height: var(--sys-size-13);
4047
display: flex;
4148
align-items: center;
4249
flex: auto 1 1;
@@ -46,6 +53,18 @@
4653
flex: 1 1 0;
4754
}
4855

56+
.list {
57+
border: none;
58+
}
59+
60+
.list-item {
61+
padding: 0 var(--sys-size-6);
62+
}
63+
64+
.editor-buttons {
65+
padding: var(--sys-size-4) var(--sys-size-6);
66+
}
67+
4968
.list-item .file-system-value {
5069
white-space: nowrap;
5170
text-overflow: ellipsis;
@@ -57,7 +76,7 @@
5776
flex: none;
5877
display: flex;
5978
flex-direction: row;
60-
margin: 6px 5px;
79+
margin: var(--sys-size-4) var(--sys-size-6);
6180
align-items: center;
6281
}
6382

0 commit comments

Comments
 (0)