xref: /openbmc/webui-vue/src/views/Logs/Dumps/Dumps.vue (revision 6e53b14b3e7e422ca18e77e7950bb4a211e3be29)
1828dda9bSDerick Montague<template>
2828dda9bSDerick Montague  <b-container fluid="xl">
3828dda9bSDerick Montague    <page-title />
4828dda9bSDerick Montague    <b-row>
5828dda9bSDerick Montague      <b-col sm="6" lg="5" xl="4">
6828dda9bSDerick Montague        <page-section :section-title="$t('pageDumps.initiateDump')">
7828dda9bSDerick Montague          <dumps-form />
8828dda9bSDerick Montague        </page-section>
9828dda9bSDerick Montague      </b-col>
10828dda9bSDerick Montague    </b-row>
11828dda9bSDerick Montague    <b-row>
12828dda9bSDerick Montague      <b-col xl="10">
13828dda9bSDerick Montague        <page-section :section-title="$t('pageDumps.dumpsAvailableOnBmc')">
14828dda9bSDerick Montague          <b-row class="align-items-start">
15828dda9bSDerick Montague            <b-col sm="8" xl="6" class="d-sm-flex align-items-end">
16828dda9bSDerick Montague              <search
17828dda9bSDerick Montague                :placeholder="$t('pageDumps.table.searchDumps')"
18828dda9bSDerick Montague                @change-search="onChangeSearchInput"
19828dda9bSDerick Montague                @clear-search="onClearSearchInput"
20828dda9bSDerick Montague              />
21828dda9bSDerick Montague              <div class="ml-sm-4">
22828dda9bSDerick Montague                <table-cell-count
23e39b95d6SSukanya Pandey                  :filtered-items-count="filteredRows"
24e39b95d6SSukanya Pandey                  :total-number-of-cells="allDumps.length"
25828dda9bSDerick Montague                ></table-cell-count>
26828dda9bSDerick Montague              </div>
27828dda9bSDerick Montague            </b-col>
28828dda9bSDerick Montague            <b-col sm="8" md="7" xl="6">
29828dda9bSDerick Montague              <table-date-filter @change="onChangeDateTimeFilter" />
30828dda9bSDerick Montague            </b-col>
31828dda9bSDerick Montague          </b-row>
32e39b95d6SSukanya Pandey          <b-row>
33e39b95d6SSukanya Pandey            <b-col class="text-right">
34e39b95d6SSukanya Pandey              <table-filter
35e39b95d6SSukanya Pandey                :filters="tableFilters"
36e39b95d6SSukanya Pandey                @filter-change="onFilterChange"
37e39b95d6SSukanya Pandey              />
38e39b95d6SSukanya Pandey            </b-col>
39e39b95d6SSukanya Pandey          </b-row>
40828dda9bSDerick Montague          <table-toolbar
41828dda9bSDerick Montague            :selected-items-count="selectedRows.length"
42828dda9bSDerick Montague            :actions="batchActions"
43828dda9bSDerick Montague            @clear-selected="clearSelectedRows($refs.table)"
44828dda9bSDerick Montague            @batch-action="onTableBatchAction"
45828dda9bSDerick Montague          />
46828dda9bSDerick Montague          <b-table
47828dda9bSDerick Montague            ref="table"
48828dda9bSDerick Montague            show-empty
49828dda9bSDerick Montague            hover
50828dda9bSDerick Montague            sort-icon-left
51828dda9bSDerick Montague            no-sort-reset
52828dda9bSDerick Montague            sort-desc
53828dda9bSDerick Montague            selectable
54828dda9bSDerick Montague            no-select-on-click
55828dda9bSDerick Montague            responsive="md"
56828dda9bSDerick Montague            sort-by="dateTime"
57828dda9bSDerick Montague            :fields="fields"
58e39b95d6SSukanya Pandey            :items="filteredDumps"
59828dda9bSDerick Montague            :empty-text="$t('global.table.emptyMessage')"
60828dda9bSDerick Montague            :empty-filtered-text="$t('global.table.emptySearchMessage')"
61828dda9bSDerick Montague            :filter="searchFilter"
6241057853SKenneth Fullbright            :busy="isBusy"
63d7cd12c2SNikhil Ashoka            @filtered="onFiltered"
6441057853SKenneth Fullbright            @row-selected="onRowSelected($event, filteredTableItems.length)"
65828dda9bSDerick Montague          >
66828dda9bSDerick Montague            <!-- Checkbox column -->
67828dda9bSDerick Montague            <template #head(checkbox)>
68828dda9bSDerick Montague              <b-form-checkbox
69828dda9bSDerick Montague                v-model="tableHeaderCheckboxModel"
70828dda9bSDerick Montague                :indeterminate="tableHeaderCheckboxIndeterminate"
71828dda9bSDerick Montague                @change="onChangeHeaderCheckbox($refs.table)"
72828dda9bSDerick Montague              >
73828dda9bSDerick Montague                <span class="sr-only">{{ $t('global.table.selectAll') }}</span>
74828dda9bSDerick Montague              </b-form-checkbox>
75828dda9bSDerick Montague            </template>
76828dda9bSDerick Montague            <template #cell(checkbox)="row">
77828dda9bSDerick Montague              <b-form-checkbox
78828dda9bSDerick Montague                v-model="row.rowSelected"
79828dda9bSDerick Montague                @change="toggleSelectRow($refs.table, row.index)"
80828dda9bSDerick Montague              >
81828dda9bSDerick Montague                <span class="sr-only">{{ $t('global.table.selectItem') }}</span>
82828dda9bSDerick Montague              </b-form-checkbox>
83828dda9bSDerick Montague            </template>
84828dda9bSDerick Montague
85828dda9bSDerick Montague            <!-- Date and Time column -->
86828dda9bSDerick Montague            <template #cell(dateTime)="{ value }">
87de23ea23SSurya V              <p class="mb-0">{{ $filters.formatDate(value) }}</p>
88de23ea23SSurya V              <p class="mb-0">{{ $filters.formatTime(value) }}</p>
89828dda9bSDerick Montague            </template>
90828dda9bSDerick Montague
91828dda9bSDerick Montague            <!-- Size column -->
92828dda9bSDerick Montague            <template #cell(size)="{ value }">
93828dda9bSDerick Montague              {{ convertBytesToMegabytes(value) }} MB
94828dda9bSDerick Montague            </template>
95828dda9bSDerick Montague
96828dda9bSDerick Montague            <!-- Actions column -->
97828dda9bSDerick Montague            <template #cell(actions)="row">
98828dda9bSDerick Montague              <table-row-action
99828dda9bSDerick Montague                v-for="(action, index) in row.item.actions"
100828dda9bSDerick Montague                :key="index"
101828dda9bSDerick Montague                :value="action.value"
102828dda9bSDerick Montague                :title="action.title"
103828dda9bSDerick Montague                :download-location="row.item.data"
104828dda9bSDerick Montague                :export-name="exportFileName(row)"
105828dda9bSDerick Montague                @click-table-action="onTableRowAction($event, row.item)"
106828dda9bSDerick Montague              >
107828dda9bSDerick Montague                <template #icon>
108828dda9bSDerick Montague                  <icon-download v-if="action.value === 'download'" />
109828dda9bSDerick Montague                  <icon-delete v-if="action.value === 'delete'" />
110828dda9bSDerick Montague                </template>
111828dda9bSDerick Montague              </table-row-action>
112828dda9bSDerick Montague            </template>
113828dda9bSDerick Montague          </b-table>
114828dda9bSDerick Montague        </page-section>
115828dda9bSDerick Montague      </b-col>
116828dda9bSDerick Montague    </b-row>
117f7000cd6SSukanya Pandey    <!-- Table pagination -->
118f7000cd6SSukanya Pandey    <b-row>
119f7000cd6SSukanya Pandey      <b-col sm="6" xl="5">
120f7000cd6SSukanya Pandey        <b-form-group
121f7000cd6SSukanya Pandey          class="table-pagination-select"
122f7000cd6SSukanya Pandey          :label="$t('global.table.itemsPerPage')"
123f7000cd6SSukanya Pandey          label-for="pagination-items-per-page"
124f7000cd6SSukanya Pandey        >
125f7000cd6SSukanya Pandey          <b-form-select
126f7000cd6SSukanya Pandey            id="pagination-items-per-page"
127f7000cd6SSukanya Pandey            v-model="perPage"
128f7000cd6SSukanya Pandey            :options="itemsPerPageOptions"
129f7000cd6SSukanya Pandey          />
130f7000cd6SSukanya Pandey        </b-form-group>
131f7000cd6SSukanya Pandey      </b-col>
132f7000cd6SSukanya Pandey      <b-col sm="6" xl="5">
133f7000cd6SSukanya Pandey        <b-pagination
134f7000cd6SSukanya Pandey          v-model="currentPage"
135f7000cd6SSukanya Pandey          first-number
136f7000cd6SSukanya Pandey          last-number
137f7000cd6SSukanya Pandey          :per-page="perPage"
138e39b95d6SSukanya Pandey          :total-rows="getTotalRowCount()"
139f7000cd6SSukanya Pandey          aria-controls="table-dump-entries"
140f7000cd6SSukanya Pandey        />
141f7000cd6SSukanya Pandey      </b-col>
142f7000cd6SSukanya Pandey    </b-row>
143828dda9bSDerick Montague  </b-container>
144828dda9bSDerick Montague</template>
145828dda9bSDerick Montague
146828dda9bSDerick Montague<script>
147828dda9bSDerick Montagueimport IconDelete from '@carbon/icons-vue/es/trash-can/20';
148828dda9bSDerick Montagueimport IconDownload from '@carbon/icons-vue/es/download/20';
149828dda9bSDerick Montagueimport DumpsForm from './DumpsForm';
150828dda9bSDerick Montagueimport PageSection from '@/components/Global/PageSection';
151828dda9bSDerick Montagueimport PageTitle from '@/components/Global/PageTitle';
152828dda9bSDerick Montagueimport Search from '@/components/Global/Search';
153828dda9bSDerick Montagueimport TableCellCount from '@/components/Global/TableCellCount';
154828dda9bSDerick Montagueimport TableDateFilter from '@/components/Global/TableDateFilter';
155828dda9bSDerick Montagueimport TableRowAction from '@/components/Global/TableRowAction';
156828dda9bSDerick Montagueimport TableToolbar from '@/components/Global/TableToolbar';
157828dda9bSDerick Montagueimport BVTableSelectableMixin, {
158828dda9bSDerick Montague  selectedRows,
159828dda9bSDerick Montague  tableHeaderCheckboxModel,
160828dda9bSDerick Montague  tableHeaderCheckboxIndeterminate,
161828dda9bSDerick Montague} from '@/components/Mixins/BVTableSelectableMixin';
162828dda9bSDerick Montagueimport BVToastMixin from '@/components/Mixins/BVToastMixin';
163f7000cd6SSukanya Pandeyimport BVPaginationMixin, {
164f7000cd6SSukanya Pandey  currentPage,
165f7000cd6SSukanya Pandey  perPage,
166f7000cd6SSukanya Pandey  itemsPerPageOptions,
167f7000cd6SSukanya Pandey} from '@/components/Mixins/BVPaginationMixin';
168828dda9bSDerick Montagueimport LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
169828dda9bSDerick Montagueimport SearchFilterMixin, {
170828dda9bSDerick Montague  searchFilter,
171828dda9bSDerick Montague} from '@/components/Mixins/SearchFilterMixin';
172e39b95d6SSukanya Pandeyimport TableFilter from '@/components/Global/TableFilter';
173828dda9bSDerick Montagueimport TableFilterMixin from '@/components/Mixins/TableFilterMixin';
174de23ea23SSurya Vimport i18n from '@/i18n';
175*6e53b14bSPaul Fertserimport { useI18n } from 'vue-i18n';
176828dda9bSDerick Montague
177828dda9bSDerick Montagueexport default {
178828dda9bSDerick Montague  components: {
179828dda9bSDerick Montague    DumpsForm,
180828dda9bSDerick Montague    IconDelete,
181828dda9bSDerick Montague    IconDownload,
182828dda9bSDerick Montague    PageSection,
183828dda9bSDerick Montague    PageTitle,
184828dda9bSDerick Montague    Search,
185828dda9bSDerick Montague    TableCellCount,
186828dda9bSDerick Montague    TableDateFilter,
187828dda9bSDerick Montague    TableRowAction,
188828dda9bSDerick Montague    TableToolbar,
189e39b95d6SSukanya Pandey    TableFilter,
190828dda9bSDerick Montague  },
191828dda9bSDerick Montague  mixins: [
192828dda9bSDerick Montague    BVTableSelectableMixin,
193828dda9bSDerick Montague    BVToastMixin,
194f7000cd6SSukanya Pandey    BVPaginationMixin,
195828dda9bSDerick Montague    LoadingBarMixin,
196828dda9bSDerick Montague    SearchFilterMixin,
197828dda9bSDerick Montague    TableFilterMixin,
198828dda9bSDerick Montague  ],
199828dda9bSDerick Montague  beforeRouteLeave(to, from, next) {
200828dda9bSDerick Montague    // Hide loader if the user navigates to another page
201828dda9bSDerick Montague    // before request is fulfilled.
202828dda9bSDerick Montague    this.hideLoader();
203828dda9bSDerick Montague    next();
204828dda9bSDerick Montague  },
205828dda9bSDerick Montague  data() {
206828dda9bSDerick Montague    return {
207*6e53b14bSPaul Fertser      $t: useI18n().t,
20841057853SKenneth Fullbright      isBusy: true,
209828dda9bSDerick Montague      fields: [
210828dda9bSDerick Montague        {
211828dda9bSDerick Montague          key: 'checkbox',
212828dda9bSDerick Montague          sortable: false,
213828dda9bSDerick Montague        },
214828dda9bSDerick Montague        {
215828dda9bSDerick Montague          key: 'dateTime',
216de23ea23SSurya V          label: i18n.global.t('pageDumps.table.dateAndTime'),
217828dda9bSDerick Montague          sortable: true,
218828dda9bSDerick Montague        },
219828dda9bSDerick Montague        {
220828dda9bSDerick Montague          key: 'dumpType',
221de23ea23SSurya V          label: i18n.global.t('pageDumps.table.dumpType'),
222828dda9bSDerick Montague          sortable: true,
223828dda9bSDerick Montague        },
224828dda9bSDerick Montague        {
225828dda9bSDerick Montague          key: 'id',
226de23ea23SSurya V          label: i18n.global.t('pageDumps.table.id'),
227828dda9bSDerick Montague          sortable: true,
228828dda9bSDerick Montague        },
229828dda9bSDerick Montague        {
230828dda9bSDerick Montague          key: 'size',
231de23ea23SSurya V          label: i18n.global.t('pageDumps.table.size'),
232828dda9bSDerick Montague          sortable: true,
233828dda9bSDerick Montague        },
234828dda9bSDerick Montague        {
235828dda9bSDerick Montague          key: 'actions',
236828dda9bSDerick Montague          sortable: false,
237828dda9bSDerick Montague          label: '',
238828dda9bSDerick Montague          tdClass: 'text-right text-nowrap',
239828dda9bSDerick Montague        },
240828dda9bSDerick Montague      ],
241828dda9bSDerick Montague      batchActions: [
242828dda9bSDerick Montague        {
243828dda9bSDerick Montague          value: 'delete',
244de23ea23SSurya V          label: i18n.global.t('global.action.delete'),
245828dda9bSDerick Montague        },
246828dda9bSDerick Montague      ],
247e39b95d6SSukanya Pandey      tableFilters: [
248e39b95d6SSukanya Pandey        {
249e39b95d6SSukanya Pandey          key: 'dumpType',
250de23ea23SSurya V          label: i18n.global.t('pageDumps.table.dumpType'),
251e39b95d6SSukanya Pandey          values: [
252e39b95d6SSukanya Pandey            'BMC Dump Entry',
253e39b95d6SSukanya Pandey            'Hostboot Dump Entry',
254e39b95d6SSukanya Pandey            'Resource Dump Entry',
255e39b95d6SSukanya Pandey            'System Dump Entry',
256e39b95d6SSukanya Pandey          ],
257e39b95d6SSukanya Pandey        },
258e39b95d6SSukanya Pandey      ],
259e39b95d6SSukanya Pandey      activeFilters: [],
260f7000cd6SSukanya Pandey      currentPage: currentPage,
261828dda9bSDerick Montague      filterEndDate: null,
262828dda9bSDerick Montague      filterStartDate: null,
263f7000cd6SSukanya Pandey      itemsPerPageOptions: itemsPerPageOptions,
264f7000cd6SSukanya Pandey      perPage: perPage,
265828dda9bSDerick Montague      searchFilter,
266e39b95d6SSukanya Pandey      searchTotalFilteredRows: 0,
267828dda9bSDerick Montague      selectedRows,
268828dda9bSDerick Montague      tableHeaderCheckboxIndeterminate,
269828dda9bSDerick Montague      tableHeaderCheckboxModel,
270828dda9bSDerick Montague    };
271828dda9bSDerick Montague  },
272828dda9bSDerick Montague  computed: {
273e39b95d6SSukanya Pandey    filteredRows() {
274e39b95d6SSukanya Pandey      return this.searchFilter
275e39b95d6SSukanya Pandey        ? this.searchTotalFilteredRows
276e39b95d6SSukanya Pandey        : this.filteredDumps.length;
277828dda9bSDerick Montague    },
278e39b95d6SSukanya Pandey    allDumps() {
279e39b95d6SSukanya Pandey      return this.$store.getters['dumps/allDumps'].map((item) => {
280828dda9bSDerick Montague        return {
281828dda9bSDerick Montague          ...item,
282828dda9bSDerick Montague          actions: [
283828dda9bSDerick Montague            {
284828dda9bSDerick Montague              value: 'download',
285de23ea23SSurya V              title: i18n.global.t('global.action.download'),
286828dda9bSDerick Montague            },
287828dda9bSDerick Montague            {
288828dda9bSDerick Montague              value: 'delete',
289de23ea23SSurya V              title: i18n.global.t('global.action.delete'),
290828dda9bSDerick Montague            },
291828dda9bSDerick Montague          ],
292828dda9bSDerick Montague        };
293828dda9bSDerick Montague      });
294828dda9bSDerick Montague    },
295e39b95d6SSukanya Pandey    filteredDumpsByDate() {
296828dda9bSDerick Montague      return this.getFilteredTableDataByDate(
297e39b95d6SSukanya Pandey        this.allDumps,
298828dda9bSDerick Montague        this.filterStartDate,
299828dda9bSDerick Montague        this.filterEndDate,
3008132399cSEd Tanous        'dateTime',
301828dda9bSDerick Montague      );
302828dda9bSDerick Montague    },
303e39b95d6SSukanya Pandey    filteredDumps() {
304e39b95d6SSukanya Pandey      return this.getFilteredTableData(
305e39b95d6SSukanya Pandey        this.filteredDumpsByDate,
3068132399cSEd Tanous        this.activeFilters,
307e39b95d6SSukanya Pandey      );
308828dda9bSDerick Montague    },
309828dda9bSDerick Montague  },
310828dda9bSDerick Montague  created() {
311828dda9bSDerick Montague    this.startLoader();
312210b1276SKees Trommel    this.$store.dispatch('dumps/getAllDumps').finally(() => {
31341057853SKenneth Fullbright      this.endLoader();
31441057853SKenneth Fullbright      this.isBusy = false;
31541057853SKenneth Fullbright    });
316828dda9bSDerick Montague  },
317828dda9bSDerick Montague  methods: {
318828dda9bSDerick Montague    convertBytesToMegabytes(bytes) {
319828dda9bSDerick Montague      return parseFloat((bytes / 1000000).toFixed(3));
320828dda9bSDerick Montague    },
321e39b95d6SSukanya Pandey    onFilterChange({ activeFilters }) {
322e39b95d6SSukanya Pandey      this.activeFilters = activeFilters;
323e39b95d6SSukanya Pandey    },
324e39b95d6SSukanya Pandey    onFiltered(filteredItems) {
325e39b95d6SSukanya Pandey      this.searchTotalFilteredRows = filteredItems.length;
326828dda9bSDerick Montague    },
327828dda9bSDerick Montague    onChangeDateTimeFilter({ fromDate, toDate }) {
328828dda9bSDerick Montague      this.filterStartDate = fromDate;
329828dda9bSDerick Montague      this.filterEndDate = toDate;
330828dda9bSDerick Montague    },
331828dda9bSDerick Montague    onTableRowAction(action, dump) {
332828dda9bSDerick Montague      if (action === 'delete') {
333828dda9bSDerick Montague        this.$bvModal
334de23ea23SSurya V          .msgBoxConfirm(
335de23ea23SSurya V            i18n.global.t('pageDumps.modal.deleteDumpConfirmation'),
336de23ea23SSurya V            {
337de23ea23SSurya V              title: i18n.global.t('pageDumps.modal.deleteDump'),
338de23ea23SSurya V              okTitle: i18n.global.t('pageDumps.modal.deleteDump'),
339de23ea23SSurya V              cancelTitle: i18n.global.t('global.action.cancel'),
340d1ef18e6SPaul Fertser              autoFocusButton: 'ok',
341de23ea23SSurya V            },
342de23ea23SSurya V          )
343828dda9bSDerick Montague          .then((deleteConfrimed) => {
344828dda9bSDerick Montague            if (deleteConfrimed) {
345828dda9bSDerick Montague              this.$store
346828dda9bSDerick Montague                .dispatch('dumps/deleteDumps', [dump])
347828dda9bSDerick Montague                .then((messages) => {
348828dda9bSDerick Montague                  messages.forEach(({ type, message }) => {
349828dda9bSDerick Montague                    if (type === 'success') {
350828dda9bSDerick Montague                      this.successToast(message);
351828dda9bSDerick Montague                    } else if (type === 'error') {
352828dda9bSDerick Montague                      this.errorToast(message);
353828dda9bSDerick Montague                    }
354828dda9bSDerick Montague                  });
355828dda9bSDerick Montague                });
356828dda9bSDerick Montague            }
357828dda9bSDerick Montague          });
358828dda9bSDerick Montague      }
359828dda9bSDerick Montague    },
360828dda9bSDerick Montague    onTableBatchAction(action) {
361828dda9bSDerick Montague      if (action === 'delete') {
362828dda9bSDerick Montague        this.$bvModal
363828dda9bSDerick Montague          .msgBoxConfirm(
364de23ea23SSurya V            i18n.global.t(
365828dda9bSDerick Montague              'pageDumps.modal.deleteDumpConfirmation',
3668132399cSEd Tanous              this.selectedRows.length,
367828dda9bSDerick Montague            ),
368828dda9bSDerick Montague            {
369de23ea23SSurya V              title: i18n.global.t(
370828dda9bSDerick Montague                'pageDumps.modal.deleteDump',
3718132399cSEd Tanous                this.selectedRows.length,
372828dda9bSDerick Montague              ),
373de23ea23SSurya V              okTitle: i18n.global.t(
374828dda9bSDerick Montague                'pageDumps.modal.deleteDump',
3758132399cSEd Tanous                this.selectedRows.length,
376828dda9bSDerick Montague              ),
377de23ea23SSurya V              cancelTitle: i18n.global.t('global.action.cancel'),
378d1ef18e6SPaul Fertser              autoFocusButton: 'ok',
3798132399cSEd Tanous            },
380828dda9bSDerick Montague          )
381828dda9bSDerick Montague          .then((deleteConfrimed) => {
382828dda9bSDerick Montague            if (deleteConfrimed) {
383828dda9bSDerick Montague              if (this.selectedRows.length === this.dumps.length) {
384828dda9bSDerick Montague                this.$store
385828dda9bSDerick Montague                  .dispatch('dumps/deleteAllDumps')
386828dda9bSDerick Montague                  .then((success) => this.successToast(success))
387828dda9bSDerick Montague                  .catch(({ message }) => this.errorToast(message));
388828dda9bSDerick Montague              } else {
389828dda9bSDerick Montague                this.$store
390828dda9bSDerick Montague                  .dispatch('dumps/deleteDumps', this.selectedRows)
391828dda9bSDerick Montague                  .then((messages) => {
392828dda9bSDerick Montague                    messages.forEach(({ type, message }) => {
393828dda9bSDerick Montague                      if (type === 'success') {
394828dda9bSDerick Montague                        this.successToast(message);
395828dda9bSDerick Montague                      } else if (type === 'error') {
396828dda9bSDerick Montague                        this.errorToast(message);
397828dda9bSDerick Montague                      }
398828dda9bSDerick Montague                    });
399828dda9bSDerick Montague                  });
400828dda9bSDerick Montague              }
401828dda9bSDerick Montague            }
402828dda9bSDerick Montague          });
403828dda9bSDerick Montague      }
404828dda9bSDerick Montague    },
405828dda9bSDerick Montague    exportFileName(row) {
406cc79a531SGunnar Mills      let filename = row.item.dumpType + '_' + row.item.id + '.tar.xz';
407828dda9bSDerick Montague      filename = filename.replace(RegExp(' ', 'g'), '_');
408828dda9bSDerick Montague      return filename;
409828dda9bSDerick Montague    },
410828dda9bSDerick Montague  },
411828dda9bSDerick Montague};
412828dda9bSDerick Montague</script>
413