HEX
Server: Microsoft-IIS/10.0
System: Windows NT ITPWINWEBSVR22 10.0 build 20348 (Windows Server 2022) AMD64
User: www.conferencesearch.co.uk (0)
PHP: 8.3.30
Disabled: NONE
Upload Files
File: D:/web/matomo.circ/plugins/Transitions/vue/src/TransitionSwitcher/TransitionSwitcher.vue
<!--
  Matomo - free/libre analytics platform

  @link    https://matomo.org
  @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
-->

<template>
  <div
    :class="{ widgetBody: isWidget }"
    id="transitions_report"
  >
    <div class="row">
      <div class="col s12 m3">
        <div name="actionType">
          <Field
            uicontrol="select"
            name="actionType"
            v-model="actionType"
            :title="translate('Actions_ActionType')"
            :full-width="true"
            :options="actionTypeOptions"
          >
          </Field>
        </div>
      </div>
      <div class="col s12 m9">
        <div name="actionName">
          <Field
            uicontrol="select"
            name="actionName"
            v-model="actionName"
            :title="translate('Transitions_TopX', 100)"
            :full-width="true"
            :disabled="!isEnabled"
            :options="actionNameOptions"
          >
          </Field>
        </div>
      </div>
    </div>
    <ActivityIndicator :loading="isLoading" />
    <div
      class="loadingPiwik"
      style="display:none;"
      id="transitions_inline_loading"
    >
      <img src="plugins/Morpheus/images/loading-blue.gif" alt/>
      <span>{{ translate('General_LoadingData') }}</span>
    </div>
    <div
      class="popoverContainer"
      v-show="!isLoading && isEnabled"
    >
    </div>
    <div
      id="Transitions_Error_Container"
      v-show="!isLoading"
    >
    </div>
    <div
      class="dataTableWrapper"
      v-show="isEnabled"
    >
      <div class="dataTableFeatures">
        <div class="dataTableFooterNavigation">
          <div class="dataTableControls">
            <div class="row">
              <a
                class="dataTableAction"
                v-transition-exporter
              >
                <span class="icon-export" />
              </a>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div class="alert alert-info">
      {{ translate('Transitions_AvailableInOtherReports') }}
      {{ translate('Actions_PageUrls') }}, {{ translate('Actions_SubmenuPageTitles') }},
      {{ translate('Actions_SubmenuPagesEntry') }}
      {{ translate('General_And') }}
      {{ translate('Actions_SubmenuPagesExit') }}.
      <span v-html="$sanitize(availableInOtherReports2)"></span>
    </div>
  </div>
</template>

<script lang="ts">
import { defineComponent, onBeforeUnmount, ref } from 'vue';
import {
  translate,
  AjaxHelper,
  Matomo,
  ActivityIndicator,
} from 'CoreHome';
import { Field } from 'CorePluginsAdmin';
import TransitionExporter from '../TransitionExporter/TransitionExporter';

interface Option {
  key: string;
  value: unknown;
  url?: string;
}

interface TransitionSwitcherState {
  actionType: string;
  actionNameOptions: Option[];
  actionTypeOptions: Option[];
  isLoading: boolean;
  actionName: string|null;
  isEnabled: boolean;
  noDataKey: string;
}

interface ActionReportRow {
  label: string;
  nb_hits: string|number;
  segment: string;
  url: string;
}

