blob: fa528c7b9d773e4c67729d0d03d8184ba509aea2 [file] [log] [blame]
/*
* 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.
*/
/**
* @implements {UI.ListWidget.Delegate}
* @unrestricted
*/
export default class NetworkManageCustomHeadersView extends UI.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('Manage Header Columns');
this._list = new UI.ListWidget(this);
this._list.element.classList.add('custom-headers-list');
this._list.registerRequiredCSS('network/networkManageCustomHeadersView.css');
const placeholder = createElementWithClass('div', 'custom-headers-list-list-empty');
placeholder.textContent = Common.UIString('No custom headers');
this._list.setEmptyPlaceholder(placeholder);
this._list.show(this.contentElement);
this.contentElement.appendChild(UI.createTextButton(
Common.UIString('Add custom header\u2026'), 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 {*} item
* @param {boolean} editable
* @return {!Element}
*/
renderItem(item, editable) {
const element = createElementWithClass('div', 'custom-headers-list-item');
const header = element.createChild('div', 'custom-header-name');
header.textContent = item.header;
header.title = item.header;
return element;
}
/**
* @override
* @param {*} item
* @param {number} index
*/
removeItemRequested(item, index) {
this._removeHeaderColumnCallback(item.header);
this._columnConfigs.delete(item.header.toLowerCase());
this._headersUpdated();
}
/**
* @override
* @param {*} 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 {*} 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('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 {*} item
* @param {number} index
* @param {!HTMLInputElement|!HTMLSelectElement} input
* @this {Network.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};
}
}
}
/* Legacy exported object */
self.Network = self.Network || {};
/* Legacy exported object */
Network = Network || {};
/**
* @constructor
*/
Network.NetworkManageCustomHeadersView = NetworkManageCustomHeadersView;