{"version":3,"sources":["jsdelivr-header.js","/npm/perspective-viewer-summary@0.0.1/src/js/plugin.js"],"names":[],"mappings":"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","file":"/npm/perspective-viewer-summary@0.0.1/dist/umd/perspective-viewer-summary.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/perspective-viewer-summary@0.0.1/dist/umd/perspective-viewer-summary.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import STYLE from \"../../dist/css/perspective-viewer-summary.css\";\n\nconst _ALIGN_DEFAULT = \"horizontal\";\n\nexport class PerspectiveViewerSummaryPluginElement extends HTMLElement {\n  constructor() {\n    super();\n    /*\n     * Config:\n     *  align: str = \"vertical\" | \"horizontal\",  // align items vertically or horizontally, default is horizontal\n     *  truncate: {[col: str]: int }, // round numbers, truncate strings\n     *  header_class: str, // css class to add to all headers\n     *  data_class: str, // css class to add to all datas\n     *  header_classes: {[col: str]: str}, // css class to add to specific headers\n     *  data_classes: {[col: str]: str}, //  css class to add to specific datas\n     */\n    this._config = {\n      plugin_config: {\n        align: _ALIGN_DEFAULT,\n        truncate: {},\n        header_class: \"\",\n        data_class: \"\",\n        header_classes: {},\n        data_classes: {},\n      },\n    };\n\n    // store data and dom elements\n    this._data = null;\n    this._schema = null;\n  }\n\n  connectedCallback() {\n    if (!this._container) {\n      this._container = document.createElement(\"div\");\n      this._container.classList.add(\"summary-container\");\n    }\n    this.appendChild(this._container);\n  }\n\n  disconnectedCallback() {}\n\n  async activate(view) {\n    // nothing to do\n  }\n\n  get name() {\n    // Plugin name is \"Summary\"\n    return \"Summary\";\n  }\n\n  get select_mode() {\n    // select any number of cols\n    return \"select\";\n  }\n\n  get min_config_columns() {\n    // at least 1 column\n    return 1;\n  }\n\n  async draw(view) {\n    await this.render(view);\n  }\n  async update(view) {\n    await this.render(view);\n  }\n\n  async render(view) {\n    // pull config\n    const config = await view.get_config();\n    this._config = {\n      ...this._config,\n      ...config,\n      plugin_config: { ...this._config.plugin_config, ...config.plugin_config },\n    };\n    this._schema = await view.schema();\n\n    // get the columns being displayed\n    const columns = config.columns;\n\n    // access the first row of data, the total aggregation\n    const data_window = {\n      start_row: 0,\n      start_col: 0,\n      end_row: 1,\n      end_col: columns.length,\n      id: false,\n    };\n\n    // get the data itself\n    this._data = await view.to_columns(data_window);\n\n    // set class based on alignment\n    this.format();\n  }\n\n  async resize() {\n    // TODO nothing yet\n  }\n\n  async clear() {\n    // TODO\n  }\n\n  save() {\n    return { ...this._config };\n  }\n\n  restore(token) {\n    this._config = {\n      ...this._config,\n      plugin_config: { ...this._config.plugin_config, ...token },\n    };\n    console;\n    this.format();\n  }\n\n  format() {\n    // get the columns being displayed\n    const columns = this._config.columns;\n\n    // get the aggregations for those columns\n    const aggregations = this._config.aggregates;\n\n    // if we're not pivoted, we don't display data\n    const is_pivoted =\n      this._data.__ROW_PATH__ && this._data.__ROW_PATH__.length > 0;\n\n    // keep in a map so we can format things individuallyt\n    const _entries = new Map();\n\n    columns.forEach((col) => {\n      // container for data\n      const col_container = document.createElement(\"div\");\n      col_container.classList.add(\"summary-column\");\n\n      // header\n      const header_container = document.createElement(\"div\");\n      header_container.classList.add(\"summary-header\");\n\n      const header_data = document.createElement(\"span\");\n      header_data.classList.add(\"summary-header-text\");\n\n      // add user provided classes\n      if (this._config.plugin_config.header_class) {\n        header_data.classList.add(this._config.plugin_config.header_class);\n      }\n      if (\n        this._config.plugin_config.header_classes &&\n        this._config.plugin_config.header_classes[col]\n      ) {\n        header_data.classList.add(\n          this._config.plugin_config.header_classes[col]\n        );\n      }\n\n      // put column name in content\n      header_data.textContent = col;\n      header_container.appendChild(header_data);\n\n      // data\n      const data_container = document.createElement(\"div\");\n      data_container.classList.add(\"summary-data\");\n\n      const data_data = document.createElement(\"span\");\n      data_data.classList.add(\"summary-data-text\");\n\n      // add user provided classes\n      if (this._config.plugin_config.data_class) {\n        data_data.classList.add(this._config.plugin_config.data_class);\n      }\n      if (\n        this._config.plugin_config.data_classes &&\n        this._config.plugin_config.data_classes[col]\n      ) {\n        data_data.classList.add(this._config.plugin_config.data_classes[col]);\n      }\n      data_container.appendChild(data_data);\n\n      // add to container\n      col_container.appendChild(header_container);\n      col_container.appendChild(data_container);\n\n      // put in map\n      _entries.set(col, col_container);\n\n      if (is_pivoted) {\n        // pull the data from the first row\n        let datum = this._data[col];\n\n        // show the aggregation type in tooltip, using type-specific variants\n        // NOTE: don't pull from schema as this will reflect the aggregate's type\n        const aggregate =\n          aggregations[col] || (Number.isNaN(datum) ? \"count\" : \"sum\");\n        data_data.title = `${aggregate}(\"${col}\")`;\n\n        // truncate the data if necessary\n        if (\n          this._config.plugin_config.truncate &&\n          this._config.plugin_config.truncate[col] >= 0\n        ) {\n          if ([\"integer\", \"float\"].indexOf(this._schema[col]) >= 0) {\n            // round to `n` decimals\n            datum = Number(datum).toFixed(\n              this._config.plugin_config.truncate[col]\n            );\n          } else if (\n            [\"boolean\", \"datetime\", \"date\"].indexOf(this._schema[col]) >= 0\n          ) {\n            // do nothing\n          } else {\n            // truncate the string to `n` digits\n            datum = new String(datum).substring(\n              0,\n              this._config.plugin_config.truncate[col]\n            );\n          }\n        }\n\n        if([\"datetime\", \"date\"].indexOf(this._schema[col]) >= 0) {\n          console.log(`formatting to date ${typeof datum}`);\n          // the data itself\n          data_data.textContent = new Date(+datum).toString();\n        } else {\n          // the data itself\n          data_data.textContent = datum;\n        }\n\n        // add classes to data if we have it and we have data\n        if (\n          this._config.plugin_config.data_classes &&\n          this._config.plugin_config.data_classes[col]\n        ) {\n          data_data.classList.add(this._config.plugin_config.data_classes[col]);\n        }\n      } else {\n        data_data.textContent = \"--\";\n      }\n\n      // set class based on alignment\n      this._container.classList.remove(\"align-horizontal\");\n      this._container.classList.remove(\"align-vertical\");\n      this._container.classList.add(\n        `align-${this._config.plugin_config.align || _ALIGN_DEFAULT}`\n      );\n    });\n\n    // clear it out\n    while (this._container.lastChild) {\n      this._container.removeChild(this._container.lastChild);\n    }\n\n    // and refill\n    _entries.forEach((value, key) => {\n      this._container.appendChild(value);\n    });\n  }\n\n  async restyle(view) {\n    // TODO\n  }\n\n  delete() {\n    // TODO\n  }\n}\n\ncustomElements.define(\n  \"perspective-viewer-summary\",\n  PerspectiveViewerSummaryPluginElement\n);\n\nfunction _register_global_styles() {\n  const style = document.createElement(\"style\");\n  style.textContent = STYLE;\n  document.head.insertBefore(style, document.head.firstChild);\n}\n\nfunction register_element() {\n  customElements\n    .get(\"perspective-viewer\")\n    .registerPlugin(\"perspective-viewer-summary\");\n}\n\ncustomElements.whenDefined(\"perspective-viewer\").then(register_element);\n_register_global_styles();\n"]}