export default defineComponent({
  props: {
    isWidget: Boolean,
  },
  components: {
    Field,
    ActivityIndicator,
  },
  directives: {
    TransitionExporter,
  },
  data(): TransitionSwitcherState {
    return {
      actionType: 'Actions.getPageUrls',
      actionNameOptions: [],
      actionTypeOptions: [
        {
          key: 'Actions.getPageUrls',
          value: translate('Actions_PageUrls'),
        }, {
          key: 'Actions.getPageTitles',
          value: translate('Actions_WidgetPageTitles'),
        },
      ],
      isLoading: false,
      actionName: null,
      isEnabled: true,
      noDataKey: '_____ignore_____',
    };
  },
  setup() {
    let transitionsInstance: Transitions|null = null;
    const transitionsUrl = ref<null|string>();

    const onSwitchTransitionsUrl = (params: { url: string }) => {
      if (params?.url) {
        transitionsUrl.value = params.url;
      }
    };

    Matomo.on('Transitions.switchTransitionsUrl', onSwitchTransitionsUrl);

    onBeforeUnmount(() => {
      Matomo.off('Transitions.switchTransitionsUrl', onSwitchTransitionsUrl);
    });

    const createTransitionsInstance = (type: string, actionName: string) => {
      if (!transitionsInstance) {
        transitionsInstance = new window.Piwik_Transitions(type, actionName, null, '');
      } else {
        transitionsInstance.reset(type, actionName, '');
      }
    };

    const getTransitionsInstance = () => transitionsInstance;

    return {
      transitionsUrl,
      createTransitionsInstance,
      getTransitionsInstance,
    };
  },
  watch: {
    transitionsUrl(newValue) {
      let url = newValue;
      if (this.isUrlReport) {
        url = url.replace('https://', '').replace('http://', '');
      }

      const found = this.actionNameOptions.find((option) => {
        let optionUrl = option.url;

        if (optionUrl && this.isUrlReport) {
          optionUrl = String(optionUrl).replace('https://', '').replace('http://', '');
        } else {
          optionUrl = undefined;
        }

        return option.key === url || (url === optionUrl && optionUrl);
      });

      if (found) {
        this.actionName = found.key;
      } else {
        // we only fetch top 100 in the report... so the entry the user clicked on, might not
        // be in the top 100
        this.actionNameOptions = [
          ...this.actionNameOptions,
          { key: url, value: url },
        ];
        this.actionName = url;
      }
    },
    actionName(newValue) {
      if (newValue === null || newValue === this.noDataKey) {
        return;
      }

      const type = this.isUrlReport ? 'url' : 'title';

      this.createTransitionsInstance(type, newValue);

      this.getTransitionsInstance()!.showPopover(true);
    },
    actionType(newValue) {
      this.fetch(newValue);
    },
  },
  created() {
    this.fetch(this.actionType);
  },
  methods: {
    detectActionName(reports: ActionReportRow[]) {
      const othersLabel = translate('General_Others');

      reports.forEach((report) => {
        if (!report) {
          return;
        }

        if (report.label === othersLabel) {
          return;
        }

        const key = this.isUrlReport ? report.url : report.label;
        if (key) {
          const pageviews = translate('Transitions_NumPageviews', report.nb_hits as string);
          const label = `${report.label} (${pageviews})`;
          this.actionNameOptions.push({
            key,
            value: label,
            url: report.url,
          });

          if (!this.actionName) {
            this.actionName = key;
          }
        }
      });
    },
    fetch(type: string) {
      this.isLoading = true;
      this.actionNameOptions = [];
      this.actionName = null;
      AjaxHelper.fetch<ActionReportRow[]>({
        method: type,
        flat: 1,
        filter_limit: 100,
        filter_sort_order: 'desc',
        filter_sort_column: 'nb_hits',
        showColumns: 'label,nb_hits,url',
      }).then((report) => {
        this.isLoading = false;
        this.actionNameOptions = [];
        this.actionName = null;

        if (report?.length) {
          this.isEnabled = true;
          this.detectActionName(report);
        }

        if (this.actionName === null || this.actionNameOptions.length === 0) {
          this.isEnabled = false;
          this.actionName = this.noDataKey;
          this.actionNameOptions.push({
            key: this.noDataKey,
            value: translate('CoreHome_ThereIsNoDataForThisReport'),
          });
        }
      }).catch(() => {
        this.isLoading = false;
        this.isEnabled = false;
      });
    },
  },
  computed: {
    isUrlReport() {
      return this.actionType === 'Actions.getPageUrls';
    },
    availableInOtherReports2() {
      return translate('Transitions_AvailableInOtherReports2', '<span class="icon-transition"></span>');
    },
  },
});
</script>