mirror of
https://github.com/react/react-native-devtools-frontend.git
synced 2026-10-19 21:14:44 +08:00
R=tvanderlippe@chromium.org Bug: chromium:1011811 Change-Id: Ie3788c2f2919204547b2b0cbb2c880d0bf2c88a2 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2460915 Reviewed-by: Tim van der Lippe <tvanderlippe@chromium.org> Commit-Queue: Simon Zünd <szuend@chromium.org>
166 lines
5.3 KiB
JavaScript
166 lines
5.3 KiB
JavaScript
// Copyright 2016 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import * as Common from '../common/common.js';
|
|
import * as UI from '../ui/ui.js';
|
|
|
|
/**
|
|
* @implements {UI.ListWidget.Delegate<!{header: string}>}
|
|
* @unrestricted
|
|
*/
|
|
export class NetworkManageCustomHeadersView extends UI.Widget.VBox {
|
|
/**
|
|
* @param {!Array.<!{title: string, editable: boolean}>} columnData
|
|
* @param {function(string) : boolean} addHeaderColumnCallback
|
|
* @param {function(string, string) : boolean} changeHeaderColumnCallback
|
|
* @param {function(string) : boolean} removeHeaderColumnCallback
|
|
*/
|
|
constructor(columnData, addHeaderColumnCallback, changeHeaderColumnCallback, removeHeaderColumnCallback) {
|
|
super(true);
|
|
this.registerRequiredCSS('network/networkManageCustomHeadersView.css');
|
|
|
|
this.contentElement.classList.add('custom-headers-wrapper');
|
|
this.contentElement.createChild('div', 'header').textContent = Common.UIString.UIString('Manage Header Columns');
|
|
|
|
/** @type {!UI.ListWidget.ListWidget<!{header: string}>} */
|
|
this._list = new UI.ListWidget.ListWidget(this);
|
|
this._list.element.classList.add('custom-headers-list');
|
|
this._list.registerRequiredCSS('network/networkManageCustomHeadersView.css');
|
|
|
|
const placeholder = document.createElement('div');
|
|
placeholder.classList.add('custom-headers-list-list-empty');
|
|
placeholder.textContent = Common.UIString.UIString('No custom headers');
|
|
this._list.setEmptyPlaceholder(placeholder);
|
|
this._list.show(this.contentElement);
|
|
this.contentElement.appendChild(UI.UIUtils.createTextButton(
|
|
Common.UIString.UIString('Add custom header…'), this._addButtonClicked.bind(this), 'add-button'));
|
|
|
|
/** @type {!Map.<string, !{title: string, editable: boolean}>} */
|
|
this._columnConfigs = new Map();
|
|
columnData.forEach(columnData => this._columnConfigs.set(columnData.title.toLowerCase(), columnData));
|
|
|
|
this._addHeaderColumnCallback = addHeaderColumnCallback;
|
|
this._changeHeaderColumnCallback = changeHeaderColumnCallback;
|
|
this._removeHeaderColumnCallback = removeHeaderColumnCallback;
|
|
|
|
this.contentElement.tabIndex = 0;
|
|
}
|
|
|
|
/**
|
|
* @override
|
|
*/
|
|
wasShown() {
|
|
this._headersUpdated();
|
|
}
|
|
|
|
_headersUpdated() {
|
|
this._list.clear();
|
|
this._columnConfigs.forEach(headerData => this._list.appendItem({header: headerData.title}, headerData.editable));
|
|
}
|
|
|
|
_addButtonClicked() {
|
|
this._list.addNewItem(this._columnConfigs.size, {header: ''});
|
|
}
|
|
|
|
/**
|
|
* @override
|
|
* @param {!{header:string}} item
|
|
* @param {boolean} editable
|
|
* @return {!Element}
|
|
*/
|
|
renderItem(item, editable) {
|
|
const element = document.createElement('div');
|
|
element.classList.add('custom-headers-list-item');
|
|
const header = element.createChild('div', 'custom-header-name');
|
|
header.textContent = item.header;
|
|
header.title = item.header;
|
|
return element;
|
|
}
|
|
|
|
/**
|
|
* @override
|
|
* @param {!{header:string}} item
|
|
* @param {number} index
|
|
*/
|
|
removeItemRequested(item, index) {
|
|
this._removeHeaderColumnCallback(item.header);
|
|
this._columnConfigs.delete(item.header.toLowerCase());
|
|
this._headersUpdated();
|
|
}
|
|
|
|
/**
|
|
* @override
|
|
* @param {!{header:string}} item
|
|
* @param {!UI.ListWidget.Editor<?>} editor
|
|
* @param {boolean} isNew
|
|
*/
|
|
commitEdit(item, editor, isNew) {
|
|
const headerId = editor.control('header').value.trim();
|
|
let success;
|
|
if (isNew) {
|
|
success = this._addHeaderColumnCallback(headerId);
|
|
} else {
|
|
success = this._changeHeaderColumnCallback(item.header, headerId);
|
|
}
|
|
|
|
if (success && !isNew) {
|
|
this._columnConfigs.delete(item.header.toLowerCase());
|
|
}
|
|
if (success) {
|
|
this._columnConfigs.set(headerId.toLowerCase(), {title: headerId, editable: true});
|
|
}
|
|
|
|
this._headersUpdated();
|
|
}
|
|
|
|
/**
|
|
* @override
|
|
* @param {!{header:string}} item
|
|
* @return {!UI.ListWidget.Editor<?>}
|
|
*/
|
|
beginEdit(item) {
|
|
const editor = this._createEditor();
|
|
editor.control('header').value = item.header;
|
|
return editor;
|
|
}
|
|
|
|
/**
|
|
* @return {!UI.ListWidget.Editor<?>}
|
|
*/
|
|
_createEditor() {
|
|
if (this._editor) {
|
|
return this._editor;
|
|
}
|
|
|
|
const editor = new UI.ListWidget.Editor();
|
|
this._editor = editor;
|
|
const content = editor.contentElement();
|
|
|
|
const titles = content.createChild('div', 'custom-headers-edit-row');
|
|
titles.createChild('div', 'custom-headers-header').textContent = Common.UIString.UIString('Header Name');
|
|
|
|
const fields = content.createChild('div', 'custom-headers-edit-row');
|
|
fields.createChild('div', 'custom-headers-header')
|
|
.appendChild(editor.createInput('header', 'text', 'x-custom-header', validateHeader.bind(this)));
|
|
|
|
return editor;
|
|
|
|
/**
|
|
* @param {!{header:string}} item
|
|
* @param {number} index
|
|
* @param {!HTMLInputElement|!HTMLSelectElement} input
|
|
* @this {NetworkManageCustomHeadersView}
|
|
* @return {!UI.ListWidget.ValidatorResult}
|
|
*/
|
|
function validateHeader(item, index, input) {
|
|
let valid = true;
|
|
const headerId = editor.control('header').value.trim().toLowerCase();
|
|
if (this._columnConfigs.has(headerId) && item.header !== headerId) {
|
|
valid = false;
|
|
}
|
|
return {valid, errorMessage: undefined};
|
|
}
|
|
}
|
|
}
|