text: /**
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you under the Apache License, Version 2.0 (the
   * "License"); you may not use this file except in compliance
   * with the License.  You may obtain a copy of the License at
   *
   *   http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing,
   * software distributed under the License is distributed on an
   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   * KIND, either express or implied.  See the License for the
   * specific language governing permissions and limitations
   * under the License.
   */
  import {
    SupersetClient,
    getTimeFormatter,
    TimeFormats,
  } from '@superset-ui/core';
  import getClientErrorObject from './getClientErrorObject';
  
  // ATTENTION: If you change any constants, make sure to also change constants.py
  
  export const NULL_STRING = '<NULL>';
  
  // moment time format strings
  export const SHORT_DATE = 'MMM D, YYYY';
  export const SHORT_TIME = 'h:m a';
  
  const DATETIME_FORMATTER = getTimeFormatter(TimeFormats.DATABASE_DATETIME);
  
  export function getParamFromQuery(query, param) {
    const vars = query.split('&');
    for (let i = 0; i < vars.length; i += 1) {
      const pair = vars[i].split('=');
      if (decodeURIComponent(pair[0]) === param) {
        return decodeURIComponent(pair[1]);
      }
    }
    return null;
  }
  
  export function storeQuery(query) {
    return SupersetClient.post({
      endpoint: '/kv/store/',
      postPayload: { data: query },
    }).then(response => {
      const baseUrl = window.location.origin + window.location.pathname;
      const url = `${baseUrl}?id=${response.json.id}`;
      return url;
    });
  }
  
  export function getParamsFromUrl() {
    const hash = window.location.search;
    const params = hash.split('?')[1].split('&');
    const newParams = {};
    params.forEach(p => {
      const value = p.split('=')[1].replace(/\+/g, ' ');
      const key = p.split('=')[0];
      newParams[key] = value;
    });
    return newParams;
  }
  
  export function getShortUrl(longUrl) {
    return SupersetClient.post({
      endpoint: '/r/shortner/',
      postPayload: { data: `/${longUrl}` }, // note: url should contain 2x '/' to redirect properly
      parseMethod: 'text',
      stringify: false, // the url saves with an extra set of string quotes without this
    })
      .then(({ text }) => text)
      .catch(response =>
        getClientErrorObject(response).then(({ error, statusText }) =>
          Promise.reject(error || statusText),
        ),
      );
  }
  
  export function optionLabel(opt) {
    if (opt === null) {
      return NULL_STRING;
    }
    if (opt === '') {
      return '<empty string>';
    }
    if (opt === true) {
      return '<true>';
    }
    if (opt === false) {
      return '<false>';
    }
    if (typeof opt !== 'string' && opt.toString) {
      return opt.toString();
    }
    return opt;
  }
  
  export function optionValue(opt) {
    if (opt === null) {
      return NULL_STRING;
    }
    return opt;
  }
  
  export function optionFromValue(opt) {
    // From a list of options, handles special values & labels
    return { value: optionValue(opt), label: optionLabel(opt) };
  }
  
  export function prepareCopyToClipboardTabularData(data) {
    let result = '';
    for (let i = 0; i < data.length; i += 1) {
      result += `${Object.values(data[i]).join('\t')}\n`;
    }
    return result;
  }
  
  export function applyFormattingToTabularData(data) {
    if (!data || data.length === 0 || !('__timestamp' in data[0])) {
      return data;
    }
    return data.map(row => ({
      ...row,
      /* eslint-disable no-underscore-dangle */
      __timestamp:
        row.__timestamp === 0 || row.__timestamp
          ? DATETIME_FORMATTER(new Date(row.__timestamp))
          : row.__timestamp,
      /* eslint-enable no-underscore-dangle */
    }));
  }
  
  export const noOp = () => undefined;
  