All Downloads are FREE. Search and download functionalities are using the official Maven repository.

META-INF.dirigible.dev-tools.network.NetworkManageCustomHeadersView.js Maven / Gradle / Ivy

There is a newer version: 10.6.27
Show newest version
// 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}
 * @unrestricted
 */
export class NetworkManageCustomHeadersView extends UI.Widget.VBox {
  /**
   * @param {!Array.} 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');

    this._list = new UI.ListWidget.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.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.} */
    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.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 {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};
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy