diff --git a/medusa/history.py b/medusa/history.py index dc190b62fd..f733cbfe8b 100644 --- a/medusa/history.py +++ b/medusa/history.py @@ -19,9 +19,10 @@ from __future__ import unicode_literals import datetime +from os.path import basename -from medusa import db -from medusa.common import FAILED, SNATCHED, SUBTITLED +from medusa import db, ws +from medusa.common import FAILED, SNATCHED, SUBTITLED, statusStrings from medusa.schedulers.download_handler import ClientStatusEnum as ClientStatus from medusa.show.history import History @@ -80,6 +81,26 @@ def _log_history_item(action, ep_obj, resource=None, provider=None, proper_tags= version, proper_tags, manually_searched, info_hash, size, provider_type, client_status, part_of_batch]) + # Update the history page in frontend. + ws.Message('historyUpdate', { + 'status': action, + 'statusName': statusStrings.get(action), + 'actionDate': log_date, + 'quality': ep_obj.quality, + 'resource': basename(resource), + 'size': size, + 'properTags': proper_tags, + 'season': ep_obj.season, + 'episode': ep_obj.episode, + 'manuallySearched': manually_searched, + 'infoHash': info_hash, + 'provider': provider, + 'size': size, + 'providerType': provider_type, + 'clientStatus': client_status, + 'partOfBatch': part_of_batch + }).push() + def log_snatch(search_result): """ diff --git a/medusa/server/api/v2/base.py b/medusa/server/api/v2/base.py index 89322c8b55..713d87c1dc 100644 --- a/medusa/server/api/v2/base.py +++ b/medusa/server/api/v2/base.py @@ -327,14 +327,14 @@ def _get_limit(self, default=20, maximum=1000): except ValueError: self._raise_bad_request_error('Invalid limit parameter') - def _paginate(self, data=None, data_generator=None, sort=None): + def _paginate(self, data=None, data_generator=None, sort=None, headers={}): arg_page = self._get_page() arg_limit = self._get_limit() - headers = { + headers.update({ 'X-Pagination-Page': arg_page, 'X-Pagination-Limit': arg_limit - } + }) first_page = arg_page if arg_page > 0 else 1 previous_page = None if arg_page <= 1 else arg_page - 1 diff --git a/medusa/server/api/v2/config.py b/medusa/server/api/v2/config.py index 3f2b59acb2..d3b81f74ec 100644 --- a/medusa/server/api/v2/config.py +++ b/medusa/server/api/v2/config.py @@ -29,6 +29,7 @@ generate_show_queue, ) from medusa.sbdatetime import date_presets, time_presets +from medusa.schedulers.download_handler import status_strings from medusa.schedulers.utils import generate_schedulers from medusa.server.api.v2.base import ( BaseRequestHandler, @@ -774,6 +775,10 @@ def make_quality(value, name, key=None): ) ] + section_data['clientStatuses'] = [ + {'value': k.value, 'name': v} for k, v in status_strings.items() + ] + # Save it for next time cls._generated_data_consts = section_data diff --git a/medusa/server/api/v2/history.py b/medusa/server/api/v2/history.py index be867cacce..ed4cdb06a5 100644 --- a/medusa/server/api/v2/history.py +++ b/medusa/server/api/v2/history.py @@ -2,14 +2,16 @@ """Request handler for alias (scene exceptions).""" from __future__ import unicode_literals +import json from os.path import basename from medusa import db from medusa.common import DOWNLOADED, FAILED, SNATCHED, SUBTITLED, statusStrings +from medusa.indexers.utils import indexer_id_to_name from medusa.providers.generic_provider import GenericProvider from medusa.schedulers.download_handler import ClientStatus from medusa.server.api.v2.base import BaseRequestHandler -from medusa.tv.series import SeriesIdentifier +from medusa.tv.series import Series, SeriesIdentifier class HistoryHandler(BaseRequestHandler): @@ -41,18 +43,99 @@ def get(self, series_slug, path_param): arg_page = self._get_page() arg_limit = self._get_limit(default=50) + compact_layout = bool(self.get_argument('compact', default=False)) + return_last = bool(self.get_argument('last', default=False)) + total_rows = self.get_argument('total', default=None) + sort = [json.loads(item) for item in self.get_arguments('sort[]')] + filter = json.loads(self.get_argument('filter')) if self.get_arguments('filter') else None + + headers = {} + + if return_last: + # Return the last history row + results = db.DBConnection().select('select * from history ORDER BY date DESC LIMIT 1') + if not results: + return self._not_found('History data not found') + return self._ok(data=results[0]) + + where = [] if series_slug is not None: series_identifier = SeriesIdentifier.from_slug(series_slug) if not series_identifier: return self._bad_request('Invalid series') - sql_base += ' WHERE indexer_id = ? AND showid = ?' + where += ['indexer_id', 'showid'] params += [series_identifier.indexer.id, series_identifier.id] - sql_base += ' ORDER BY date DESC' + field_map = { + 'actiondate': 'date', + 'date': 'date', + 'action': 'action', + 'statusname': 'action', + 'provider.id': 'provider', + 'clientstatus': 'client_status', + 'size': 'size', + 'quality': 'quality' + } + + # Prepare an operator (> or <) and size, for the size query. + size_operator = None + size = None + provider = None + + if filter is not None and filter.get('columnFilters'): + size = filter['columnFilters'].pop('size', None) + provider = filter['columnFilters'].pop('provider.id', None) + + if size: + size_operator, size = size.split(' ') + + for filter_field, filter_value in filter['columnFilters'].items(): + # Loop through each column filter apply the mapping, and add to sql_base. + filter_field = field_map.get(filter_field.lower()) + if not filter_field or not filter_value: + continue + where += [filter_field] + params += [filter_value] + + if where: + sql_base += ' WHERE ' + ' AND '.join(f'{item} = ?' for item in where) + + # Add size query (with operator) + if size_operator and size: + sql_base += f' {"AND" if where else "WHERE"} size {size_operator} ?' + params.append(int(size) * 1024 * 1024) + + # Add provider with like %provider% + if provider: + sql_base += f' {"AND" if where else "WHERE"} provider LIKE ?' + params.append(f'%%{provider}%%') + + if sort is not None and len(sort) == 1: # Only support one sort column right now. + field = sort[0].get('field').lower() + order = sort[0].get('type') + if field_map.get(field): + sql_base += f' ORDER BY {field_map[field]} {order} ' + + if total_rows: + sql_base += ' LIMIT ?' + params += [total_rows] + results = db.DBConnection().select(sql_base, params) + if compact_layout: + from collections import OrderedDict + res = OrderedDict() + + for item in results: + if item.get('showid') and item.get('season') and item.get('episode') and item.get('indexer_id'): + item['showslug'] = f"{indexer_id_to_name(item['indexer_id'])}{item['showid']}" + my_key = f"{item['showslug']}S{item['season']}E{item['episode']}" + res.setdefault(my_key, []).append(item) + results = res + headers['X-Pagination-Count'] = len(results) + def data_generator(): """Read and paginate history records.""" start = arg_limit * (arg_page - 1) @@ -65,6 +148,8 @@ def data_generator(): subtitle_language = None show_slug = None client_status = None + show_slug = None + show_title = 'Missing Show' if item['action'] in (SNATCHED, FAILED): provider.update({ @@ -79,9 +164,7 @@ def data_generator(): if item['action'] == SUBTITLED: subtitle_language = item['resource'] - - if item['action'] == SUBTITLED: - subtitle_language = item['resource'] + provider['name'] = item['provider'] if item['client_status'] is not None: status = ClientStatus(status=item['client_status']) @@ -91,7 +174,15 @@ def data_generator(): } if item['indexer_id'] and item['showid']: - show_slug = SeriesIdentifier.from_id(item['indexer_id'], item['showid']).slug + identifier = SeriesIdentifier.from_id(item['indexer_id'], item['showid']) + show_slug = identifier.slug + show = Series.find_by_identifier(identifier) + if show: + show_title = show.title + + item['episodeTitle'] = '{0} - s{1:02d}e{2:02d}'.format( + show_title, item['season'], item['episode'] + ) yield { 'id': item['rowid'], @@ -105,6 +196,7 @@ def data_generator(): 'properTags': item['proper_tags'], 'season': item['season'], 'episode': item['episode'], + 'episodeTitle': item['episodeTitle'], 'manuallySearched': bool(item['manually_searched']), 'infoHash': item['info_hash'], 'provider': provider, @@ -112,15 +204,90 @@ def data_generator(): 'releaseGroup': release_group, 'fileName': file_name, 'subtitleLanguage': subtitle_language, + 'showSlug': show_slug, + 'showTitle': show_title, 'providerType': item['provider_type'], 'clientStatus': client_status, 'partOfBatch': bool(item['part_of_batch']) } - if not results: - return self._not_found('History data not found') + def data_generator_compact(): + """ + Read and paginate history records. + + Results are provided grouped per showid+season+episode. + The results are flattened into a structure of [{'actionDate': .., 'showSlug':.., 'rows':Array(history_items)},] + """ + start = arg_limit * (arg_page - 1) + + for compact_item in list(results.values())[start:start + arg_limit]: + return_item = {'rows': []} + for item in compact_item: + provider = {} + release_group = None + release_name = None + file_name = None + subtitle_language = None + + if item['action'] in (SNATCHED, FAILED): + provider.update({ + 'id': GenericProvider.make_id(item['provider']), + 'name': item['provider'] + }) + release_name = item['resource'] + + if item['action'] == DOWNLOADED: + release_group = item['provider'] + file_name = item['resource'] + + if item['action'] == SUBTITLED: + subtitle_language = item['resource'] + provider['name'] = item['provider'] + + item['showSlug'] = None + item['showTitle'] = 'Missing Show' + if item['indexer_id'] and item['showid']: + identifier = SeriesIdentifier.from_id(item['indexer_id'], item['showid']) + item['showSlug'] = identifier.slug + show = Series.find_by_identifier(identifier) + if show: + item['showTitle'] = show.title + + return_item['actionDate'] = item['date'] + return_item['showSlug'] = item['showslug'] + return_item['episodeTitle'] = '{0} - s{1:02d}e{2:02d}'.format( + item['showTitle'], item['season'], item['episode'] + ) + return_item['quality'] = item['quality'] + + return_item['rows'].append({ + 'actionDate': item['date'], + 'id': item['rowid'], + 'series': item['showSlug'], + 'status': item['action'], + 'statusName': statusStrings.get(item['action']), + 'quality': item['quality'], + 'resource': basename(item['resource']), + 'size': item['size'], + 'properTags': item['proper_tags'], + 'season': item['season'], + 'episode': item['episode'], + 'manuallySearched': bool(item['manually_searched']), + 'infoHash': item['info_hash'], + 'provider': provider, + 'release_name': release_name, + 'releaseGroup': release_group, + 'fileName': file_name, + 'subtitleLanguage': subtitle_language, + 'showSlug': item['showslug'], + 'showTitle': item['showTitle'] + }) + yield return_item + + if compact_layout: + return self._paginate(data_generator=data_generator_compact, headers=headers) - return self._paginate(data_generator=data_generator) + return self._paginate(data_generator=data_generator, headers=headers) def delete(self, identifier, **kwargs): """Delete a history record.""" diff --git a/medusa/server/web/core/history.py b/medusa/server/web/core/history.py index c6443da6c7..97b478218c 100644 --- a/medusa/server/web/core/history.py +++ b/medusa/server/web/core/history.py @@ -2,8 +2,7 @@ from __future__ import unicode_literals -from medusa import app, ui -from medusa.helper.common import try_int +from medusa import ui from medusa.server.web.core.base import PageTemplate, WebRoot from medusa.show.history import History as HistoryTool @@ -17,24 +16,14 @@ def __init__(self, *args, **kwargs): self.history = HistoryTool() - def index(self, limit=None): - if limit is None: - if app.HISTORY_LIMIT: - limit = int(app.HISTORY_LIMIT) - else: - limit = 100 - else: - limit = try_int(limit, 100) - - app.HISTORY_LIMIT = limit - - app.instance.save_config() - - history = self.history.get(limit) + def index(self): + """ + Render the history page. - t = PageTemplate(rh=self, filename='history.mako') - return t.render(historyResults=history.detailed, compactResults=history.compact, limit=limit, - controller='history', action='index') + [Converted to VueRouter] + """ + t = PageTemplate(rh=self, filename='index.mako') + return t.render() def clearHistory(self): # @TODO: Replace this with DELETE /api/v2/history diff --git a/medusa/show/history.py b/medusa/show/history.py index 03ff7cef1b..d59752b3eb 100644 --- a/medusa/show/history.py +++ b/medusa/show/history.py @@ -44,7 +44,7 @@ def clear(self): 'WHERE 1 = 1' ) - def get(self, limit=100, action=None): + def get(self, limit=100, action=None, show_obj=None): """ :param limit: The maximum number of elements to return :param action: The type of action to filter in the history. Either 'downloaded' or 'snatched'. Anything else or @@ -69,11 +69,16 @@ def get(self, limit=100, action=None): filter_sql = 'AND action = ? ' order_sql = 'ORDER BY date DESC ' + show_params = [] + if show_obj: + filter_sql += 'AND s.showid = ? AND s.indexer_id = ?' + show_params += [show_obj.series_id, show_obj.indexer] + if parsed_action: sql_results = self.db.select(common_sql + filter_sql + order_sql, - [parsed_action]) + [parsed_action] + show_params) else: - sql_results = self.db.select(common_sql + order_sql) + sql_results = self.db.select(common_sql + order_sql, show_params) detailed = [] compact = dict() diff --git a/tests/apiv2/test_config.py b/tests/apiv2/test_config.py index 78704610e4..e70e9fe7c9 100644 --- a/tests/apiv2/test_config.py +++ b/tests/apiv2/test_config.py @@ -237,6 +237,7 @@ def gen_schema(data): 'presets': [{'value': 65518, 'key': 'any', 'name': 'ANY'}], }, 'statuses': [{'value': 3, 'key': 'wanted', 'name': 'Wanted'}], + 'clientStatuses': [{'name': 'Snatched', 'value': 0}], }) url = create_url('/config/consts') diff --git a/themes-default/slim/package.json b/themes-default/slim/package.json index 248952b4e2..df5c73417c 100644 --- a/themes-default/slim/package.json +++ b/themes-default/slim/package.json @@ -49,7 +49,7 @@ "vue-async-computed": "3.9.0", "vue-cookies": "1.7.4", "vue-form-wizard": "0.8.4", - "vue-good-table": "p0psicles/vue-good-table#34c34e7bf4818ad0a873a9d83e32a755657b62f1", + "vue-good-table": "p0psicles/vue-good-table#254e1f3c5274e52c019d104396549037fbea19c8", "vue-images-loaded": "1.1.2", "vue-js-modal": "2.0.0-rc.6", "vue-js-toggle-button": "1.3.3", diff --git a/themes-default/slim/src/components/app-header.vue b/themes-default/slim/src/components/app-header.vue index bdca690b13..9a62383044 100644 --- a/themes-default/slim/src/components/app-header.vue +++ b/themes-default/slim/src/components/app-header.vue @@ -195,8 +195,10 @@ export default { const { target } = event; if (target.matches('#main_nav a.router-link, #main_nav a.router-link *')) { const dropdown = target.closest('.dropdown'); - dropdown.querySelector('.dropdown-toggle').setAttribute('aria-expanded', false); - dropdown.querySelector('.dropdown-menu').style.display = 'none'; + if (dropdown) { + dropdown.querySelector('.dropdown-toggle').setAttribute('aria-expanded', false); + dropdown.querySelector('.dropdown-menu').style.display = 'none'; + } // Also collapse the main nav if it's open $('#main_nav').collapse('hide'); } diff --git a/themes-default/slim/src/components/current-downloads.vue b/themes-default/slim/src/components/current-downloads.vue index 3a71a1958b..2560d0010f 100644 --- a/themes-default/slim/src/components/current-downloads.vue +++ b/themes-default/slim/src/components/current-downloads.vue @@ -63,7 +63,7 @@ {{props.formattedRow[props.column.field]}} - + diff --git a/themes-default/slim/src/components/display-show.vue b/themes-default/slim/src/components/display-show.vue index 3347e0aa67..ad7c86374d 100644 --- a/themes-default/slim/src/components/display-show.vue +++ b/themes-default/slim/src/components/display-show.vue @@ -23,7 +23,6 @@ :groupOptions="{ enabled: true, mode: 'span', - customChildObject: 'episodes' }" :pagination-options="{ enabled: layout.show.pagination.enable, @@ -71,7 +70,7 @@ @@ -202,7 +201,8 @@ }" :sort-options="{ enabled: true, - initialSortBy: getSortBy('episode', 'desc') + multipleColumns: true, + initialSortBy: getSortBy('episode', 'desc') // From mixin manage-cookie.js }" :selectOptions="{ enabled: true, @@ -233,7 +233,7 @@ @@ -788,7 +788,7 @@ export default { * @returns {string} - Human readable file size. */ addFileSize(headerRow) { - return humanFileSize(headerRow.episodes.reduce((a, b) => a + (b.file.size || 0), 0)); + return humanFileSize(headerRow.children.reduce((a, b) => a + (b.file.size || 0), 0)); }, searchSubtitle(event, episode, lang) { const { showSlug, getEpisodes, show, subtitleSearchComponents } = this; @@ -923,19 +923,19 @@ export default { * @returns {Boolean} - true if one of the seasons episodes has a status 'unaired'. */ anyEpisodeNotUnaired(season) { - return season.episodes.filter(ep => ep.status !== 'Unaired').length > 0; + return season.children.filter(ep => ep.status !== 'Unaired').length > 0; }, episodesInverse(season) { const { invertTable } = this; - if (!season.episodes) { + if (!season.children) { return []; } if (invertTable) { - return season.episodes.slice().reverse(); + return season.children.slice().reverse(); } - return season.episodes; + return season.children; }, /** * Check if the season/episode combination exists in the scene numbering. @@ -1082,7 +1082,7 @@ export default { return (episode.season !== 0 && config.subtitles.enabled && show.config.subtitlesEnabled && !['Snatched', 'Snatched (Proper)', 'Snatched (Best)', 'Downloaded'].includes(episode.status)); }, totalSeasonEpisodeSize(season) { - return season.episodes.filter(x => x.file && x.file.size > 0).reduce((a, b) => a + b.file.size, 0); + return season.children.filter(x => x.file && x.file.size > 0).reduce((a, b) => a + b.file.size, 0); }, getSeasonExceptions(season) { const { show } = this; diff --git a/themes-default/slim/src/components/history-compact.vue b/themes-default/slim/src/components/history-compact.vue new file mode 100644 index 0000000000..976dfa9247 --- /dev/null +++ b/themes-default/slim/src/components/history-compact.vue @@ -0,0 +1,272 @@ + + + diff --git a/themes-default/slim/src/components/history-detailed.vue b/themes-default/slim/src/components/history-detailed.vue new file mode 100644 index 0000000000..b2c197af71 --- /dev/null +++ b/themes-default/slim/src/components/history-detailed.vue @@ -0,0 +1,363 @@ + + + diff --git a/themes-default/slim/src/components/history-new.vue b/themes-default/slim/src/components/history-new.vue deleted file mode 100644 index 175b29e47d..0000000000 --- a/themes-default/slim/src/components/history-new.vue +++ /dev/null @@ -1,185 +0,0 @@ - - - diff --git a/themes-default/slim/src/components/history.vue b/themes-default/slim/src/components/history.vue index a4d9485f03..5ae0fd699a 100644 --- a/themes-default/slim/src/components/history.vue +++ b/themes-default/slim/src/components/history.vue @@ -1,11 +1,44 @@ + diff --git a/themes-default/slim/src/components/index.js b/themes-default/slim/src/components/index.js index eb31fe7f7e..e98ad0dde6 100644 --- a/themes-default/slim/src/components/index.js +++ b/themes-default/slim/src/components/index.js @@ -16,6 +16,8 @@ export { default as DisplayShow } from './display-show.vue'; export { default as CurrentDownloads } from './current-downloads.vue'; export { default as EditShow } from './edit-show.vue'; export { default as History } from './history.vue'; +export { default as HistoryCompact } from './history-compact.vue'; +export { default as HistoryDetailed } from './history-detailed.vue'; export { default as Home } from './home.vue'; export { default as IRC } from './irc.vue'; export { default as Login } from './login.vue'; diff --git a/themes-default/slim/src/components/show-header.vue b/themes-default/slim/src/components/show-header.vue index 8af1d4bed5..3599403911 100644 --- a/themes-default/slim/src/components/show-header.vue +++ b/themes-default/slim/src/components/show-header.vue @@ -497,7 +497,7 @@ export default { Allowed: 0 }; seasons.forEach(season => { - season.episodes.forEach(episode => { + season.children.forEach(episode => { summary[getOverviewStatus(episode.status, episode.quality, show.config.qualities)] += 1; }); }); diff --git a/themes-default/slim/src/components/snatch-selection.vue b/themes-default/slim/src/components/snatch-selection.vue index 84d3bc90e9..1eb66d7b2b 100644 --- a/themes-default/slim/src/components/snatch-selection.vue +++ b/themes-default/slim/src/components/snatch-selection.vue @@ -86,8 +86,7 @@ export default { }, methods: { ...mapActions({ - getShow: 'getShow', // Map `this.getShow()` to `this.$store.dispatch('getShow')` - getHistory: 'getHistory' + getShow: 'getShow' }), // TODO: Move this to show-results! getReleaseNameClasses(name) { diff --git a/themes-default/slim/src/global-vue-shim.js b/themes-default/slim/src/global-vue-shim.js index 0fb2df35fb..24fc4c46ab 100644 --- a/themes-default/slim/src/global-vue-shim.js +++ b/themes-default/slim/src/global-vue-shim.js @@ -25,7 +25,6 @@ import { ConfigTextboxNumber, ConfigToggleSlider, FileBrowser, - History, LanguageSelect, LoadProgressBar, PlotInfo, @@ -90,7 +89,6 @@ export const registerGlobalComponents = () => { // Add components for pages that use `pageComponent` // @TODO: These need to be converted to Vue SFCs components = components.concat([ - History, Schedule ]); diff --git a/themes-default/slim/src/router/routes.js b/themes-default/slim/src/router/routes.js index 89d3f9c108..44e3ec4f50 100644 --- a/themes-default/slim/src/router/routes.js +++ b/themes-default/slim/src/router/routes.js @@ -324,8 +324,10 @@ const historyRoute = { title: 'History', header: 'History', topMenu: 'history', - subMenu: historySubMenu - } + subMenu: historySubMenu, + converted: true + }, + component: () => import('../components/history.vue') }; /** @type {import('.').Route} */ diff --git a/themes-default/slim/src/store/index.js b/themes-default/slim/src/store/index.js index e35a4cec30..53f25b1309 100644 --- a/themes-default/slim/src/store/index.js +++ b/themes-default/slim/src/store/index.js @@ -67,6 +67,8 @@ const passToStoreHandler = function(eventName, event, next) { this.store.dispatch('updateQueueItem', data); } else if (event === 'QueueItemShowAdd') { this.store.dispatch('updateShowQueueItem', data); + } else if (event === 'historyUpdate') { + this.store.dispatch('updateHistory', data); } else { window.displayNotification('info', event, data); } diff --git a/themes-default/slim/src/store/modules/config/consts.js b/themes-default/slim/src/store/modules/config/consts.js index 5aec2892f0..dfc0c7cef1 100644 --- a/themes-default/slim/src/store/modules/config/consts.js +++ b/themes-default/slim/src/store/modules/config/consts.js @@ -14,7 +14,8 @@ const state = { anySets: [], presets: [] }, - statuses: [] + statuses: [], + clientStatuses: [] }; const mutations = { diff --git a/themes-default/slim/src/store/modules/defaults.js b/themes-default/slim/src/store/modules/defaults.js index 84396f172b..df60b9b002 100644 --- a/themes-default/slim/src/store/modules/defaults.js +++ b/themes-default/slim/src/store/modules/defaults.js @@ -93,7 +93,7 @@ const state = { // Seasons array is added to the show object under this query, // but we currently check to see if this property is defined before fetching the show with `?episodes=true`. - // seasons: [], + seasons: [], episodeCount: null }, provider: { diff --git a/themes-default/slim/src/store/modules/history.js b/themes-default/slim/src/store/modules/history.js index 7b9f31fa25..c16db35596 100644 --- a/themes-default/slim/src/store/modules/history.js +++ b/themes-default/slim/src/store/modules/history.js @@ -5,15 +5,41 @@ import { ADD_HISTORY, ADD_SHOW_HISTORY, ADD_SHOW_EPISODE_HISTORY } from '../muta import { episodeToSlug } from '../../utils/core'; const state = { - history: [], - page: 0, - episodeHistory: {} + remote: { + rows: [], + totalRows: 0, + page: 1, + perPage: 25, + sort: [{ + field: 'date', + type: 'desc' + }], + filter: null + }, + remoteCompact: { + rows: [], + totalRows: 0, + page: 1, + perPage: 25, + sort: [{ + field: 'date', + type: 'desc' + }], + filter: null + }, + episodeHistory: {}, + historyLast: null, + historyLastCompact: null, + loading: false }; const mutations = { - [ADD_HISTORY](state, history) { + [ADD_HISTORY](state, { history, compact }) { + // Only evaluate compact once. + const historyKey = compact ? 'remoteCompact' : 'remote'; + // Update state - state.history.push(...history); + Vue.set(state[historyKey], 'rows', history); }, [ADD_SHOW_HISTORY](state, { showSlug, history }) { // Add history data to episodeHistory, but without passing the show slug. @@ -39,6 +65,12 @@ const mutations = { } Vue.set(state.episodeHistory[showSlug], episodeSlug, history); + }, + setLoading(state, value) { + state.loading = value; + }, + setRemoteTotal(state, { total, compact = false }) { + state[compact ? 'remoteCompact' : 'remote'].totalRows = total; } }; @@ -100,51 +132,64 @@ const actions = { } }, /** - * Get history from API and commit them to the store. + * Get detailed history from API and commit them to the store. * * @param {*} context - The store context. - * @param {string} showSlug Slug for the show to get. If not provided, gets the first 1k shows. - * @returns {undefined|Promise} undefined if `shows` was provided or the API response if not. + * @param {object} args - arguments. */ - async getHistory(context, showSlug) { - const { commit, state } = context; - const limit = 1000; - const params = { limit }; + async getHistory(context, args) { + const { commit } = context; let url = '/history'; + const page = args ? args.page : 1; + const limit = args ? args.perPage : 1000; + let sort = args ? args.sort : [{ field: 'date', type: 'desc' }]; + const filter = args ? args.filter : {}; + const showSlug = args ? args.showSlug : undefined; + const compact = args ? args.compact : undefined; + + const params = { + page, + limit + }; + + if (sort) { + if (!Array.isArray(sort)) { + sort = [sort]; + } + params.sort = sort; + } + + if (filter) { + params.filter = filter; + } if (showSlug) { url = `${url}/${showSlug}`; } - let lastPage = false; - while (!lastPage) { - let response = null; - state.page += 1; - params.page = state.page; - - try { - response = await api.get(url, { params }); // eslint-disable-line no-await-in-loop - } catch (error) { - if (error.response && error.response.status === 404) { - console.debug(`No history available${showSlug ? ' for show ' + showSlug : ''}`); - } - lastPage = true; - } + if (compact) { + params.compact = true; + } + commit('setLoading', true); + let response = null; + try { + response = await api.get(url, { params }); // eslint-disable-line no-await-in-loop if (response) { + commit('setRemoteTotal', { total: Number(response.headers['x-pagination-count']), compact }); if (showSlug) { - commit(ADD_SHOW_HISTORY, { showSlug, history: response.data }); + commit(ADD_SHOW_HISTORY, { showSlug, history: response.data, compact }); } else { - commit(ADD_HISTORY, response.data); + commit(ADD_HISTORY, { history: response.data, compact }); } - - if (response.data.length < limit) { - lastPage = true; - } - } else { - lastPage = true; + } + } catch (error) { + if (error.response && error.response.status === 404) { + console.debug(`No history available${showSlug ? ' for show ' + showSlug : ''}`); } } + + commit('setLoading', false); }, /** * Get episode history from API and commit it to the store. @@ -168,6 +213,44 @@ const actions = { console.warn(`No episode history found for show ${showSlug} and episode ${episodeSlug}`); }); }); + }, + checkHistory({ state, rootState, dispatch }) { + // Retrieve the last history item from api. + // Compare the states last history or historyCompact row. + // and get new history data. + const { layout } = rootState.config; + const params = { last: true }; + const historyParams = {}; + + if (layout.historyLimit) { + historyParams.total = layout.historyLimit; + } + + let history = []; + const compact = layout.history === 'compact'; + if (compact) { + history = state.historyCompact; + } else { + history = state.history; + } + + if (!history || history.length === 0) { + dispatch('getHistory', { compact }); + } + + api.get('/history', { params }) + .then(response => { + if (response.data && response.data.date > history[0].actionDate) { + dispatch('getHistory', { compact }); + } + }) + .catch(() => { + console.info('No history record found'); + }); + }, + updateHistory({ dispatch }) { + // Update store's search queue item. (provided through websocket) + dispatch('checkHistory', {}); } }; diff --git a/themes-default/slim/src/store/modules/shows.js b/themes-default/slim/src/store/modules/shows.js index 0477e07c9f..7b32fba965 100644 --- a/themes-default/slim/src/store/modules/shows.js +++ b/themes-default/slim/src/store/modules/shows.js @@ -101,22 +101,22 @@ const mutations = { const existingSeason = newShow.seasons.find(season => season.season === episode.season); if (existingSeason) { - const foundIndex = existingSeason.episodes.findIndex(element => element.slug === episode.slug); + const foundIndex = existingSeason.children.findIndex(element => element.slug === episode.slug); if (foundIndex === -1) { - existingSeason.episodes.push(episode); + existingSeason.children.push(episode); } else { - existingSeason.episodes.splice(foundIndex, 1, episode); + existingSeason.children.splice(foundIndex, 1, episode); } } else { const newSeason = { season: episode.season, - episodes: [], + children: [], html: false, mode: 'span', label: 1 }; newShow.seasons.push(newSeason); - newSeason.episodes.push(episode); + newSeason.children.push(episode); } }); @@ -177,7 +177,7 @@ const getters = { }, getEpisode: state => ({ showSlug, season, episode }) => { const show = state.shows.find(show => show.id.slug === showSlug); - return show && show.seasons && show.seasons.find(s => s.season === season) ? show.seasons.find(s => s.season === season).episodes.find(ep => ep.episode === episode) : undefined; + return show && show.seasons && show.seasons.find(s => s.season === season) ? show.seasons.find(s => s.season === season).children.find(ep => ep.episode === episode) : undefined; }, getCurrentShow: (state, getters, rootState) => { return state.shows.find(show => show.id.slug === state.currentShow.showSlug) || rootState.defaults.show; diff --git a/themes-default/slim/src/style/v-tooltip.css b/themes-default/slim/src/style/v-tooltip.css index e6094471f9..4e5b924fe9 100644 --- a/themes-default/slim/src/style/v-tooltip.css +++ b/themes-default/slim/src/style/v-tooltip.css @@ -9,6 +9,7 @@ .tooltip { display: block !important; + word-break: break-word; z-index: 10000; } diff --git a/themes-default/slim/src/style/vgt-table.css b/themes-default/slim/src/style/vgt-table.css index 61e5a296d5..b03057be21 100644 --- a/themes-default/slim/src/style/vgt-table.css +++ b/themes-default/slim/src/style/vgt-table.css @@ -23,6 +23,7 @@ text-align: center; border-collapse: collapse; font-weight: normal; + position: relative; } .vgt-table-styling >>> .vgt-table span.break-word { @@ -38,6 +39,31 @@ background-repeat: no-repeat; } +.vgt-table-styling >>> .vgt-table thead th.sorting.sorting-desc { + background-color: rgb(85, 85, 85); + background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7); +} + +.vgt-table-styling >>> .vgt-table thead th.sorting.sorting-asc { + background-color: rgb(85, 85, 85); + background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7); + background-position-x: right; + background-position-y: bottom; +} + +.vgt-table-styling >>> .vgt-table th.sortable button { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background: transparent; + border: none; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + .vgt-table-styling >>> .vgt-table thead th { padding: 4px; cursor: default; @@ -125,6 +151,13 @@ display: inline-block; } +/* When using collored rows (using the episode status name, Snatched, Downloaded, Failed, etc.) + * we'd like to have the text always black. +*/ +.vgt-table-styling >>> .vgt-table tr.status td > span { + color: rgb(0, 0, 0); +} + .vgt-table-styling >>> .skipped { background-color: rgb(190, 222, 237); } @@ -166,3 +199,122 @@ .vgt-table-styling >>> .global-undesired td.release span { color: orange; } + +td.col-footer { + text-align: left !important; +} + +.vgt-table-styling >>> .vgt-wrap__footer { + color: rgb(255, 255, 255); + padding: 1em; + background-color: rgb(51, 51, 51); + margin-bottom: 1em; + display: flex; + justify-content: space-between; +} + +.vgt-table-styling >>> .footer__row-count, +.vgt-table-styling >>> .footer__navigation__page-info { + display: inline; +} + +.vgt-table-styling >>> .footer__row-count__label { + margin-right: 1em; +} + +.vgt-table-styling >>> .vgt-wrap__footer .footer__navigation { + font-size: 14px; +} + +.vgt-table-styling >>> .vgt-pull-right { + float: right !important; +} + +.vgt-table-styling >>> .footer__navigation__page-btn { + display: inline-block; + padding: 4px 10px; + margin-bottom: 0; + font-size: 12px; + line-height: 16px; + vertical-align: middle; + border-radius: 1px; +} + +.vgt-table-styling >>> .footer__navigation__page-btn:hover { + text-decoration: none; + background-position: 0 -150px; + transition: background-position 0s linear; + background-image: none; +} + +.vgt-table-styling >>> .footer__navigation__page-btn.disabled { + display: none; +} + +.vgt-table-styling >>> .vgt-wrap__footer .footer__navigation__page-btn .chevron { + width: 24px; + height: 24px; + border-radius: 15%; + position: relative; + margin: 0 8px; +} + +.vgt-table-styling >>> .vgt-wrap__footer .footer__navigation__info, +.vgt-table-styling >>> .vgt-wrap__footer .footer__navigation__page-info { + display: inline-flex; + color: #909399; + margin: 0 16px; + margin-top: 0; + margin-right: 16px; + margin-bottom: 0; + margin-left: 16px; +} + +.show-history { + margin-bottom: 10px; +} + + +/* History tables */ +.status-name > svg { + margin-left: 5px; +} + +.multiselect--active { + min-width: 200px; +} + +:not(tr.status) span.episode-title a { + text-decoration: none; + color: rgb(255, 255, 255) +} + +tr.status span.episode-title a { + text-decoration: none; + color: rgb(0, 0, 0); +} + +.vgt-table-styling >>> .vgt-input { + height: 30px; + line-height: 30px; + font-size: 0.9em; + width: auto; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 3px; + padding: 5px 10px; + margin-top: 5px; +} + +.vgt-table-styling >>> .vgt-select { + height: 30px; + line-height: 30px; + font-size: 0.9em; + width: auto; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 3px; + padding: 5px 10px; +} diff --git a/themes-default/slim/static/css/dark.css b/themes-default/slim/static/css/dark.css index 8cf4ef75a0..a1b3bbbe8e 100644 --- a/themes-default/slim/static/css/dark.css +++ b/themes-default/slim/static/css/dark.css @@ -703,7 +703,6 @@ body { .vgt-table th { color: rgb(255, 255, 255); - text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3); background-color: rgb(85, 85, 85); } @@ -715,6 +714,26 @@ body { background-color: rgb(51, 51, 51); } +.footer__navigation__page-btn { + color: rgb(255, 255, 255); + text-shadow: 0 1px 1px rgb(0 0 0 / 75%); + background-image: linear-gradient(to top, rgb(85, 85, 85), rgb(51, 51, 51)); + border: 1px solid rgb(17, 17, 17); + border-color: rgb(17, 17, 17) rgb(17, 17, 17) rgb(17, 17, 17); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#297AB8', endColorstr='#15528F', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + box-shadow: inset 0 1px 0 rgb(255 255 255 / 0%), 0 1px 2px rgb(0 0 0 / 5%); +} + +.footer__navigation__page-btn:hover { + text-decoration: none; + background-color: rgb(30, 30, 30); + color: rgb(255, 255, 255); + background-position: 0 -150px; + transition: background-position 0s linear; + background-image: none; +} + /* submenu styling */ #sub-menu-container { background-color: rgb(41, 41, 41); diff --git a/themes-default/slim/static/css/style.css b/themes-default/slim/static/css/style.css index bf559670b7..26ea18112a 100644 --- a/themes-default/slim/static/css/style.css +++ b/themes-default/slim/static/css/style.css @@ -2846,7 +2846,6 @@ fieldset[disabled] .navbar-default .btn-link:focus { .vgt-table th { color: rgb(255, 255, 255); - text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3); background-color: rgb(51, 51, 51); } @@ -2900,6 +2899,28 @@ fieldset[disabled] .navbar-default .btn-link:focus { color: #333; } +.footer__navigation__page-btn { + color: rgb(51, 51, 51); + background-image: linear-gradient(to top, rgb(255, 255, 255), rgb(230, 230, 230)); + background-image: -moz-linear-gradient(top, rgb(255, 255, 255), rgb(230, 230, 230)); + border: 1px solid rgb(204, 204, 204); + background-color: rgb(245, 245, 245); + border-color: rgb(230, 230, 230) rgb(230, 230, 230) rgb(191, 191, 191); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.footer__navigation__page-btn:hover { + color: rgb(51, 51, 51); + text-decoration: none; + background-color: rgb(230, 230, 230); + background-position: 0 -15px; + transition: background-position 0.1s linear; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -ms-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; +} + .form-control { color: rgb(0, 0, 0); } @@ -4291,3 +4312,13 @@ CSS helper classes .d-block { display: block; } + +/* Style multiselect components */ +.multiselect, +.multiselect__tags, +.multiselect__input { + font-family: inherit; + font-size: 0.9em; + -ms-touch-action: manipulation; + touch-action: manipulation; +} diff --git a/themes-default/slim/yarn.lock b/themes-default/slim/yarn.lock index 2e5c585265..8c787b750d 100644 --- a/themes-default/slim/yarn.lock +++ b/themes-default/slim/yarn.lock @@ -3717,7 +3717,7 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -date-fns@2.18.0, date-fns@^2.0.0-beta.4: +date-fns@2.18.0, date-fns@^2.17.0: version "2.18.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.18.0.tgz#08e50aee300ad0d2c5e054e3f0d10d8f9cdfe09e" integrity sha512-NYyAg4wRmGVU4miKq5ivRACOODdZRY3q5WLmOJSq8djyzftYphU7dTHLcEtLqEvfqMKQ0jVv91P4BAwIjsXIcw== @@ -7495,16 +7495,6 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash.assign@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= - -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -7520,11 +7510,6 @@ lodash.difference@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= -lodash.filter@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" - integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= - lodash.flatten@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" @@ -7535,11 +7520,6 @@ lodash.flattendeep@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= -lodash.foreach@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" - integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= - lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -11665,18 +11645,13 @@ vue-form-wizard@0.8.4: resolved "https://registry.yarnpkg.com/vue-form-wizard/-/vue-form-wizard-0.8.4.tgz#ddf864c9709b7ba2a6323f59e5d6d17536b7800e" integrity sha512-/Zk1+B7bz7qHFJ16mwu021lpPXWf/9Tlr2mTNG3J7M0Hdy3rgA802lWsbKYySns0B0qtsD8BYGjQ2Wyxgg+4uw== -vue-good-table@p0psicles/vue-good-table#34c34e7bf4818ad0a873a9d83e32a755657b62f1: - version "2.19.3" - resolved "https://codeload.github.com/p0psicles/vue-good-table/tar.gz/34c34e7bf4818ad0a873a9d83e32a755657b62f1" +vue-good-table@p0psicles/vue-good-table#254e1f3c5274e52c019d104396549037fbea19c8: + version "2.21.8" + resolved "https://codeload.github.com/p0psicles/vue-good-table/tar.gz/254e1f3c5274e52c019d104396549037fbea19c8" dependencies: - date-fns "^2.0.0-beta.4" + date-fns "^2.17.0" diacriticless "1.0.1" - lodash.assign "^4.2.0" - lodash.clonedeep "^4.5.0" - lodash.filter "^4.6.0" - lodash.foreach "^4.5.0" lodash.isequal "^4.5.0" - vue-select "^3.1.0" vue-hot-reload-api@^2.3.0: version "2.3.4" @@ -11770,11 +11745,6 @@ vue-scrollto@2.20.0: dependencies: bezier-easing "2.1.0" -vue-select@^3.1.0: - version "3.11.2" - resolved "https://registry.yarnpkg.com/vue-select/-/vue-select-3.11.2.tgz#3ef93e3f2707e133c2df0b2920a05eea78764d18" - integrity sha512-pIOcY8ajWNSwg8Ns4eHVr5ZWwqKCSZeQRymTnlUI8i+3QiQXF6JIM4lylK6mVfbccs4S6vOyxB7zmJBpp7tDUg== - vue-snotify@3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/vue-snotify/-/vue-snotify-3.2.1.tgz#1e093838b67ecb4141d6227b6b19175735f4e259" diff --git a/themes/dark/assets/css/style.css b/themes/dark/assets/css/style.css index bf559670b7..26ea18112a 100644 --- a/themes/dark/assets/css/style.css +++ b/themes/dark/assets/css/style.css @@ -2846,7 +2846,6 @@ fieldset[disabled] .navbar-default .btn-link:focus { .vgt-table th { color: rgb(255, 255, 255); - text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3); background-color: rgb(51, 51, 51); } @@ -2900,6 +2899,28 @@ fieldset[disabled] .navbar-default .btn-link:focus { color: #333; } +.footer__navigation__page-btn { + color: rgb(51, 51, 51); + background-image: linear-gradient(to top, rgb(255, 255, 255), rgb(230, 230, 230)); + background-image: -moz-linear-gradient(top, rgb(255, 255, 255), rgb(230, 230, 230)); + border: 1px solid rgb(204, 204, 204); + background-color: rgb(245, 245, 245); + border-color: rgb(230, 230, 230) rgb(230, 230, 230) rgb(191, 191, 191); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.footer__navigation__page-btn:hover { + color: rgb(51, 51, 51); + text-decoration: none; + background-color: rgb(230, 230, 230); + background-position: 0 -15px; + transition: background-position 0.1s linear; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -ms-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; +} + .form-control { color: rgb(0, 0, 0); } @@ -4291,3 +4312,13 @@ CSS helper classes .d-block { display: block; } + +/* Style multiselect components */ +.multiselect, +.multiselect__tags, +.multiselect__input { + font-family: inherit; + font-size: 0.9em; + -ms-touch-action: manipulation; + touch-action: manipulation; +} diff --git a/themes/dark/assets/css/themed.css b/themes/dark/assets/css/themed.css index 8cf4ef75a0..a1b3bbbe8e 100644 --- a/themes/dark/assets/css/themed.css +++ b/themes/dark/assets/css/themed.css @@ -703,7 +703,6 @@ body { .vgt-table th { color: rgb(255, 255, 255); - text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3); background-color: rgb(85, 85, 85); } @@ -715,6 +714,26 @@ body { background-color: rgb(51, 51, 51); } +.footer__navigation__page-btn { + color: rgb(255, 255, 255); + text-shadow: 0 1px 1px rgb(0 0 0 / 75%); + background-image: linear-gradient(to top, rgb(85, 85, 85), rgb(51, 51, 51)); + border: 1px solid rgb(17, 17, 17); + border-color: rgb(17, 17, 17) rgb(17, 17, 17) rgb(17, 17, 17); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#297AB8', endColorstr='#15528F', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + box-shadow: inset 0 1px 0 rgb(255 255 255 / 0%), 0 1px 2px rgb(0 0 0 / 5%); +} + +.footer__navigation__page-btn:hover { + text-decoration: none; + background-color: rgb(30, 30, 30); + color: rgb(255, 255, 255); + background-position: 0 -150px; + transition: background-position 0s linear; + background-image: none; +} + /* submenu styling */ #sub-menu-container { background-color: rgb(41, 41, 41); diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js index 38440d883c..fc6dadaadb 100644 --- a/themes/dark/assets/js/medusa-runtime.js +++ b/themes/dark/assets/js/medusa-runtime.js @@ -70,7 +70,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* provided dependency */ var $ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'app-header',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__.AppLink\n },\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_2__.mapState)({\n config: state => state.config.general,\n clients: state => state.config.clients,\n notifiers: state => state.config.notifiers,\n postprocessing: state => state.config.postprocessing,\n search: state => state.config.search,\n system: state => state.config.system,\n isAuthenticated: state => state.auth.isAuthenticated,\n username: state => state.auth.user.username,\n warningLevel: state => state.config.general.logs.loggingLevels.warning\n }),\n\n /**\n * Moved into a computed, so it's easier to mock in Jest.\n * @returns {Object} - Route name and query.\n */\n currentShowRoute() {\n const {\n $route\n } = this;\n return {\n name: $route.name,\n query: $route.query\n };\n },\n\n recentShows() {\n const {\n config,\n currentShowRoute\n } = this;\n const {\n recentShows\n } = config;\n\n const hideActiveShow = show => !(currentShowRoute.name === 'show' && show.showSlug === currentShowRoute.query.showslug);\n\n return recentShows.filter(hideActiveShow).map(show => {\n const link = `home/displayShow?showslug=${show.showSlug}`;\n return {\n name: show.name,\n link\n };\n });\n },\n\n topMenu() {\n return this.$route.meta.topMenu;\n },\n\n toolsBadgeCount() {\n const {\n config\n } = this;\n const {\n system\n } = this;\n const {\n logs\n } = config;\n const {\n news\n } = system;\n return logs.numErrors + logs.numWarnings + news.unread;\n },\n\n toolsBadgeClass() {\n const {\n config\n } = this;\n const {\n logs\n } = config;\n\n if (logs.numErrors > 0) {\n return ' btn-danger';\n }\n\n if (logs.numWarnings > 0) {\n return ' btn-warning';\n }\n\n return '';\n },\n\n linkVisible() {\n const {\n clients,\n config,\n notifiers,\n postprocessing,\n search\n } = this;\n const {\n subtitles\n } = config;\n const {\n general\n } = search;\n const {\n kodi,\n plex,\n emby\n } = notifiers;\n return {\n plex: plex.server.enabled && plex.server.host.length !== 0,\n kodi: kodi.enabled && kodi.host.length !== 0,\n\n /* @TODO: Originally there was a check to make sure the API key\n was configured for Emby: ` app.EMBY_APIKEY != '' ` */\n emby: emby.enabled && emby.host,\n manageTorrents: clients.torrents.enabled && clients.torrents.method !== 'blackhole',\n failedDownloads: general.failedDownloads.enabled,\n subtitleMissed: subtitles.enabled,\n subtitleMissedPP: postprocessing.postponeIfNoSubs\n };\n }\n\n },\n\n mounted() {\n const {\n $el\n } = this; // Auto close menus when clicking a RouterLink\n\n $el.clickCloseMenus = event => {\n const {\n target\n } = event;\n\n if (target.matches('#main_nav a.router-link, #main_nav a.router-link *')) {\n const dropdown = target.closest('.dropdown');\n dropdown.querySelector('.dropdown-toggle').setAttribute('aria-expanded', false);\n dropdown.querySelector('.dropdown-menu').style.display = 'none'; // Also collapse the main nav if it's open\n\n $('#main_nav').collapse('hide');\n }\n };\n\n $el.addEventListener('click', $el.clickCloseMenus, {\n passive: true\n }); // Hover Dropdown for Nav\n\n $($el).on({\n mouseenter(event) {\n const $target = $(event.currentTarget);\n $target.find('.dropdown-menu').stop(true, true).delay(200).fadeIn(500, () => {\n $target.find('.dropdown-toggle').attr('aria-expanded', 'true');\n });\n },\n\n mouseleave(event) {\n const $target = $(event.currentTarget);\n $target.find('.dropdown-toggle').attr('aria-expanded', 'false');\n $target.find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500);\n }\n\n }, 'ul.nav li.dropdown'); // @TODO Replace this with a real touchscreen check\n // hack alert: if we don't have a touchscreen, and we are already hovering the mouse, then click should link instead of toggle\n\n if ((navigator.maxTouchPoints || 0) < 2) {\n $($el).on('click', '.dropdown-toggle', event => {\n const $target = $(event.currentTarget);\n\n if ($target.attr('aria-expanded') === 'true') {\n window.location.href = $target.attr('href');\n }\n });\n }\n },\n\n destroyed() {\n // Revert `mounted()`\n const {\n $el\n } = this; // Auto close menus when clicking a RouterLink\n\n $el.removeEventListener('click', $el.clickCloseMenus); // Hover Dropdown for Nav\n\n $($el).off('mouseenter mouseleave', 'ul.nav li.dropdown'); // @TODO Replace this with a real touchscreen check\n // hack alert: if we don't have a touchscreen, and we are already hovering the mouse, then click should link instead of toggle\n\n if ((navigator.maxTouchPoints || 0) < 2) {\n $($el).off('click', '.dropdown-toggle');\n }\n },\n\n methods: {\n confirmDialog(event, action) {\n const options = {\n confirmButton: 'Yes',\n cancelButton: 'Cancel',\n dialogClass: 'modal-dialog',\n post: false,\n button: $(event.currentTarget || event.target),\n\n confirm($element) {\n window.location.href = $element[0].href;\n }\n\n };\n\n if (action === 'newversion') {\n options.title = 'New version';\n options.text = 'New version available, update now?';\n } else if (action === 'logout') {\n options.title = 'Logout';\n options.text = 'Are you sure you want to logout from Medusa?';\n } else {\n return;\n }\n\n $.confirm(options, event);\n },\n\n async checkForupdates(event) {\n const {\n confirmDialog\n } = this;\n\n try {\n this.$snotify.info('Checking for a new version...');\n await _api__WEBPACK_IMPORTED_MODULE_0__.api.post('system/operation', {\n type: 'CHECKFORUPDATE'\n });\n confirmDialog(event, 'newversion');\n } catch (error) {\n this.$snotify.info('You are already on the latest version');\n }\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/app-header.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* provided dependency */ var $ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'app-header',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__.AppLink\n },\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_2__.mapState)({\n config: state => state.config.general,\n clients: state => state.config.clients,\n notifiers: state => state.config.notifiers,\n postprocessing: state => state.config.postprocessing,\n search: state => state.config.search,\n system: state => state.config.system,\n isAuthenticated: state => state.auth.isAuthenticated,\n username: state => state.auth.user.username,\n warningLevel: state => state.config.general.logs.loggingLevels.warning\n }),\n\n /**\n * Moved into a computed, so it's easier to mock in Jest.\n * @returns {Object} - Route name and query.\n */\n currentShowRoute() {\n const {\n $route\n } = this;\n return {\n name: $route.name,\n query: $route.query\n };\n },\n\n recentShows() {\n const {\n config,\n currentShowRoute\n } = this;\n const {\n recentShows\n } = config;\n\n const hideActiveShow = show => !(currentShowRoute.name === 'show' && show.showSlug === currentShowRoute.query.showslug);\n\n return recentShows.filter(hideActiveShow).map(show => {\n const link = `home/displayShow?showslug=${show.showSlug}`;\n return {\n name: show.name,\n link\n };\n });\n },\n\n topMenu() {\n return this.$route.meta.topMenu;\n },\n\n toolsBadgeCount() {\n const {\n config\n } = this;\n const {\n system\n } = this;\n const {\n logs\n } = config;\n const {\n news\n } = system;\n return logs.numErrors + logs.numWarnings + news.unread;\n },\n\n toolsBadgeClass() {\n const {\n config\n } = this;\n const {\n logs\n } = config;\n\n if (logs.numErrors > 0) {\n return ' btn-danger';\n }\n\n if (logs.numWarnings > 0) {\n return ' btn-warning';\n }\n\n return '';\n },\n\n linkVisible() {\n const {\n clients,\n config,\n notifiers,\n postprocessing,\n search\n } = this;\n const {\n subtitles\n } = config;\n const {\n general\n } = search;\n const {\n kodi,\n plex,\n emby\n } = notifiers;\n return {\n plex: plex.server.enabled && plex.server.host.length !== 0,\n kodi: kodi.enabled && kodi.host.length !== 0,\n\n /* @TODO: Originally there was a check to make sure the API key\n was configured for Emby: ` app.EMBY_APIKEY != '' ` */\n emby: emby.enabled && emby.host,\n manageTorrents: clients.torrents.enabled && clients.torrents.method !== 'blackhole',\n failedDownloads: general.failedDownloads.enabled,\n subtitleMissed: subtitles.enabled,\n subtitleMissedPP: postprocessing.postponeIfNoSubs\n };\n }\n\n },\n\n mounted() {\n const {\n $el\n } = this; // Auto close menus when clicking a RouterLink\n\n $el.clickCloseMenus = event => {\n const {\n target\n } = event;\n\n if (target.matches('#main_nav a.router-link, #main_nav a.router-link *')) {\n const dropdown = target.closest('.dropdown');\n\n if (dropdown) {\n dropdown.querySelector('.dropdown-toggle').setAttribute('aria-expanded', false);\n dropdown.querySelector('.dropdown-menu').style.display = 'none';\n } // Also collapse the main nav if it's open\n\n\n $('#main_nav').collapse('hide');\n }\n };\n\n $el.addEventListener('click', $el.clickCloseMenus, {\n passive: true\n }); // Hover Dropdown for Nav\n\n $($el).on({\n mouseenter(event) {\n const $target = $(event.currentTarget);\n $target.find('.dropdown-menu').stop(true, true).delay(200).fadeIn(500, () => {\n $target.find('.dropdown-toggle').attr('aria-expanded', 'true');\n });\n },\n\n mouseleave(event) {\n const $target = $(event.currentTarget);\n $target.find('.dropdown-toggle').attr('aria-expanded', 'false');\n $target.find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500);\n }\n\n }, 'ul.nav li.dropdown'); // @TODO Replace this with a real touchscreen check\n // hack alert: if we don't have a touchscreen, and we are already hovering the mouse, then click should link instead of toggle\n\n if ((navigator.maxTouchPoints || 0) < 2) {\n $($el).on('click', '.dropdown-toggle', event => {\n const $target = $(event.currentTarget);\n\n if ($target.attr('aria-expanded') === 'true') {\n window.location.href = $target.attr('href');\n }\n });\n }\n },\n\n destroyed() {\n // Revert `mounted()`\n const {\n $el\n } = this; // Auto close menus when clicking a RouterLink\n\n $el.removeEventListener('click', $el.clickCloseMenus); // Hover Dropdown for Nav\n\n $($el).off('mouseenter mouseleave', 'ul.nav li.dropdown'); // @TODO Replace this with a real touchscreen check\n // hack alert: if we don't have a touchscreen, and we are already hovering the mouse, then click should link instead of toggle\n\n if ((navigator.maxTouchPoints || 0) < 2) {\n $($el).off('click', '.dropdown-toggle');\n }\n },\n\n methods: {\n confirmDialog(event, action) {\n const options = {\n confirmButton: 'Yes',\n cancelButton: 'Cancel',\n dialogClass: 'modal-dialog',\n post: false,\n button: $(event.currentTarget || event.target),\n\n confirm($element) {\n window.location.href = $element[0].href;\n }\n\n };\n\n if (action === 'newversion') {\n options.title = 'New version';\n options.text = 'New version available, update now?';\n } else if (action === 'logout') {\n options.title = 'Logout';\n options.text = 'Are you sure you want to logout from Medusa?';\n } else {\n return;\n }\n\n $.confirm(options, event);\n },\n\n async checkForupdates(event) {\n const {\n confirmDialog\n } = this;\n\n try {\n this.$snotify.info('Checking for a new version...');\n await _api__WEBPACK_IMPORTED_MODULE_0__.api.post('system/operation', {\n type: 'CHECKFORUPDATE'\n });\n confirmDialog(event, 'newversion');\n } catch (error) {\n this.$snotify.info('You are already on the latest version');\n }\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/app-header.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -180,7 +180,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/debounce */ \"./node_modules/lodash/debounce.js\");\n/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../mixins/manage-cookie */ \"./src/mixins/manage-cookie.js\");\n/* harmony import */ var _utils_jquery__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/jquery */ \"./src/utils/jquery.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./subtitle-search.vue */ \"./src/components/subtitle-search.vue\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* provided dependency */ var $ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'show',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__.AppLink,\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__.default,\n PlotInfo: _helpers__WEBPACK_IMPORTED_MODULE_1__.PlotInfo,\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_8__.default,\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_6__.default,\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_9__.VueGoodTable\n },\n mixins: [(0,_mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_3__.manageCookieMixin)('displayShow')],\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n props: {\n /**\n * Show Slug\n */\n slug: {\n type: String\n }\n },\n\n data() {\n const {\n getCookie\n } = this;\n const perPageDropdown = [25, 50, 100, 250, 500];\n\n const getPaginationPerPage = () => {\n const rows = getCookie('pagination-perPage');\n\n if (!rows) {\n return 50;\n }\n\n if (!perPageDropdown.includes(rows)) {\n return 500;\n }\n\n return rows;\n };\n\n return {\n invertTable: true,\n isMobile: false,\n subtitleSearchComponents: [],\n columns: [{\n label: 'NFO',\n field: 'content.hasNfo',\n type: 'boolean',\n sortable: false,\n hidden: getCookie('NFO')\n }, {\n label: 'TBN',\n field: 'content.hasTbn',\n type: 'boolean',\n sortable: false,\n hidden: getCookie('TBN')\n }, {\n label: 'Episode',\n field: 'episode',\n type: 'number',\n hidden: getCookie('Episode')\n }, {\n label: 'Abs. #',\n field: 'absoluteNumber',\n type: 'number',\n hidden: getCookie('Abs. #')\n }, {\n label: 'Scene',\n field: row => {\n const {\n getSceneNumbering\n } = this;\n return getSceneNumbering(row);\n },\n sortable: false,\n hidden: getCookie('Scene')\n }, {\n label: 'Scene Abs. #',\n field: row => {\n const {\n getSceneAbsoluteNumbering\n } = this;\n return getSceneAbsoluteNumbering(row);\n },\n type: 'number',\n hidden: getCookie('Scene Abs. #')\n }, {\n label: 'Title',\n field: 'title',\n hidden: getCookie('Title')\n }, {\n label: 'File',\n field: 'file.location',\n hidden: getCookie('File')\n }, {\n label: 'Size',\n field: 'file.size',\n type: 'number',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__.humanFileSize,\n hidden: getCookie('Size')\n }, {\n // For now i'm using a custom function the parse it. As the type: date, isn't working for us.\n // But the goal is to have this user formatted (as configured in backend)\n label: 'Air date',\n field: this.parseDateFn,\n tdClass: 'align-center',\n sortable: false,\n hidden: getCookie('Air date')\n }, {\n label: 'Download',\n field: 'download',\n sortable: false,\n hidden: getCookie('Download')\n }, {\n label: 'Subtitles',\n field: 'subtitles',\n sortable: false,\n hidden: getCookie('Subtitles')\n }, {\n label: 'Status',\n field: 'status',\n hidden: getCookie('Status')\n }, {\n label: 'Search',\n field: 'search',\n sortable: false,\n hidden: getCookie('Search')\n }],\n perPageDropdown,\n paginationPerPage: getPaginationPerPage(),\n selectedEpisodes: [],\n // We need to keep track of which episode where trying to search, for the vue-modal\n failedSearchEpisodes: [],\n backlogSearchEpisodes: [],\n filterByOverviewStatus: false,\n selectedSearch: 'search action'\n };\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_10__.mapState)({\n shows: state => state.shows.shows,\n config: state => state.config.general,\n configLoaded: state => state.config.layout.fanartBackground !== null,\n layout: state => state.config.layout,\n stateSearch: state => state.config.search\n }),\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_10__.mapGetters)({\n show: 'getCurrentShow',\n getOverviewStatus: 'getOverviewStatus',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n showSlug() {\n const {\n slug\n } = this;\n return slug || this.$route.query.showslug;\n },\n\n theme() {\n const {\n layout\n } = this;\n const {\n themeName\n } = layout;\n return themeName || 'light';\n },\n\n orderSeasons() {\n const {\n filterByOverviewStatus,\n invertTable,\n show\n } = this;\n\n if (!show.seasons) {\n return [];\n }\n\n let sortedSeasons = show.seasons.sort((a, b) => a.season - b.season).filter(season => season.season !== 0); // Use the filterOverviewStatus to filter the data based on what's checked in the show-header.\n\n if (filterByOverviewStatus && filterByOverviewStatus.filter(status => status.checked).length < filterByOverviewStatus.length) {\n const filteredSortedSeasons = [];\n\n for (const season of sortedSeasons) {\n const {\n episodes,\n ...res\n } = season;\n const filteredEpisodes = episodes.filter(episode => {\n const episodeOverviewStatus = this.getOverviewStatus(episode.status, episode.quality, show.config.qualities);\n const filteredStatus = filterByOverviewStatus.find(overviewStatus => overviewStatus.name === episodeOverviewStatus);\n return !filteredStatus || filteredStatus.checked;\n });\n filteredSortedSeasons.push(Object.assign({\n episodes: filteredEpisodes\n }, res));\n }\n\n sortedSeasons = filteredSortedSeasons;\n }\n\n if (invertTable) {\n return sortedSeasons.reverse();\n }\n\n return sortedSeasons;\n },\n\n specials() {\n const {\n show\n } = this;\n\n if (!show.seasons) {\n return [];\n }\n\n return show.seasons.filter(season => season.season === 0);\n }\n\n },\n\n mounted() {\n const {\n setEpisodeSceneNumbering,\n setAbsoluteSceneNumbering,\n setInputValidInvalid\n } = this;\n this.loadShow();\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.reflowLayout();\n });\n });\n $(document.body).on('click', '.seasonCheck', event => {\n const seasCheck = event.currentTarget;\n const seasNo = $(seasCheck).attr('id');\n $('#collapseSeason-' + seasNo).collapse('show');\n const seasonIdentifier = 's' + seasNo;\n $('.epCheck:visible').each((index, element) => {\n const epParts = $(element).attr('id').split('e');\n\n if (epParts[0] === seasonIdentifier) {\n element.checked = seasCheck.checked;\n }\n });\n });\n $(document.body).on('change', '.sceneSeasonXEpisode', event => {\n const target = event.currentTarget; // Strip non-numeric characters\n\n const value = $(target).val();\n $(target).val(value.replace(/[^\\dXx]*/g, ''));\n const forSeason = $(target).attr('data-for-season');\n const forEpisode = $(target).attr('data-for-episode'); // If empty reset the field\n\n if (value === '') {\n setEpisodeSceneNumbering(forSeason, forEpisode, null, null);\n return;\n }\n\n const m = $(target).val().match(/^(\\d+)x(\\d+)$/i);\n const onlyEpisode = $(target).val().match(/^(\\d+)$/i);\n let sceneSeason = null;\n let sceneEpisode = null;\n let isValid = false;\n\n if (m) {\n sceneSeason = m[1];\n sceneEpisode = m[2];\n isValid = setInputValidInvalid(true, $(target));\n } else if (onlyEpisode) {\n // For example when '5' is filled in instead of '1x5', asume it's the first season\n sceneSeason = forSeason;\n sceneEpisode = onlyEpisode[1];\n isValid = setInputValidInvalid(true, $(target));\n } else {\n isValid = setInputValidInvalid(false, $(target));\n }\n\n if (isValid) {\n setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode);\n }\n });\n $(document.body).on('change', '.sceneAbsolute', event => {\n const target = event.currentTarget; // Strip non-numeric characters\n\n $(target).val($(target).val().replace(/[^\\dXx]*/g, ''));\n const forAbsolute = $(target).attr('data-for-absolute');\n const m = $(target).val().match(/^(\\d{1,3})$/i);\n let sceneAbsolute = null;\n\n if (m) {\n sceneAbsolute = m[1];\n }\n\n setAbsoluteSceneNumbering(forAbsolute, sceneAbsolute);\n });\n },\n\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__.humanFileSize,\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_10__.mapActions)({\n getShow: 'getShow',\n // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n getEpisodes: 'getEpisodes',\n setCurrentShow: 'setCurrentShow',\n setRecentShow: 'setRecentShow'\n }),\n\n async loadShow() {\n const {\n setCurrentShow,\n showSlug,\n initializeEpisodes,\n getShow\n } = this; // We need detailed info for the xem / scene exceptions, so let's get it.\n\n await getShow({\n showSlug,\n detailed: true\n }); // Let's tell the store which show we currently want as current.\n // Run this after getShow(), as it will trigger the initializeEpisodes() method.\n\n setCurrentShow(showSlug); // Load all episodes\n\n initializeEpisodes();\n },\n\n statusQualityUpdate(event) {\n const {\n selectedEpisodes,\n setStatus,\n setQuality\n } = this;\n\n if (event.newQuality !== null && event.newQuality !== 'Change quality to:') {\n setQuality(event.newQuality, selectedEpisodes);\n }\n\n if (event.newStatus !== null && event.newStatus !== 'Change status to:') {\n setStatus(event.newStatus, selectedEpisodes);\n }\n },\n\n setQuality(quality, episodes) {\n const {\n showSlug,\n getEpisodes,\n show\n } = this;\n const patchData = {};\n episodes.forEach(episode => {\n patchData[episode.slug] = {\n quality: Number.parseInt(quality, 10)\n };\n });\n api.patch('series/' + show.id.slug + '/episodes', patchData) // eslint-disable-line no-undef\n .then(_ => {\n console.info(`patched show ${show.id.slug} with quality ${quality}`);\n [...new Set(episodes.map(episode => episode.season))].forEach(season => {\n getEpisodes({\n showSlug,\n season\n });\n });\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n setStatus(status, episodes) {\n const {\n showSlug,\n getEpisodes\n } = this;\n const patchData = {};\n episodes.forEach(episode => {\n patchData[episode.slug] = {\n status\n };\n });\n api.patch(`series/${showSlug}/episodes`, patchData) // eslint-disable-line no-undef\n .then(_ => {\n console.info(`patched show ${showSlug} with status ${status}`);\n [...new Set(episodes.map(episode => episode.season))].forEach(season => {\n getEpisodes({\n showSlug,\n season\n });\n });\n }).catch(error => {\n console.error(String(error));\n }); // New status Wanted\n\n if (status === 3) {\n this.$modal.show('query-start-backlog-search', {\n episodes\n });\n } // New status Failed\n\n\n if (status === 11) {\n this.$modal.show('query-mark-failed-and-search', {\n episodes\n });\n }\n },\n\n parseDateFn(row) {\n const {\n fuzzyParseDateTime\n } = this;\n return fuzzyParseDateTime(row.airDate);\n },\n\n rowStyleClassFn(row) {\n const {\n getOverviewStatus,\n show\n } = this;\n\n if (Object.keys(row).includes('vgt_header_id')) {\n return;\n }\n\n const overview = getOverviewStatus(row.status, row.quality, show.config.qualities).toLowerCase().trim();\n return overview;\n },\n\n /**\n * Add (reduce) the total episodes filesize.\n * @param {object} headerRow header row object.\n * @returns {string} - Human readable file size.\n */\n addFileSize(headerRow) {\n return (0,_utils_core__WEBPACK_IMPORTED_MODULE_2__.humanFileSize)(headerRow.episodes.reduce((a, b) => a + (b.file.size || 0), 0));\n },\n\n searchSubtitle(event, episode, lang) {\n const {\n showSlug,\n getEpisodes,\n show,\n subtitleSearchComponents\n } = this;\n const SubtitleSearchClass = Vue.extend(_subtitle_search_vue__WEBPACK_IMPORTED_MODULE_7__.default); // eslint-disable-line no-undef\n\n const instance = new SubtitleSearchClass({\n propsData: {\n show,\n episode,\n key: episode.originalIndex,\n lang\n },\n parent: this\n }); // Update the show, as we downloaded new subtitle(s)\n\n instance.$on('update', event => {\n // This could be replaced by the generic websocket updates in future.\n if (event.reason === 'new subtitles found') {\n getEpisodes({\n showSlug,\n season: episode.season\n });\n }\n });\n const node = document.createElement('div');\n const tableRef = episode.season === 0 ? 'table-specials' : 'table-seasons';\n this.$refs[tableRef].$refs[`row-${episode.originalIndex}`][0].after(node);\n instance.$mount(node);\n subtitleSearchComponents.push(instance);\n },\n\n /**\n * Attaches IMDB tooltip\n */\n reflowLayout: lodash_debounce__WEBPACK_IMPORTED_MODULE_0___default()(() => {\n console.debug('Reflowing layout');\n (0,_utils_jquery__WEBPACK_IMPORTED_MODULE_4__.addQTip)(); // eslint-disable-line no-undef\n }, 1000),\n\n setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode) {\n const {\n $snotify,\n show\n } = this;\n\n if (!show.config.scene) {\n $snotify.warning('To change episode scene numbering you need to enable the show option `scene` first', 'Warning', {\n timeout: 0\n });\n }\n\n if (sceneSeason === '') {\n sceneSeason = null;\n }\n\n if (sceneEpisode === '') {\n sceneEpisode = null;\n }\n\n $.getJSON('home/setSceneNumbering', {\n showslug: show.id.slug,\n forSeason,\n forEpisode,\n sceneSeason,\n sceneEpisode\n }, data => {\n // Set the values we get back\n if (data.sceneSeason === null || data.sceneEpisode === null) {\n $(`#sceneSeasonXEpisode_${show.id[show.indexer]}_${forSeason}_${forEpisode}`).val('');\n } else {\n $(`#sceneSeasonXEpisode_${show.id[show.indexer]}_${forSeason}_${forEpisode}`).val(data.sceneSeason + 'x' + data.sceneEpisode);\n }\n\n if (!data.success) {\n if (data.errorMessage) {\n alert(data.errorMessage); // eslint-disable-line no-alert\n } else {\n alert('Update failed.'); // eslint-disable-line no-alert\n }\n }\n });\n },\n\n setAbsoluteSceneNumbering(forAbsolute, sceneAbsolute) {\n const {\n $snotify,\n show\n } = this;\n\n if (!show.config.scene) {\n $snotify.warning('To change an anime episode scene numbering you need to enable the show option `scene` first', 'Warning', {\n timeout: 0\n });\n }\n\n if (sceneAbsolute === '') {\n sceneAbsolute = null;\n }\n\n $.getJSON('home/setSceneNumbering', {\n showslug: show.id.slug,\n forAbsolute,\n sceneAbsolute\n }, data => {\n // Set the values we get back\n if (data.sceneAbsolute === null) {\n $(`#sceneAbsolute_${show.id[show.indexer]}_${forAbsolute}`).val('');\n } else {\n $(`#sceneAbsolute_${show.id[show.indexer]}_${forAbsolute}`).val(data.sceneAbsolute);\n }\n\n if (!data.success) {\n if (data.errorMessage) {\n alert(data.errorMessage); // eslint-disable-line no-alert\n } else {\n alert('Update failed.'); // eslint-disable-line no-alert\n }\n }\n });\n },\n\n setInputValidInvalid(valid, el) {\n if (valid) {\n $(el).css({\n 'background-color': '#90EE90',\n // Green\n 'color': '#FFF',\n // eslint-disable-line quote-props\n 'font-weight': 'bold'\n });\n return true;\n }\n\n $(el).css({\n 'background-color': '#FF0000',\n // Red\n 'color': '#FFF !important',\n // eslint-disable-line quote-props\n 'font-weight': 'bold'\n });\n return false;\n },\n\n /**\n * Check if any of the episodes in this season does not have the status \"unaired\".\n * If that's the case we want to manual season search icon.\n * @param {object} season - A season object.\n * @returns {Boolean} - true if one of the seasons episodes has a status 'unaired'.\n */\n anyEpisodeNotUnaired(season) {\n return season.episodes.filter(ep => ep.status !== 'Unaired').length > 0;\n },\n\n episodesInverse(season) {\n const {\n invertTable\n } = this;\n\n if (!season.episodes) {\n return [];\n }\n\n if (invertTable) {\n return season.episodes.slice().reverse();\n }\n\n return season.episodes;\n },\n\n /**\n * Check if the season/episode combination exists in the scene numbering.\n * @param {Object} episode - object.\n * @returns {Object} with scene season and episodes mapped numbering.\n */\n getSceneNumbering(episode) {\n const {\n show\n } = this;\n const {\n sceneNumbering,\n xemNumbering\n } = show;\n\n if (!show.config.scene) {\n return {\n season: 0,\n episode: 0\n };\n } // Manually configured scene numbering\n\n\n if (sceneNumbering.length !== 0) {\n const mapped = sceneNumbering.filter(x => {\n return x.source.season === episode.season && x.source.episode === episode.episode;\n });\n\n if (mapped.length !== 0) {\n return mapped[0].destination;\n }\n } // Scene numbering downloaded from thexem.de.\n\n\n if (xemNumbering.length !== 0) {\n const mapped = xemNumbering.filter(x => {\n return x.source.season === episode.season && x.source.episode === episode.episode;\n });\n\n if (mapped.length !== 0) {\n return mapped[0].destination;\n }\n }\n\n return {\n season: episode.scene.season || 0,\n episode: episode.scene.episode || 0\n };\n },\n\n getSceneAbsoluteNumbering(episode) {\n const {\n show\n } = this;\n const {\n sceneAbsoluteNumbering,\n xemAbsoluteNumbering\n } = show;\n\n if (!show.config.anime || !show.config.scene) {\n return episode.scene.absoluteNumber;\n }\n\n if (Object.keys(sceneAbsoluteNumbering).length > 0) {\n const mapped = sceneAbsoluteNumbering.filter(x => {\n return x.absolute === episode.absoluteNumber;\n });\n\n if (mapped.length !== 0) {\n return mapped[0].sceneAbsolute;\n }\n }\n\n if (Object.keys(xemAbsoluteNumbering).length > 0) {\n const mapped = xemAbsoluteNumbering.filter(x => {\n return x.absolute === episode.absoluteNumber;\n });\n\n if (mapped.length !== 0) {\n return mapped[0].sceneAbsolute;\n }\n }\n\n return episode.scene.absoluteNumber;\n },\n\n /**\n * Vue-js-modal requires a method, to pass an event to.\n * The event then can be used to assign the value of the episode.\n * @param {Object} event - vue js modal event\n */\n beforeBacklogSearchModalClose(event) {\n this.backlogSearchEpisodes = event.params.episodes;\n },\n\n /**\n * Vue-js-modal requires a method, to pass an event to.\n * The event then can be used to assign the value of the episode.\n * @param {Object} event - vue js modal event\n */\n beforeFailedSearchModalClose(event) {\n this.failedSearchEpisodes = event.params.episodes;\n },\n\n retryDownload(episode) {\n const {\n stateSearch\n } = this;\n return stateSearch.general.failedDownloads.enabled && ['Snatched', 'Snatched (Proper)', 'Snatched (Best)', 'Downloaded'].includes(episode.status);\n },\n\n search(episodes, searchType) {\n const {\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes: [],\n options: {}\n };\n episodes.forEach(episode => {\n data.episodes.push(episode.slug);\n this.$refs[`search-${episode.slug}`].src = 'images/loading16-dark.gif';\n });\n }\n\n api.put(`search/${searchType}`, data) // eslint-disable-line no-undef\n .then(_ => {\n if (episodes.length === 1) {\n console.info(`started search for show: ${show.id.slug} episode: ${episodes[0].slug}`);\n this.$refs[`search-${episodes[0].slug}`].src = 'images/queued.png';\n this.$refs[`search-${episodes[0].slug}`].disabled = true;\n } else {\n console.info('started a full backlog search');\n }\n }).catch(error => {\n console.error(String(error));\n episodes.forEach(episode => {\n data.episodes.push(episode.slug);\n this.$refs[`search-${episodes[0].slug}`].src = 'images/no16.png';\n });\n }).finally(() => {\n this.failedSearchEpisodes = [];\n this.backlogSearchEpisodes = [];\n });\n },\n\n /**\n * Start a backlog search or failed search for the specific episode.\n * A failed search is started depending on the current episodes status.\n * @param {Object} episode - Episode object. If no episode object is passed, a backlog search is started.\n */\n queueSearch(episode) {\n const {\n $modal,\n search,\n retryDownload\n } = this;\n const episodeIdentifier = episode.slug;\n\n if (episode) {\n if (this.$refs[`search-${episodeIdentifier}`].disabled === true) {\n return;\n }\n\n if (retryDownload(episode)) {\n $modal.show('query-mark-failed-and-search', {\n episode\n });\n } else {\n search([episode], 'backlog');\n }\n }\n },\n\n showSubtitleButton(episode) {\n const {\n config,\n show\n } = this;\n return episode.season !== 0 && config.subtitles.enabled && show.config.subtitlesEnabled && !['Snatched', 'Snatched (Proper)', 'Snatched (Best)', 'Downloaded'].includes(episode.status);\n },\n\n totalSeasonEpisodeSize(season) {\n return season.episodes.filter(x => x.file && x.file.size > 0).reduce((a, b) => a + b.file.size, 0);\n },\n\n getSeasonExceptions(season) {\n const {\n show\n } = this;\n const {\n config\n } = show;\n const {\n aliases\n } = config;\n let bindData = {\n class: 'display: none'\n }; // Map the indexer season to a xem mapped season.\n // check if the season exception also exists in the xem numbering table\n\n let xemSeasons = [];\n let foundInXem = false;\n\n if (show.xemNumbering.length > 0) {\n const xemResult = show.xemNumbering.filter(x => x.source.season === season); // Create an array with unique seasons\n\n xemSeasons = [...new Set(xemResult.map(item => item.destination.season))];\n foundInXem = Boolean(xemSeasons.length);\n } // Check if there is a season exception for this season\n\n\n if (aliases.find(x => x.season === season)) {\n // If there is not a match on the xem table, display it as a medusa scene exception\n bindData = {\n id: `xem-exception-season-${foundInXem ? xemSeasons[0] : season}`,\n alt: foundInXem ? '[xem]' : '[medusa]',\n src: foundInXem ? 'images/xem.png' : 'images/ico/favicon-16.png',\n title: foundInXem ? xemSeasons.reduce((a, b) => {\n return a.concat(aliases.filter(alias => alias.season === b).map(alias => alias.title));\n }, []).join(', ') : aliases.filter(alias => alias.season === season).map(alias => alias.title).join(', ')\n };\n }\n\n return bindData;\n },\n\n updateEpisodeWatched(episode, watched) {\n const {\n showSlug,\n getEpisodes,\n show\n } = this;\n const patchData = {};\n patchData[episode.slug] = {\n watched\n };\n api.patch(`series/${show.id.slug}/episodes`, patchData) // eslint-disable-line no-undef\n .then(_ => {\n console.info(`patched episode ${episode.slug} with watched set to ${watched}`);\n getEpisodes({\n showSlug,\n season: episode.season\n });\n }).catch(error => {\n console.error(String(error));\n });\n episode.watched = watched;\n },\n\n updatePaginationPerPage(rows) {\n const {\n setCookie\n } = this;\n this.paginationPerPage = rows;\n setCookie('pagination-perPage', rows);\n },\n\n onPageChange(params) {\n this.loadEpisodes(params.currentPage);\n },\n\n neededSeasons(page) {\n const {\n layout,\n paginationPerPage,\n show\n } = this;\n const {\n seasonCount\n } = show;\n\n if (!seasonCount || seasonCount.length === 0) {\n return [];\n }\n\n if (!layout.show.pagination.enable) {\n return seasonCount.filter(season => season.season !== 0).map(season => season.season).reverse();\n }\n\n const seasons = show.seasonCount.length - 1;\n let pagesCount = 1;\n let episodeCount = 0;\n const pages = {};\n\n for (let i = seasons; i >= 0; i--) {\n const {\n season\n } = show.seasonCount[i]; // Exclude specials\n\n if (season === 0) {\n break;\n }\n\n if (pagesCount in pages) {\n pages[pagesCount].push(season);\n } else {\n pages[pagesCount] = [season];\n }\n\n episodeCount += show.seasonCount[i].episodeCount;\n\n if (episodeCount / paginationPerPage > pagesCount) {\n pagesCount++;\n pages[pagesCount] = [season];\n }\n\n if (pagesCount > page) {\n break;\n }\n }\n\n return pages[page] || [];\n },\n\n loadEpisodes(page) {\n const {\n showSlug,\n getEpisodes\n } = this; // Wrap getEpisodes into an async/await function, so we can wait for the season to have been committed\n // before going on to the next one.\n\n const _getEpisodes = async showSlug => {\n for (const season of this.neededSeasons(page)) {\n // We're waiting for the results by design, to give vue the chance to update the dom.\n // If we fire all the promises at once for, for example 25 seasons. We'll overload medusa's app\n // and chance is high a number of requests will timeout.\n await getEpisodes({\n showSlug,\n season\n }); // eslint-disable-line no-await-in-loop\n }\n };\n\n _getEpisodes(showSlug);\n },\n\n initializeEpisodes() {\n const {\n getEpisodes,\n showSlug,\n setRecentShow,\n show\n } = this;\n\n if (!show.seasons && show.seasonCount) {\n // Load episodes for the first page.\n this.loadEpisodes(1); // Always get special episodes if available.\n\n if (show.seasonCount.length > 0 && show.seasonCount[0].season === 0) {\n getEpisodes({\n showSlug,\n season: 0\n });\n }\n }\n\n if (show.id.slug) {\n // For now i'm dumping this here\n setRecentShow({\n showSlug: show.id.slug,\n name: show.title\n });\n }\n },\n\n mobileSelectSearch(event, episode) {\n const {\n $snotify,\n $router,\n queueSearch,\n searchSubtitle,\n show\n } = this;\n\n if (event.target.value === 'forced') {\n queueSearch(episode);\n $snotify.success(`Search started for S${episode.season} E${episode.episode}`);\n }\n\n if (event.target.value === 'manual') {\n // Use the router to navigate to snatchSelection.\n $router.push({\n name: 'snatchSelection',\n query: {\n showslug: show.id.slug,\n season: episode.season,\n episode: episode.episode\n }\n });\n }\n\n if (event.target.value === 'subtitle') {\n searchSubtitle(event, episode);\n }\n\n setTimeout(() => {\n event.target.value = 'search action';\n }, 2000);\n }\n\n },\n watch: {\n 'show.id.slug': function (slug) {\n // eslint-disable-line object-shorthand\n // Show's slug has changed, meaning the show's page has finished loading.\n if (slug) {\n // This is still technically jQuery. Meaning whe're still letting jQuery do its thing on the entire dom.\n (0,_utils_jquery__WEBPACK_IMPORTED_MODULE_4__.updateSearchIcons)(slug, this);\n }\n }\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/display-show.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/debounce */ \"./node_modules/lodash/debounce.js\");\n/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../mixins/manage-cookie */ \"./src/mixins/manage-cookie.js\");\n/* harmony import */ var _utils_jquery__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/jquery */ \"./src/utils/jquery.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./subtitle-search.vue */ \"./src/components/subtitle-search.vue\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* provided dependency */ var $ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'show',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__.AppLink,\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__.default,\n PlotInfo: _helpers__WEBPACK_IMPORTED_MODULE_1__.PlotInfo,\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_8__.default,\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_6__.default,\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_9__.VueGoodTable\n },\n mixins: [(0,_mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_3__.manageCookieMixin)('displayShow')],\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n props: {\n /**\n * Show Slug\n */\n slug: {\n type: String\n }\n },\n\n data() {\n const {\n getCookie\n } = this;\n const perPageDropdown = [25, 50, 100, 250, 500];\n\n const getPaginationPerPage = () => {\n const rows = getCookie('pagination-perPage');\n\n if (!rows) {\n return 50;\n }\n\n if (!perPageDropdown.includes(rows)) {\n return 500;\n }\n\n return rows;\n };\n\n return {\n invertTable: true,\n isMobile: false,\n subtitleSearchComponents: [],\n columns: [{\n label: 'NFO',\n field: 'content.hasNfo',\n type: 'boolean',\n sortable: false,\n hidden: getCookie('NFO')\n }, {\n label: 'TBN',\n field: 'content.hasTbn',\n type: 'boolean',\n sortable: false,\n hidden: getCookie('TBN')\n }, {\n label: 'Episode',\n field: 'episode',\n type: 'number',\n hidden: getCookie('Episode')\n }, {\n label: 'Abs. #',\n field: 'absoluteNumber',\n type: 'number',\n hidden: getCookie('Abs. #')\n }, {\n label: 'Scene',\n field: row => {\n const {\n getSceneNumbering\n } = this;\n return getSceneNumbering(row);\n },\n sortable: false,\n hidden: getCookie('Scene')\n }, {\n label: 'Scene Abs. #',\n field: row => {\n const {\n getSceneAbsoluteNumbering\n } = this;\n return getSceneAbsoluteNumbering(row);\n },\n type: 'number',\n hidden: getCookie('Scene Abs. #')\n }, {\n label: 'Title',\n field: 'title',\n hidden: getCookie('Title')\n }, {\n label: 'File',\n field: 'file.location',\n hidden: getCookie('File')\n }, {\n label: 'Size',\n field: 'file.size',\n type: 'number',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__.humanFileSize,\n hidden: getCookie('Size')\n }, {\n // For now i'm using a custom function the parse it. As the type: date, isn't working for us.\n // But the goal is to have this user formatted (as configured in backend)\n label: 'Air date',\n field: this.parseDateFn,\n tdClass: 'align-center',\n sortable: false,\n hidden: getCookie('Air date')\n }, {\n label: 'Download',\n field: 'download',\n sortable: false,\n hidden: getCookie('Download')\n }, {\n label: 'Subtitles',\n field: 'subtitles',\n sortable: false,\n hidden: getCookie('Subtitles')\n }, {\n label: 'Status',\n field: 'status',\n hidden: getCookie('Status')\n }, {\n label: 'Search',\n field: 'search',\n sortable: false,\n hidden: getCookie('Search')\n }],\n perPageDropdown,\n paginationPerPage: getPaginationPerPage(),\n selectedEpisodes: [],\n // We need to keep track of which episode where trying to search, for the vue-modal\n failedSearchEpisodes: [],\n backlogSearchEpisodes: [],\n filterByOverviewStatus: false,\n selectedSearch: 'search action'\n };\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_10__.mapState)({\n shows: state => state.shows.shows,\n config: state => state.config.general,\n configLoaded: state => state.config.layout.fanartBackground !== null,\n layout: state => state.config.layout,\n stateSearch: state => state.config.search\n }),\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_10__.mapGetters)({\n show: 'getCurrentShow',\n getOverviewStatus: 'getOverviewStatus',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n showSlug() {\n const {\n slug\n } = this;\n return slug || this.$route.query.showslug;\n },\n\n theme() {\n const {\n layout\n } = this;\n const {\n themeName\n } = layout;\n return themeName || 'light';\n },\n\n orderSeasons() {\n const {\n filterByOverviewStatus,\n invertTable,\n show\n } = this;\n\n if (!show.seasons) {\n return [];\n }\n\n let sortedSeasons = show.seasons.sort((a, b) => a.season - b.season).filter(season => season.season !== 0); // Use the filterOverviewStatus to filter the data based on what's checked in the show-header.\n\n if (filterByOverviewStatus && filterByOverviewStatus.filter(status => status.checked).length < filterByOverviewStatus.length) {\n const filteredSortedSeasons = [];\n\n for (const season of sortedSeasons) {\n const {\n episodes,\n ...res\n } = season;\n const filteredEpisodes = episodes.filter(episode => {\n const episodeOverviewStatus = this.getOverviewStatus(episode.status, episode.quality, show.config.qualities);\n const filteredStatus = filterByOverviewStatus.find(overviewStatus => overviewStatus.name === episodeOverviewStatus);\n return !filteredStatus || filteredStatus.checked;\n });\n filteredSortedSeasons.push(Object.assign({\n episodes: filteredEpisodes\n }, res));\n }\n\n sortedSeasons = filteredSortedSeasons;\n }\n\n if (invertTable) {\n return sortedSeasons.reverse();\n }\n\n return sortedSeasons;\n },\n\n specials() {\n const {\n show\n } = this;\n\n if (!show.seasons) {\n return [];\n }\n\n return show.seasons.filter(season => season.season === 0);\n }\n\n },\n\n mounted() {\n const {\n setEpisodeSceneNumbering,\n setAbsoluteSceneNumbering,\n setInputValidInvalid\n } = this;\n this.loadShow();\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.reflowLayout();\n });\n });\n $(document.body).on('click', '.seasonCheck', event => {\n const seasCheck = event.currentTarget;\n const seasNo = $(seasCheck).attr('id');\n $('#collapseSeason-' + seasNo).collapse('show');\n const seasonIdentifier = 's' + seasNo;\n $('.epCheck:visible').each((index, element) => {\n const epParts = $(element).attr('id').split('e');\n\n if (epParts[0] === seasonIdentifier) {\n element.checked = seasCheck.checked;\n }\n });\n });\n $(document.body).on('change', '.sceneSeasonXEpisode', event => {\n const target = event.currentTarget; // Strip non-numeric characters\n\n const value = $(target).val();\n $(target).val(value.replace(/[^\\dXx]*/g, ''));\n const forSeason = $(target).attr('data-for-season');\n const forEpisode = $(target).attr('data-for-episode'); // If empty reset the field\n\n if (value === '') {\n setEpisodeSceneNumbering(forSeason, forEpisode, null, null);\n return;\n }\n\n const m = $(target).val().match(/^(\\d+)x(\\d+)$/i);\n const onlyEpisode = $(target).val().match(/^(\\d+)$/i);\n let sceneSeason = null;\n let sceneEpisode = null;\n let isValid = false;\n\n if (m) {\n sceneSeason = m[1];\n sceneEpisode = m[2];\n isValid = setInputValidInvalid(true, $(target));\n } else if (onlyEpisode) {\n // For example when '5' is filled in instead of '1x5', asume it's the first season\n sceneSeason = forSeason;\n sceneEpisode = onlyEpisode[1];\n isValid = setInputValidInvalid(true, $(target));\n } else {\n isValid = setInputValidInvalid(false, $(target));\n }\n\n if (isValid) {\n setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode);\n }\n });\n $(document.body).on('change', '.sceneAbsolute', event => {\n const target = event.currentTarget; // Strip non-numeric characters\n\n $(target).val($(target).val().replace(/[^\\dXx]*/g, ''));\n const forAbsolute = $(target).attr('data-for-absolute');\n const m = $(target).val().match(/^(\\d{1,3})$/i);\n let sceneAbsolute = null;\n\n if (m) {\n sceneAbsolute = m[1];\n }\n\n setAbsoluteSceneNumbering(forAbsolute, sceneAbsolute);\n });\n },\n\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__.humanFileSize,\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_10__.mapActions)({\n getShow: 'getShow',\n // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n getEpisodes: 'getEpisodes',\n setCurrentShow: 'setCurrentShow',\n setRecentShow: 'setRecentShow'\n }),\n\n async loadShow() {\n const {\n setCurrentShow,\n showSlug,\n initializeEpisodes,\n getShow\n } = this; // We need detailed info for the xem / scene exceptions, so let's get it.\n\n await getShow({\n showSlug,\n detailed: true\n }); // Let's tell the store which show we currently want as current.\n // Run this after getShow(), as it will trigger the initializeEpisodes() method.\n\n setCurrentShow(showSlug); // Load all episodes\n\n initializeEpisodes();\n },\n\n statusQualityUpdate(event) {\n const {\n selectedEpisodes,\n setStatus,\n setQuality\n } = this;\n\n if (event.newQuality !== null && event.newQuality !== 'Change quality to:') {\n setQuality(event.newQuality, selectedEpisodes);\n }\n\n if (event.newStatus !== null && event.newStatus !== 'Change status to:') {\n setStatus(event.newStatus, selectedEpisodes);\n }\n },\n\n setQuality(quality, episodes) {\n const {\n showSlug,\n getEpisodes,\n show\n } = this;\n const patchData = {};\n episodes.forEach(episode => {\n patchData[episode.slug] = {\n quality: Number.parseInt(quality, 10)\n };\n });\n api.patch('series/' + show.id.slug + '/episodes', patchData) // eslint-disable-line no-undef\n .then(_ => {\n console.info(`patched show ${show.id.slug} with quality ${quality}`);\n [...new Set(episodes.map(episode => episode.season))].forEach(season => {\n getEpisodes({\n showSlug,\n season\n });\n });\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n setStatus(status, episodes) {\n const {\n showSlug,\n getEpisodes\n } = this;\n const patchData = {};\n episodes.forEach(episode => {\n patchData[episode.slug] = {\n status\n };\n });\n api.patch(`series/${showSlug}/episodes`, patchData) // eslint-disable-line no-undef\n .then(_ => {\n console.info(`patched show ${showSlug} with status ${status}`);\n [...new Set(episodes.map(episode => episode.season))].forEach(season => {\n getEpisodes({\n showSlug,\n season\n });\n });\n }).catch(error => {\n console.error(String(error));\n }); // New status Wanted\n\n if (status === 3) {\n this.$modal.show('query-start-backlog-search', {\n episodes\n });\n } // New status Failed\n\n\n if (status === 11) {\n this.$modal.show('query-mark-failed-and-search', {\n episodes\n });\n }\n },\n\n parseDateFn(row) {\n const {\n fuzzyParseDateTime\n } = this;\n return fuzzyParseDateTime(row.airDate);\n },\n\n rowStyleClassFn(row) {\n const {\n getOverviewStatus,\n show\n } = this;\n\n if (Object.keys(row).includes('vgt_header_id')) {\n return;\n }\n\n const overview = getOverviewStatus(row.status, row.quality, show.config.qualities).toLowerCase().trim();\n return overview;\n },\n\n /**\n * Add (reduce) the total episodes filesize.\n * @param {object} headerRow header row object.\n * @returns {string} - Human readable file size.\n */\n addFileSize(headerRow) {\n return (0,_utils_core__WEBPACK_IMPORTED_MODULE_2__.humanFileSize)(headerRow.children.reduce((a, b) => a + (b.file.size || 0), 0));\n },\n\n searchSubtitle(event, episode, lang) {\n const {\n showSlug,\n getEpisodes,\n show,\n subtitleSearchComponents\n } = this;\n const SubtitleSearchClass = Vue.extend(_subtitle_search_vue__WEBPACK_IMPORTED_MODULE_7__.default); // eslint-disable-line no-undef\n\n const instance = new SubtitleSearchClass({\n propsData: {\n show,\n episode,\n key: episode.originalIndex,\n lang\n },\n parent: this\n }); // Update the show, as we downloaded new subtitle(s)\n\n instance.$on('update', event => {\n // This could be replaced by the generic websocket updates in future.\n if (event.reason === 'new subtitles found') {\n getEpisodes({\n showSlug,\n season: episode.season\n });\n }\n });\n const node = document.createElement('div');\n const tableRef = episode.season === 0 ? 'table-specials' : 'table-seasons';\n this.$refs[tableRef].$refs[`row-${episode.originalIndex}`][0].after(node);\n instance.$mount(node);\n subtitleSearchComponents.push(instance);\n },\n\n /**\n * Attaches IMDB tooltip\n */\n reflowLayout: lodash_debounce__WEBPACK_IMPORTED_MODULE_0___default()(() => {\n console.debug('Reflowing layout');\n (0,_utils_jquery__WEBPACK_IMPORTED_MODULE_4__.addQTip)(); // eslint-disable-line no-undef\n }, 1000),\n\n setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode) {\n const {\n $snotify,\n show\n } = this;\n\n if (!show.config.scene) {\n $snotify.warning('To change episode scene numbering you need to enable the show option `scene` first', 'Warning', {\n timeout: 0\n });\n }\n\n if (sceneSeason === '') {\n sceneSeason = null;\n }\n\n if (sceneEpisode === '') {\n sceneEpisode = null;\n }\n\n $.getJSON('home/setSceneNumbering', {\n showslug: show.id.slug,\n forSeason,\n forEpisode,\n sceneSeason,\n sceneEpisode\n }, data => {\n // Set the values we get back\n if (data.sceneSeason === null || data.sceneEpisode === null) {\n $(`#sceneSeasonXEpisode_${show.id[show.indexer]}_${forSeason}_${forEpisode}`).val('');\n } else {\n $(`#sceneSeasonXEpisode_${show.id[show.indexer]}_${forSeason}_${forEpisode}`).val(data.sceneSeason + 'x' + data.sceneEpisode);\n }\n\n if (!data.success) {\n if (data.errorMessage) {\n alert(data.errorMessage); // eslint-disable-line no-alert\n } else {\n alert('Update failed.'); // eslint-disable-line no-alert\n }\n }\n });\n },\n\n setAbsoluteSceneNumbering(forAbsolute, sceneAbsolute) {\n const {\n $snotify,\n show\n } = this;\n\n if (!show.config.scene) {\n $snotify.warning('To change an anime episode scene numbering you need to enable the show option `scene` first', 'Warning', {\n timeout: 0\n });\n }\n\n if (sceneAbsolute === '') {\n sceneAbsolute = null;\n }\n\n $.getJSON('home/setSceneNumbering', {\n showslug: show.id.slug,\n forAbsolute,\n sceneAbsolute\n }, data => {\n // Set the values we get back\n if (data.sceneAbsolute === null) {\n $(`#sceneAbsolute_${show.id[show.indexer]}_${forAbsolute}`).val('');\n } else {\n $(`#sceneAbsolute_${show.id[show.indexer]}_${forAbsolute}`).val(data.sceneAbsolute);\n }\n\n if (!data.success) {\n if (data.errorMessage) {\n alert(data.errorMessage); // eslint-disable-line no-alert\n } else {\n alert('Update failed.'); // eslint-disable-line no-alert\n }\n }\n });\n },\n\n setInputValidInvalid(valid, el) {\n if (valid) {\n $(el).css({\n 'background-color': '#90EE90',\n // Green\n 'color': '#FFF',\n // eslint-disable-line quote-props\n 'font-weight': 'bold'\n });\n return true;\n }\n\n $(el).css({\n 'background-color': '#FF0000',\n // Red\n 'color': '#FFF !important',\n // eslint-disable-line quote-props\n 'font-weight': 'bold'\n });\n return false;\n },\n\n /**\n * Check if any of the episodes in this season does not have the status \"unaired\".\n * If that's the case we want to manual season search icon.\n * @param {object} season - A season object.\n * @returns {Boolean} - true if one of the seasons episodes has a status 'unaired'.\n */\n anyEpisodeNotUnaired(season) {\n return season.children.filter(ep => ep.status !== 'Unaired').length > 0;\n },\n\n episodesInverse(season) {\n const {\n invertTable\n } = this;\n\n if (!season.children) {\n return [];\n }\n\n if (invertTable) {\n return season.children.slice().reverse();\n }\n\n return season.children;\n },\n\n /**\n * Check if the season/episode combination exists in the scene numbering.\n * @param {Object} episode - object.\n * @returns {Object} with scene season and episodes mapped numbering.\n */\n getSceneNumbering(episode) {\n const {\n show\n } = this;\n const {\n sceneNumbering,\n xemNumbering\n } = show;\n\n if (!show.config.scene) {\n return {\n season: 0,\n episode: 0\n };\n } // Manually configured scene numbering\n\n\n if (sceneNumbering.length !== 0) {\n const mapped = sceneNumbering.filter(x => {\n return x.source.season === episode.season && x.source.episode === episode.episode;\n });\n\n if (mapped.length !== 0) {\n return mapped[0].destination;\n }\n } // Scene numbering downloaded from thexem.de.\n\n\n if (xemNumbering.length !== 0) {\n const mapped = xemNumbering.filter(x => {\n return x.source.season === episode.season && x.source.episode === episode.episode;\n });\n\n if (mapped.length !== 0) {\n return mapped[0].destination;\n }\n }\n\n return {\n season: episode.scene.season || 0,\n episode: episode.scene.episode || 0\n };\n },\n\n getSceneAbsoluteNumbering(episode) {\n const {\n show\n } = this;\n const {\n sceneAbsoluteNumbering,\n xemAbsoluteNumbering\n } = show;\n\n if (!show.config.anime || !show.config.scene) {\n return episode.scene.absoluteNumber;\n }\n\n if (Object.keys(sceneAbsoluteNumbering).length > 0) {\n const mapped = sceneAbsoluteNumbering.filter(x => {\n return x.absolute === episode.absoluteNumber;\n });\n\n if (mapped.length !== 0) {\n return mapped[0].sceneAbsolute;\n }\n }\n\n if (Object.keys(xemAbsoluteNumbering).length > 0) {\n const mapped = xemAbsoluteNumbering.filter(x => {\n return x.absolute === episode.absoluteNumber;\n });\n\n if (mapped.length !== 0) {\n return mapped[0].sceneAbsolute;\n }\n }\n\n return episode.scene.absoluteNumber;\n },\n\n /**\n * Vue-js-modal requires a method, to pass an event to.\n * The event then can be used to assign the value of the episode.\n * @param {Object} event - vue js modal event\n */\n beforeBacklogSearchModalClose(event) {\n this.backlogSearchEpisodes = event.params.episodes;\n },\n\n /**\n * Vue-js-modal requires a method, to pass an event to.\n * The event then can be used to assign the value of the episode.\n * @param {Object} event - vue js modal event\n */\n beforeFailedSearchModalClose(event) {\n this.failedSearchEpisodes = event.params.episodes;\n },\n\n retryDownload(episode) {\n const {\n stateSearch\n } = this;\n return stateSearch.general.failedDownloads.enabled && ['Snatched', 'Snatched (Proper)', 'Snatched (Best)', 'Downloaded'].includes(episode.status);\n },\n\n search(episodes, searchType) {\n const {\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes: [],\n options: {}\n };\n episodes.forEach(episode => {\n data.episodes.push(episode.slug);\n this.$refs[`search-${episode.slug}`].src = 'images/loading16-dark.gif';\n });\n }\n\n api.put(`search/${searchType}`, data) // eslint-disable-line no-undef\n .then(_ => {\n if (episodes.length === 1) {\n console.info(`started search for show: ${show.id.slug} episode: ${episodes[0].slug}`);\n this.$refs[`search-${episodes[0].slug}`].src = 'images/queued.png';\n this.$refs[`search-${episodes[0].slug}`].disabled = true;\n } else {\n console.info('started a full backlog search');\n }\n }).catch(error => {\n console.error(String(error));\n episodes.forEach(episode => {\n data.episodes.push(episode.slug);\n this.$refs[`search-${episodes[0].slug}`].src = 'images/no16.png';\n });\n }).finally(() => {\n this.failedSearchEpisodes = [];\n this.backlogSearchEpisodes = [];\n });\n },\n\n /**\n * Start a backlog search or failed search for the specific episode.\n * A failed search is started depending on the current episodes status.\n * @param {Object} episode - Episode object. If no episode object is passed, a backlog search is started.\n */\n queueSearch(episode) {\n const {\n $modal,\n search,\n retryDownload\n } = this;\n const episodeIdentifier = episode.slug;\n\n if (episode) {\n if (this.$refs[`search-${episodeIdentifier}`].disabled === true) {\n return;\n }\n\n if (retryDownload(episode)) {\n $modal.show('query-mark-failed-and-search', {\n episode\n });\n } else {\n search([episode], 'backlog');\n }\n }\n },\n\n showSubtitleButton(episode) {\n const {\n config,\n show\n } = this;\n return episode.season !== 0 && config.subtitles.enabled && show.config.subtitlesEnabled && !['Snatched', 'Snatched (Proper)', 'Snatched (Best)', 'Downloaded'].includes(episode.status);\n },\n\n totalSeasonEpisodeSize(season) {\n return season.children.filter(x => x.file && x.file.size > 0).reduce((a, b) => a + b.file.size, 0);\n },\n\n getSeasonExceptions(season) {\n const {\n show\n } = this;\n const {\n config\n } = show;\n const {\n aliases\n } = config;\n let bindData = {\n class: 'display: none'\n }; // Map the indexer season to a xem mapped season.\n // check if the season exception also exists in the xem numbering table\n\n let xemSeasons = [];\n let foundInXem = false;\n\n if (show.xemNumbering.length > 0) {\n const xemResult = show.xemNumbering.filter(x => x.source.season === season); // Create an array with unique seasons\n\n xemSeasons = [...new Set(xemResult.map(item => item.destination.season))];\n foundInXem = Boolean(xemSeasons.length);\n } // Check if there is a season exception for this season\n\n\n if (aliases.find(x => x.season === season)) {\n // If there is not a match on the xem table, display it as a medusa scene exception\n bindData = {\n id: `xem-exception-season-${foundInXem ? xemSeasons[0] : season}`,\n alt: foundInXem ? '[xem]' : '[medusa]',\n src: foundInXem ? 'images/xem.png' : 'images/ico/favicon-16.png',\n title: foundInXem ? xemSeasons.reduce((a, b) => {\n return a.concat(aliases.filter(alias => alias.season === b).map(alias => alias.title));\n }, []).join(', ') : aliases.filter(alias => alias.season === season).map(alias => alias.title).join(', ')\n };\n }\n\n return bindData;\n },\n\n updateEpisodeWatched(episode, watched) {\n const {\n showSlug,\n getEpisodes,\n show\n } = this;\n const patchData = {};\n patchData[episode.slug] = {\n watched\n };\n api.patch(`series/${show.id.slug}/episodes`, patchData) // eslint-disable-line no-undef\n .then(_ => {\n console.info(`patched episode ${episode.slug} with watched set to ${watched}`);\n getEpisodes({\n showSlug,\n season: episode.season\n });\n }).catch(error => {\n console.error(String(error));\n });\n episode.watched = watched;\n },\n\n updatePaginationPerPage(rows) {\n const {\n setCookie\n } = this;\n this.paginationPerPage = rows;\n setCookie('pagination-perPage', rows);\n },\n\n onPageChange(params) {\n this.loadEpisodes(params.currentPage);\n },\n\n neededSeasons(page) {\n const {\n layout,\n paginationPerPage,\n show\n } = this;\n const {\n seasonCount\n } = show;\n\n if (!seasonCount || seasonCount.length === 0) {\n return [];\n }\n\n if (!layout.show.pagination.enable) {\n return seasonCount.filter(season => season.season !== 0).map(season => season.season).reverse();\n }\n\n const seasons = show.seasonCount.length - 1;\n let pagesCount = 1;\n let episodeCount = 0;\n const pages = {};\n\n for (let i = seasons; i >= 0; i--) {\n const {\n season\n } = show.seasonCount[i]; // Exclude specials\n\n if (season === 0) {\n break;\n }\n\n if (pagesCount in pages) {\n pages[pagesCount].push(season);\n } else {\n pages[pagesCount] = [season];\n }\n\n episodeCount += show.seasonCount[i].episodeCount;\n\n if (episodeCount / paginationPerPage > pagesCount) {\n pagesCount++;\n pages[pagesCount] = [season];\n }\n\n if (pagesCount > page) {\n break;\n }\n }\n\n return pages[page] || [];\n },\n\n loadEpisodes(page) {\n const {\n showSlug,\n getEpisodes\n } = this; // Wrap getEpisodes into an async/await function, so we can wait for the season to have been committed\n // before going on to the next one.\n\n const _getEpisodes = async showSlug => {\n for (const season of this.neededSeasons(page)) {\n // We're waiting for the results by design, to give vue the chance to update the dom.\n // If we fire all the promises at once for, for example 25 seasons. We'll overload medusa's app\n // and chance is high a number of requests will timeout.\n await getEpisodes({\n showSlug,\n season\n }); // eslint-disable-line no-await-in-loop\n }\n };\n\n _getEpisodes(showSlug);\n },\n\n initializeEpisodes() {\n const {\n getEpisodes,\n showSlug,\n setRecentShow,\n show\n } = this;\n\n if (!show.seasons && show.seasonCount) {\n // Load episodes for the first page.\n this.loadEpisodes(1); // Always get special episodes if available.\n\n if (show.seasonCount.length > 0 && show.seasonCount[0].season === 0) {\n getEpisodes({\n showSlug,\n season: 0\n });\n }\n }\n\n if (show.id.slug) {\n // For now i'm dumping this here\n setRecentShow({\n showSlug: show.id.slug,\n name: show.title\n });\n }\n },\n\n mobileSelectSearch(event, episode) {\n const {\n $snotify,\n $router,\n queueSearch,\n searchSubtitle,\n show\n } = this;\n\n if (event.target.value === 'forced') {\n queueSearch(episode);\n $snotify.success(`Search started for S${episode.season} E${episode.episode}`);\n }\n\n if (event.target.value === 'manual') {\n // Use the router to navigate to snatchSelection.\n $router.push({\n name: 'snatchSelection',\n query: {\n showslug: show.id.slug,\n season: episode.season,\n episode: episode.episode\n }\n });\n }\n\n if (event.target.value === 'subtitle') {\n searchSubtitle(event, episode);\n }\n\n setTimeout(() => {\n event.target.value = 'search action';\n }, 2000);\n }\n\n },\n watch: {\n 'show.id.slug': function (slug) {\n // eslint-disable-line object-shorthand\n // Show's slug has changed, meaning the show's page has finished loading.\n if (slug) {\n // This is still technically jQuery. Meaning whe're still letting jQuery do its thing on the entire dom.\n (0,_utils_jquery__WEBPACK_IMPORTED_MODULE_4__.updateSearchIcons)(slug, this);\n }\n }\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/display-show.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -448,6 +448,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history-compact.vue?vue&type=script&lang=js&": +/*!******************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history-compact.vue?vue&type=script&lang=js& ***! + \******************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mixins/manage-cookie */ \"./src/mixins/manage-cookie.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _helpers_app_link_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/app-link.vue */ \"./src/components/helpers/app-link.vue\");\n/* harmony import */ var v_tooltip__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! v-tooltip */ \"./node_modules/v-tooltip/dist/v-tooltip.esm.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'history-compact',\n components: {\n AppLink: _helpers_app_link_vue__WEBPACK_IMPORTED_MODULE_3__.default,\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_2__.default,\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_5__.VueGoodTable\n },\n directives: {\n tooltip: v_tooltip__WEBPACK_IMPORTED_MODULE_4__.VTooltip\n },\n mixins: [(0,_mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_1__.manageCookieMixin)('historyCompact')],\n\n data() {\n const {\n getCookie\n } = this;\n const perPageDropdown = [25, 50, 100, 250, 500, 1000];\n const columns = [{\n label: 'Time',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n // E.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date',\n hidden: getCookie('Date')\n }, {\n label: 'Episode',\n field: 'episodeTitle',\n sortable: false,\n hidden: getCookie('Status')\n }, {\n label: 'Snatched',\n field: 'snatched',\n type: 'number',\n sortable: false,\n hidden: getCookie('Quality')\n }, {\n label: 'Downloaded',\n field: 'downloaded',\n sortable: false,\n hidden: getCookie('Provider/Group')\n }, {\n label: 'Subtitled',\n field: 'subtitled',\n hidden: getCookie('Release')\n }, {\n label: 'Quality',\n field: 'quality',\n hidden: getCookie('Release')\n }];\n return {\n columns,\n selectedClientStatusValue: [],\n perPageDropdown\n };\n },\n\n mounted() {\n const {\n getCookie,\n getSortFromCookie\n } = this; // Get per-page pagination from cookie\n\n const perPage = getCookie('pagination-perpage-history');\n\n if (perPage) {\n this.remoteHistory.perPage = perPage;\n }\n\n this.remoteHistory.sort = getSortFromCookie();\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_6__.mapState)({\n layout: state => state.config.layout,\n remoteHistory: state => state.history.remoteCompact,\n consts: state => state.config.consts\n }),\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_6__.mapGetters)({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n serverParams() {\n return {\n page: this.remoteHistory.page,\n // What page I want to show\n perPage: this.remoteHistory.perPage,\n // How many items I'm showing per page\n sort: this.remoteHistory.sort,\n filter: this.remoteHistory.filter,\n compact: true\n };\n },\n\n qualityOptions() {\n const {\n consts\n } = this;\n return consts.qualities.values.map(quality => {\n return {\n value: quality.value,\n text: quality.name\n };\n });\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_0__.humanFileSize,\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_6__.mapActions)({\n getHistory: 'getHistory',\n checkHistory: 'checkHistory',\n setStoreLayout: 'setStoreLayout'\n }),\n\n getSortFromCookie() {\n const {\n getCookie\n } = this;\n const sort = getCookie('sort'); // From manage-cookie.js mixin\n\n if (sort) {\n return JSON.parse(sort);\n }\n\n return [{\n field: 'date',\n type: 'desc'\n }];\n },\n\n sortDate(rows) {\n const cloneRows = [...rows];\n return cloneRows.sort(x => x.actionDate).reverse();\n },\n\n getFileBaseName(path) {\n if (path) {\n return path.split(/[/\\\\]/).pop();\n }\n\n return path;\n },\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n updatePaginationPerPage(pageLimit) {\n const {\n setStoreLayout\n } = this;\n setStoreLayout({\n key: 'historyLimit',\n value: pageLimit\n });\n },\n\n onPageChange(params) {\n this.remoteHistory.page = params.currentPage;\n this.loadItems();\n },\n\n onPerPageChange(params) {\n this.setCookie('pagination-perpage-history', params.currentPerPage);\n this.remoteHistory.perPage = params.currentPerPage;\n this.loadItems();\n },\n\n onSortChange(params) {\n this.setCookie('sort', JSON.stringify(params));\n this.remoteHistory.sort = params.filter(item => item.type !== 'none');\n this.loadItems();\n },\n\n onColumnFilter(params) {\n this.remoteHistory.filter = params;\n this.loadItems();\n },\n\n updateClientStatusFilter(event) {\n const combinedStatus = event.reduce((result, item) => {\n return result | item.value;\n }, 0);\n\n if (!this.remoteHistory.filter) {\n this.remoteHistory.filter = {\n columnFilters: {}\n };\n }\n\n this.selectedClientStatusValue = event;\n this.remoteHistory.filter.columnFilters.clientStatus = combinedStatus;\n this.loadItems();\n },\n\n updateQualityFilter(quality) {\n if (!this.remoteHistory.filter) {\n this.remoteHistory.filter = {\n columnFilters: {}\n };\n }\n\n this.remoteHistory.filter.columnFilters.quality = quality.currentTarget.value;\n this.loadItems();\n },\n\n // Load items is what brings back the rows from server\n loadItems() {\n const {\n getHistory\n } = this;\n console.log(this.serverParams);\n getHistory(this.serverParams);\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/history-compact.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history-detailed.vue?vue&type=script&lang=js&": +/*!*******************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history-detailed.vue?vue&type=script&lang=js& ***! + \*******************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mixins/manage-cookie */ \"./src/mixins/manage-cookie.js\");\n/* harmony import */ var _helpers_app_link_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers/app-link.vue */ \"./src/components/helpers/app-link.vue\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _fortawesome_vue_fontawesome__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @fortawesome/vue-fontawesome */ \"./node_modules/@fortawesome/vue-fontawesome/index.es.js\");\n/* harmony import */ var v_tooltip__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! v-tooltip */ \"./node_modules/v-tooltip/dist/v-tooltip.esm.js\");\n/* harmony import */ var vue_multiselect__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vue-multiselect */ \"./node_modules/vue-multiselect/dist/vue-multiselect.min.js\");\n/* harmony import */ var vue_multiselect__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(vue_multiselect__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var vue_multiselect_dist_vue_multiselect_min_css__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! vue-multiselect/dist/vue-multiselect.min.css */ \"./node_modules/vue-multiselect/dist/vue-multiselect.min.css\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'history-detailed',\n components: {\n AppLink: _helpers_app_link_vue__WEBPACK_IMPORTED_MODULE_2__.default,\n FontAwesomeIcon: _fortawesome_vue_fontawesome__WEBPACK_IMPORTED_MODULE_4__.FontAwesomeIcon,\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__.default,\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_8__.VueGoodTable,\n Multiselect: (vue_multiselect__WEBPACK_IMPORTED_MODULE_6___default())\n },\n directives: {\n tooltip: v_tooltip__WEBPACK_IMPORTED_MODULE_5__.VTooltip\n },\n mixins: [(0,_mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_1__.manageCookieMixin)('history-detailed')],\n\n data() {\n const {\n getCookie\n } = this;\n const perPageDropdown = [25, 50, 100, 250, 500, 1000];\n const statusNames = [{\n value: -1,\n text: 'Unset'\n }, {\n value: 1,\n text: 'Unaired'\n }, {\n value: 5,\n text: 'Skipped'\n }, {\n value: 3,\n text: 'Wanted'\n }, {\n value: 2,\n text: 'Snatched'\n }, {\n value: 9,\n text: 'Snatched (Proper)'\n }, {\n value: 12,\n text: 'Snatched (Best)'\n }, {\n value: 4,\n text: 'Downloaded'\n }, {\n value: 6,\n text: 'Archived'\n }, {\n value: 7,\n text: 'Ignored'\n }, {\n value: 10,\n text: 'Subtitled'\n }, {\n value: 11,\n text: 'Failed'\n }];\n const columns = [{\n label: 'Date',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n // E.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date',\n hidden: getCookie('Date')\n }, {\n label: 'Episode',\n field: 'episodeTitle',\n sortable: false,\n hidden: getCookie('Episode')\n }, {\n label: 'Action',\n field: 'statusName',\n filterOptions: {\n enabled: true,\n filterDropdownItems: statusNames\n },\n hidden: getCookie('Action')\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number',\n filterOptions: {\n customFilter: true\n },\n hidden: getCookie('Quality')\n }, {\n label: 'Provider',\n field: 'provider.id',\n filterOptions: {\n enabled: true\n },\n hidden: getCookie('Provider')\n }, {\n label: 'Size',\n field: 'size',\n tdClass: 'align-center',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_0__.humanFileSize,\n type: 'number',\n filterOptions: {\n customFilter: true\n },\n hidden: getCookie('Size')\n }, {\n label: 'Client Status',\n field: 'clientStatus',\n type: 'number',\n filterOptions: {\n customFilter: true\n },\n hidden: getCookie('Client Status')\n }];\n return {\n columns,\n selectedClientStatusValue: [],\n perPageDropdown\n };\n },\n\n mounted() {\n const {\n getCookie,\n getSortFromCookie\n } = this;\n this.loadItems(); // Get per-page pagination from cookie\n\n const perPage = getCookie('pagination-perpage-history');\n const filter = getCookie('filter');\n\n if (perPage) {\n this.remoteHistory.perPage = perPage;\n }\n\n if (filter) {\n this.remoteHistory.filter = JSON.parse(filter);\n }\n\n this.remoteHistory.sort = getSortFromCookie();\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_9__.mapState)({\n layout: state => state.config.layout,\n remoteHistory: state => state.history.remote,\n consts: state => state.config.consts\n }),\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_9__.mapGetters)({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n serverParams() {\n return {\n page: this.remoteHistory.page,\n // What page I want to show\n perPage: this.remoteHistory.perPage,\n // How many items I'm showing per page\n sort: this.remoteHistory.sort,\n filter: this.remoteHistory.filter\n };\n },\n\n qualityOptions() {\n const {\n consts\n } = this;\n return consts.qualities.values.map(quality => {\n return {\n value: quality.value,\n text: quality.name\n };\n });\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_0__.humanFileSize,\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_9__.mapActions)({\n getHistory: 'getHistory',\n setStoreLayout: 'setStoreLayout'\n }),\n\n getSortFromCookie() {\n const {\n getCookie\n } = this;\n const sort = getCookie('sort'); // From manage-cookie.js mixin\n\n if (sort) {\n return JSON.parse(sort);\n }\n\n return [{\n field: 'date',\n type: 'desc'\n }];\n },\n\n rowStyleClassFn(row) {\n return `${row.statusName.toLowerCase()} status` || 'skipped status';\n },\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n onPageChange(params) {\n console.log('page change called');\n console.log(params);\n this.remoteHistory.page = params.currentPage;\n this.loadItems();\n },\n\n onPerPageChange(params) {\n console.log('per page change called');\n this.setCookie('pagination-perpage-history', params.currentPerPage);\n this.remoteHistory.perPage = params.currentPerPage;\n this.loadItems();\n },\n\n onSortChange(params) {\n this.setCookie('sort', JSON.stringify(params));\n this.remoteHistory.sort = params.filter(item => item.type !== 'none');\n this.loadItems();\n },\n\n onColumnFilter(params) {\n this.setCookie('filter', JSON.stringify(params));\n this.remoteHistory.filter = params;\n this.loadItems();\n },\n\n updateClientStatusFilter(event) {\n const combinedStatus = event.reduce((result, item) => {\n return result | item.value;\n }, 0);\n\n if (!this.remoteHistory.filter) {\n this.remoteHistory.filter = {\n columnFilters: {}\n };\n }\n\n this.selectedClientStatusValue = event;\n this.remoteHistory.filter.columnFilters.clientStatus = combinedStatus;\n this.loadItems();\n },\n\n updateQualityFilter(quality) {\n if (!this.remoteHistory.filter) {\n this.remoteHistory.filter = {\n columnFilters: {}\n };\n }\n\n this.remoteHistory.filter.columnFilters.quality = quality.currentTarget.value;\n this.loadItems();\n },\n\n /**\n * Update the size filter.\n * As a specific size filter is useless. I've choosen to use a > or < operator.\n * The backend will parse these into queries.\n * @param {string} size - Operator with size in MB.\n */\n updateSizeFilter(size) {\n // Check for valid syntax, and pass along.\n size = size.currentTarget.value;\n\n if (!size) {\n return;\n }\n\n const validSizeRegex = /[<>] \\d{2,6}/;\n\n if (size.match(validSizeRegex)) {\n this.invalidSizeMessage = '';\n\n if (!this.remoteHistory.filter) {\n this.remoteHistory.filter = {\n columnFilters: {}\n };\n }\n\n this.remoteHistory.filter.columnFilters.size = size;\n this.loadItems();\n }\n },\n\n // Load items is what brings back the rows from server\n loadItems() {\n const {\n getHistory\n } = this;\n console.log(this.serverParams);\n getHistory(this.serverParams);\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/history-detailed.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history.vue?vue&type=script&lang=js&": /*!**********************************************************************************************************************************************************************************************!*\ !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history.vue?vue&type=script&lang=js& ***! @@ -455,7 +477,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* provided dependency */ var $ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'history',\n template: '#history-template',\n\n data() {\n return {\n layoutOptions: [{\n value: 'compact',\n text: 'Compact'\n }, {\n value: 'detailed',\n text: 'Detailed'\n }]\n };\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_0__.mapState)({\n config: state => state.config.general,\n // Renamed because of the computed property 'layout'.\n stateLayout: state => state.config.layout\n }),\n historyLayout: {\n get() {\n const {\n stateLayout\n } = this;\n return stateLayout.history;\n },\n\n set(layout) {\n const {\n setLayout\n } = this;\n const page = 'history';\n setLayout({\n page,\n layout\n });\n }\n\n }\n },\n\n mounted() {\n const unwatch = this.$watch('stateLayout.history', () => {\n unwatch();\n const {\n historyLayout: layout,\n config\n } = this;\n $('#historyTable:has(tbody tr)').tablesorter({\n widgets: ['saveSort', 'zebra', 'filter'],\n sortList: [[0, 1]],\n textExtraction: function () {\n if (layout === 'detailed') {\n return {\n // 0: Time, 1: Episode, 2: Action, 3: Provider, 4: Quality\n 0: node => $(node).find('time').attr('datetime'),\n 1: node => $(node).find('a').text(),\n 4: node => $(node).attr('quality')\n };\n } // 0: Time, 1: Episode, 2: Snatched, 3: Downloaded\n\n\n const compactExtract = {\n 0: node => $(node).find('time').attr('datetime'),\n 1: node => $(node).find('a').text(),\n 2: node => $(node).find('img').attr('title') === undefined ? '' : $(node).find('img').attr('title'),\n 3: node => $(node).text()\n };\n\n if (config.subtitles.enabled) {\n // 4: Subtitled, 5: Quality\n compactExtract[4] = node => $(node).find('img').attr('title') === undefined ? '' : $(node).find('img').attr('title');\n\n compactExtract[5] = node => $(node).attr('quality');\n } else {\n // 4: Quality\n compactExtract[4] = node => $(node).attr('quality');\n }\n\n return compactExtract;\n }(),\n headers: function () {\n if (layout === 'detailed') {\n return {\n 0: {\n sorter: 'realISODate'\n }\n };\n }\n\n return {\n 0: {\n sorter: 'realISODate'\n },\n 2: {\n sorter: 'text'\n }\n };\n }()\n });\n });\n $('#history_limit').on('change', function () {\n window.location.href = $('base').attr('href') + 'history/?limit=' + $(this).val();\n });\n },\n\n methods: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_0__.mapActions)({\n setLayout: 'setLayout'\n })\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/history.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _history_detailed_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./history-detailed.vue */ \"./src/components/history-detailed.vue\");\n/* harmony import */ var _history_compact_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./history-compact.vue */ \"./src/components/history-compact.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'show-history',\n components: {\n HistoryCompact: _history_compact_vue__WEBPACK_IMPORTED_MODULE_2__.default,\n HistoryDetailed: _history_detailed_vue__WEBPACK_IMPORTED_MODULE_1__.default\n },\n\n data() {\n return {\n loading: false,\n loadingMessage: '',\n layoutOptions: [{\n value: 'compact',\n text: 'Compact'\n }, {\n value: 'detailed',\n text: 'Detailed'\n }]\n };\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_3__.mapState)({\n config: state => state.config.general,\n stateLayout: state => state.config.layout\n }),\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_3__.mapGetters)({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n layout: {\n get() {\n const {\n stateLayout\n } = this;\n return stateLayout.history;\n },\n\n set(layout) {\n const {\n setLayout\n } = this;\n const page = 'history';\n setLayout({\n page,\n layout\n });\n }\n\n }\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_0__.humanFileSize,\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_3__.mapActions)({\n setLayout: 'setLayout'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/history.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -609,7 +631,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue_truncate_collapsed__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-truncate-collapsed */ \"./node_modules/vue-truncate-collapsed/dist/vue-truncate-collapsed.min.es.js\");\n/* harmony import */ var country_language__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! country-language */ \"./node_modules/country-language/index.js\");\n/* harmony import */ var vue_scrollto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-scrollto */ \"./node_modules/vue-scrollto/vue-scrollto.js\");\n/* harmony import */ var vue_scrollto__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_scrollto__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _utils_jquery__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/jquery */ \"./src/utils/jquery.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n/**\n * Return the first item of `values` that is not `null`, `undefined` or `NaN`.\n * @param {...any} values - Values to check.\n * @returns {any} - The first item that fits the criteria, `undefined` otherwise.\n */\n\nconst resolveToValue = (...values) => {\n return values.find(value => {\n return !Number.isNaN(value) && value !== null && value !== undefined;\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'show-header',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_6__.AppLink,\n Asset: _helpers__WEBPACK_IMPORTED_MODULE_6__.Asset,\n QualityPill: _helpers__WEBPACK_IMPORTED_MODULE_6__.QualityPill,\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_6__.StateSwitch,\n Truncate: vue_truncate_collapsed__WEBPACK_IMPORTED_MODULE_0__.default\n },\n props: {\n /**\n * Page type: show or snatch-selection\n */\n type: {\n type: String,\n default: 'show',\n validator: value => ['show', 'snatch-selection'].includes(value)\n },\n\n /**\n * Show Slug\n */\n slug: {\n type: String\n },\n\n /**\n * Season\n */\n showSeason: {\n type: Number\n },\n\n /**\n * Episode\n */\n showEpisode: {\n type: Number\n },\n\n /**\n * Manual Search Type (snatch-selection)\n */\n manualSearchType: {\n type: String\n }\n },\n\n data() {\n return {\n jumpToSeason: 'jump',\n selectedStatus: 'Change status to:',\n selectedQuality: 'Change quality to:',\n overviewStatus: [{\n id: 'wanted',\n checked: true,\n name: 'Wanted'\n }, {\n id: 'allowed',\n checked: true,\n name: 'Allowed'\n }, {\n id: 'preferred',\n checked: true,\n name: 'Preferred'\n }, {\n id: 'skipped',\n checked: true,\n name: 'Skipped'\n }, {\n id: 'snatched',\n checked: true,\n name: 'Snatched'\n }]\n };\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_7__.mapState)({\n config: state => state.config.general,\n layout: state => state.config.layout,\n shows: state => state.shows.shows,\n indexers: state => state.config.indexers,\n indexerConfig: state => state.config.indexers.indexers,\n displaySpecials: state => state.config.layout.show.specials,\n qualities: state => state.config.consts.qualities.values,\n statuses: state => state.config.consts.statuses,\n search: state => state.config.search,\n configLoaded: state => state.config.layout.fanartBackground !== null\n }),\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_7__.mapGetters)({\n show: 'getCurrentShow',\n getEpisode: 'getEpisode',\n getOverviewStatus: 'getOverviewStatus',\n getQualityPreset: 'getQualityPreset',\n getStatus: 'getStatus'\n }),\n\n season() {\n return resolveToValue(this.showSeason, Number(this.$route.query.season));\n },\n\n episode() {\n return resolveToValue(this.showEpisode, Number(this.$route.query.episode));\n },\n\n showIndexerUrl() {\n const {\n show,\n indexerConfig\n } = this;\n\n if (!show.indexer) {\n return;\n }\n\n const id = show.id[show.indexer];\n const indexerUrl = indexerConfig[show.indexer].showUrl;\n return `${indexerUrl}${id}`;\n },\n\n activeShowQueueStatuses() {\n const {\n showQueueStatus\n } = this.show;\n\n if (!showQueueStatus) {\n return [];\n }\n\n return showQueueStatus.filter(status => status.active === true);\n },\n\n showGenres() {\n const {\n show,\n dedupeGenres\n } = this;\n const {\n imdbInfo\n } = show;\n const {\n genres\n } = imdbInfo;\n let result = [];\n\n if (genres) {\n result = dedupeGenres(genres.split('|'));\n }\n\n return result;\n },\n\n episodeSummary() {\n const {\n getOverviewStatus,\n show\n } = this;\n const {\n seasons\n } = show;\n const summary = {\n Unaired: 0,\n Skipped: 0,\n Wanted: 0,\n Snatched: 0,\n Preferred: 0,\n Allowed: 0\n };\n seasons.forEach(season => {\n season.episodes.forEach(episode => {\n summary[getOverviewStatus(episode.status, episode.quality, show.config.qualities)] += 1;\n });\n });\n return summary;\n },\n\n changeStatusOptions() {\n const {\n search,\n getStatus,\n statuses\n } = this;\n const {\n general\n } = search;\n\n if (statuses.length === 0) {\n return [];\n } // Get status objects, in this order\n\n\n const defaultOptions = ['wanted', 'skipped', 'ignored', 'downloaded', 'archived'].map(key => getStatus({\n key\n }));\n\n if (general.failedDownloads.enabled) {\n defaultOptions.push(getStatus({\n key: 'failed'\n }));\n }\n\n return defaultOptions;\n },\n\n combinedQualities() {\n const {\n allowed,\n preferred\n } = this.show.config.qualities;\n return (0,_utils_core__WEBPACK_IMPORTED_MODULE_4__.combineQualities)(allowed, preferred);\n },\n\n seasons() {\n const {\n show\n } = this;\n const {\n seasonCount\n } = show;\n\n if (!seasonCount) {\n return [];\n } // Only return an array with seasons (integers)\n\n\n return seasonCount.map(season => season.season);\n },\n\n episodeTitle() {\n const {\n getEpisode,\n show,\n season,\n episode\n } = this;\n\n if (!(show.id.slug && season && episode)) {\n return '';\n }\n\n const curEpisode = getEpisode({\n showSlug: show.id.slug,\n season,\n episode\n });\n\n if (curEpisode) {\n return curEpisode.title;\n }\n\n return '';\n }\n\n },\n\n mounted() {\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.$nextTick(() => this.reflowLayout());\n });\n });\n this.$watch('show', function (slug) {\n // eslint-disable-line object-shorthand\n // Show has changed. Meaning we should reflow the layout.\n if (slug) {\n const {\n reflowLayout\n } = this;\n this.$nextTick(() => reflowLayout());\n }\n }, {\n deep: true\n });\n },\n\n methods: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_7__.mapActions)(['setSpecials']),\n combineQualities: _utils_core__WEBPACK_IMPORTED_MODULE_4__.combineQualities,\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_4__.humanFileSize,\n\n changeStatusClicked() {\n const {\n changeStatusOptions,\n changeQualityOptions,\n selectedStatus,\n selectedQuality\n } = this;\n this.$emit('update', {\n newStatus: selectedStatus,\n newQuality: selectedQuality,\n statusOptions: changeStatusOptions,\n qualityOptions: changeQualityOptions\n });\n },\n\n toggleSpecials() {\n const {\n setSpecials\n } = this;\n setSpecials(!this.displaySpecials);\n },\n\n reverse(array) {\n return array ? array.slice().reverse() : [];\n },\n\n dedupeGenres(genres) {\n return genres ? [...new Set(genres.slice(0).map(genre => genre.replace('-', ' ')))] : [];\n },\n\n getCountryISO2ToISO3(country) {\n return (0,country_language__WEBPACK_IMPORTED_MODULE_1__.getLanguage)(country).iso639_2en;\n },\n\n toggleConfigOption(option) {\n const {\n show\n } = this;\n const {\n config\n } = show;\n this.show.config[option] = !this.show.config[option];\n const data = {\n config: {\n [option]: config[option]\n }\n };\n _api__WEBPACK_IMPORTED_MODULE_3__.api.patch('series/' + show.id.slug, data).then(_ => {\n this.$snotify.success(`${data.config[option] ? 'enabled' : 'disabled'} show option ${option}`, 'Saved', {\n timeout: 5000\n });\n }).catch(error => {\n this.$snotify.error('Error while trying to save \"' + show.title + '\": ' + error.message || 0, 'Error');\n });\n },\n\n reflowLayout() {\n (0,_utils_jquery__WEBPACK_IMPORTED_MODULE_5__.attachImdbTooltip)(); // eslint-disable-line no-undef\n }\n\n },\n watch: {\n jumpToSeason(season) {\n // Don't jump until an option is selected\n if (season !== 'jump') {\n // Calculate duration\n let duration = (this.seasons.length - season) * 50;\n duration = Math.max(500, Math.min(duration, 2000)); // Limit to (500ms <= duration <= 2000ms)\n // Calculate offset\n\n let offset = -50; // Navbar\n // Needs extra offset when the sub menu is \"fixed\".\n\n offset -= window.matchMedia('(min-width: 1281px)').matches ? 40 : 0;\n const name = `season-${season}`;\n console.debug(`Jumping to #${name} (${duration}ms)`);\n (0,vue_scrollto__WEBPACK_IMPORTED_MODULE_2__.scrollTo)(`[name=\"${name}\"]`, duration, {\n container: 'body',\n easing: 'ease-in-out',\n offset\n }); // Update URL hash\n\n window.location.hash = name; // Reset jump\n\n this.jumpToSeason = 'jump';\n }\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/show-header.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue_truncate_collapsed__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-truncate-collapsed */ \"./node_modules/vue-truncate-collapsed/dist/vue-truncate-collapsed.min.es.js\");\n/* harmony import */ var country_language__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! country-language */ \"./node_modules/country-language/index.js\");\n/* harmony import */ var vue_scrollto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-scrollto */ \"./node_modules/vue-scrollto/vue-scrollto.js\");\n/* harmony import */ var vue_scrollto__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_scrollto__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _utils_jquery__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/jquery */ \"./src/utils/jquery.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n/**\n * Return the first item of `values` that is not `null`, `undefined` or `NaN`.\n * @param {...any} values - Values to check.\n * @returns {any} - The first item that fits the criteria, `undefined` otherwise.\n */\n\nconst resolveToValue = (...values) => {\n return values.find(value => {\n return !Number.isNaN(value) && value !== null && value !== undefined;\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'show-header',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_6__.AppLink,\n Asset: _helpers__WEBPACK_IMPORTED_MODULE_6__.Asset,\n QualityPill: _helpers__WEBPACK_IMPORTED_MODULE_6__.QualityPill,\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_6__.StateSwitch,\n Truncate: vue_truncate_collapsed__WEBPACK_IMPORTED_MODULE_0__.default\n },\n props: {\n /**\n * Page type: show or snatch-selection\n */\n type: {\n type: String,\n default: 'show',\n validator: value => ['show', 'snatch-selection'].includes(value)\n },\n\n /**\n * Show Slug\n */\n slug: {\n type: String\n },\n\n /**\n * Season\n */\n showSeason: {\n type: Number\n },\n\n /**\n * Episode\n */\n showEpisode: {\n type: Number\n },\n\n /**\n * Manual Search Type (snatch-selection)\n */\n manualSearchType: {\n type: String\n }\n },\n\n data() {\n return {\n jumpToSeason: 'jump',\n selectedStatus: 'Change status to:',\n selectedQuality: 'Change quality to:',\n overviewStatus: [{\n id: 'wanted',\n checked: true,\n name: 'Wanted'\n }, {\n id: 'allowed',\n checked: true,\n name: 'Allowed'\n }, {\n id: 'preferred',\n checked: true,\n name: 'Preferred'\n }, {\n id: 'skipped',\n checked: true,\n name: 'Skipped'\n }, {\n id: 'snatched',\n checked: true,\n name: 'Snatched'\n }]\n };\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_7__.mapState)({\n config: state => state.config.general,\n layout: state => state.config.layout,\n shows: state => state.shows.shows,\n indexers: state => state.config.indexers,\n indexerConfig: state => state.config.indexers.indexers,\n displaySpecials: state => state.config.layout.show.specials,\n qualities: state => state.config.consts.qualities.values,\n statuses: state => state.config.consts.statuses,\n search: state => state.config.search,\n configLoaded: state => state.config.layout.fanartBackground !== null\n }),\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_7__.mapGetters)({\n show: 'getCurrentShow',\n getEpisode: 'getEpisode',\n getOverviewStatus: 'getOverviewStatus',\n getQualityPreset: 'getQualityPreset',\n getStatus: 'getStatus'\n }),\n\n season() {\n return resolveToValue(this.showSeason, Number(this.$route.query.season));\n },\n\n episode() {\n return resolveToValue(this.showEpisode, Number(this.$route.query.episode));\n },\n\n showIndexerUrl() {\n const {\n show,\n indexerConfig\n } = this;\n\n if (!show.indexer) {\n return;\n }\n\n const id = show.id[show.indexer];\n const indexerUrl = indexerConfig[show.indexer].showUrl;\n return `${indexerUrl}${id}`;\n },\n\n activeShowQueueStatuses() {\n const {\n showQueueStatus\n } = this.show;\n\n if (!showQueueStatus) {\n return [];\n }\n\n return showQueueStatus.filter(status => status.active === true);\n },\n\n showGenres() {\n const {\n show,\n dedupeGenres\n } = this;\n const {\n imdbInfo\n } = show;\n const {\n genres\n } = imdbInfo;\n let result = [];\n\n if (genres) {\n result = dedupeGenres(genres.split('|'));\n }\n\n return result;\n },\n\n episodeSummary() {\n const {\n getOverviewStatus,\n show\n } = this;\n const {\n seasons\n } = show;\n const summary = {\n Unaired: 0,\n Skipped: 0,\n Wanted: 0,\n Snatched: 0,\n Preferred: 0,\n Allowed: 0\n };\n seasons.forEach(season => {\n season.children.forEach(episode => {\n summary[getOverviewStatus(episode.status, episode.quality, show.config.qualities)] += 1;\n });\n });\n return summary;\n },\n\n changeStatusOptions() {\n const {\n search,\n getStatus,\n statuses\n } = this;\n const {\n general\n } = search;\n\n if (statuses.length === 0) {\n return [];\n } // Get status objects, in this order\n\n\n const defaultOptions = ['wanted', 'skipped', 'ignored', 'downloaded', 'archived'].map(key => getStatus({\n key\n }));\n\n if (general.failedDownloads.enabled) {\n defaultOptions.push(getStatus({\n key: 'failed'\n }));\n }\n\n return defaultOptions;\n },\n\n combinedQualities() {\n const {\n allowed,\n preferred\n } = this.show.config.qualities;\n return (0,_utils_core__WEBPACK_IMPORTED_MODULE_4__.combineQualities)(allowed, preferred);\n },\n\n seasons() {\n const {\n show\n } = this;\n const {\n seasonCount\n } = show;\n\n if (!seasonCount) {\n return [];\n } // Only return an array with seasons (integers)\n\n\n return seasonCount.map(season => season.season);\n },\n\n episodeTitle() {\n const {\n getEpisode,\n show,\n season,\n episode\n } = this;\n\n if (!(show.id.slug && season && episode)) {\n return '';\n }\n\n const curEpisode = getEpisode({\n showSlug: show.id.slug,\n season,\n episode\n });\n\n if (curEpisode) {\n return curEpisode.title;\n }\n\n return '';\n }\n\n },\n\n mounted() {\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.$nextTick(() => this.reflowLayout());\n });\n });\n this.$watch('show', function (slug) {\n // eslint-disable-line object-shorthand\n // Show has changed. Meaning we should reflow the layout.\n if (slug) {\n const {\n reflowLayout\n } = this;\n this.$nextTick(() => reflowLayout());\n }\n }, {\n deep: true\n });\n },\n\n methods: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_7__.mapActions)(['setSpecials']),\n combineQualities: _utils_core__WEBPACK_IMPORTED_MODULE_4__.combineQualities,\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_4__.humanFileSize,\n\n changeStatusClicked() {\n const {\n changeStatusOptions,\n changeQualityOptions,\n selectedStatus,\n selectedQuality\n } = this;\n this.$emit('update', {\n newStatus: selectedStatus,\n newQuality: selectedQuality,\n statusOptions: changeStatusOptions,\n qualityOptions: changeQualityOptions\n });\n },\n\n toggleSpecials() {\n const {\n setSpecials\n } = this;\n setSpecials(!this.displaySpecials);\n },\n\n reverse(array) {\n return array ? array.slice().reverse() : [];\n },\n\n dedupeGenres(genres) {\n return genres ? [...new Set(genres.slice(0).map(genre => genre.replace('-', ' ')))] : [];\n },\n\n getCountryISO2ToISO3(country) {\n return (0,country_language__WEBPACK_IMPORTED_MODULE_1__.getLanguage)(country).iso639_2en;\n },\n\n toggleConfigOption(option) {\n const {\n show\n } = this;\n const {\n config\n } = show;\n this.show.config[option] = !this.show.config[option];\n const data = {\n config: {\n [option]: config[option]\n }\n };\n _api__WEBPACK_IMPORTED_MODULE_3__.api.patch('series/' + show.id.slug, data).then(_ => {\n this.$snotify.success(`${data.config[option] ? 'enabled' : 'disabled'} show option ${option}`, 'Saved', {\n timeout: 5000\n });\n }).catch(error => {\n this.$snotify.error('Error while trying to save \"' + show.title + '\": ' + error.message || 0, 'Error');\n });\n },\n\n reflowLayout() {\n (0,_utils_jquery__WEBPACK_IMPORTED_MODULE_5__.attachImdbTooltip)(); // eslint-disable-line no-undef\n }\n\n },\n watch: {\n jumpToSeason(season) {\n // Don't jump until an option is selected\n if (season !== 'jump') {\n // Calculate duration\n let duration = (this.seasons.length - season) * 50;\n duration = Math.max(500, Math.min(duration, 2000)); // Limit to (500ms <= duration <= 2000ms)\n // Calculate offset\n\n let offset = -50; // Navbar\n // Needs extra offset when the sub menu is \"fixed\".\n\n offset -= window.matchMedia('(min-width: 1281px)').matches ? 40 : 0;\n const name = `season-${season}`;\n console.debug(`Jumping to #${name} (${duration}ms)`);\n (0,vue_scrollto__WEBPACK_IMPORTED_MODULE_2__.scrollTo)(`[name=\"${name}\"]`, duration, {\n container: 'body',\n easing: 'ease-in-out',\n offset\n }); // Update URL hash\n\n window.location.hash = name; // Reset jump\n\n this.jumpToSeason = 'jump';\n }\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/show-header.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -697,7 +719,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _show_history_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./show-history.vue */ \"./src/components/show-history.vue\");\n/* harmony import */ var _show_results_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./show-results.vue */ \"./src/components/show-results.vue\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'snatch-selection',\n template: '#snatch-selection-template',\n components: {\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_3__.default,\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_0__.default,\n ShowHistory: _show_history_vue__WEBPACK_IMPORTED_MODULE_1__.default,\n ShowResults: _show_results_vue__WEBPACK_IMPORTED_MODULE_2__.default\n },\n props: {\n /**\n * Show Slug\n */\n slug: {\n type: String\n }\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_4__.mapState)({\n shows: state => state.shows.shows,\n config: state => state.config.general,\n search: state => state.config.search,\n history: state => state.history\n }),\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_4__.mapGetters)({\n show: 'getCurrentShow',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired',\n getShowHistoryBySlug: 'getShowHistoryBySlug',\n getEpisode: 'getEpisode'\n }),\n\n showSlug() {\n const {\n slug\n } = this;\n return slug || this.$route.query.showslug;\n },\n\n season() {\n return Number(this.$route.query.season);\n },\n\n episode() {\n if (this.$route.query.manual_search_type === 'season') {\n return;\n }\n\n return Number(this.$route.query.episode);\n },\n\n manualSearchType() {\n return this.$route.query.manual_search_type;\n }\n\n },\n methods: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_4__.mapActions)({\n getShow: 'getShow',\n // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n getHistory: 'getHistory'\n }),\n\n // TODO: Move this to show-results!\n getReleaseNameClasses(name) {\n const {\n effectiveIgnored,\n effectiveRequired,\n search,\n show\n } = this;\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n\n return classes.join(' ');\n }\n\n },\n\n mounted() {\n const {\n show,\n showSlug,\n getShow,\n $store\n } = this; // Let's tell the store which show we currently want as current.\n\n $store.commit('currentShow', showSlug); // We need the show info, so let's get it.\n\n if (!show || !show.id.slug) {\n getShow({\n showSlug,\n detailed: false\n });\n }\n }\n\n});\n\n//# sourceURL=webpack://slim/./src/components/snatch-selection.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _show_history_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./show-history.vue */ \"./src/components/show-history.vue\");\n/* harmony import */ var _show_results_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./show-results.vue */ \"./src/components/show-results.vue\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'snatch-selection',\n template: '#snatch-selection-template',\n components: {\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_3__.default,\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_0__.default,\n ShowHistory: _show_history_vue__WEBPACK_IMPORTED_MODULE_1__.default,\n ShowResults: _show_results_vue__WEBPACK_IMPORTED_MODULE_2__.default\n },\n props: {\n /**\n * Show Slug\n */\n slug: {\n type: String\n }\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_4__.mapState)({\n shows: state => state.shows.shows,\n config: state => state.config.general,\n search: state => state.config.search,\n history: state => state.history\n }),\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_4__.mapGetters)({\n show: 'getCurrentShow',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired',\n getShowHistoryBySlug: 'getShowHistoryBySlug',\n getEpisode: 'getEpisode'\n }),\n\n showSlug() {\n const {\n slug\n } = this;\n return slug || this.$route.query.showslug;\n },\n\n season() {\n return Number(this.$route.query.season);\n },\n\n episode() {\n if (this.$route.query.manual_search_type === 'season') {\n return;\n }\n\n return Number(this.$route.query.episode);\n },\n\n manualSearchType() {\n return this.$route.query.manual_search_type;\n }\n\n },\n methods: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_4__.mapActions)({\n getShow: 'getShow'\n }),\n\n // TODO: Move this to show-results!\n getReleaseNameClasses(name) {\n const {\n effectiveIgnored,\n effectiveRequired,\n search,\n show\n } = this;\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n\n return classes.join(' ');\n }\n\n },\n\n mounted() {\n const {\n show,\n showSlug,\n getShow,\n $store\n } = this; // Let's tell the store which show we currently want as current.\n\n $store.commit('currentShow', showSlug); // We need the show info, so let's get it.\n\n if (!show || !show.id.slug) {\n getShow({\n showSlug,\n detailed: false\n });\n }\n }\n\n});\n\n//# sourceURL=webpack://slim/./src/components/snatch-selection.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -785,7 +807,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"AddRecommended\": () => (/* reexport safe */ _add_recommended_vue__WEBPACK_IMPORTED_MODULE_0__.default),\n/* harmony export */ \"AddShowOptions\": () => (/* reexport safe */ _add_show_options_vue__WEBPACK_IMPORTED_MODULE_1__.default),\n/* harmony export */ \"AddShows\": () => (/* reexport safe */ _add_shows_vue__WEBPACK_IMPORTED_MODULE_2__.default),\n/* harmony export */ \"AnidbReleaseGroupUi\": () => (/* reexport safe */ _anidb_release_group_ui_vue__WEBPACK_IMPORTED_MODULE_3__.default),\n/* harmony export */ \"App\": () => (/* reexport safe */ _app_vue__WEBPACK_IMPORTED_MODULE_4__.default),\n/* harmony export */ \"AppFooter\": () => (/* reexport safe */ _app_footer_vue__WEBPACK_IMPORTED_MODULE_5__.default),\n/* harmony export */ \"AppHeader\": () => (/* reexport safe */ _app_header_vue__WEBPACK_IMPORTED_MODULE_6__.default),\n/* harmony export */ \"Backstretch\": () => (/* reexport safe */ _backstretch_vue__WEBPACK_IMPORTED_MODULE_7__.default),\n/* harmony export */ \"Config\": () => (/* reexport safe */ _config_vue__WEBPACK_IMPORTED_MODULE_8__.default),\n/* harmony export */ \"ConfigAnime\": () => (/* reexport safe */ _config_anime_vue__WEBPACK_IMPORTED_MODULE_9__.default),\n/* harmony export */ \"ConfigGeneral\": () => (/* reexport safe */ _config_general_vue__WEBPACK_IMPORTED_MODULE_10__.default),\n/* harmony export */ \"ConfigPostProcessing\": () => (/* reexport safe */ _config_post_processing_vue__WEBPACK_IMPORTED_MODULE_11__.default),\n/* harmony export */ \"ConfigNotifications\": () => (/* reexport safe */ _config_notifications_vue__WEBPACK_IMPORTED_MODULE_12__.default),\n/* harmony export */ \"ConfigSearch\": () => (/* reexport safe */ _config_search_vue__WEBPACK_IMPORTED_MODULE_13__.default),\n/* harmony export */ \"DisplayShow\": () => (/* reexport safe */ _display_show_vue__WEBPACK_IMPORTED_MODULE_14__.default),\n/* harmony export */ \"CurrentDownloads\": () => (/* reexport safe */ _current_downloads_vue__WEBPACK_IMPORTED_MODULE_15__.default),\n/* harmony export */ \"EditShow\": () => (/* reexport safe */ _edit_show_vue__WEBPACK_IMPORTED_MODULE_16__.default),\n/* harmony export */ \"History\": () => (/* reexport safe */ _history_vue__WEBPACK_IMPORTED_MODULE_17__.default),\n/* harmony export */ \"Home\": () => (/* reexport safe */ _home_vue__WEBPACK_IMPORTED_MODULE_18__.default),\n/* harmony export */ \"IRC\": () => (/* reexport safe */ _irc_vue__WEBPACK_IMPORTED_MODULE_19__.default),\n/* harmony export */ \"Login\": () => (/* reexport safe */ _login_vue__WEBPACK_IMPORTED_MODULE_20__.default),\n/* harmony export */ \"Logs\": () => (/* reexport safe */ _logs_vue__WEBPACK_IMPORTED_MODULE_21__.default),\n/* harmony export */ \"manageSearches\": () => (/* reexport safe */ _manage_searches_vue__WEBPACK_IMPORTED_MODULE_22__.default),\n/* harmony export */ \"ManualPostProcess\": () => (/* reexport safe */ _manual_post_process_vue__WEBPACK_IMPORTED_MODULE_23__.default),\n/* harmony export */ \"NewShow\": () => (/* reexport safe */ _new_show_vue__WEBPACK_IMPORTED_MODULE_24__.default),\n/* harmony export */ \"NewShowsExisting\": () => (/* reexport safe */ _new_shows_existing_vue__WEBPACK_IMPORTED_MODULE_25__.default),\n/* harmony export */ \"Restart\": () => (/* reexport safe */ _restart_vue__WEBPACK_IMPORTED_MODULE_26__.default),\n/* harmony export */ \"RootDirs\": () => (/* reexport safe */ _root_dirs_vue__WEBPACK_IMPORTED_MODULE_27__.default),\n/* harmony export */ \"Schedule\": () => (/* reexport safe */ _schedule_vue__WEBPACK_IMPORTED_MODULE_28__.default),\n/* harmony export */ \"ShowHeader\": () => (/* reexport safe */ _show_header_vue__WEBPACK_IMPORTED_MODULE_29__.default),\n/* harmony export */ \"ShowHistory\": () => (/* reexport safe */ _show_history_vue__WEBPACK_IMPORTED_MODULE_30__.default),\n/* harmony export */ \"ShowResults\": () => (/* reexport safe */ _show_results_vue__WEBPACK_IMPORTED_MODULE_31__.default),\n/* harmony export */ \"SnatchSelection\": () => (/* reexport safe */ _snatch_selection_vue__WEBPACK_IMPORTED_MODULE_32__.default),\n/* harmony export */ \"Status\": () => (/* reexport safe */ _status_vue__WEBPACK_IMPORTED_MODULE_33__.default),\n/* harmony export */ \"SubMenu\": () => (/* reexport safe */ _sub_menu_vue__WEBPACK_IMPORTED_MODULE_34__.default),\n/* harmony export */ \"SubtitleSearch\": () => (/* reexport safe */ _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_35__.default),\n/* harmony export */ \"Update\": () => (/* reexport safe */ _update_vue__WEBPACK_IMPORTED_MODULE_36__.default),\n/* harmony export */ \"NotFound\": () => (/* reexport safe */ _http__WEBPACK_IMPORTED_MODULE_37__.NotFound),\n/* harmony export */ \"AppLink\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.AppLink),\n/* harmony export */ \"Asset\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.Asset),\n/* harmony export */ \"ConfigSceneExceptions\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.ConfigSceneExceptions),\n/* harmony export */ \"ConfigTemplate\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.ConfigTemplate),\n/* harmony export */ \"ConfigTextbox\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.ConfigTextbox),\n/* harmony export */ \"ConfigTextboxNumber\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.ConfigTextboxNumber),\n/* harmony export */ \"ConfigToggleSlider\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.ConfigToggleSlider),\n/* harmony export */ \"CustomLogs\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.CustomLogs),\n/* harmony export */ \"FileBrowser\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.FileBrowser),\n/* harmony export */ \"LanguageSelect\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.LanguageSelect),\n/* harmony export */ \"LoadProgressBar\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.LoadProgressBar),\n/* harmony export */ \"NamePattern\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.NamePattern),\n/* harmony export */ \"PlotInfo\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.PlotInfo),\n/* harmony export */ \"PosterSizeSlider\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.PosterSizeSlider),\n/* harmony export */ \"ProgressBar\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.ProgressBar),\n/* harmony export */ \"QualityChooser\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.QualityChooser),\n/* harmony export */ \"QualityPill\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.QualityPill),\n/* harmony export */ \"ScrollButtons\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.ScrollButtons),\n/* harmony export */ \"SelectList\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.SelectList),\n/* harmony export */ \"ShowSelector\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.ShowSelector),\n/* harmony export */ \"SortedSelectList\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.SortedSelectList),\n/* harmony export */ \"StateSwitch\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_38__.StateSwitch)\n/* harmony export */ });\n/* harmony import */ var _add_recommended_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./add-recommended.vue */ \"./src/components/add-recommended.vue\");\n/* harmony import */ var _add_show_options_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./add-show-options.vue */ \"./src/components/add-show-options.vue\");\n/* harmony import */ var _add_shows_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./add-shows.vue */ \"./src/components/add-shows.vue\");\n/* harmony import */ var _anidb_release_group_ui_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./anidb-release-group-ui.vue */ \"./src/components/anidb-release-group-ui.vue\");\n/* harmony import */ var _app_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./app.vue */ \"./src/components/app.vue\");\n/* harmony import */ var _app_footer_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./app-footer.vue */ \"./src/components/app-footer.vue\");\n/* harmony import */ var _app_header_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./app-header.vue */ \"./src/components/app-header.vue\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n/* harmony import */ var _config_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./config.vue */ \"./src/components/config.vue\");\n/* harmony import */ var _config_anime_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./config-anime.vue */ \"./src/components/config-anime.vue\");\n/* harmony import */ var _config_general_vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./config-general.vue */ \"./src/components/config-general.vue\");\n/* harmony import */ var _config_post_processing_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./config-post-processing.vue */ \"./src/components/config-post-processing.vue\");\n/* harmony import */ var _config_notifications_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./config-notifications.vue */ \"./src/components/config-notifications.vue\");\n/* harmony import */ var _config_search_vue__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./config-search.vue */ \"./src/components/config-search.vue\");\n/* harmony import */ var _display_show_vue__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./display-show.vue */ \"./src/components/display-show.vue\");\n/* harmony import */ var _current_downloads_vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./current-downloads.vue */ \"./src/components/current-downloads.vue\");\n/* harmony import */ var _edit_show_vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./edit-show.vue */ \"./src/components/edit-show.vue\");\n/* harmony import */ var _history_vue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./history.vue */ \"./src/components/history.vue\");\n/* harmony import */ var _home_vue__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./home.vue */ \"./src/components/home.vue\");\n/* harmony import */ var _irc_vue__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./irc.vue */ \"./src/components/irc.vue\");\n/* harmony import */ var _login_vue__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./login.vue */ \"./src/components/login.vue\");\n/* harmony import */ var _logs_vue__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./logs.vue */ \"./src/components/logs.vue\");\n/* harmony import */ var _manage_searches_vue__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./manage-searches.vue */ \"./src/components/manage-searches.vue\");\n/* harmony import */ var _manual_post_process_vue__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./manual-post-process.vue */ \"./src/components/manual-post-process.vue\");\n/* harmony import */ var _new_show_vue__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./new-show.vue */ \"./src/components/new-show.vue\");\n/* harmony import */ var _new_shows_existing_vue__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./new-shows-existing.vue */ \"./src/components/new-shows-existing.vue\");\n/* harmony import */ var _restart_vue__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./restart.vue */ \"./src/components/restart.vue\");\n/* harmony import */ var _root_dirs_vue__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./root-dirs.vue */ \"./src/components/root-dirs.vue\");\n/* harmony import */ var _schedule_vue__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./schedule.vue */ \"./src/components/schedule.vue\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _show_history_vue__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./show-history.vue */ \"./src/components/show-history.vue\");\n/* harmony import */ var _show_results_vue__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./show-results.vue */ \"./src/components/show-results.vue\");\n/* harmony import */ var _snatch_selection_vue__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./snatch-selection.vue */ \"./src/components/snatch-selection.vue\");\n/* harmony import */ var _status_vue__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./status.vue */ \"./src/components/status.vue\");\n/* harmony import */ var _sub_menu_vue__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./sub-menu.vue */ \"./src/components/sub-menu.vue\");\n/* harmony import */ var _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./subtitle-search.vue */ \"./src/components/subtitle-search.vue\");\n/* harmony import */ var _update_vue__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./update.vue */ \"./src/components/update.vue\");\n/* harmony import */ var _http__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./http */ \"./src/components/http/index.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack://slim/./src/components/index.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"AddRecommended\": () => (/* reexport safe */ _add_recommended_vue__WEBPACK_IMPORTED_MODULE_0__.default),\n/* harmony export */ \"AddShowOptions\": () => (/* reexport safe */ _add_show_options_vue__WEBPACK_IMPORTED_MODULE_1__.default),\n/* harmony export */ \"AddShows\": () => (/* reexport safe */ _add_shows_vue__WEBPACK_IMPORTED_MODULE_2__.default),\n/* harmony export */ \"AnidbReleaseGroupUi\": () => (/* reexport safe */ _anidb_release_group_ui_vue__WEBPACK_IMPORTED_MODULE_3__.default),\n/* harmony export */ \"App\": () => (/* reexport safe */ _app_vue__WEBPACK_IMPORTED_MODULE_4__.default),\n/* harmony export */ \"AppFooter\": () => (/* reexport safe */ _app_footer_vue__WEBPACK_IMPORTED_MODULE_5__.default),\n/* harmony export */ \"AppHeader\": () => (/* reexport safe */ _app_header_vue__WEBPACK_IMPORTED_MODULE_6__.default),\n/* harmony export */ \"Backstretch\": () => (/* reexport safe */ _backstretch_vue__WEBPACK_IMPORTED_MODULE_7__.default),\n/* harmony export */ \"Config\": () => (/* reexport safe */ _config_vue__WEBPACK_IMPORTED_MODULE_8__.default),\n/* harmony export */ \"ConfigAnime\": () => (/* reexport safe */ _config_anime_vue__WEBPACK_IMPORTED_MODULE_9__.default),\n/* harmony export */ \"ConfigGeneral\": () => (/* reexport safe */ _config_general_vue__WEBPACK_IMPORTED_MODULE_10__.default),\n/* harmony export */ \"ConfigPostProcessing\": () => (/* reexport safe */ _config_post_processing_vue__WEBPACK_IMPORTED_MODULE_11__.default),\n/* harmony export */ \"ConfigNotifications\": () => (/* reexport safe */ _config_notifications_vue__WEBPACK_IMPORTED_MODULE_12__.default),\n/* harmony export */ \"ConfigSearch\": () => (/* reexport safe */ _config_search_vue__WEBPACK_IMPORTED_MODULE_13__.default),\n/* harmony export */ \"DisplayShow\": () => (/* reexport safe */ _display_show_vue__WEBPACK_IMPORTED_MODULE_14__.default),\n/* harmony export */ \"CurrentDownloads\": () => (/* reexport safe */ _current_downloads_vue__WEBPACK_IMPORTED_MODULE_15__.default),\n/* harmony export */ \"EditShow\": () => (/* reexport safe */ _edit_show_vue__WEBPACK_IMPORTED_MODULE_16__.default),\n/* harmony export */ \"History\": () => (/* reexport safe */ _history_vue__WEBPACK_IMPORTED_MODULE_17__.default),\n/* harmony export */ \"HistoryCompact\": () => (/* reexport safe */ _history_compact_vue__WEBPACK_IMPORTED_MODULE_18__.default),\n/* harmony export */ \"HistoryDetailed\": () => (/* reexport safe */ _history_detailed_vue__WEBPACK_IMPORTED_MODULE_19__.default),\n/* harmony export */ \"Home\": () => (/* reexport safe */ _home_vue__WEBPACK_IMPORTED_MODULE_20__.default),\n/* harmony export */ \"IRC\": () => (/* reexport safe */ _irc_vue__WEBPACK_IMPORTED_MODULE_21__.default),\n/* harmony export */ \"Login\": () => (/* reexport safe */ _login_vue__WEBPACK_IMPORTED_MODULE_22__.default),\n/* harmony export */ \"Logs\": () => (/* reexport safe */ _logs_vue__WEBPACK_IMPORTED_MODULE_23__.default),\n/* harmony export */ \"manageSearches\": () => (/* reexport safe */ _manage_searches_vue__WEBPACK_IMPORTED_MODULE_24__.default),\n/* harmony export */ \"ManualPostProcess\": () => (/* reexport safe */ _manual_post_process_vue__WEBPACK_IMPORTED_MODULE_25__.default),\n/* harmony export */ \"NewShow\": () => (/* reexport safe */ _new_show_vue__WEBPACK_IMPORTED_MODULE_26__.default),\n/* harmony export */ \"NewShowsExisting\": () => (/* reexport safe */ _new_shows_existing_vue__WEBPACK_IMPORTED_MODULE_27__.default),\n/* harmony export */ \"Restart\": () => (/* reexport safe */ _restart_vue__WEBPACK_IMPORTED_MODULE_28__.default),\n/* harmony export */ \"RootDirs\": () => (/* reexport safe */ _root_dirs_vue__WEBPACK_IMPORTED_MODULE_29__.default),\n/* harmony export */ \"Schedule\": () => (/* reexport safe */ _schedule_vue__WEBPACK_IMPORTED_MODULE_30__.default),\n/* harmony export */ \"ShowHeader\": () => (/* reexport safe */ _show_header_vue__WEBPACK_IMPORTED_MODULE_31__.default),\n/* harmony export */ \"ShowHistory\": () => (/* reexport safe */ _show_history_vue__WEBPACK_IMPORTED_MODULE_32__.default),\n/* harmony export */ \"ShowResults\": () => (/* reexport safe */ _show_results_vue__WEBPACK_IMPORTED_MODULE_33__.default),\n/* harmony export */ \"SnatchSelection\": () => (/* reexport safe */ _snatch_selection_vue__WEBPACK_IMPORTED_MODULE_34__.default),\n/* harmony export */ \"Status\": () => (/* reexport safe */ _status_vue__WEBPACK_IMPORTED_MODULE_35__.default),\n/* harmony export */ \"SubMenu\": () => (/* reexport safe */ _sub_menu_vue__WEBPACK_IMPORTED_MODULE_36__.default),\n/* harmony export */ \"SubtitleSearch\": () => (/* reexport safe */ _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_37__.default),\n/* harmony export */ \"Update\": () => (/* reexport safe */ _update_vue__WEBPACK_IMPORTED_MODULE_38__.default),\n/* harmony export */ \"NotFound\": () => (/* reexport safe */ _http__WEBPACK_IMPORTED_MODULE_39__.NotFound),\n/* harmony export */ \"AppLink\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.AppLink),\n/* harmony export */ \"Asset\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.Asset),\n/* harmony export */ \"ConfigSceneExceptions\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.ConfigSceneExceptions),\n/* harmony export */ \"ConfigTemplate\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.ConfigTemplate),\n/* harmony export */ \"ConfigTextbox\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.ConfigTextbox),\n/* harmony export */ \"ConfigTextboxNumber\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.ConfigTextboxNumber),\n/* harmony export */ \"ConfigToggleSlider\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.ConfigToggleSlider),\n/* harmony export */ \"CustomLogs\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.CustomLogs),\n/* harmony export */ \"FileBrowser\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.FileBrowser),\n/* harmony export */ \"LanguageSelect\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.LanguageSelect),\n/* harmony export */ \"LoadProgressBar\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.LoadProgressBar),\n/* harmony export */ \"NamePattern\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.NamePattern),\n/* harmony export */ \"PlotInfo\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.PlotInfo),\n/* harmony export */ \"PosterSizeSlider\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.PosterSizeSlider),\n/* harmony export */ \"ProgressBar\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.ProgressBar),\n/* harmony export */ \"QualityChooser\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.QualityChooser),\n/* harmony export */ \"QualityPill\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.QualityPill),\n/* harmony export */ \"ScrollButtons\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.ScrollButtons),\n/* harmony export */ \"SelectList\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.SelectList),\n/* harmony export */ \"ShowSelector\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.ShowSelector),\n/* harmony export */ \"SortedSelectList\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.SortedSelectList),\n/* harmony export */ \"StateSwitch\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_40__.StateSwitch)\n/* harmony export */ });\n/* harmony import */ var _add_recommended_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./add-recommended.vue */ \"./src/components/add-recommended.vue\");\n/* harmony import */ var _add_show_options_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./add-show-options.vue */ \"./src/components/add-show-options.vue\");\n/* harmony import */ var _add_shows_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./add-shows.vue */ \"./src/components/add-shows.vue\");\n/* harmony import */ var _anidb_release_group_ui_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./anidb-release-group-ui.vue */ \"./src/components/anidb-release-group-ui.vue\");\n/* harmony import */ var _app_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./app.vue */ \"./src/components/app.vue\");\n/* harmony import */ var _app_footer_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./app-footer.vue */ \"./src/components/app-footer.vue\");\n/* harmony import */ var _app_header_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./app-header.vue */ \"./src/components/app-header.vue\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n/* harmony import */ var _config_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./config.vue */ \"./src/components/config.vue\");\n/* harmony import */ var _config_anime_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./config-anime.vue */ \"./src/components/config-anime.vue\");\n/* harmony import */ var _config_general_vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./config-general.vue */ \"./src/components/config-general.vue\");\n/* harmony import */ var _config_post_processing_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./config-post-processing.vue */ \"./src/components/config-post-processing.vue\");\n/* harmony import */ var _config_notifications_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./config-notifications.vue */ \"./src/components/config-notifications.vue\");\n/* harmony import */ var _config_search_vue__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./config-search.vue */ \"./src/components/config-search.vue\");\n/* harmony import */ var _display_show_vue__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./display-show.vue */ \"./src/components/display-show.vue\");\n/* harmony import */ var _current_downloads_vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./current-downloads.vue */ \"./src/components/current-downloads.vue\");\n/* harmony import */ var _edit_show_vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./edit-show.vue */ \"./src/components/edit-show.vue\");\n/* harmony import */ var _history_vue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./history.vue */ \"./src/components/history.vue\");\n/* harmony import */ var _history_compact_vue__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./history-compact.vue */ \"./src/components/history-compact.vue\");\n/* harmony import */ var _history_detailed_vue__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./history-detailed.vue */ \"./src/components/history-detailed.vue\");\n/* harmony import */ var _home_vue__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./home.vue */ \"./src/components/home.vue\");\n/* harmony import */ var _irc_vue__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./irc.vue */ \"./src/components/irc.vue\");\n/* harmony import */ var _login_vue__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./login.vue */ \"./src/components/login.vue\");\n/* harmony import */ var _logs_vue__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./logs.vue */ \"./src/components/logs.vue\");\n/* harmony import */ var _manage_searches_vue__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./manage-searches.vue */ \"./src/components/manage-searches.vue\");\n/* harmony import */ var _manual_post_process_vue__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./manual-post-process.vue */ \"./src/components/manual-post-process.vue\");\n/* harmony import */ var _new_show_vue__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./new-show.vue */ \"./src/components/new-show.vue\");\n/* harmony import */ var _new_shows_existing_vue__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./new-shows-existing.vue */ \"./src/components/new-shows-existing.vue\");\n/* harmony import */ var _restart_vue__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./restart.vue */ \"./src/components/restart.vue\");\n/* harmony import */ var _root_dirs_vue__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./root-dirs.vue */ \"./src/components/root-dirs.vue\");\n/* harmony import */ var _schedule_vue__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./schedule.vue */ \"./src/components/schedule.vue\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _show_history_vue__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./show-history.vue */ \"./src/components/show-history.vue\");\n/* harmony import */ var _show_results_vue__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./show-results.vue */ \"./src/components/show-results.vue\");\n/* harmony import */ var _snatch_selection_vue__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./snatch-selection.vue */ \"./src/components/snatch-selection.vue\");\n/* harmony import */ var _status_vue__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./status.vue */ \"./src/components/status.vue\");\n/* harmony import */ var _sub_menu_vue__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./sub-menu.vue */ \"./src/components/sub-menu.vue\");\n/* harmony import */ var _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./subtitle-search.vue */ \"./src/components/subtitle-search.vue\");\n/* harmony import */ var _update_vue__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./update.vue */ \"./src/components/update.vue\");\n/* harmony import */ var _http__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./http */ \"./src/components/http/index.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack://slim/./src/components/index.js?"); /***/ }), @@ -807,7 +829,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"registerGlobalComponents\": () => (/* binding */ registerGlobalComponents),\n/* harmony export */ \"registerPlugins\": () => (/* binding */ registerPlugins),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vue_async_computed__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-async-computed */ \"./node_modules/vue-async-computed/dist/vue-async-computed.esm.js\");\n/* harmony import */ var vue_meta__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-meta */ \"./node_modules/vue-meta/dist/vue-meta.esm.js\");\n/* harmony import */ var vue_snotify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-snotify */ \"./node_modules/vue-snotify/vue-snotify.esm.js\");\n/* harmony import */ var vue_cookies__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-cookies */ \"./node_modules/vue-cookies/vue-cookies.js\");\n/* harmony import */ var vue_cookies__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(vue_cookies__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var vue_js_modal__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vue-js-modal */ \"./node_modules/vue-js-modal/dist/index.js\");\n/* harmony import */ var vue_js_modal__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(vue_js_modal__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var v_tooltip__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! v-tooltip */ \"./node_modules/v-tooltip/dist/v-tooltip.esm.js\");\n/* harmony import */ var _fortawesome_fontawesome_svg_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @fortawesome/fontawesome-svg-core */ \"./node_modules/@fortawesome/fontawesome-svg-core/index.es.js\");\n/* harmony import */ var _fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @fortawesome/free-solid-svg-icons */ \"./node_modules/@fortawesome/free-solid-svg-icons/index.es.js\");\n/* harmony import */ var _components__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components */ \"./src/components/index.js\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./store */ \"./src/store/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils/core */ \"./src/utils/core.js\");\n// @TODO: Remove this file before v1.0.0\n\n\n\n\n\n\n\n\n\n_fortawesome_fontawesome_svg_core__WEBPACK_IMPORTED_MODULE_6__.library.add([_fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_7__.faAlignJustify, _fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_7__.faImages]);\n\n\n\n/**\n * Register global components and x-template components.\n */\n\nconst registerGlobalComponents = () => {\n // Start with the x-template components\n let {\n components = []\n } = window; // Add global components (in use by `main.mako`)\n // @TODO: These should be registered in an `App.vue` component when possible,\n // along with some of the `main.mako` template\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_8__.App, _components__WEBPACK_IMPORTED_MODULE_8__.AppFooter, _components__WEBPACK_IMPORTED_MODULE_8__.AppHeader, _components__WEBPACK_IMPORTED_MODULE_8__.ScrollButtons, _components__WEBPACK_IMPORTED_MODULE_8__.SubMenu]); // Add global components (in use by pages/components that are not SFCs yet)\n // Use this when it's not possible to use `components: { ... }` in a component's definition.\n // If a component that uses any of these is a SFC, please use the `components` key when defining it.\n // @TODO: Instead of globally registering these,\n // they should be registered in each component that uses them\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_8__.AddShowOptions, _components__WEBPACK_IMPORTED_MODULE_8__.AnidbReleaseGroupUi, _components__WEBPACK_IMPORTED_MODULE_8__.AppLink, _components__WEBPACK_IMPORTED_MODULE_8__.Asset, _components__WEBPACK_IMPORTED_MODULE_8__.Backstretch, _components__WEBPACK_IMPORTED_MODULE_8__.ConfigTemplate, _components__WEBPACK_IMPORTED_MODULE_8__.ConfigTextbox, _components__WEBPACK_IMPORTED_MODULE_8__.ConfigTextboxNumber, _components__WEBPACK_IMPORTED_MODULE_8__.ConfigToggleSlider, _components__WEBPACK_IMPORTED_MODULE_8__.FileBrowser, _components__WEBPACK_IMPORTED_MODULE_8__.LanguageSelect, _components__WEBPACK_IMPORTED_MODULE_8__.LoadProgressBar, _components__WEBPACK_IMPORTED_MODULE_8__.PlotInfo, _components__WEBPACK_IMPORTED_MODULE_8__.QualityChooser, _components__WEBPACK_IMPORTED_MODULE_8__.QualityPill, // @FIXME: (sharkykh) Used in a hack/workaround in `static/js/ajax-episode-search.js`\n _components__WEBPACK_IMPORTED_MODULE_8__.RootDirs, _components__WEBPACK_IMPORTED_MODULE_8__.SelectList, _components__WEBPACK_IMPORTED_MODULE_8__.ShowSelector, _components__WEBPACK_IMPORTED_MODULE_8__.StateSwitch]); // Add components for pages that use `pageComponent`\n // @TODO: These need to be converted to Vue SFCs\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_8__.History, _components__WEBPACK_IMPORTED_MODULE_8__.Schedule]); // Register the components globally\n\n components.forEach(component => {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_10__.isDevelopment) {\n console.debug(`Registering ${component.name}`);\n }\n\n vue__WEBPACK_IMPORTED_MODULE_11__.default.component(component.name, component);\n });\n};\n/**\n * Register plugins.\n */\n\nconst registerPlugins = () => {\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use(vue_async_computed__WEBPACK_IMPORTED_MODULE_0__.default);\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use(vue_meta__WEBPACK_IMPORTED_MODULE_1__.default);\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use(vue_snotify__WEBPACK_IMPORTED_MODULE_2__.default);\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use((vue_cookies__WEBPACK_IMPORTED_MODULE_3___default()));\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use((vue_js_modal__WEBPACK_IMPORTED_MODULE_4___default()), {\n dynamicDefault: {\n height: 'auto'\n }\n });\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use(v_tooltip__WEBPACK_IMPORTED_MODULE_5__.VTooltip); // Set default cookie expire time\n\n vue__WEBPACK_IMPORTED_MODULE_11__.default.$cookies.config('10y');\n};\n/**\n * Apply the global Vue shim.\n */\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (() => {\n const warningTemplate = (name, state) => `${name} is using the global Vuex '${state}' state, ` + `please replace that with a local one using: mapState(['${state}'])`;\n\n vue__WEBPACK_IMPORTED_MODULE_11__.default.mixin({\n data() {\n // These are only needed for the root Vue\n if (this.$root === this) {\n return {\n globalLoading: true,\n pageComponent: false,\n showsLoading: false\n };\n }\n\n return {};\n },\n\n mounted() {\n if (this.$root === this && !window.location.pathname.includes('/login')) {\n const {\n username\n } = window;\n Promise.all([\n /* This is used by the `app-header` component\n to only show the logout button if a username is set */\n _store__WEBPACK_IMPORTED_MODULE_9__.default.dispatch('login', {\n username\n }), _store__WEBPACK_IMPORTED_MODULE_9__.default.dispatch('getConfig'), _store__WEBPACK_IMPORTED_MODULE_9__.default.dispatch('getStats')]).then(([_, config]) => {\n this.$root.$emit('loaded'); // Legacy - send config.general to jQuery (received by index.js)\n\n const event = new CustomEvent('medusa-config-loaded', {\n detail: {\n general: config.main,\n layout: config.layout\n }\n });\n window.dispatchEvent(event);\n }).catch(error => {\n console.debug(error);\n alert('Unable to connect to Medusa!'); // eslint-disable-line no-alert\n });\n }\n\n this.$root.$once('loaded', () => {\n this.$root.globalLoading = false;\n });\n },\n\n // Make auth and config accessible to all components\n // @TODO: Remove this completely\n computed: {\n // Deprecate the global `Vuex.mapState(['auth', 'config'])`\n auth() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_10__.isDevelopment && !this.__VUE_DEVTOOLS_UID__) {\n console.warn(warningTemplate(this._name, 'auth'));\n }\n\n return this.$store.state.auth;\n },\n\n config() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_10__.isDevelopment && !this.__VUE_DEVTOOLS_UID__) {\n console.warn(warningTemplate(this._name, 'config'));\n }\n\n return this.$store.state.config;\n }\n\n }\n });\n\n if (_utils_core__WEBPACK_IMPORTED_MODULE_10__.isDevelopment) {\n console.debug('Loading local Vue');\n }\n\n registerPlugins();\n registerGlobalComponents();\n});\n\n//# sourceURL=webpack://slim/./src/global-vue-shim.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"registerGlobalComponents\": () => (/* binding */ registerGlobalComponents),\n/* harmony export */ \"registerPlugins\": () => (/* binding */ registerPlugins),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vue_async_computed__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-async-computed */ \"./node_modules/vue-async-computed/dist/vue-async-computed.esm.js\");\n/* harmony import */ var vue_meta__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-meta */ \"./node_modules/vue-meta/dist/vue-meta.esm.js\");\n/* harmony import */ var vue_snotify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-snotify */ \"./node_modules/vue-snotify/vue-snotify.esm.js\");\n/* harmony import */ var vue_cookies__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-cookies */ \"./node_modules/vue-cookies/vue-cookies.js\");\n/* harmony import */ var vue_cookies__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(vue_cookies__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var vue_js_modal__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vue-js-modal */ \"./node_modules/vue-js-modal/dist/index.js\");\n/* harmony import */ var vue_js_modal__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(vue_js_modal__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var v_tooltip__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! v-tooltip */ \"./node_modules/v-tooltip/dist/v-tooltip.esm.js\");\n/* harmony import */ var _fortawesome_fontawesome_svg_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @fortawesome/fontawesome-svg-core */ \"./node_modules/@fortawesome/fontawesome-svg-core/index.es.js\");\n/* harmony import */ var _fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @fortawesome/free-solid-svg-icons */ \"./node_modules/@fortawesome/free-solid-svg-icons/index.es.js\");\n/* harmony import */ var _components__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components */ \"./src/components/index.js\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./store */ \"./src/store/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils/core */ \"./src/utils/core.js\");\n// @TODO: Remove this file before v1.0.0\n\n\n\n\n\n\n\n\n\n_fortawesome_fontawesome_svg_core__WEBPACK_IMPORTED_MODULE_6__.library.add([_fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_7__.faAlignJustify, _fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_7__.faImages]);\n\n\n\n/**\n * Register global components and x-template components.\n */\n\nconst registerGlobalComponents = () => {\n // Start with the x-template components\n let {\n components = []\n } = window; // Add global components (in use by `main.mako`)\n // @TODO: These should be registered in an `App.vue` component when possible,\n // along with some of the `main.mako` template\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_8__.App, _components__WEBPACK_IMPORTED_MODULE_8__.AppFooter, _components__WEBPACK_IMPORTED_MODULE_8__.AppHeader, _components__WEBPACK_IMPORTED_MODULE_8__.ScrollButtons, _components__WEBPACK_IMPORTED_MODULE_8__.SubMenu]); // Add global components (in use by pages/components that are not SFCs yet)\n // Use this when it's not possible to use `components: { ... }` in a component's definition.\n // If a component that uses any of these is a SFC, please use the `components` key when defining it.\n // @TODO: Instead of globally registering these,\n // they should be registered in each component that uses them\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_8__.AddShowOptions, _components__WEBPACK_IMPORTED_MODULE_8__.AnidbReleaseGroupUi, _components__WEBPACK_IMPORTED_MODULE_8__.AppLink, _components__WEBPACK_IMPORTED_MODULE_8__.Asset, _components__WEBPACK_IMPORTED_MODULE_8__.Backstretch, _components__WEBPACK_IMPORTED_MODULE_8__.ConfigTemplate, _components__WEBPACK_IMPORTED_MODULE_8__.ConfigTextbox, _components__WEBPACK_IMPORTED_MODULE_8__.ConfigTextboxNumber, _components__WEBPACK_IMPORTED_MODULE_8__.ConfigToggleSlider, _components__WEBPACK_IMPORTED_MODULE_8__.FileBrowser, _components__WEBPACK_IMPORTED_MODULE_8__.LanguageSelect, _components__WEBPACK_IMPORTED_MODULE_8__.LoadProgressBar, _components__WEBPACK_IMPORTED_MODULE_8__.PlotInfo, _components__WEBPACK_IMPORTED_MODULE_8__.QualityChooser, _components__WEBPACK_IMPORTED_MODULE_8__.QualityPill, // @FIXME: (sharkykh) Used in a hack/workaround in `static/js/ajax-episode-search.js`\n _components__WEBPACK_IMPORTED_MODULE_8__.RootDirs, _components__WEBPACK_IMPORTED_MODULE_8__.SelectList, _components__WEBPACK_IMPORTED_MODULE_8__.ShowSelector, _components__WEBPACK_IMPORTED_MODULE_8__.StateSwitch]); // Add components for pages that use `pageComponent`\n // @TODO: These need to be converted to Vue SFCs\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_8__.Schedule]); // Register the components globally\n\n components.forEach(component => {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_10__.isDevelopment) {\n console.debug(`Registering ${component.name}`);\n }\n\n vue__WEBPACK_IMPORTED_MODULE_11__.default.component(component.name, component);\n });\n};\n/**\n * Register plugins.\n */\n\nconst registerPlugins = () => {\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use(vue_async_computed__WEBPACK_IMPORTED_MODULE_0__.default);\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use(vue_meta__WEBPACK_IMPORTED_MODULE_1__.default);\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use(vue_snotify__WEBPACK_IMPORTED_MODULE_2__.default);\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use((vue_cookies__WEBPACK_IMPORTED_MODULE_3___default()));\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use((vue_js_modal__WEBPACK_IMPORTED_MODULE_4___default()), {\n dynamicDefault: {\n height: 'auto'\n }\n });\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use(v_tooltip__WEBPACK_IMPORTED_MODULE_5__.VTooltip); // Set default cookie expire time\n\n vue__WEBPACK_IMPORTED_MODULE_11__.default.$cookies.config('10y');\n};\n/**\n * Apply the global Vue shim.\n */\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (() => {\n const warningTemplate = (name, state) => `${name} is using the global Vuex '${state}' state, ` + `please replace that with a local one using: mapState(['${state}'])`;\n\n vue__WEBPACK_IMPORTED_MODULE_11__.default.mixin({\n data() {\n // These are only needed for the root Vue\n if (this.$root === this) {\n return {\n globalLoading: true,\n pageComponent: false,\n showsLoading: false\n };\n }\n\n return {};\n },\n\n mounted() {\n if (this.$root === this && !window.location.pathname.includes('/login')) {\n const {\n username\n } = window;\n Promise.all([\n /* This is used by the `app-header` component\n to only show the logout button if a username is set */\n _store__WEBPACK_IMPORTED_MODULE_9__.default.dispatch('login', {\n username\n }), _store__WEBPACK_IMPORTED_MODULE_9__.default.dispatch('getConfig'), _store__WEBPACK_IMPORTED_MODULE_9__.default.dispatch('getStats')]).then(([_, config]) => {\n this.$root.$emit('loaded'); // Legacy - send config.general to jQuery (received by index.js)\n\n const event = new CustomEvent('medusa-config-loaded', {\n detail: {\n general: config.main,\n layout: config.layout\n }\n });\n window.dispatchEvent(event);\n }).catch(error => {\n console.debug(error);\n alert('Unable to connect to Medusa!'); // eslint-disable-line no-alert\n });\n }\n\n this.$root.$once('loaded', () => {\n this.$root.globalLoading = false;\n });\n },\n\n // Make auth and config accessible to all components\n // @TODO: Remove this completely\n computed: {\n // Deprecate the global `Vuex.mapState(['auth', 'config'])`\n auth() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_10__.isDevelopment && !this.__VUE_DEVTOOLS_UID__) {\n console.warn(warningTemplate(this._name, 'auth'));\n }\n\n return this.$store.state.auth;\n },\n\n config() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_10__.isDevelopment && !this.__VUE_DEVTOOLS_UID__) {\n console.warn(warningTemplate(this._name, 'config'));\n }\n\n return this.$store.state.config;\n }\n\n }\n });\n\n if (_utils_core__WEBPACK_IMPORTED_MODULE_10__.isDevelopment) {\n console.debug('Loading local Vue');\n }\n\n registerPlugins();\n registerGlobalComponents();\n});\n\n//# sourceURL=webpack://slim/./src/global-vue-shim.js?"); /***/ }), @@ -851,7 +873,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _sub_menus__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sub-menus */ \"./src/router/sub-menus.js\");\n\n/** @type {import('.').Route[]} */\n\nconst homeRoutes = [{\n path: '/home',\n name: 'home',\n meta: {\n title: 'Home',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/home.vue */ \"./src/components/home.vue\"))\n}, {\n path: '/home/editShow',\n name: 'editShow',\n meta: {\n topMenu: 'home',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.showSubMenu,\n converted: true,\n nocache: true // Use this flag, to have the router-view use :key=\"$route.fullPath\"\n\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/edit-show.vue */ \"./src/components/edit-show.vue\"))\n}, {\n path: '/home/displayShow',\n name: 'show',\n meta: {\n topMenu: 'home',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.showSubMenu,\n converted: true,\n nocache: true // Use this flag, to have the router-view use :key=\"$route.fullPath\"\n\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/display-show.vue */ \"./src/components/display-show.vue\"))\n}, {\n path: '/home/snatchSelection',\n name: 'snatchSelection',\n meta: {\n topMenu: 'home',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.showSubMenu,\n converted: true,\n nocache: true // Use this flag, to have the router-view use :key=\"$route.fullPath\"\n\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/snatch-selection.vue */ \"./src/components/snatch-selection.vue\"))\n}, {\n path: '/home/testRename',\n name: 'testRename',\n meta: {\n title: 'Preview Rename',\n header: 'Preview Rename',\n topMenu: 'home'\n }\n}, {\n path: '/home/postprocess',\n name: 'postprocess',\n meta: {\n title: 'Manual Post-Processing',\n header: 'Manual Post-Processing',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/manual-post-process.vue */ \"./src/components/manual-post-process.vue\"))\n}, {\n path: '/home/status',\n name: 'status',\n meta: {\n title: 'Status',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/status.vue */ \"./src/components/status.vue\"))\n}, {\n path: '/home/restart',\n name: 'restart',\n meta: {\n title: 'Restarting...',\n header: 'Performing Restart',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/restart.vue */ \"./src/components/restart.vue\"))\n}, {\n path: '/home/shutdown',\n name: 'shutdown',\n meta: {\n header: 'Shutting down',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/restart.vue */ \"./src/components/restart.vue\")),\n props: {\n shutdown: true\n }\n}, {\n path: '/home/update',\n name: 'update',\n meta: {\n header: 'Update Medusa',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/update.vue */ \"./src/components/update.vue\"))\n}];\n/** @type {import('.').Route[]} */\n\nconst configRoutes = [{\n path: '/config',\n name: 'config',\n meta: {\n title: 'Help & Info',\n header: 'Medusa Configuration',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config.vue */ \"./src/components/config.vue\"))\n}, {\n path: '/config/anime',\n name: 'configAnime',\n meta: {\n title: 'Config - Anime',\n header: 'Anime',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-anime.vue */ \"./src/components/config-anime.vue\"))\n}, {\n path: '/config/backuprestore',\n name: 'configBackupRestore',\n meta: {\n title: 'Config - Backup/Restore',\n header: 'Backup/Restore',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu\n }\n}, {\n path: '/config/general',\n name: 'configGeneral',\n meta: {\n title: 'Config - General',\n header: 'General Configuration',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-general.vue */ \"./src/components/config-general.vue\"))\n}, {\n path: '/config/notifications',\n name: 'configNotifications',\n meta: {\n title: 'Config - Notifications',\n header: 'Notifications',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-notifications.vue */ \"./src/components/config-notifications.vue\"))\n}, {\n path: '/config/postProcessing',\n name: 'configPostProcessing',\n meta: {\n title: 'Config - Post-Processing',\n header: 'Post-Processing',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-post-processing.vue */ \"./src/components/config-post-processing.vue\"))\n}, {\n path: '/config/providers',\n name: 'configSearchProviders',\n meta: {\n title: 'Config - Providers',\n header: 'Search Providers',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu\n }\n}, {\n path: '/config/search',\n name: 'configSearchSettings',\n meta: {\n title: 'Config - Episode Search',\n header: 'Search Settings',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-search.vue */ \"./src/components/config-search.vue\"))\n}, {\n path: '/config/subtitles',\n name: 'configSubtitles',\n meta: {\n title: 'Config - Subtitles',\n header: 'Subtitles',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu\n }\n}];\n/** @type {import('.').Route[]} */\n\nconst addShowRoutes = [{\n path: '/addShows',\n name: 'addShows',\n meta: {\n title: 'Add Shows',\n header: 'Add Shows',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/add-shows.vue */ \"./src/components/add-shows.vue\"))\n}, {\n path: '/addShows/existingShows',\n name: 'addExistingShows',\n meta: {\n title: 'Add Existing Shows',\n header: 'Add Existing Shows',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/new-shows-existing.vue */ \"./src/components/new-shows-existing.vue\"))\n}, {\n path: '/addShows/newShow',\n name: 'addNewShow',\n meta: {\n title: 'Add New Show',\n header: 'Add New Show',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/new-show.vue */ \"./src/components/new-show.vue\"))\n}, {\n path: '/addShows/trendingShows',\n name: 'addTrendingShows',\n meta: {\n topMenu: 'home'\n }\n}, {\n path: '/addShows/popularShows',\n name: 'addPopularShows',\n meta: {\n title: 'Popular Shows',\n header: 'Popular Shows',\n topMenu: 'home'\n }\n}, {\n path: '/addShows/popularAnime',\n name: 'addPopularAnime',\n meta: {\n title: 'Popular Anime Shows',\n header: 'Popular Anime Shows',\n topMenu: 'home'\n }\n}];\n/** @type {import('.').Route} */\n\nconst loginRoute = {\n path: '/login',\n name: 'login',\n meta: {\n title: 'Login'\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/login.vue */ \"./src/components/login.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst addRecommendedRoute = {\n path: '/addRecommended',\n name: 'addRecommended',\n meta: {\n title: 'Add Recommended Shows',\n header: 'Add Recommended Shows',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/add-recommended.vue */ \"./src/components/add-recommended.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst scheduleRoute = {\n path: '/schedule',\n name: 'schedule',\n meta: {\n title: 'Schedule',\n header: 'Schedule',\n topMenu: 'schedule'\n }\n};\n/** @type {import('.').Route} */\n\nconst historyRoute = {\n path: '/history',\n name: 'history',\n meta: {\n title: 'History',\n header: 'History',\n topMenu: 'history',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.historySubMenu\n }\n};\n/** @type {import('.').Route} */\n\nconst downloadsRoute = {\n path: '/downloads',\n name: 'downloads',\n meta: {\n title: 'Downloads',\n header: 'Downloads',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/current-downloads.vue */ \"./src/components/current-downloads.vue\"))\n};\n/** @type {import('.').Route[]} */\n\nconst manageRoutes = [{\n path: '/manage',\n name: 'manage',\n meta: {\n title: 'Mass Update',\n header: 'Mass Update',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/backlogOverview',\n name: 'manageBacklogOverview',\n meta: {\n title: 'Backlog Overview',\n header: 'Backlog Overview',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/episodeStatuses',\n name: 'manageEpisodeOverview',\n meta: {\n title: 'Episode Overview',\n header: 'Episode Overview',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/failedDownloads',\n name: 'manageFailedDownloads',\n meta: {\n title: 'Failed Downloads',\n header: 'Failed Downloads',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/manageSearches',\n name: 'manageManageSearches',\n meta: {\n title: 'Manage Searches',\n header: 'Manage Searches',\n topMenu: 'manage',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/manage-searches.vue */ \"./src/components/manage-searches.vue\"))\n}, {\n path: '/manage/massEdit',\n name: 'manageMassEdit',\n meta: {\n title: 'Mass Edit',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/subtitleMissed',\n name: 'manageSubtitleMissed',\n meta: {\n title: 'Missing Subtitles',\n header: 'Missing Subtitles',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/subtitleMissedPP',\n name: 'manageSubtitleMissedPP',\n meta: {\n title: 'Missing Subtitles in Post-Process folder',\n header: 'Missing Subtitles in Post-Process folder',\n topMenu: 'manage'\n }\n}];\n/** @type {import('.').Route[]} */\n\nconst errorLogsRoutes = [{\n path: '/errorlogs',\n name: 'errorlogs',\n meta: {\n title: 'Logs & Errors',\n topMenu: 'system',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.errorlogsSubMenu\n }\n}, {\n path: '/errorlogs/viewlog',\n name: 'viewlog',\n meta: {\n title: 'Logs',\n header: 'Log File',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/logs.vue */ \"./src/components/logs.vue\"))\n}];\n/** @type {import('.').Route} */\n\nconst newsRoute = {\n path: '/news',\n name: 'news',\n meta: {\n title: 'News',\n header: 'News',\n topMenu: 'system'\n }\n};\n/** @type {import('.').Route} */\n\nconst changesRoute = {\n path: '/changes',\n name: 'changes',\n meta: {\n title: 'Changelog',\n header: 'Changelog',\n topMenu: 'system'\n }\n};\n/** @type {import('.').Route} */\n\nconst ircRoute = {\n path: '/IRC',\n name: 'IRC',\n meta: {\n title: 'IRC',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/irc.vue */ \"./src/components/irc.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst notFoundRoute = {\n path: '/not-found',\n name: 'not-found',\n meta: {\n title: '404',\n header: '404 - page not found'\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/http/404.vue */ \"./src/components/http/404.vue\"))\n}; // @NOTE: Redirect can only be added once all routes are vue\n\n/*\n/** @type {import('.').Route} *-/\nconst notFoundRedirect = {\n path: '*',\n redirect: '/not-found'\n};\n*/\n\n/** @type {import('.').Route[]} */\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ([...homeRoutes, ...configRoutes, ...addShowRoutes, loginRoute, addRecommendedRoute, scheduleRoute, historyRoute, downloadsRoute, ...manageRoutes, ...errorLogsRoutes, newsRoute, changesRoute, ircRoute, notFoundRoute]);\n\n//# sourceURL=webpack://slim/./src/router/routes.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _sub_menus__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sub-menus */ \"./src/router/sub-menus.js\");\n\n/** @type {import('.').Route[]} */\n\nconst homeRoutes = [{\n path: '/home',\n name: 'home',\n meta: {\n title: 'Home',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/home.vue */ \"./src/components/home.vue\"))\n}, {\n path: '/home/editShow',\n name: 'editShow',\n meta: {\n topMenu: 'home',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.showSubMenu,\n converted: true,\n nocache: true // Use this flag, to have the router-view use :key=\"$route.fullPath\"\n\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/edit-show.vue */ \"./src/components/edit-show.vue\"))\n}, {\n path: '/home/displayShow',\n name: 'show',\n meta: {\n topMenu: 'home',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.showSubMenu,\n converted: true,\n nocache: true // Use this flag, to have the router-view use :key=\"$route.fullPath\"\n\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/display-show.vue */ \"./src/components/display-show.vue\"))\n}, {\n path: '/home/snatchSelection',\n name: 'snatchSelection',\n meta: {\n topMenu: 'home',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.showSubMenu,\n converted: true,\n nocache: true // Use this flag, to have the router-view use :key=\"$route.fullPath\"\n\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/snatch-selection.vue */ \"./src/components/snatch-selection.vue\"))\n}, {\n path: '/home/testRename',\n name: 'testRename',\n meta: {\n title: 'Preview Rename',\n header: 'Preview Rename',\n topMenu: 'home'\n }\n}, {\n path: '/home/postprocess',\n name: 'postprocess',\n meta: {\n title: 'Manual Post-Processing',\n header: 'Manual Post-Processing',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/manual-post-process.vue */ \"./src/components/manual-post-process.vue\"))\n}, {\n path: '/home/status',\n name: 'status',\n meta: {\n title: 'Status',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/status.vue */ \"./src/components/status.vue\"))\n}, {\n path: '/home/restart',\n name: 'restart',\n meta: {\n title: 'Restarting...',\n header: 'Performing Restart',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/restart.vue */ \"./src/components/restart.vue\"))\n}, {\n path: '/home/shutdown',\n name: 'shutdown',\n meta: {\n header: 'Shutting down',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/restart.vue */ \"./src/components/restart.vue\")),\n props: {\n shutdown: true\n }\n}, {\n path: '/home/update',\n name: 'update',\n meta: {\n header: 'Update Medusa',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/update.vue */ \"./src/components/update.vue\"))\n}];\n/** @type {import('.').Route[]} */\n\nconst configRoutes = [{\n path: '/config',\n name: 'config',\n meta: {\n title: 'Help & Info',\n header: 'Medusa Configuration',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config.vue */ \"./src/components/config.vue\"))\n}, {\n path: '/config/anime',\n name: 'configAnime',\n meta: {\n title: 'Config - Anime',\n header: 'Anime',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-anime.vue */ \"./src/components/config-anime.vue\"))\n}, {\n path: '/config/backuprestore',\n name: 'configBackupRestore',\n meta: {\n title: 'Config - Backup/Restore',\n header: 'Backup/Restore',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu\n }\n}, {\n path: '/config/general',\n name: 'configGeneral',\n meta: {\n title: 'Config - General',\n header: 'General Configuration',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-general.vue */ \"./src/components/config-general.vue\"))\n}, {\n path: '/config/notifications',\n name: 'configNotifications',\n meta: {\n title: 'Config - Notifications',\n header: 'Notifications',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-notifications.vue */ \"./src/components/config-notifications.vue\"))\n}, {\n path: '/config/postProcessing',\n name: 'configPostProcessing',\n meta: {\n title: 'Config - Post-Processing',\n header: 'Post-Processing',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-post-processing.vue */ \"./src/components/config-post-processing.vue\"))\n}, {\n path: '/config/providers',\n name: 'configSearchProviders',\n meta: {\n title: 'Config - Providers',\n header: 'Search Providers',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu\n }\n}, {\n path: '/config/search',\n name: 'configSearchSettings',\n meta: {\n title: 'Config - Episode Search',\n header: 'Search Settings',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-search.vue */ \"./src/components/config-search.vue\"))\n}, {\n path: '/config/subtitles',\n name: 'configSubtitles',\n meta: {\n title: 'Config - Subtitles',\n header: 'Subtitles',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu\n }\n}];\n/** @type {import('.').Route[]} */\n\nconst addShowRoutes = [{\n path: '/addShows',\n name: 'addShows',\n meta: {\n title: 'Add Shows',\n header: 'Add Shows',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/add-shows.vue */ \"./src/components/add-shows.vue\"))\n}, {\n path: '/addShows/existingShows',\n name: 'addExistingShows',\n meta: {\n title: 'Add Existing Shows',\n header: 'Add Existing Shows',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/new-shows-existing.vue */ \"./src/components/new-shows-existing.vue\"))\n}, {\n path: '/addShows/newShow',\n name: 'addNewShow',\n meta: {\n title: 'Add New Show',\n header: 'Add New Show',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/new-show.vue */ \"./src/components/new-show.vue\"))\n}, {\n path: '/addShows/trendingShows',\n name: 'addTrendingShows',\n meta: {\n topMenu: 'home'\n }\n}, {\n path: '/addShows/popularShows',\n name: 'addPopularShows',\n meta: {\n title: 'Popular Shows',\n header: 'Popular Shows',\n topMenu: 'home'\n }\n}, {\n path: '/addShows/popularAnime',\n name: 'addPopularAnime',\n meta: {\n title: 'Popular Anime Shows',\n header: 'Popular Anime Shows',\n topMenu: 'home'\n }\n}];\n/** @type {import('.').Route} */\n\nconst loginRoute = {\n path: '/login',\n name: 'login',\n meta: {\n title: 'Login'\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/login.vue */ \"./src/components/login.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst addRecommendedRoute = {\n path: '/addRecommended',\n name: 'addRecommended',\n meta: {\n title: 'Add Recommended Shows',\n header: 'Add Recommended Shows',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/add-recommended.vue */ \"./src/components/add-recommended.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst scheduleRoute = {\n path: '/schedule',\n name: 'schedule',\n meta: {\n title: 'Schedule',\n header: 'Schedule',\n topMenu: 'schedule'\n }\n};\n/** @type {import('.').Route} */\n\nconst historyRoute = {\n path: '/history',\n name: 'history',\n meta: {\n title: 'History',\n header: 'History',\n topMenu: 'history',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.historySubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/history.vue */ \"./src/components/history.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst downloadsRoute = {\n path: '/downloads',\n name: 'downloads',\n meta: {\n title: 'Downloads',\n header: 'Downloads',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/current-downloads.vue */ \"./src/components/current-downloads.vue\"))\n};\n/** @type {import('.').Route[]} */\n\nconst manageRoutes = [{\n path: '/manage',\n name: 'manage',\n meta: {\n title: 'Mass Update',\n header: 'Mass Update',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/backlogOverview',\n name: 'manageBacklogOverview',\n meta: {\n title: 'Backlog Overview',\n header: 'Backlog Overview',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/episodeStatuses',\n name: 'manageEpisodeOverview',\n meta: {\n title: 'Episode Overview',\n header: 'Episode Overview',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/failedDownloads',\n name: 'manageFailedDownloads',\n meta: {\n title: 'Failed Downloads',\n header: 'Failed Downloads',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/manageSearches',\n name: 'manageManageSearches',\n meta: {\n title: 'Manage Searches',\n header: 'Manage Searches',\n topMenu: 'manage',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/manage-searches.vue */ \"./src/components/manage-searches.vue\"))\n}, {\n path: '/manage/massEdit',\n name: 'manageMassEdit',\n meta: {\n title: 'Mass Edit',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/subtitleMissed',\n name: 'manageSubtitleMissed',\n meta: {\n title: 'Missing Subtitles',\n header: 'Missing Subtitles',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/subtitleMissedPP',\n name: 'manageSubtitleMissedPP',\n meta: {\n title: 'Missing Subtitles in Post-Process folder',\n header: 'Missing Subtitles in Post-Process folder',\n topMenu: 'manage'\n }\n}];\n/** @type {import('.').Route[]} */\n\nconst errorLogsRoutes = [{\n path: '/errorlogs',\n name: 'errorlogs',\n meta: {\n title: 'Logs & Errors',\n topMenu: 'system',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.errorlogsSubMenu\n }\n}, {\n path: '/errorlogs/viewlog',\n name: 'viewlog',\n meta: {\n title: 'Logs',\n header: 'Log File',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/logs.vue */ \"./src/components/logs.vue\"))\n}];\n/** @type {import('.').Route} */\n\nconst newsRoute = {\n path: '/news',\n name: 'news',\n meta: {\n title: 'News',\n header: 'News',\n topMenu: 'system'\n }\n};\n/** @type {import('.').Route} */\n\nconst changesRoute = {\n path: '/changes',\n name: 'changes',\n meta: {\n title: 'Changelog',\n header: 'Changelog',\n topMenu: 'system'\n }\n};\n/** @type {import('.').Route} */\n\nconst ircRoute = {\n path: '/IRC',\n name: 'IRC',\n meta: {\n title: 'IRC',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/irc.vue */ \"./src/components/irc.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst notFoundRoute = {\n path: '/not-found',\n name: 'not-found',\n meta: {\n title: '404',\n header: '404 - page not found'\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/http/404.vue */ \"./src/components/http/404.vue\"))\n}; // @NOTE: Redirect can only be added once all routes are vue\n\n/*\n/** @type {import('.').Route} *-/\nconst notFoundRedirect = {\n path: '*',\n redirect: '/not-found'\n};\n*/\n\n/** @type {import('.').Route[]} */\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ([...homeRoutes, ...configRoutes, ...addShowRoutes, loginRoute, addRecommendedRoute, scheduleRoute, historyRoute, downloadsRoute, ...manageRoutes, ...errorLogsRoutes, newsRoute, changesRoute, ircRoute, notFoundRoute]);\n\n//# sourceURL=webpack://slim/./src/router/routes.js?"); /***/ }), @@ -873,7 +895,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-native-websocket */ \"./node_modules/vue-native-websocket/dist/build.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(vue_native_websocket__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _modules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules */ \"./src/store/modules/index.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_3__.default.use(vuex__WEBPACK_IMPORTED_MODULE_4__.default);\nconst store = new vuex__WEBPACK_IMPORTED_MODULE_4__.Store({\n modules: {\n auth: _modules__WEBPACK_IMPORTED_MODULE_1__.auth,\n config: _modules__WEBPACK_IMPORTED_MODULE_1__.config,\n defaults: _modules__WEBPACK_IMPORTED_MODULE_1__.defaults,\n history: _modules__WEBPACK_IMPORTED_MODULE_1__.history,\n notifications: _modules__WEBPACK_IMPORTED_MODULE_1__.notifications,\n provider: _modules__WEBPACK_IMPORTED_MODULE_1__.provider,\n shows: _modules__WEBPACK_IMPORTED_MODULE_1__.shows,\n socket: _modules__WEBPACK_IMPORTED_MODULE_1__.socket,\n stats: _modules__WEBPACK_IMPORTED_MODULE_1__.stats,\n queue: _modules__WEBPACK_IMPORTED_MODULE_1__.queue\n },\n state: {},\n mutations: {},\n getters: {},\n actions: {}\n}); // Keep as a non-arrow function for `this` context.\n\nconst passToStoreHandler = function (eventName, event, next) {\n const target = eventName.toUpperCase();\n const eventData = event.data;\n\n if (target === 'SOCKET_ONMESSAGE') {\n const message = JSON.parse(eventData);\n const {\n data,\n event\n } = message; // Show the notification to the user\n\n if (event === 'notification') {\n const {\n body,\n hash,\n type,\n title\n } = data;\n window.displayNotification(type, title, body, hash);\n } else if (event === 'configUpdated') {\n const {\n section,\n config\n } = data;\n this.store.dispatch('updateConfig', {\n section,\n config\n });\n } else if (event === 'showUpdated' || event === 'showAdded') {\n this.store.dispatch('updateShow', data);\n } else if (event === 'addManualSearchResult') {\n this.store.dispatch('addManualSearchResult', data);\n } else if (event === 'QueueItemUpdate') {\n this.store.dispatch('updateQueueItem', data);\n } else if (event === 'QueueItemShowAdd') {\n this.store.dispatch('updateShowQueueItem', data);\n } else {\n window.displayNotification('info', event, data);\n }\n } // Resume normal 'passToStore' handling\n\n\n next(eventName, event);\n};\n\nconst websocketUrl = (() => {\n const {\n protocol,\n host\n } = window.location;\n const proto = protocol === 'https:' ? 'wss:' : 'ws:';\n const WSMessageUrl = '/ui';\n const webRoot = document.body.getAttribute('web-root');\n return `${proto}//${host}${webRoot}/ws${WSMessageUrl}`;\n})();\n\nvue__WEBPACK_IMPORTED_MODULE_3__.default.use((vue_native_websocket__WEBPACK_IMPORTED_MODULE_0___default()), websocketUrl, {\n store,\n format: 'json',\n reconnection: true,\n // (Boolean) whether to reconnect automatically (false)\n reconnectionAttempts: 2,\n // (Number) number of reconnection attempts before giving up (Infinity),\n reconnectionDelay: 1000,\n // (Number) how long to initially wait before attempting a new (1000)\n passToStoreHandler,\n // (Function|) Handler for events triggered by the WebSocket (false)\n mutations: {\n SOCKET_ONOPEN: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_ONOPEN,\n SOCKET_ONCLOSE: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_ONCLOSE,\n SOCKET_ONERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_ONERROR,\n SOCKET_ONMESSAGE: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_ONMESSAGE,\n SOCKET_RECONNECT: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_RECONNECT,\n SOCKET_RECONNECT_ERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_RECONNECT_ERROR\n }\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (store);\n\n//# sourceURL=webpack://slim/./src/store/index.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-native-websocket */ \"./node_modules/vue-native-websocket/dist/build.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(vue_native_websocket__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _modules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules */ \"./src/store/modules/index.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_3__.default.use(vuex__WEBPACK_IMPORTED_MODULE_4__.default);\nconst store = new vuex__WEBPACK_IMPORTED_MODULE_4__.Store({\n modules: {\n auth: _modules__WEBPACK_IMPORTED_MODULE_1__.auth,\n config: _modules__WEBPACK_IMPORTED_MODULE_1__.config,\n defaults: _modules__WEBPACK_IMPORTED_MODULE_1__.defaults,\n history: _modules__WEBPACK_IMPORTED_MODULE_1__.history,\n notifications: _modules__WEBPACK_IMPORTED_MODULE_1__.notifications,\n provider: _modules__WEBPACK_IMPORTED_MODULE_1__.provider,\n shows: _modules__WEBPACK_IMPORTED_MODULE_1__.shows,\n socket: _modules__WEBPACK_IMPORTED_MODULE_1__.socket,\n stats: _modules__WEBPACK_IMPORTED_MODULE_1__.stats,\n queue: _modules__WEBPACK_IMPORTED_MODULE_1__.queue\n },\n state: {},\n mutations: {},\n getters: {},\n actions: {}\n}); // Keep as a non-arrow function for `this` context.\n\nconst passToStoreHandler = function (eventName, event, next) {\n const target = eventName.toUpperCase();\n const eventData = event.data;\n\n if (target === 'SOCKET_ONMESSAGE') {\n const message = JSON.parse(eventData);\n const {\n data,\n event\n } = message; // Show the notification to the user\n\n if (event === 'notification') {\n const {\n body,\n hash,\n type,\n title\n } = data;\n window.displayNotification(type, title, body, hash);\n } else if (event === 'configUpdated') {\n const {\n section,\n config\n } = data;\n this.store.dispatch('updateConfig', {\n section,\n config\n });\n } else if (event === 'showUpdated' || event === 'showAdded') {\n this.store.dispatch('updateShow', data);\n } else if (event === 'addManualSearchResult') {\n this.store.dispatch('addManualSearchResult', data);\n } else if (event === 'QueueItemUpdate') {\n this.store.dispatch('updateQueueItem', data);\n } else if (event === 'QueueItemShowAdd') {\n this.store.dispatch('updateShowQueueItem', data);\n } else if (event === 'historyUpdate') {\n this.store.dispatch('updateHistory', data);\n } else {\n window.displayNotification('info', event, data);\n }\n } // Resume normal 'passToStore' handling\n\n\n next(eventName, event);\n};\n\nconst websocketUrl = (() => {\n const {\n protocol,\n host\n } = window.location;\n const proto = protocol === 'https:' ? 'wss:' : 'ws:';\n const WSMessageUrl = '/ui';\n const webRoot = document.body.getAttribute('web-root');\n return `${proto}//${host}${webRoot}/ws${WSMessageUrl}`;\n})();\n\nvue__WEBPACK_IMPORTED_MODULE_3__.default.use((vue_native_websocket__WEBPACK_IMPORTED_MODULE_0___default()), websocketUrl, {\n store,\n format: 'json',\n reconnection: true,\n // (Boolean) whether to reconnect automatically (false)\n reconnectionAttempts: 2,\n // (Number) number of reconnection attempts before giving up (Infinity),\n reconnectionDelay: 1000,\n // (Number) how long to initially wait before attempting a new (1000)\n passToStoreHandler,\n // (Function|) Handler for events triggered by the WebSocket (false)\n mutations: {\n SOCKET_ONOPEN: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_ONOPEN,\n SOCKET_ONCLOSE: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_ONCLOSE,\n SOCKET_ONERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_ONERROR,\n SOCKET_ONMESSAGE: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_ONMESSAGE,\n SOCKET_RECONNECT: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_RECONNECT,\n SOCKET_RECONNECT_ERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_RECONNECT_ERROR\n }\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (store);\n\n//# sourceURL=webpack://slim/./src/store/index.js?"); /***/ }), @@ -917,7 +939,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../mutation-types */ \"./src/store/mutation-types.js\");\n\n/**\n * An object representing a split quality.\n *\n * @typedef {Object} Quality\n * @property {number[]} allowed - Allowed qualities\n * @property {number[]} preferred - Preferred qualities\n */\n\nconst state = {\n qualities: {\n values: [],\n anySets: [],\n presets: []\n },\n statuses: []\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_0__.ADD_CONFIG](state, {\n section,\n config\n }) {\n if (section === 'consts') {\n state = Object.assign(state, config);\n }\n }\n\n};\nconst getters = {\n // Get a quality object using a key or a value\n getQuality: state => ({\n key,\n value\n }) => {\n if ([key, value].every(x => x === undefined) || [key, value].every(x => x !== undefined)) {\n throw new Error('Conflict in `getQuality`: Please provide either `key` or `value`.');\n }\n\n return state.qualities.values.find(quality => key === quality.key || value === quality.value);\n },\n // Get a quality any-set object using a key or a value\n getQualityAnySet: state => ({\n key,\n value\n }) => {\n if ([key, value].every(x => x === undefined) || [key, value].every(x => x !== undefined)) {\n throw new Error('Conflict in `getQualityAnySet`: Please provide either `key` or `value`.');\n }\n\n return state.qualities.anySets.find(preset => key === preset.key || value === preset.value);\n },\n // Get a quality preset object using a key or a value\n getQualityPreset: state => ({\n key,\n value\n }) => {\n if ([key, value].every(x => x === undefined) || [key, value].every(x => x !== undefined)) {\n throw new Error('Conflict in `getQualityPreset`: Please provide either `key` or `value`.');\n }\n\n return state.qualities.presets.find(preset => key === preset.key || value === preset.value);\n },\n // Get a status object using a key or a value\n getStatus: state => ({\n key,\n value\n }) => {\n if ([key, value].every(x => x === undefined) || [key, value].every(x => x !== undefined)) {\n throw new Error('Conflict in `getStatus`: Please provide either `key` or `value`.');\n }\n\n return state.statuses.find(status => key === status.key || value === status.value);\n },\n\n /**\n * Get an episode overview status using the episode status and quality.\n *\n * @typedef {Object} - Episode status\n * @property {Object} quality - Episode quality\n * @property {Object} configQualities - Shows configured qualities (allowed and preferred)\n * @returns {String} The overview status\n */\n // eslint-disable-next-line no-unused-vars\n getOverviewStatus: _state => (status, quality, configQualities) => {\n if (['Unset', 'Unaired'].includes(status)) {\n return 'Unaired';\n }\n\n if (['Skipped', 'Ignored'].includes(status)) {\n return 'Skipped';\n }\n\n if (['Archived'].includes(status)) {\n return 'Preferred';\n }\n\n if (['Wanted', 'Failed'].includes(status)) {\n return 'Wanted';\n }\n\n if (['Snatched', 'Snatched (Proper)', 'Snatched (Best)'].includes(status)) {\n return 'Snatched';\n }\n\n if (['Downloaded'].includes(status)) {\n // Check if the show has been configured with only allowed qualities.\n if (configQualities.allowed.length > 0 && configQualities.preferred.length === 0) {\n // This is a hack, because technically the quality does not fit in the Preferred quality.\n // But because 'preferred' translates to the css color \"green\", we use it.\n if (configQualities.allowed.includes(quality)) {\n return 'Preferred';\n }\n }\n\n if (configQualities.preferred.includes(quality)) {\n return 'Preferred';\n }\n\n if (configQualities.allowed.includes(quality)) {\n return 'Allowed';\n }\n\n return 'Wanted';\n }\n\n return status;\n },\n splitQuality: state => {\n /**\n * Split a combined quality to allowed and preferred qualities.\n * Converted Python method from `medusa.common.Quality.split_quality`.\n *\n * @param {number} quality - The combined quality to split\n * @returns {Quality} The split quality\n */\n const _splitQuality = quality => {\n return state.qualities.values.reduce((result, {\n value\n }) => {\n quality >>>= 0; // Unsigned int\n\n if (value & quality) {\n result.allowed.push(value);\n }\n\n if (value << 16 & quality) {\n result.preferred.push(value);\n }\n\n return result;\n }, {\n allowed: [],\n preferred: []\n });\n };\n\n return _splitQuality;\n }\n};\nconst actions = {};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack://slim/./src/store/modules/config/consts.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../mutation-types */ \"./src/store/mutation-types.js\");\n\n/**\n * An object representing a split quality.\n *\n * @typedef {Object} Quality\n * @property {number[]} allowed - Allowed qualities\n * @property {number[]} preferred - Preferred qualities\n */\n\nconst state = {\n qualities: {\n values: [],\n anySets: [],\n presets: []\n },\n statuses: [],\n clientStatuses: []\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_0__.ADD_CONFIG](state, {\n section,\n config\n }) {\n if (section === 'consts') {\n state = Object.assign(state, config);\n }\n }\n\n};\nconst getters = {\n // Get a quality object using a key or a value\n getQuality: state => ({\n key,\n value\n }) => {\n if ([key, value].every(x => x === undefined) || [key, value].every(x => x !== undefined)) {\n throw new Error('Conflict in `getQuality`: Please provide either `key` or `value`.');\n }\n\n return state.qualities.values.find(quality => key === quality.key || value === quality.value);\n },\n // Get a quality any-set object using a key or a value\n getQualityAnySet: state => ({\n key,\n value\n }) => {\n if ([key, value].every(x => x === undefined) || [key, value].every(x => x !== undefined)) {\n throw new Error('Conflict in `getQualityAnySet`: Please provide either `key` or `value`.');\n }\n\n return state.qualities.anySets.find(preset => key === preset.key || value === preset.value);\n },\n // Get a quality preset object using a key or a value\n getQualityPreset: state => ({\n key,\n value\n }) => {\n if ([key, value].every(x => x === undefined) || [key, value].every(x => x !== undefined)) {\n throw new Error('Conflict in `getQualityPreset`: Please provide either `key` or `value`.');\n }\n\n return state.qualities.presets.find(preset => key === preset.key || value === preset.value);\n },\n // Get a status object using a key or a value\n getStatus: state => ({\n key,\n value\n }) => {\n if ([key, value].every(x => x === undefined) || [key, value].every(x => x !== undefined)) {\n throw new Error('Conflict in `getStatus`: Please provide either `key` or `value`.');\n }\n\n return state.statuses.find(status => key === status.key || value === status.value);\n },\n\n /**\n * Get an episode overview status using the episode status and quality.\n *\n * @typedef {Object} - Episode status\n * @property {Object} quality - Episode quality\n * @property {Object} configQualities - Shows configured qualities (allowed and preferred)\n * @returns {String} The overview status\n */\n // eslint-disable-next-line no-unused-vars\n getOverviewStatus: _state => (status, quality, configQualities) => {\n if (['Unset', 'Unaired'].includes(status)) {\n return 'Unaired';\n }\n\n if (['Skipped', 'Ignored'].includes(status)) {\n return 'Skipped';\n }\n\n if (['Archived'].includes(status)) {\n return 'Preferred';\n }\n\n if (['Wanted', 'Failed'].includes(status)) {\n return 'Wanted';\n }\n\n if (['Snatched', 'Snatched (Proper)', 'Snatched (Best)'].includes(status)) {\n return 'Snatched';\n }\n\n if (['Downloaded'].includes(status)) {\n // Check if the show has been configured with only allowed qualities.\n if (configQualities.allowed.length > 0 && configQualities.preferred.length === 0) {\n // This is a hack, because technically the quality does not fit in the Preferred quality.\n // But because 'preferred' translates to the css color \"green\", we use it.\n if (configQualities.allowed.includes(quality)) {\n return 'Preferred';\n }\n }\n\n if (configQualities.preferred.includes(quality)) {\n return 'Preferred';\n }\n\n if (configQualities.allowed.includes(quality)) {\n return 'Allowed';\n }\n\n return 'Wanted';\n }\n\n return status;\n },\n splitQuality: state => {\n /**\n * Split a combined quality to allowed and preferred qualities.\n * Converted Python method from `medusa.common.Quality.split_quality`.\n *\n * @param {number} quality - The combined quality to split\n * @returns {Quality} The split quality\n */\n const _splitQuality = quality => {\n return state.qualities.values.reduce((result, {\n value\n }) => {\n quality >>>= 0; // Unsigned int\n\n if (value & quality) {\n result.allowed.push(value);\n }\n\n if (value << 16 & quality) {\n result.preferred.push(value);\n }\n\n return result;\n }, {\n allowed: [],\n preferred: []\n });\n };\n\n return _splitQuality;\n }\n};\nconst actions = {};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack://slim/./src/store/modules/config/consts.js?"); /***/ }), @@ -1280,7 +1302,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nconst state = {\n show: {\n airs: null,\n airsFormatValid: null,\n akas: null,\n cache: null,\n classification: null,\n seasonCount: [],\n config: {\n airByDate: null,\n aliases: [],\n anime: null,\n defaultEpisodeStatus: null,\n dvdOrder: null,\n location: null,\n locationValid: null,\n paused: null,\n qualities: {\n allowed: [],\n preferred: []\n },\n release: {\n requiredWords: [],\n ignoredWords: [],\n blacklist: [],\n whitelist: [],\n requiredWordsExclude: null,\n ignoredWordsExclude: null\n },\n scene: null,\n seasonFolders: null,\n sports: null,\n subtitlesEnabled: null,\n airdateOffset: null\n },\n countries: null,\n genres: [],\n id: {\n tvdb: null,\n trakt: null,\n imdb: null,\n slug: null\n },\n indexer: null,\n imdbInfo: {\n akas: null,\n certificates: null,\n countries: null,\n countryCodes: null,\n genres: null,\n imdbId: null,\n imdbInfoId: null,\n indexer: null,\n indexerId: null,\n lastUpdate: null,\n plot: null,\n rating: null,\n runtimes: null,\n title: null,\n votes: null\n },\n language: null,\n network: null,\n nextAirDate: null,\n plot: null,\n rating: {\n imdb: {\n rating: null,\n votes: null\n }\n },\n runtime: null,\n showType: null,\n status: null,\n title: null,\n type: null,\n year: {},\n size: null,\n // ===========================\n // Detailed (`?detailed=true`)\n // ===========================\n showQueueStatus: [],\n xemNumbering: [],\n sceneAbsoluteNumbering: [],\n xemAbsoluteNumbering: [],\n sceneNumbering: [],\n // ===========================\n // Episodes (`?episodes=true`)\n // ===========================\n // Seasons array is added to the show object under this query,\n // but we currently check to see if this property is defined before fetching the show with `?episodes=true`.\n // seasons: [],\n episodeCount: null\n },\n provider: {\n id: null,\n name: null,\n config: {},\n cache: []\n }\n};\nconst mutations = {};\nconst getters = {};\nconst actions = {};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack://slim/./src/store/modules/defaults.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nconst state = {\n show: {\n airs: null,\n airsFormatValid: null,\n akas: null,\n cache: null,\n classification: null,\n seasonCount: [],\n config: {\n airByDate: null,\n aliases: [],\n anime: null,\n defaultEpisodeStatus: null,\n dvdOrder: null,\n location: null,\n locationValid: null,\n paused: null,\n qualities: {\n allowed: [],\n preferred: []\n },\n release: {\n requiredWords: [],\n ignoredWords: [],\n blacklist: [],\n whitelist: [],\n requiredWordsExclude: null,\n ignoredWordsExclude: null\n },\n scene: null,\n seasonFolders: null,\n sports: null,\n subtitlesEnabled: null,\n airdateOffset: null\n },\n countries: null,\n genres: [],\n id: {\n tvdb: null,\n trakt: null,\n imdb: null,\n slug: null\n },\n indexer: null,\n imdbInfo: {\n akas: null,\n certificates: null,\n countries: null,\n countryCodes: null,\n genres: null,\n imdbId: null,\n imdbInfoId: null,\n indexer: null,\n indexerId: null,\n lastUpdate: null,\n plot: null,\n rating: null,\n runtimes: null,\n title: null,\n votes: null\n },\n language: null,\n network: null,\n nextAirDate: null,\n plot: null,\n rating: {\n imdb: {\n rating: null,\n votes: null\n }\n },\n runtime: null,\n showType: null,\n status: null,\n title: null,\n type: null,\n year: {},\n size: null,\n // ===========================\n // Detailed (`?detailed=true`)\n // ===========================\n showQueueStatus: [],\n xemNumbering: [],\n sceneAbsoluteNumbering: [],\n xemAbsoluteNumbering: [],\n sceneNumbering: [],\n // ===========================\n // Episodes (`?episodes=true`)\n // ===========================\n // Seasons array is added to the show object under this query,\n // but we currently check to see if this property is defined before fetching the show with `?episodes=true`.\n seasons: [],\n episodeCount: null\n },\n provider: {\n id: null,\n name: null,\n config: {},\n cache: []\n }\n};\nconst mutations = {};\nconst getters = {};\nconst actions = {};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack://slim/./src/store/modules/defaults.js?"); /***/ }), @@ -1291,7 +1313,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/core */ \"./src/utils/core.js\");\n\n\n\n\nconst state = {\n history: [],\n page: 0,\n episodeHistory: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_HISTORY](state, history) {\n // Update state\n state.history.push(...history);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_HISTORY](state, {\n showSlug,\n history\n }) {\n // Add history data to episodeHistory, but without passing the show slug.\n for (const row of history) {\n if (!Object.keys(state.episodeHistory).includes(showSlug)) {\n vue__WEBPACK_IMPORTED_MODULE_3__.default.set(state.episodeHistory, showSlug, {});\n }\n\n const episodeSlug = (0,_utils_core__WEBPACK_IMPORTED_MODULE_2__.episodeToSlug)(row.season, row.episode);\n\n if (!state.episodeHistory[showSlug][episodeSlug]) {\n state.episodeHistory[showSlug][episodeSlug] = [];\n }\n\n state.episodeHistory[showSlug][episodeSlug].push(row);\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_EPISODE_HISTORY](state, {\n showSlug,\n episodeSlug,\n history\n }) {\n // Keep an object of shows, with their history per episode\n // Example: {tvdb1234: {s01e01: [history]}}\n if (!Object.keys(state.episodeHistory).includes(showSlug)) {\n vue__WEBPACK_IMPORTED_MODULE_3__.default.set(state.episodeHistory, showSlug, {});\n }\n\n vue__WEBPACK_IMPORTED_MODULE_3__.default.set(state.episodeHistory[showSlug], episodeSlug, history);\n }\n\n};\nconst getters = {\n getShowHistoryBySlug: state => showSlug => state.showHistory[showSlug],\n getLastReleaseName: state => ({\n showSlug,\n episodeSlug\n }) => {\n if (state.episodeHistory[showSlug] !== undefined) {\n if (state.episodeHistory[showSlug][episodeSlug] !== undefined) {\n if (state.episodeHistory[showSlug][episodeSlug].length === 1) {\n return state.episodeHistory[showSlug][episodeSlug][0].resource;\n }\n\n const filteredHistory = state.episodeHistory[showSlug][episodeSlug].sort((a, b) => (a.actionDate - b.actionDate) * -1).filter(ep => ['Snatched', 'Downloaded'].includes(ep.statusName) && ep.resource !== '');\n\n if (filteredHistory.length > 0) {\n return filteredHistory[0].resource;\n }\n }\n }\n },\n getEpisodeHistory: state => ({\n showSlug,\n episodeSlug\n }) => {\n if (state.episodeHistory[showSlug] === undefined) {\n return [];\n }\n\n return state.episodeHistory[showSlug][episodeSlug] || [];\n },\n getSeasonHistory: state => ({\n showSlug,\n season\n }) => {\n if (state.episodeHistory[showSlug] === undefined) {\n return [];\n }\n\n return Object.values(state.episodeHistory[showSlug]).flat().filter(row => row.season === season) || [];\n }\n};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get show history from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n async getShowHistory(context, {\n slug\n }) {\n const {\n commit\n } = context;\n const response = await _api__WEBPACK_IMPORTED_MODULE_0__.api.get(`/history/${slug}`);\n\n if (response.data.length > 0) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_HISTORY, {\n showSlug: slug,\n history: response.data\n });\n }\n },\n\n /**\n * Get history from API and commit them to the store.\n *\n * @param {*} context - The store context.\n * @param {string} showSlug Slug for the show to get. If not provided, gets the first 1k shows.\n * @returns {undefined|Promise} undefined if `shows` was provided or the API response if not.\n */\n async getHistory(context, showSlug) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit\n };\n let url = '/history';\n\n if (showSlug) {\n url = `${url}/${showSlug}`;\n }\n\n let lastPage = false;\n\n while (!lastPage) {\n let response = null;\n state.page += 1;\n params.page = state.page;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_0__.api.get(url, {\n params\n }); // eslint-disable-line no-await-in-loop\n } catch (error) {\n if (error.response && error.response.status === 404) {\n console.debug(`No history available${showSlug ? ' for show ' + showSlug : ''}`);\n }\n\n lastPage = true;\n }\n\n if (response) {\n if (showSlug) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_HISTORY, {\n showSlug,\n history: response.data\n });\n } else {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_HISTORY, response.data);\n }\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n } else {\n lastPage = true;\n }\n }\n },\n\n /**\n * Get episode history from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n getShowEpisodeHistory(context, {\n showSlug,\n episodeSlug\n }) {\n return new Promise(resolve => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_0__.api.get(`/history/${showSlug}/episode/${episodeSlug}`).then(response => {\n if (response.data.length > 0) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_EPISODE_HISTORY, {\n showSlug,\n episodeSlug,\n history: response.data\n });\n }\n\n resolve();\n }).catch(() => {\n console.warn(`No episode history found for show ${showSlug} and episode ${episodeSlug}`);\n });\n });\n }\n\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack://slim/./src/store/modules/history.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/core */ \"./src/utils/core.js\");\n\n\n\n\nconst state = {\n remote: {\n rows: [],\n totalRows: 0,\n page: 1,\n perPage: 25,\n sort: [{\n field: 'date',\n type: 'desc'\n }],\n filter: null\n },\n remoteCompact: {\n rows: [],\n totalRows: 0,\n page: 1,\n perPage: 25,\n sort: [{\n field: 'date',\n type: 'desc'\n }],\n filter: null\n },\n episodeHistory: {},\n historyLast: null,\n historyLastCompact: null,\n loading: false\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_HISTORY](state, {\n history,\n compact\n }) {\n // Only evaluate compact once.\n const historyKey = compact ? 'remoteCompact' : 'remote'; // Update state\n\n vue__WEBPACK_IMPORTED_MODULE_3__.default.set(state[historyKey], 'rows', history);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_HISTORY](state, {\n showSlug,\n history\n }) {\n // Add history data to episodeHistory, but without passing the show slug.\n for (const row of history) {\n if (!Object.keys(state.episodeHistory).includes(showSlug)) {\n vue__WEBPACK_IMPORTED_MODULE_3__.default.set(state.episodeHistory, showSlug, {});\n }\n\n const episodeSlug = (0,_utils_core__WEBPACK_IMPORTED_MODULE_2__.episodeToSlug)(row.season, row.episode);\n\n if (!state.episodeHistory[showSlug][episodeSlug]) {\n state.episodeHistory[showSlug][episodeSlug] = [];\n }\n\n state.episodeHistory[showSlug][episodeSlug].push(row);\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_EPISODE_HISTORY](state, {\n showSlug,\n episodeSlug,\n history\n }) {\n // Keep an object of shows, with their history per episode\n // Example: {tvdb1234: {s01e01: [history]}}\n if (!Object.keys(state.episodeHistory).includes(showSlug)) {\n vue__WEBPACK_IMPORTED_MODULE_3__.default.set(state.episodeHistory, showSlug, {});\n }\n\n vue__WEBPACK_IMPORTED_MODULE_3__.default.set(state.episodeHistory[showSlug], episodeSlug, history);\n },\n\n setLoading(state, value) {\n state.loading = value;\n },\n\n setRemoteTotal(state, {\n total,\n compact = false\n }) {\n state[compact ? 'remoteCompact' : 'remote'].totalRows = total;\n }\n\n};\nconst getters = {\n getShowHistoryBySlug: state => showSlug => state.showHistory[showSlug],\n getLastReleaseName: state => ({\n showSlug,\n episodeSlug\n }) => {\n if (state.episodeHistory[showSlug] !== undefined) {\n if (state.episodeHistory[showSlug][episodeSlug] !== undefined) {\n if (state.episodeHistory[showSlug][episodeSlug].length === 1) {\n return state.episodeHistory[showSlug][episodeSlug][0].resource;\n }\n\n const filteredHistory = state.episodeHistory[showSlug][episodeSlug].sort((a, b) => (a.actionDate - b.actionDate) * -1).filter(ep => ['Snatched', 'Downloaded'].includes(ep.statusName) && ep.resource !== '');\n\n if (filteredHistory.length > 0) {\n return filteredHistory[0].resource;\n }\n }\n }\n },\n getEpisodeHistory: state => ({\n showSlug,\n episodeSlug\n }) => {\n if (state.episodeHistory[showSlug] === undefined) {\n return [];\n }\n\n return state.episodeHistory[showSlug][episodeSlug] || [];\n },\n getSeasonHistory: state => ({\n showSlug,\n season\n }) => {\n if (state.episodeHistory[showSlug] === undefined) {\n return [];\n }\n\n return Object.values(state.episodeHistory[showSlug]).flat().filter(row => row.season === season) || [];\n }\n};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get show history from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n async getShowHistory(context, {\n slug\n }) {\n const {\n commit\n } = context;\n const response = await _api__WEBPACK_IMPORTED_MODULE_0__.api.get(`/history/${slug}`);\n\n if (response.data.length > 0) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_HISTORY, {\n showSlug: slug,\n history: response.data\n });\n }\n },\n\n /**\n * Get detailed history from API and commit them to the store.\n *\n * @param {*} context - The store context.\n * @param {object} args - arguments.\n */\n async getHistory(context, args) {\n const {\n commit\n } = context;\n let url = '/history';\n const page = args ? args.page : 1;\n const limit = args ? args.perPage : 1000;\n let sort = args ? args.sort : [{\n field: 'date',\n type: 'desc'\n }];\n const filter = args ? args.filter : {};\n const showSlug = args ? args.showSlug : undefined;\n const compact = args ? args.compact : undefined;\n const params = {\n page,\n limit\n };\n\n if (sort) {\n if (!Array.isArray(sort)) {\n sort = [sort];\n }\n\n params.sort = sort;\n }\n\n if (filter) {\n params.filter = filter;\n }\n\n if (showSlug) {\n url = `${url}/${showSlug}`;\n }\n\n if (compact) {\n params.compact = true;\n }\n\n commit('setLoading', true);\n let response = null;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_0__.api.get(url, {\n params\n }); // eslint-disable-line no-await-in-loop\n\n if (response) {\n commit('setRemoteTotal', {\n total: Number(response.headers['x-pagination-count']),\n compact\n });\n\n if (showSlug) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_HISTORY, {\n showSlug,\n history: response.data,\n compact\n });\n } else {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_HISTORY, {\n history: response.data,\n compact\n });\n }\n }\n } catch (error) {\n if (error.response && error.response.status === 404) {\n console.debug(`No history available${showSlug ? ' for show ' + showSlug : ''}`);\n }\n }\n\n commit('setLoading', false);\n },\n\n /**\n * Get episode history from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n getShowEpisodeHistory(context, {\n showSlug,\n episodeSlug\n }) {\n return new Promise(resolve => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_0__.api.get(`/history/${showSlug}/episode/${episodeSlug}`).then(response => {\n if (response.data.length > 0) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_EPISODE_HISTORY, {\n showSlug,\n episodeSlug,\n history: response.data\n });\n }\n\n resolve();\n }).catch(() => {\n console.warn(`No episode history found for show ${showSlug} and episode ${episodeSlug}`);\n });\n });\n },\n\n checkHistory({\n state,\n rootState,\n dispatch\n }) {\n // Retrieve the last history item from api.\n // Compare the states last history or historyCompact row.\n // and get new history data.\n const {\n layout\n } = rootState.config;\n const params = {\n last: true\n };\n const historyParams = {};\n\n if (layout.historyLimit) {\n historyParams.total = layout.historyLimit;\n }\n\n let history = [];\n const compact = layout.history === 'compact';\n\n if (compact) {\n history = state.historyCompact;\n } else {\n history = state.history;\n }\n\n if (!history || history.length === 0) {\n dispatch('getHistory', {\n compact\n });\n }\n\n _api__WEBPACK_IMPORTED_MODULE_0__.api.get('/history', {\n params\n }).then(response => {\n if (response.data && response.data.date > history[0].actionDate) {\n dispatch('getHistory', {\n compact\n });\n }\n }).catch(() => {\n console.info('No history record found');\n });\n },\n\n updateHistory({\n dispatch\n }) {\n // Update store's search queue item. (provided through websocket)\n dispatch('checkHistory', {});\n }\n\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack://slim/./src/store/modules/history.js?"); /***/ }), @@ -1346,7 +1368,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\n/**\n * @typedef {object} ShowIdentifier\n * @property {string} indexer The indexer name (e.g. `tvdb`)\n * @property {number} id The show ID on the indexer (e.g. `12345`)\n */\n\nconst state = {\n shows: [],\n currentShow: {\n showSlug: null\n },\n loading: {\n total: null,\n current: null,\n display: false,\n finished: false\n },\n queueitems: []\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW](state, show) {\n const existingShow = state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer]));\n\n if (!existingShow) {\n console.debug(`Adding ${show.title || show.indexer + String(show.id)} as it wasn't found in the shows array`, show);\n state.shows.push(show);\n return;\n } // Merge new show object over old one\n // this allows detailed queries to update the record\n // without the non-detailed removing the extra data\n\n\n console.debug(`Found ${show.title || show.indexer + String(show.id)} in shows array attempting merge`);\n const newShow = { ...existingShow,\n ...show\n }; // Update state\n\n vue__WEBPACK_IMPORTED_MODULE_2__.default.set(state.shows, state.shows.indexOf(existingShow), newShow);\n console.debug(`Merged ${newShow.title || newShow.indexer + String(newShow.id)}`, newShow);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOWS](state, shows) {\n // Quick check on duplicate shows.\n const newShows = shows.filter(newShow => {\n return !state.shows.find(({\n id,\n indexer\n }) => Number(newShow.id[newShow.indexer]) === Number(id[indexer]) && newShow.indexer === indexer);\n });\n vue__WEBPACK_IMPORTED_MODULE_2__.default.set(state, 'shows', [...state.shows, ...newShows]);\n console.debug(`Added ${shows.length} shows to store`);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_CONFIG](state, {\n show,\n config\n }) {\n const existingShow = state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer]));\n existingShow.config = { ...existingShow.config,\n ...config\n };\n },\n\n currentShow(state, showSlug) {\n state.currentShow.showSlug = showSlug;\n },\n\n setLoadingTotal(state, total) {\n state.loading.total = total;\n },\n\n setLoadingCurrent(state, current) {\n state.loading.current = current;\n },\n\n updateLoadingCurrent(state, current) {\n state.loading.current += current;\n },\n\n setLoadingDisplay(state, display) {\n state.loading.display = display;\n },\n\n setLoadingFinished(state, finished) {\n state.loading.finished = finished;\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_EPISODE](state, {\n show,\n episodes\n }) {\n // Creating a new show object (from the state one) as we want to trigger a store update\n const newShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (!newShow.seasons) {\n newShow.seasons = [];\n } // Recreate an Array with season objects, with each season having an episodes array.\n // This format is used by vue-good-table (displayShow).\n\n\n episodes.forEach(episode => {\n const existingSeason = newShow.seasons.find(season => season.season === episode.season);\n\n if (existingSeason) {\n const foundIndex = existingSeason.episodes.findIndex(element => element.slug === episode.slug);\n\n if (foundIndex === -1) {\n existingSeason.episodes.push(episode);\n } else {\n existingSeason.episodes.splice(foundIndex, 1, episode);\n }\n } else {\n const newSeason = {\n season: episode.season,\n episodes: [],\n html: false,\n mode: 'span',\n label: 1\n };\n newShow.seasons.push(newSeason);\n newSeason.episodes.push(episode);\n }\n }); // Update state\n\n const existingShow = state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer]));\n vue__WEBPACK_IMPORTED_MODULE_2__.default.set(state.shows, state.shows.indexOf(existingShow), newShow);\n console.log(`Storing episodes for show ${newShow.title} seasons: ${[...new Set(episodes.map(episode => episode.season))].join(', ')}`);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_SCENE_EXCEPTION](state, {\n show,\n exception\n }) {\n // Get current show object\n const currentShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (currentShow.config.aliases.find(e => e.title === exception.title && e.season === exception.season)) {\n console.warn(`Can't add exception ${exception.title} with season ${exception.season} to show ${currentShow.title} as it already exists.`);\n return;\n }\n\n currentShow.config.aliases.push(exception);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.REMOVE_SHOW_SCENE_EXCEPTION](state, {\n show,\n exception\n }) {\n // Get current show object\n const currentShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (!currentShow.config.aliases.find(e => e.title === exception.title && e.season === exception.season)) {\n console.warn(`Can't remove exception ${exception.title} with season ${exception.season} to show ${currentShow.title} as it does not exist.`);\n return;\n }\n\n currentShow.config.aliases.splice(currentShow.config.aliases.indexOf(exception), 1);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_QUEUE_ITEM](state, queueItem) {\n const existingQueueItem = state.queueitems.find(item => item.identifier === queueItem.identifier);\n\n if (existingQueueItem) {\n vue__WEBPACK_IMPORTED_MODULE_2__.default.set(state.queueitems, state.queueitems.indexOf(existingQueueItem), { ...existingQueueItem,\n ...queueItem\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_2__.default.set(state.queueitems, state.queueitems.length, queueItem);\n }\n }\n\n};\nconst getters = {\n getShowById: state => {\n /**\n * Get a show from the loaded shows state, identified by show slug.\n *\n * @param {string} showSlug Show identifier.\n * @returns {object|undefined} Show object or undefined if not found.\n */\n const getShowById = showSlug => state.shows.find(show => show.id.slug === showSlug);\n\n return getShowById;\n },\n getShowByTitle: state => title => state.shows.find(show => show.title === title),\n getSeason: state => ({\n showSlug,\n season\n }) => {\n const show = state.shows.find(show => show.id.slug === showSlug);\n return show && show.seasons ? show.seasons[season] : undefined;\n },\n getEpisode: state => ({\n showSlug,\n season,\n episode\n }) => {\n const show = state.shows.find(show => show.id.slug === showSlug);\n return show && show.seasons && show.seasons.find(s => s.season === season) ? show.seasons.find(s => s.season === season).episodes.find(ep => ep.episode === episode) : undefined;\n },\n getCurrentShow: (state, getters, rootState) => {\n return state.shows.find(show => show.id.slug === state.currentShow.showSlug) || rootState.defaults.show;\n },\n showsWithStats: (state, getters, rootState) => {\n if (!state.shows) {\n return [];\n }\n\n return state.shows.map(show => {\n let showStats = rootState.stats.show.stats.find(stat => stat.indexerId === getters.indexerNameToId(show.indexer) && stat.seriesId === show.id[show.indexer]);\n const newLine = '\\u000D';\n let text = 'Unaired';\n let title = '';\n\n if (!showStats) {\n showStats = {\n epDownloaded: 0,\n epSnatched: 0,\n epTotal: 0,\n seriesSize: 0\n };\n }\n\n if (showStats.epTotal >= 1) {\n text = showStats.epDownloaded;\n title = `Downloaded: ${showStats.epDownloaded}`;\n\n if (showStats.epSnatched) {\n text += `+${showStats.epSnatched}`;\n title += `${newLine}Snatched: ${showStats.epSnatched}`;\n }\n\n text += ` / ${showStats.epTotal}`;\n title += `${newLine}Total: ${showStats.epTotal}`;\n }\n\n show.stats = {\n episodes: {\n total: showStats.epTotal,\n snatched: showStats.epSnatched,\n downloaded: showStats.epDownloaded,\n size: showStats.seriesSize\n },\n tooltip: {\n text,\n title,\n percentage: showStats.epDownloaded * 100 / (showStats.epTotal || 1)\n }\n };\n return show;\n });\n },\n showsInLists: (state, getters, rootState) => {\n const {\n layout,\n general\n } = rootState.config;\n const {\n show\n } = layout;\n const {\n showListOrder\n } = show;\n const {\n rootDirs\n } = general;\n const {\n selectedRootIndex,\n local\n } = layout;\n const {\n showFilterByName\n } = local;\n const {\n showsWithStats\n } = getters;\n let shows = null; // Filter root dirs\n\n shows = showsWithStats.filter(show => selectedRootIndex === -1 || show.config.location.includes(rootDirs.slice(1)[selectedRootIndex])); // Filter by text for the banner, simple and smallposter layouts.\n // The Poster layout uses vue-isotope and this does not respond well to changes to the `list` property.\n\n if (layout.home !== 'poster') {\n shows = shows.filter(show => show.title.toLowerCase().includes(showFilterByName.toLowerCase()));\n }\n\n const categorizedShows = showListOrder.filter(listTitle => shows.filter(show => show.config.showLists.map(list => list.toLowerCase()).includes(listTitle.toLowerCase())).length > 0).map(listTitle => ({\n listTitle,\n shows: shows.filter(show => show.config.showLists.map(list => list.toLowerCase()).includes(listTitle.toLowerCase()))\n })); // Check for shows that are not in any category anymore\n\n const uncategorizedShows = shows.filter(show => {\n return show.config.showLists.map(item => {\n return showListOrder.map(list => list.toLowerCase()).includes(item.toLowerCase());\n }).every(item => !item);\n });\n\n if (uncategorizedShows.length > 0) {\n categorizedShows.push({\n listTitle: 'uncategorized',\n shows: uncategorizedShows\n });\n }\n\n if (categorizedShows.length === 0 && uncategorizedShows.length === 0) {\n categorizedShows.push({\n listTitle: 'Series',\n shows: []\n });\n }\n\n return categorizedShows;\n }\n};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get show from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n getShow(context, {\n showSlug,\n detailed,\n episodes\n }) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n const params = {};\n let timeout = 30000;\n\n if (detailed !== undefined) {\n params.detailed = detailed;\n timeout = 60000;\n timeout = 60000;\n }\n\n if (episodes !== undefined) {\n params.episodes = episodes;\n timeout = 60000;\n }\n\n _api__WEBPACK_IMPORTED_MODULE_0__.api.get(`/series/${showSlug}`, {\n params,\n timeout\n }).then(res => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW, res.data);\n resolve(res.data);\n }).catch(error => {\n reject(error);\n });\n });\n },\n\n /**\n * Get episdoes for a specified show from API and commit it to the store.\n *\n * @param {*} context - The store context.\n * @param {ShowParameteres} parameters - Request parameters.\n * @returns {Promise} The API response.\n */\n getEpisodes({\n commit,\n getters\n }, {\n showSlug,\n season\n }) {\n return new Promise((resolve, reject) => {\n const {\n getShowById\n } = getters;\n const show = getShowById(showSlug);\n const limit = 1000;\n const params = {\n limit\n };\n\n if (season !== undefined) {\n params.season = season;\n } // Get episodes\n\n\n _api__WEBPACK_IMPORTED_MODULE_0__.api.get(`/series/${showSlug}/episodes`, {\n params\n }).then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_EPISODE, {\n show,\n episodes: response.data\n });\n resolve();\n }).catch(error => {\n console.log(`Could not retrieve a episodes for show ${showSlug}, error: ${error}`);\n reject(error);\n });\n });\n },\n\n /**\n * Get shows from API and commit them to the store.\n *\n * @param {*} context - The store context.\n * @param {(ShowIdentifier&ShowGetParameters)[]} shows Shows to get. If not provided, gets the first 1k shows.\n * @returns {undefined|Promise} undefined if `shows` was provided or the API response if not.\n */\n getShows(context, shows) {\n const {\n commit,\n dispatch\n } = context; // If no shows are provided get the first 1000\n\n if (!shows) {\n // Loading new shows, commit show loading information to state.\n commit('setLoadingTotal', 0);\n commit('setLoadingCurrent', 0);\n commit('setLoadingDisplay', true);\n const limit = 1000;\n const page = 1;\n const params = {\n limit,\n page\n };\n const pageRequests = []; // Get first page\n\n pageRequests.push(_api__WEBPACK_IMPORTED_MODULE_0__.api.get('/series', {\n params\n }).then(response => {\n commit('setLoadingTotal', Number(response.headers['x-pagination-count']));\n const totalPages = Number(response.headers['x-pagination-total']);\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOWS, response.data);\n commit('updateLoadingCurrent', response.data.length); // Optionally get additional pages\n\n for (let page = 2; page <= totalPages; page++) {\n const newPage = {\n page\n };\n newPage.limit = params.limit;\n pageRequests.push(_api__WEBPACK_IMPORTED_MODULE_0__.api.get('/series', {\n params: newPage\n }).then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOWS, response.data);\n commit('updateLoadingCurrent', response.data.length);\n }));\n }\n }).catch(() => {\n console.log('Could not retrieve a list of shows');\n }));\n return Promise.all(pageRequests);\n }\n\n return shows.forEach(show => dispatch('getShow', show));\n },\n\n setShow(_, {\n showSlug,\n data\n }) {\n // Update show, updated show will arrive over a WebSocket message\n return _api__WEBPACK_IMPORTED_MODULE_0__.api.patch(`series/${showSlug}`, data);\n },\n\n updateShow(context, show) {\n // Update local store\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW, show);\n },\n\n addSceneException(context, {\n show,\n exception\n }) {\n const {\n commit\n } = context;\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_SCENE_EXCEPTION, {\n show,\n exception\n });\n },\n\n removeSceneException(context, {\n show,\n exception\n }) {\n const {\n commit\n } = context;\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.REMOVE_SHOW_SCENE_EXCEPTION, {\n show,\n exception\n });\n },\n\n setCurrentShow(context, showSlug) {\n return new Promise(resolve => {\n // Set current show\n const {\n commit\n } = context;\n commit('currentShow', showSlug);\n resolve();\n });\n },\n\n setShowConfig(context, {\n show,\n config\n }) {\n const {\n commit\n } = context;\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_CONFIG, {\n show,\n config\n });\n },\n\n updateShowQueueItem(context, queueItem) {\n // Update store's search queue item. (provided through websocket)\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_QUEUE_ITEM, queueItem);\n }\n\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack://slim/./src/store/modules/shows.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\n/**\n * @typedef {object} ShowIdentifier\n * @property {string} indexer The indexer name (e.g. `tvdb`)\n * @property {number} id The show ID on the indexer (e.g. `12345`)\n */\n\nconst state = {\n shows: [],\n currentShow: {\n showSlug: null\n },\n loading: {\n total: null,\n current: null,\n display: false,\n finished: false\n },\n queueitems: []\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW](state, show) {\n const existingShow = state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer]));\n\n if (!existingShow) {\n console.debug(`Adding ${show.title || show.indexer + String(show.id)} as it wasn't found in the shows array`, show);\n state.shows.push(show);\n return;\n } // Merge new show object over old one\n // this allows detailed queries to update the record\n // without the non-detailed removing the extra data\n\n\n console.debug(`Found ${show.title || show.indexer + String(show.id)} in shows array attempting merge`);\n const newShow = { ...existingShow,\n ...show\n }; // Update state\n\n vue__WEBPACK_IMPORTED_MODULE_2__.default.set(state.shows, state.shows.indexOf(existingShow), newShow);\n console.debug(`Merged ${newShow.title || newShow.indexer + String(newShow.id)}`, newShow);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOWS](state, shows) {\n // Quick check on duplicate shows.\n const newShows = shows.filter(newShow => {\n return !state.shows.find(({\n id,\n indexer\n }) => Number(newShow.id[newShow.indexer]) === Number(id[indexer]) && newShow.indexer === indexer);\n });\n vue__WEBPACK_IMPORTED_MODULE_2__.default.set(state, 'shows', [...state.shows, ...newShows]);\n console.debug(`Added ${shows.length} shows to store`);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_CONFIG](state, {\n show,\n config\n }) {\n const existingShow = state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer]));\n existingShow.config = { ...existingShow.config,\n ...config\n };\n },\n\n currentShow(state, showSlug) {\n state.currentShow.showSlug = showSlug;\n },\n\n setLoadingTotal(state, total) {\n state.loading.total = total;\n },\n\n setLoadingCurrent(state, current) {\n state.loading.current = current;\n },\n\n updateLoadingCurrent(state, current) {\n state.loading.current += current;\n },\n\n setLoadingDisplay(state, display) {\n state.loading.display = display;\n },\n\n setLoadingFinished(state, finished) {\n state.loading.finished = finished;\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_EPISODE](state, {\n show,\n episodes\n }) {\n // Creating a new show object (from the state one) as we want to trigger a store update\n const newShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (!newShow.seasons) {\n newShow.seasons = [];\n } // Recreate an Array with season objects, with each season having an episodes array.\n // This format is used by vue-good-table (displayShow).\n\n\n episodes.forEach(episode => {\n const existingSeason = newShow.seasons.find(season => season.season === episode.season);\n\n if (existingSeason) {\n const foundIndex = existingSeason.children.findIndex(element => element.slug === episode.slug);\n\n if (foundIndex === -1) {\n existingSeason.children.push(episode);\n } else {\n existingSeason.children.splice(foundIndex, 1, episode);\n }\n } else {\n const newSeason = {\n season: episode.season,\n children: [],\n html: false,\n mode: 'span',\n label: 1\n };\n newShow.seasons.push(newSeason);\n newSeason.children.push(episode);\n }\n }); // Update state\n\n const existingShow = state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer]));\n vue__WEBPACK_IMPORTED_MODULE_2__.default.set(state.shows, state.shows.indexOf(existingShow), newShow);\n console.log(`Storing episodes for show ${newShow.title} seasons: ${[...new Set(episodes.map(episode => episode.season))].join(', ')}`);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_SCENE_EXCEPTION](state, {\n show,\n exception\n }) {\n // Get current show object\n const currentShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (currentShow.config.aliases.find(e => e.title === exception.title && e.season === exception.season)) {\n console.warn(`Can't add exception ${exception.title} with season ${exception.season} to show ${currentShow.title} as it already exists.`);\n return;\n }\n\n currentShow.config.aliases.push(exception);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.REMOVE_SHOW_SCENE_EXCEPTION](state, {\n show,\n exception\n }) {\n // Get current show object\n const currentShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (!currentShow.config.aliases.find(e => e.title === exception.title && e.season === exception.season)) {\n console.warn(`Can't remove exception ${exception.title} with season ${exception.season} to show ${currentShow.title} as it does not exist.`);\n return;\n }\n\n currentShow.config.aliases.splice(currentShow.config.aliases.indexOf(exception), 1);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_QUEUE_ITEM](state, queueItem) {\n const existingQueueItem = state.queueitems.find(item => item.identifier === queueItem.identifier);\n\n if (existingQueueItem) {\n vue__WEBPACK_IMPORTED_MODULE_2__.default.set(state.queueitems, state.queueitems.indexOf(existingQueueItem), { ...existingQueueItem,\n ...queueItem\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_2__.default.set(state.queueitems, state.queueitems.length, queueItem);\n }\n }\n\n};\nconst getters = {\n getShowById: state => {\n /**\n * Get a show from the loaded shows state, identified by show slug.\n *\n * @param {string} showSlug Show identifier.\n * @returns {object|undefined} Show object or undefined if not found.\n */\n const getShowById = showSlug => state.shows.find(show => show.id.slug === showSlug);\n\n return getShowById;\n },\n getShowByTitle: state => title => state.shows.find(show => show.title === title),\n getSeason: state => ({\n showSlug,\n season\n }) => {\n const show = state.shows.find(show => show.id.slug === showSlug);\n return show && show.seasons ? show.seasons[season] : undefined;\n },\n getEpisode: state => ({\n showSlug,\n season,\n episode\n }) => {\n const show = state.shows.find(show => show.id.slug === showSlug);\n return show && show.seasons && show.seasons.find(s => s.season === season) ? show.seasons.find(s => s.season === season).children.find(ep => ep.episode === episode) : undefined;\n },\n getCurrentShow: (state, getters, rootState) => {\n return state.shows.find(show => show.id.slug === state.currentShow.showSlug) || rootState.defaults.show;\n },\n showsWithStats: (state, getters, rootState) => {\n if (!state.shows) {\n return [];\n }\n\n return state.shows.map(show => {\n let showStats = rootState.stats.show.stats.find(stat => stat.indexerId === getters.indexerNameToId(show.indexer) && stat.seriesId === show.id[show.indexer]);\n const newLine = '\\u000D';\n let text = 'Unaired';\n let title = '';\n\n if (!showStats) {\n showStats = {\n epDownloaded: 0,\n epSnatched: 0,\n epTotal: 0,\n seriesSize: 0\n };\n }\n\n if (showStats.epTotal >= 1) {\n text = showStats.epDownloaded;\n title = `Downloaded: ${showStats.epDownloaded}`;\n\n if (showStats.epSnatched) {\n text += `+${showStats.epSnatched}`;\n title += `${newLine}Snatched: ${showStats.epSnatched}`;\n }\n\n text += ` / ${showStats.epTotal}`;\n title += `${newLine}Total: ${showStats.epTotal}`;\n }\n\n show.stats = {\n episodes: {\n total: showStats.epTotal,\n snatched: showStats.epSnatched,\n downloaded: showStats.epDownloaded,\n size: showStats.seriesSize\n },\n tooltip: {\n text,\n title,\n percentage: showStats.epDownloaded * 100 / (showStats.epTotal || 1)\n }\n };\n return show;\n });\n },\n showsInLists: (state, getters, rootState) => {\n const {\n layout,\n general\n } = rootState.config;\n const {\n show\n } = layout;\n const {\n showListOrder\n } = show;\n const {\n rootDirs\n } = general;\n const {\n selectedRootIndex,\n local\n } = layout;\n const {\n showFilterByName\n } = local;\n const {\n showsWithStats\n } = getters;\n let shows = null; // Filter root dirs\n\n shows = showsWithStats.filter(show => selectedRootIndex === -1 || show.config.location.includes(rootDirs.slice(1)[selectedRootIndex])); // Filter by text for the banner, simple and smallposter layouts.\n // The Poster layout uses vue-isotope and this does not respond well to changes to the `list` property.\n\n if (layout.home !== 'poster') {\n shows = shows.filter(show => show.title.toLowerCase().includes(showFilterByName.toLowerCase()));\n }\n\n const categorizedShows = showListOrder.filter(listTitle => shows.filter(show => show.config.showLists.map(list => list.toLowerCase()).includes(listTitle.toLowerCase())).length > 0).map(listTitle => ({\n listTitle,\n shows: shows.filter(show => show.config.showLists.map(list => list.toLowerCase()).includes(listTitle.toLowerCase()))\n })); // Check for shows that are not in any category anymore\n\n const uncategorizedShows = shows.filter(show => {\n return show.config.showLists.map(item => {\n return showListOrder.map(list => list.toLowerCase()).includes(item.toLowerCase());\n }).every(item => !item);\n });\n\n if (uncategorizedShows.length > 0) {\n categorizedShows.push({\n listTitle: 'uncategorized',\n shows: uncategorizedShows\n });\n }\n\n if (categorizedShows.length === 0 && uncategorizedShows.length === 0) {\n categorizedShows.push({\n listTitle: 'Series',\n shows: []\n });\n }\n\n return categorizedShows;\n }\n};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get show from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n getShow(context, {\n showSlug,\n detailed,\n episodes\n }) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n const params = {};\n let timeout = 30000;\n\n if (detailed !== undefined) {\n params.detailed = detailed;\n timeout = 60000;\n timeout = 60000;\n }\n\n if (episodes !== undefined) {\n params.episodes = episodes;\n timeout = 60000;\n }\n\n _api__WEBPACK_IMPORTED_MODULE_0__.api.get(`/series/${showSlug}`, {\n params,\n timeout\n }).then(res => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW, res.data);\n resolve(res.data);\n }).catch(error => {\n reject(error);\n });\n });\n },\n\n /**\n * Get episdoes for a specified show from API and commit it to the store.\n *\n * @param {*} context - The store context.\n * @param {ShowParameteres} parameters - Request parameters.\n * @returns {Promise} The API response.\n */\n getEpisodes({\n commit,\n getters\n }, {\n showSlug,\n season\n }) {\n return new Promise((resolve, reject) => {\n const {\n getShowById\n } = getters;\n const show = getShowById(showSlug);\n const limit = 1000;\n const params = {\n limit\n };\n\n if (season !== undefined) {\n params.season = season;\n } // Get episodes\n\n\n _api__WEBPACK_IMPORTED_MODULE_0__.api.get(`/series/${showSlug}/episodes`, {\n params\n }).then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_EPISODE, {\n show,\n episodes: response.data\n });\n resolve();\n }).catch(error => {\n console.log(`Could not retrieve a episodes for show ${showSlug}, error: ${error}`);\n reject(error);\n });\n });\n },\n\n /**\n * Get shows from API and commit them to the store.\n *\n * @param {*} context - The store context.\n * @param {(ShowIdentifier&ShowGetParameters)[]} shows Shows to get. If not provided, gets the first 1k shows.\n * @returns {undefined|Promise} undefined if `shows` was provided or the API response if not.\n */\n getShows(context, shows) {\n const {\n commit,\n dispatch\n } = context; // If no shows are provided get the first 1000\n\n if (!shows) {\n // Loading new shows, commit show loading information to state.\n commit('setLoadingTotal', 0);\n commit('setLoadingCurrent', 0);\n commit('setLoadingDisplay', true);\n const limit = 1000;\n const page = 1;\n const params = {\n limit,\n page\n };\n const pageRequests = []; // Get first page\n\n pageRequests.push(_api__WEBPACK_IMPORTED_MODULE_0__.api.get('/series', {\n params\n }).then(response => {\n commit('setLoadingTotal', Number(response.headers['x-pagination-count']));\n const totalPages = Number(response.headers['x-pagination-total']);\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOWS, response.data);\n commit('updateLoadingCurrent', response.data.length); // Optionally get additional pages\n\n for (let page = 2; page <= totalPages; page++) {\n const newPage = {\n page\n };\n newPage.limit = params.limit;\n pageRequests.push(_api__WEBPACK_IMPORTED_MODULE_0__.api.get('/series', {\n params: newPage\n }).then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOWS, response.data);\n commit('updateLoadingCurrent', response.data.length);\n }));\n }\n }).catch(() => {\n console.log('Could not retrieve a list of shows');\n }));\n return Promise.all(pageRequests);\n }\n\n return shows.forEach(show => dispatch('getShow', show));\n },\n\n setShow(_, {\n showSlug,\n data\n }) {\n // Update show, updated show will arrive over a WebSocket message\n return _api__WEBPACK_IMPORTED_MODULE_0__.api.patch(`series/${showSlug}`, data);\n },\n\n updateShow(context, show) {\n // Update local store\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW, show);\n },\n\n addSceneException(context, {\n show,\n exception\n }) {\n const {\n commit\n } = context;\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_SCENE_EXCEPTION, {\n show,\n exception\n });\n },\n\n removeSceneException(context, {\n show,\n exception\n }) {\n const {\n commit\n } = context;\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.REMOVE_SHOW_SCENE_EXCEPTION, {\n show,\n exception\n });\n },\n\n setCurrentShow(context, showSlug) {\n return new Promise(resolve => {\n // Set current show\n const {\n commit\n } = context;\n commit('currentShow', showSlug);\n resolve();\n });\n },\n\n setShowConfig(context, {\n show,\n config\n }) {\n const {\n commit\n } = context;\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_CONFIG, {\n show,\n config\n });\n },\n\n updateShowQueueItem(context, queueItem) {\n // Update store's search queue item. (provided through websocket)\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_SHOW_QUEUE_ITEM, queueItem);\n }\n\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack://slim/./src/store/modules/shows.js?"); /***/ }), @@ -1811,7 +1833,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. \*****************************************************************************************************************************************************************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/** Use this as table styling for all table layouts */\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table th,\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table th:first-child,\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row,\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-0ad4c7fc] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .subtitled {\\n background-color: rgb(190, 222, 237);\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .global-ignored td.release span {\\n color: red;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .show-ignored td.release span {\\n color: red;\\n font-style: italic;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .global-required td.release span {\\n color: green;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .show-required td.release span {\\n color: green;\\n font-style: italic;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .global-undesired td.release span {\\n color: orange;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___;\n\n\n//# sourceURL=webpack://slim/./src/style/vgt-table.css?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3%5B0%5D.rules%5B0%5D.use%5B1%5D!./node_modules/vue-loader/lib/loaders/stylePostLoader.js"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/** Use this as table styling for all table layouts */\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table th,\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table th:first-child,\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n position: relative;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table thead th.sorting.sorting-desc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table thead th.sorting.sorting-asc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table th.sortable button {\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n appearance: none;\\n background: transparent;\\n border: none;\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row,\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-0ad4c7fc] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\n\\n/* When using collored rows (using the episode status name, Snatched, Downloaded, Failed, etc.)\\n * we'd like to have the text always black.\\n*/\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-table tr.status td > span {\\n color: rgb(0, 0, 0);\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .subtitled {\\n background-color: rgb(190, 222, 237);\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .global-ignored td.release span {\\n color: red;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .show-ignored td.release span {\\n color: red;\\n font-style: italic;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .global-required td.release span {\\n color: green;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .show-required td.release span {\\n color: green;\\n font-style: italic;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .global-undesired td.release span {\\n color: orange;\\n}\\ntd.col-footer[data-v-0ad4c7fc] {\\n text-align: left !important;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-wrap__footer {\\n color: rgb(255, 255, 255);\\n padding: 1em;\\n background-color: rgb(51, 51, 51);\\n margin-bottom: 1em;\\n display: flex;\\n justify-content: space-between;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .footer__row-count,\\n.vgt-table-styling[data-v-0ad4c7fc] .footer__navigation__page-info {\\n display: inline;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .footer__row-count__label {\\n margin-right: 1em;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-wrap__footer .footer__navigation {\\n font-size: 14px;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-pull-right {\\n float: right !important;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .footer__navigation__page-btn {\\n display: inline-block;\\n padding: 4px 10px;\\n margin-bottom: 0;\\n font-size: 12px;\\n line-height: 16px;\\n vertical-align: middle;\\n border-radius: 1px;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .footer__navigation__page-btn:hover {\\n text-decoration: none;\\n background-position: 0 -150px;\\n transition: background-position 0s linear;\\n background-image: none;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .footer__navigation__page-btn.disabled {\\n display: none;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-wrap__footer .footer__navigation__page-btn .chevron {\\n width: 24px;\\n height: 24px;\\n border-radius: 15%;\\n position: relative;\\n margin: 0 8px;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-wrap__footer .footer__navigation__info,\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-wrap__footer .footer__navigation__page-info {\\n display: inline-flex;\\n color: #909399;\\n margin: 0 16px;\\n margin-top: 0;\\n margin-right: 16px;\\n margin-bottom: 0;\\n margin-left: 16px;\\n}\\n.show-history[data-v-0ad4c7fc] {\\n margin-bottom: 10px;\\n}\\n\\n\\n/* History tables */\\n.status-name > svg[data-v-0ad4c7fc] {\\n margin-left: 5px;\\n}\\n.multiselect--active[data-v-0ad4c7fc] {\\n min-width: 200px;\\n}\\n:not(tr.status) span.episode-title a[data-v-0ad4c7fc] {\\n text-decoration: none;\\n color: rgb(255, 255, 255)\\n}\\ntr.status span.episode-title a[data-v-0ad4c7fc] {\\n text-decoration: none;\\n color: rgb(0, 0, 0);\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-input {\\n height: 30px;\\n line-height: 30px;\\n font-size: 0.9em;\\n width: auto;\\n background-color: #fff;\\n background-image: none;\\n border: 1px solid #ccc;\\n border-radius: 3px;\\n padding: 5px 10px;\\n margin-top: 5px;\\n}\\n.vgt-table-styling[data-v-0ad4c7fc] .vgt-select {\\n height: 30px;\\n line-height: 30px;\\n font-size: 0.9em;\\n width: auto;\\n background-color: #fff;\\n background-image: none;\\n border: 1px solid #ccc;\\n border-radius: 3px;\\n padding: 5px 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___;\n\n\n//# sourceURL=webpack://slim/./src/style/vgt-table.css?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3%5B0%5D.rules%5B0%5D.use%5B1%5D!./node_modules/vue-loader/lib/loaders/stylePostLoader.js"); /***/ }), @@ -1821,7 +1843,27 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. \*****************************************************************************************************************************************************************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/** Use this as table styling for all table layouts */\\n.vgt-table-styling[data-v-12124237] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table th,\\n.vgt-table-styling[data-v-12124237] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.vgt-table-styling[data-v-12124237] .vgt-table th:first-child,\\n.vgt-table-styling[data-v-12124237] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table tr.tablesorter-filter-row,\\n.vgt-table-styling[data-v-12124237] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.vgt-table-styling[data-v-12124237] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-12124237] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.vgt-table-styling[data-v-12124237] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.vgt-table-styling[data-v-12124237] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.vgt-table-styling[data-v-12124237] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\n.vgt-table-styling[data-v-12124237] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.vgt-table-styling[data-v-12124237] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.vgt-table-styling[data-v-12124237] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.vgt-table-styling[data-v-12124237] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.vgt-table-styling[data-v-12124237] .subtitled {\\n background-color: rgb(190, 222, 237);\\n}\\n.vgt-table-styling[data-v-12124237] .global-ignored td.release span {\\n color: red;\\n}\\n.vgt-table-styling[data-v-12124237] .show-ignored td.release span {\\n color: red;\\n font-style: italic;\\n}\\n.vgt-table-styling[data-v-12124237] .global-required td.release span {\\n color: green;\\n}\\n.vgt-table-styling[data-v-12124237] .show-required td.release span {\\n color: green;\\n font-style: italic;\\n}\\n.vgt-table-styling[data-v-12124237] .global-undesired td.release span {\\n color: orange;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___;\n\n\n//# sourceURL=webpack://slim/./src/style/vgt-table.css?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3%5B0%5D.rules%5B0%5D.use%5B1%5D!./node_modules/vue-loader/lib/loaders/stylePostLoader.js"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/** Use this as table styling for all table layouts */\\n.vgt-table-styling[data-v-12124237] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table th,\\n.vgt-table-styling[data-v-12124237] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.vgt-table-styling[data-v-12124237] .vgt-table th:first-child,\\n.vgt-table-styling[data-v-12124237] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n position: relative;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table thead th.sorting.sorting-desc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table thead th.sorting.sorting-asc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table th.sortable button {\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n appearance: none;\\n background: transparent;\\n border: none;\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table tr.tablesorter-filter-row,\\n.vgt-table-styling[data-v-12124237] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.vgt-table-styling[data-v-12124237] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-12124237] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.vgt-table-styling[data-v-12124237] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.vgt-table-styling[data-v-12124237] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.vgt-table-styling[data-v-12124237] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\n\\n/* When using collored rows (using the episode status name, Snatched, Downloaded, Failed, etc.)\\n * we'd like to have the text always black.\\n*/\\n.vgt-table-styling[data-v-12124237] .vgt-table tr.status td > span {\\n color: rgb(0, 0, 0);\\n}\\n.vgt-table-styling[data-v-12124237] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.vgt-table-styling[data-v-12124237] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.vgt-table-styling[data-v-12124237] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.vgt-table-styling[data-v-12124237] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.vgt-table-styling[data-v-12124237] .subtitled {\\n background-color: rgb(190, 222, 237);\\n}\\n.vgt-table-styling[data-v-12124237] .global-ignored td.release span {\\n color: red;\\n}\\n.vgt-table-styling[data-v-12124237] .show-ignored td.release span {\\n color: red;\\n font-style: italic;\\n}\\n.vgt-table-styling[data-v-12124237] .global-required td.release span {\\n color: green;\\n}\\n.vgt-table-styling[data-v-12124237] .show-required td.release span {\\n color: green;\\n font-style: italic;\\n}\\n.vgt-table-styling[data-v-12124237] .global-undesired td.release span {\\n color: orange;\\n}\\ntd.col-footer[data-v-12124237] {\\n text-align: left !important;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-wrap__footer {\\n color: rgb(255, 255, 255);\\n padding: 1em;\\n background-color: rgb(51, 51, 51);\\n margin-bottom: 1em;\\n display: flex;\\n justify-content: space-between;\\n}\\n.vgt-table-styling[data-v-12124237] .footer__row-count,\\n.vgt-table-styling[data-v-12124237] .footer__navigation__page-info {\\n display: inline;\\n}\\n.vgt-table-styling[data-v-12124237] .footer__row-count__label {\\n margin-right: 1em;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-wrap__footer .footer__navigation {\\n font-size: 14px;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-pull-right {\\n float: right !important;\\n}\\n.vgt-table-styling[data-v-12124237] .footer__navigation__page-btn {\\n display: inline-block;\\n padding: 4px 10px;\\n margin-bottom: 0;\\n font-size: 12px;\\n line-height: 16px;\\n vertical-align: middle;\\n border-radius: 1px;\\n}\\n.vgt-table-styling[data-v-12124237] .footer__navigation__page-btn:hover {\\n text-decoration: none;\\n background-position: 0 -150px;\\n transition: background-position 0s linear;\\n background-image: none;\\n}\\n.vgt-table-styling[data-v-12124237] .footer__navigation__page-btn.disabled {\\n display: none;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-wrap__footer .footer__navigation__page-btn .chevron {\\n width: 24px;\\n height: 24px;\\n border-radius: 15%;\\n position: relative;\\n margin: 0 8px;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-wrap__footer .footer__navigation__info,\\n.vgt-table-styling[data-v-12124237] .vgt-wrap__footer .footer__navigation__page-info {\\n display: inline-flex;\\n color: #909399;\\n margin: 0 16px;\\n margin-top: 0;\\n margin-right: 16px;\\n margin-bottom: 0;\\n margin-left: 16px;\\n}\\n.show-history[data-v-12124237] {\\n margin-bottom: 10px;\\n}\\n\\n\\n/* History tables */\\n.status-name > svg[data-v-12124237] {\\n margin-left: 5px;\\n}\\n.multiselect--active[data-v-12124237] {\\n min-width: 200px;\\n}\\n:not(tr.status) span.episode-title a[data-v-12124237] {\\n text-decoration: none;\\n color: rgb(255, 255, 255)\\n}\\ntr.status span.episode-title a[data-v-12124237] {\\n text-decoration: none;\\n color: rgb(0, 0, 0);\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-input {\\n height: 30px;\\n line-height: 30px;\\n font-size: 0.9em;\\n width: auto;\\n background-color: #fff;\\n background-image: none;\\n border: 1px solid #ccc;\\n border-radius: 3px;\\n padding: 5px 10px;\\n margin-top: 5px;\\n}\\n.vgt-table-styling[data-v-12124237] .vgt-select {\\n height: 30px;\\n line-height: 30px;\\n font-size: 0.9em;\\n width: auto;\\n background-color: #fff;\\n background-image: none;\\n border: 1px solid #ccc;\\n border-radius: 3px;\\n padding: 5px 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___;\n\n\n//# sourceURL=webpack://slim/./src/style/vgt-table.css?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3%5B0%5D.rules%5B0%5D.use%5B1%5D!./node_modules/vue-loader/lib/loaders/stylePostLoader.js"); + +/***/ }), + +/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./src/style/vgt-table.css?vue&type=style&index=0&id=3792bd4e&scoped=true&lang=css&": +/*!*****************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./src/style/vgt-table.css?vue&type=style&index=0&id=3792bd4e&scoped=true&lang=css& ***! + \*****************************************************************************************************************************************************************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/** Use this as table styling for all table layouts */\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table th,\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table th:first-child,\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n position: relative;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table thead th.sorting.sorting-desc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table thead th.sorting.sorting-asc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table th.sortable button {\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n appearance: none;\\n background: transparent;\\n border: none;\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table tr.tablesorter-filter-row,\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-3792bd4e] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\n\\n/* When using collored rows (using the episode status name, Snatched, Downloaded, Failed, etc.)\\n * we'd like to have the text always black.\\n*/\\n.vgt-table-styling[data-v-3792bd4e] .vgt-table tr.status td > span {\\n color: rgb(0, 0, 0);\\n}\\n.vgt-table-styling[data-v-3792bd4e] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.vgt-table-styling[data-v-3792bd4e] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.vgt-table-styling[data-v-3792bd4e] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.vgt-table-styling[data-v-3792bd4e] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.vgt-table-styling[data-v-3792bd4e] .subtitled {\\n background-color: rgb(190, 222, 237);\\n}\\n.vgt-table-styling[data-v-3792bd4e] .global-ignored td.release span {\\n color: red;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .show-ignored td.release span {\\n color: red;\\n font-style: italic;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .global-required td.release span {\\n color: green;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .show-required td.release span {\\n color: green;\\n font-style: italic;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .global-undesired td.release span {\\n color: orange;\\n}\\ntd.col-footer[data-v-3792bd4e] {\\n text-align: left !important;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-wrap__footer {\\n color: rgb(255, 255, 255);\\n padding: 1em;\\n background-color: rgb(51, 51, 51);\\n margin-bottom: 1em;\\n display: flex;\\n justify-content: space-between;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .footer__row-count,\\n.vgt-table-styling[data-v-3792bd4e] .footer__navigation__page-info {\\n display: inline;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .footer__row-count__label {\\n margin-right: 1em;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-wrap__footer .footer__navigation {\\n font-size: 14px;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-pull-right {\\n float: right !important;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .footer__navigation__page-btn {\\n display: inline-block;\\n padding: 4px 10px;\\n margin-bottom: 0;\\n font-size: 12px;\\n line-height: 16px;\\n vertical-align: middle;\\n border-radius: 1px;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .footer__navigation__page-btn:hover {\\n text-decoration: none;\\n background-position: 0 -150px;\\n transition: background-position 0s linear;\\n background-image: none;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .footer__navigation__page-btn.disabled {\\n display: none;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-wrap__footer .footer__navigation__page-btn .chevron {\\n width: 24px;\\n height: 24px;\\n border-radius: 15%;\\n position: relative;\\n margin: 0 8px;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-wrap__footer .footer__navigation__info,\\n.vgt-table-styling[data-v-3792bd4e] .vgt-wrap__footer .footer__navigation__page-info {\\n display: inline-flex;\\n color: #909399;\\n margin: 0 16px;\\n margin-top: 0;\\n margin-right: 16px;\\n margin-bottom: 0;\\n margin-left: 16px;\\n}\\n.show-history[data-v-3792bd4e] {\\n margin-bottom: 10px;\\n}\\n\\n\\n/* History tables */\\n.status-name > svg[data-v-3792bd4e] {\\n margin-left: 5px;\\n}\\n.multiselect--active[data-v-3792bd4e] {\\n min-width: 200px;\\n}\\n:not(tr.status) span.episode-title a[data-v-3792bd4e] {\\n text-decoration: none;\\n color: rgb(255, 255, 255)\\n}\\ntr.status span.episode-title a[data-v-3792bd4e] {\\n text-decoration: none;\\n color: rgb(0, 0, 0);\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-input {\\n height: 30px;\\n line-height: 30px;\\n font-size: 0.9em;\\n width: auto;\\n background-color: #fff;\\n background-image: none;\\n border: 1px solid #ccc;\\n border-radius: 3px;\\n padding: 5px 10px;\\n margin-top: 5px;\\n}\\n.vgt-table-styling[data-v-3792bd4e] .vgt-select {\\n height: 30px;\\n line-height: 30px;\\n font-size: 0.9em;\\n width: auto;\\n background-color: #fff;\\n background-image: none;\\n border: 1px solid #ccc;\\n border-radius: 3px;\\n padding: 5px 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___;\n\n\n//# sourceURL=webpack://slim/./src/style/vgt-table.css?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3%5B0%5D.rules%5B0%5D.use%5B1%5D!./node_modules/vue-loader/lib/loaders/stylePostLoader.js"); + +/***/ }), + +/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./src/style/vgt-table.css?vue&type=style&index=0&id=899ba7ec&scoped=true&lang=css&": +/*!*****************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./src/style/vgt-table.css?vue&type=style&index=0&id=899ba7ec&scoped=true&lang=css& ***! + \*****************************************************************************************************************************************************************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/** Use this as table styling for all table layouts */\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table th,\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table th:first-child,\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n position: relative;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table thead th.sorting.sorting-desc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table thead th.sorting.sorting-asc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table th.sortable button {\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n appearance: none;\\n background: transparent;\\n border: none;\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table tr.tablesorter-filter-row,\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-899ba7ec] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\n\\n/* When using collored rows (using the episode status name, Snatched, Downloaded, Failed, etc.)\\n * we'd like to have the text always black.\\n*/\\n.vgt-table-styling[data-v-899ba7ec] .vgt-table tr.status td > span {\\n color: rgb(0, 0, 0);\\n}\\n.vgt-table-styling[data-v-899ba7ec] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.vgt-table-styling[data-v-899ba7ec] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.vgt-table-styling[data-v-899ba7ec] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.vgt-table-styling[data-v-899ba7ec] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.vgt-table-styling[data-v-899ba7ec] .subtitled {\\n background-color: rgb(190, 222, 237);\\n}\\n.vgt-table-styling[data-v-899ba7ec] .global-ignored td.release span {\\n color: red;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .show-ignored td.release span {\\n color: red;\\n font-style: italic;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .global-required td.release span {\\n color: green;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .show-required td.release span {\\n color: green;\\n font-style: italic;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .global-undesired td.release span {\\n color: orange;\\n}\\ntd.col-footer[data-v-899ba7ec] {\\n text-align: left !important;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-wrap__footer {\\n color: rgb(255, 255, 255);\\n padding: 1em;\\n background-color: rgb(51, 51, 51);\\n margin-bottom: 1em;\\n display: flex;\\n justify-content: space-between;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .footer__row-count,\\n.vgt-table-styling[data-v-899ba7ec] .footer__navigation__page-info {\\n display: inline;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .footer__row-count__label {\\n margin-right: 1em;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-wrap__footer .footer__navigation {\\n font-size: 14px;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-pull-right {\\n float: right !important;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .footer__navigation__page-btn {\\n display: inline-block;\\n padding: 4px 10px;\\n margin-bottom: 0;\\n font-size: 12px;\\n line-height: 16px;\\n vertical-align: middle;\\n border-radius: 1px;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .footer__navigation__page-btn:hover {\\n text-decoration: none;\\n background-position: 0 -150px;\\n transition: background-position 0s linear;\\n background-image: none;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .footer__navigation__page-btn.disabled {\\n display: none;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-wrap__footer .footer__navigation__page-btn .chevron {\\n width: 24px;\\n height: 24px;\\n border-radius: 15%;\\n position: relative;\\n margin: 0 8px;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-wrap__footer .footer__navigation__info,\\n.vgt-table-styling[data-v-899ba7ec] .vgt-wrap__footer .footer__navigation__page-info {\\n display: inline-flex;\\n color: #909399;\\n margin: 0 16px;\\n margin-top: 0;\\n margin-right: 16px;\\n margin-bottom: 0;\\n margin-left: 16px;\\n}\\n.show-history[data-v-899ba7ec] {\\n margin-bottom: 10px;\\n}\\n\\n\\n/* History tables */\\n.status-name > svg[data-v-899ba7ec] {\\n margin-left: 5px;\\n}\\n.multiselect--active[data-v-899ba7ec] {\\n min-width: 200px;\\n}\\n:not(tr.status) span.episode-title a[data-v-899ba7ec] {\\n text-decoration: none;\\n color: rgb(255, 255, 255)\\n}\\ntr.status span.episode-title a[data-v-899ba7ec] {\\n text-decoration: none;\\n color: rgb(0, 0, 0);\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-input {\\n height: 30px;\\n line-height: 30px;\\n font-size: 0.9em;\\n width: auto;\\n background-color: #fff;\\n background-image: none;\\n border: 1px solid #ccc;\\n border-radius: 3px;\\n padding: 5px 10px;\\n margin-top: 5px;\\n}\\n.vgt-table-styling[data-v-899ba7ec] .vgt-select {\\n height: 30px;\\n line-height: 30px;\\n font-size: 0.9em;\\n width: auto;\\n background-color: #fff;\\n background-image: none;\\n border: 1px solid #ccc;\\n border-radius: 3px;\\n padding: 5px 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___;\n\n\n//# sourceURL=webpack://slim/./src/style/vgt-table.css?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3%5B0%5D.rules%5B0%5D.use%5B1%5D!./node_modules/vue-loader/lib/loaders/stylePostLoader.js"); /***/ }), @@ -1831,7 +1873,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. \*****************************************************************************************************************************************************************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/** Use this as table styling for all table layouts */\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table th,\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table th:first-child,\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table tr.tablesorter-filter-row,\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-f8155dfc] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.vgt-table-styling[data-v-f8155dfc] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.vgt-table-styling[data-v-f8155dfc] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.vgt-table-styling[data-v-f8155dfc] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.vgt-table-styling[data-v-f8155dfc] .subtitled {\\n background-color: rgb(190, 222, 237);\\n}\\n.vgt-table-styling[data-v-f8155dfc] .global-ignored td.release span {\\n color: red;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .show-ignored td.release span {\\n color: red;\\n font-style: italic;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .global-required td.release span {\\n color: green;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .show-required td.release span {\\n color: green;\\n font-style: italic;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .global-undesired td.release span {\\n color: orange;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___;\n\n\n//# sourceURL=webpack://slim/./src/style/vgt-table.css?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3%5B0%5D.rules%5B0%5D.use%5B1%5D!./node_modules/vue-loader/lib/loaders/stylePostLoader.js"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/** Use this as table styling for all table layouts */\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table th,\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table th:first-child,\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n position: relative;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table thead th.sorting.sorting-desc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table thead th.sorting.sorting-asc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table th.sortable button {\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n appearance: none;\\n background: transparent;\\n border: none;\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table tr.tablesorter-filter-row,\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-f8155dfc] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\n\\n/* When using collored rows (using the episode status name, Snatched, Downloaded, Failed, etc.)\\n * we'd like to have the text always black.\\n*/\\n.vgt-table-styling[data-v-f8155dfc] .vgt-table tr.status td > span {\\n color: rgb(0, 0, 0);\\n}\\n.vgt-table-styling[data-v-f8155dfc] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.vgt-table-styling[data-v-f8155dfc] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.vgt-table-styling[data-v-f8155dfc] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.vgt-table-styling[data-v-f8155dfc] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.vgt-table-styling[data-v-f8155dfc] .subtitled {\\n background-color: rgb(190, 222, 237);\\n}\\n.vgt-table-styling[data-v-f8155dfc] .global-ignored td.release span {\\n color: red;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .show-ignored td.release span {\\n color: red;\\n font-style: italic;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .global-required td.release span {\\n color: green;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .show-required td.release span {\\n color: green;\\n font-style: italic;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .global-undesired td.release span {\\n color: orange;\\n}\\ntd.col-footer[data-v-f8155dfc] {\\n text-align: left !important;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-wrap__footer {\\n color: rgb(255, 255, 255);\\n padding: 1em;\\n background-color: rgb(51, 51, 51);\\n margin-bottom: 1em;\\n display: flex;\\n justify-content: space-between;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .footer__row-count,\\n.vgt-table-styling[data-v-f8155dfc] .footer__navigation__page-info {\\n display: inline;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .footer__row-count__label {\\n margin-right: 1em;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-wrap__footer .footer__navigation {\\n font-size: 14px;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-pull-right {\\n float: right !important;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .footer__navigation__page-btn {\\n display: inline-block;\\n padding: 4px 10px;\\n margin-bottom: 0;\\n font-size: 12px;\\n line-height: 16px;\\n vertical-align: middle;\\n border-radius: 1px;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .footer__navigation__page-btn:hover {\\n text-decoration: none;\\n background-position: 0 -150px;\\n transition: background-position 0s linear;\\n background-image: none;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .footer__navigation__page-btn.disabled {\\n display: none;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-wrap__footer .footer__navigation__page-btn .chevron {\\n width: 24px;\\n height: 24px;\\n border-radius: 15%;\\n position: relative;\\n margin: 0 8px;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-wrap__footer .footer__navigation__info,\\n.vgt-table-styling[data-v-f8155dfc] .vgt-wrap__footer .footer__navigation__page-info {\\n display: inline-flex;\\n color: #909399;\\n margin: 0 16px;\\n margin-top: 0;\\n margin-right: 16px;\\n margin-bottom: 0;\\n margin-left: 16px;\\n}\\n.show-history[data-v-f8155dfc] {\\n margin-bottom: 10px;\\n}\\n\\n\\n/* History tables */\\n.status-name > svg[data-v-f8155dfc] {\\n margin-left: 5px;\\n}\\n.multiselect--active[data-v-f8155dfc] {\\n min-width: 200px;\\n}\\n:not(tr.status) span.episode-title a[data-v-f8155dfc] {\\n text-decoration: none;\\n color: rgb(255, 255, 255)\\n}\\ntr.status span.episode-title a[data-v-f8155dfc] {\\n text-decoration: none;\\n color: rgb(0, 0, 0);\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-input {\\n height: 30px;\\n line-height: 30px;\\n font-size: 0.9em;\\n width: auto;\\n background-color: #fff;\\n background-image: none;\\n border: 1px solid #ccc;\\n border-radius: 3px;\\n padding: 5px 10px;\\n margin-top: 5px;\\n}\\n.vgt-table-styling[data-v-f8155dfc] .vgt-select {\\n height: 30px;\\n line-height: 30px;\\n font-size: 0.9em;\\n width: auto;\\n background-color: #fff;\\n background-image: none;\\n border: 1px solid #ccc;\\n border-radius: 3px;\\n padding: 5px 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___;\n\n\n//# sourceURL=webpack://slim/./src/style/vgt-table.css?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3%5B0%5D.rules%5B0%5D.use%5B1%5D!./node_modules/vue-loader/lib/loaders/stylePostLoader.js"); /***/ }), @@ -1851,7 +1893,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. \***********************************************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".tooltip-wrapper {\\n float: left;\\n min-width: 340px;\\n}\\n\\n.invalid {\\n background-color: #ff5b5b;\\n}\\n\\n.tooltip {\\n display: block !important;\\n z-index: 10000;\\n}\\n\\n.tooltip .tooltip-inner {\\n background: #ffef93;\\n color: #555;\\n border-radius: 16px;\\n padding: 5px 10px 4px;\\n border: 1px solid #f1d031;\\n -webkit-box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);\\n -moz-box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);\\n box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);\\n}\\n\\n.tooltip .tooltip-arrow {\\n width: 0;\\n height: 0;\\n position: absolute;\\n margin: 5px;\\n border: 1px solid #ffef93;\\n z-index: 1;\\n}\\n\\n.tooltip[x-placement^='top'] {\\n margin-bottom: 5px;\\n}\\n\\n.tooltip[x-placement^='top'] .tooltip-arrow {\\n border-width: 5px 5px 0 5px;\\n border-left-color: transparent !important;\\n border-right-color: transparent !important;\\n border-bottom-color: transparent !important;\\n bottom: -5px;\\n left: calc(50% - 4px);\\n margin-top: 0;\\n margin-bottom: 0;\\n}\\n\\n.tooltip[x-placement^='bottom'] {\\n margin-top: 5px;\\n}\\n\\n.tooltip[x-placement^='bottom'] .tooltip-arrow {\\n border-width: 0 5px 5px 5px;\\n border-left-color: transparent !important;\\n border-right-color: transparent !important;\\n border-top-color: transparent !important;\\n top: -5px;\\n left: calc(50% - 4px);\\n margin-top: 0;\\n margin-bottom: 0;\\n}\\n\\n.tooltip[x-placement^='right'] {\\n margin-left: 5px;\\n}\\n\\n.tooltip[x-placement^='right'] .tooltip-arrow {\\n border-width: 5px 5px 5px 0;\\n border-left-color: transparent !important;\\n border-top-color: transparent !important;\\n border-bottom-color: transparent !important;\\n left: -4px;\\n top: calc(50% - 5px);\\n margin-left: 0;\\n margin-right: 0;\\n}\\n\\n.tooltip[x-placement^='left'] {\\n margin-right: 5px;\\n}\\n\\n.tooltip[x-placement^='left'] .tooltip-arrow {\\n border-width: 5px 0 5px 5px;\\n border-top-color: transparent !important;\\n border-right-color: transparent !important;\\n border-bottom-color: transparent !important;\\n right: -4px;\\n top: calc(50% - 5px);\\n margin-left: 0;\\n margin-right: 0;\\n}\\n\\n.tooltip.popover .popover-inner {\\n background: #ffef93;\\n color: #555;\\n padding: 24px;\\n border-radius: 5px;\\n box-shadow: 0 5px 30px rgba(black, 0.1);\\n}\\n\\n.tooltip.popover .popover-arrow {\\n border-color: #ffef93;\\n}\\n\\n.tooltip[aria-hidden='true'] {\\n visibility: hidden;\\n opacity: 0;\\n transition: opacity 0.15s, visibility 0.15s;\\n}\\n\\n.tooltip[aria-hidden='false'] {\\n visibility: visible;\\n opacity: 1;\\n transition: opacity 0.15s;\\n}\", \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___;\n\n\n//# sourceURL=webpack://slim/./src/style/v-tooltip.css?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3%5B0%5D.rules%5B0%5D.use%5B1%5D"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".tooltip-wrapper {\\n float: left;\\n min-width: 340px;\\n}\\n\\n.invalid {\\n background-color: #ff5b5b;\\n}\\n\\n.tooltip {\\n display: block !important;\\n word-break: break-word;\\n z-index: 10000;\\n}\\n\\n.tooltip .tooltip-inner {\\n background: #ffef93;\\n color: #555;\\n border-radius: 16px;\\n padding: 5px 10px 4px;\\n border: 1px solid #f1d031;\\n -webkit-box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);\\n -moz-box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);\\n box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);\\n}\\n\\n.tooltip .tooltip-arrow {\\n width: 0;\\n height: 0;\\n position: absolute;\\n margin: 5px;\\n border: 1px solid #ffef93;\\n z-index: 1;\\n}\\n\\n.tooltip[x-placement^='top'] {\\n margin-bottom: 5px;\\n}\\n\\n.tooltip[x-placement^='top'] .tooltip-arrow {\\n border-width: 5px 5px 0 5px;\\n border-left-color: transparent !important;\\n border-right-color: transparent !important;\\n border-bottom-color: transparent !important;\\n bottom: -5px;\\n left: calc(50% - 4px);\\n margin-top: 0;\\n margin-bottom: 0;\\n}\\n\\n.tooltip[x-placement^='bottom'] {\\n margin-top: 5px;\\n}\\n\\n.tooltip[x-placement^='bottom'] .tooltip-arrow {\\n border-width: 0 5px 5px 5px;\\n border-left-color: transparent !important;\\n border-right-color: transparent !important;\\n border-top-color: transparent !important;\\n top: -5px;\\n left: calc(50% - 4px);\\n margin-top: 0;\\n margin-bottom: 0;\\n}\\n\\n.tooltip[x-placement^='right'] {\\n margin-left: 5px;\\n}\\n\\n.tooltip[x-placement^='right'] .tooltip-arrow {\\n border-width: 5px 5px 5px 0;\\n border-left-color: transparent !important;\\n border-top-color: transparent !important;\\n border-bottom-color: transparent !important;\\n left: -4px;\\n top: calc(50% - 5px);\\n margin-left: 0;\\n margin-right: 0;\\n}\\n\\n.tooltip[x-placement^='left'] {\\n margin-right: 5px;\\n}\\n\\n.tooltip[x-placement^='left'] .tooltip-arrow {\\n border-width: 5px 0 5px 5px;\\n border-top-color: transparent !important;\\n border-right-color: transparent !important;\\n border-bottom-color: transparent !important;\\n right: -4px;\\n top: calc(50% - 5px);\\n margin-left: 0;\\n margin-right: 0;\\n}\\n\\n.tooltip.popover .popover-inner {\\n background: #ffef93;\\n color: #555;\\n padding: 24px;\\n border-radius: 5px;\\n box-shadow: 0 5px 30px rgba(black, 0.1);\\n}\\n\\n.tooltip.popover .popover-arrow {\\n border-color: #ffef93;\\n}\\n\\n.tooltip[aria-hidden='true'] {\\n visibility: hidden;\\n opacity: 0;\\n transition: opacity 0.15s, visibility 0.15s;\\n}\\n\\n.tooltip[aria-hidden='false'] {\\n visibility: visible;\\n opacity: 1;\\n transition: opacity 0.15s;\\n}\", \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___;\n\n\n//# sourceURL=webpack://slim/./src/style/v-tooltip.css?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3%5B0%5D.rules%5B0%5D.use%5B1%5D"); /***/ }), @@ -2295,6 +2337,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./src/components/history-compact.vue": +/*!********************************************!*\ + !*** ./src/components/history-compact.vue ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _history_compact_vue_vue_type_template_id_899ba7ec_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./history-compact.vue?vue&type=template&id=899ba7ec&scoped=true& */ \"./src/components/history-compact.vue?vue&type=template&id=899ba7ec&scoped=true&\");\n/* harmony import */ var _history_compact_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./history-compact.vue?vue&type=script&lang=js& */ \"./src/components/history-compact.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _style_vgt_table_css_vue_type_style_index_0_id_899ba7ec_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../style/vgt-table.css?vue&type=style&index=0&id=899ba7ec&scoped=true&lang=css& */ \"./src/style/vgt-table.css?vue&type=style&index=0&id=899ba7ec&scoped=true&lang=css&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n;\n\n\n/* normalize component */\n\nvar component = (0,_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__.default)(\n _history_compact_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__.default,\n _history_compact_vue_vue_type_template_id_899ba7ec_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render,\n _history_compact_vue_vue_type_template_id_899ba7ec_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns,\n false,\n null,\n \"899ba7ec\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/components/history-compact.vue\"\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component.exports);\n\n//# sourceURL=webpack://slim/./src/components/history-compact.vue?"); + +/***/ }), + +/***/ "./src/components/history-detailed.vue": +/*!*********************************************!*\ + !*** ./src/components/history-detailed.vue ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _history_detailed_vue_vue_type_template_id_3792bd4e_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./history-detailed.vue?vue&type=template&id=3792bd4e&scoped=true& */ \"./src/components/history-detailed.vue?vue&type=template&id=3792bd4e&scoped=true&\");\n/* harmony import */ var _history_detailed_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./history-detailed.vue?vue&type=script&lang=js& */ \"./src/components/history-detailed.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _style_vgt_table_css_vue_type_style_index_0_id_3792bd4e_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../style/vgt-table.css?vue&type=style&index=0&id=3792bd4e&scoped=true&lang=css& */ \"./src/style/vgt-table.css?vue&type=style&index=0&id=3792bd4e&scoped=true&lang=css&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n;\n\n\n/* normalize component */\n\nvar component = (0,_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__.default)(\n _history_detailed_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__.default,\n _history_detailed_vue_vue_type_template_id_3792bd4e_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render,\n _history_detailed_vue_vue_type_template_id_3792bd4e_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns,\n false,\n null,\n \"3792bd4e\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/components/history-detailed.vue\"\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component.exports);\n\n//# sourceURL=webpack://slim/./src/components/history-detailed.vue?"); + +/***/ }), + /***/ "./src/components/history.vue": /*!************************************!*\ !*** ./src/components/history.vue ***! @@ -2302,7 +2366,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _history_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./history.vue?vue&type=script&lang=js& */ \"./src/components/history.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\nvar render, staticRenderFns\n;\n\n\n\n/* normalize component */\n;\nvar component = (0,_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_1__.default)(\n _history_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__.default,\n render,\n staticRenderFns,\n false,\n null,\n \"476f04b4\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/components/history.vue\"\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component.exports);\n\n//# sourceURL=webpack://slim/./src/components/history.vue?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _history_vue_vue_type_template_id_476f04b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./history.vue?vue&type=template&id=476f04b4&scoped=true& */ \"./src/components/history.vue?vue&type=template&id=476f04b4&scoped=true&\");\n/* harmony import */ var _history_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./history.vue?vue&type=script&lang=js& */ \"./src/components/history.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n/* normalize component */\n;\nvar component = (0,_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__.default)(\n _history_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__.default,\n _history_vue_vue_type_template_id_476f04b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render,\n _history_vue_vue_type_template_id_476f04b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns,\n false,\n null,\n \"476f04b4\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/components/history.vue\"\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component.exports);\n\n//# sourceURL=webpack://slim/./src/components/history.vue?"); /***/ }), @@ -3032,6 +3096,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./src/components/history-compact.vue?vue&type=script&lang=js&": +/*!*********************************************************************!*\ + !*** ./src/components/history-compact.vue?vue&type=script&lang=js& ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_1_0_rules_0_node_modules_vue_loader_lib_index_js_vue_loader_options_history_compact_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./history-compact.vue?vue&type=script&lang=js& */ \"./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history-compact.vue?vue&type=script&lang=js&\");\n /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_babel_loader_lib_index_js_clonedRuleSet_1_0_rules_0_node_modules_vue_loader_lib_index_js_vue_loader_options_history_compact_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__.default); \n\n//# sourceURL=webpack://slim/./src/components/history-compact.vue?"); + +/***/ }), + +/***/ "./src/components/history-detailed.vue?vue&type=script&lang=js&": +/*!**********************************************************************!*\ + !*** ./src/components/history-detailed.vue?vue&type=script&lang=js& ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_1_0_rules_0_node_modules_vue_loader_lib_index_js_vue_loader_options_history_detailed_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./history-detailed.vue?vue&type=script&lang=js& */ \"./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history-detailed.vue?vue&type=script&lang=js&\");\n /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_babel_loader_lib_index_js_clonedRuleSet_1_0_rules_0_node_modules_vue_loader_lib_index_js_vue_loader_options_history_detailed_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__.default); \n\n//# sourceURL=webpack://slim/./src/components/history-detailed.vue?"); + +/***/ }), + /***/ "./src/components/history.vue?vue&type=script&lang=js&": /*!*************************************************************!*\ !*** ./src/components/history.vue?vue&type=script&lang=js& ***! @@ -3758,6 +3844,39 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./src/components/history-compact.vue?vue&type=template&id=899ba7ec&scoped=true&": +/*!***************************************************************************************!*\ + !*** ./src/components/history-compact.vue?vue&type=template&id=899ba7ec&scoped=true& ***! + \***************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_history_compact_vue_vue_type_template_id_899ba7ec_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render),\n/* harmony export */ \"staticRenderFns\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_history_compact_vue_vue_type_template_id_899ba7ec_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns)\n/* harmony export */ });\n/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_history_compact_vue_vue_type_template_id_899ba7ec_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./history-compact.vue?vue&type=template&id=899ba7ec&scoped=true& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history-compact.vue?vue&type=template&id=899ba7ec&scoped=true&\");\n\n\n//# sourceURL=webpack://slim/./src/components/history-compact.vue?"); + +/***/ }), + +/***/ "./src/components/history-detailed.vue?vue&type=template&id=3792bd4e&scoped=true&": +/*!****************************************************************************************!*\ + !*** ./src/components/history-detailed.vue?vue&type=template&id=3792bd4e&scoped=true& ***! + \****************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_history_detailed_vue_vue_type_template_id_3792bd4e_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render),\n/* harmony export */ \"staticRenderFns\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_history_detailed_vue_vue_type_template_id_3792bd4e_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns)\n/* harmony export */ });\n/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_history_detailed_vue_vue_type_template_id_3792bd4e_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./history-detailed.vue?vue&type=template&id=3792bd4e&scoped=true& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history-detailed.vue?vue&type=template&id=3792bd4e&scoped=true&\");\n\n\n//# sourceURL=webpack://slim/./src/components/history-detailed.vue?"); + +/***/ }), + +/***/ "./src/components/history.vue?vue&type=template&id=476f04b4&scoped=true&": +/*!*******************************************************************************!*\ + !*** ./src/components/history.vue?vue&type=template&id=476f04b4&scoped=true& ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_history_vue_vue_type_template_id_476f04b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render),\n/* harmony export */ \"staticRenderFns\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_history_vue_vue_type_template_id_476f04b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns)\n/* harmony export */ });\n/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_history_vue_vue_type_template_id_476f04b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./history.vue?vue&type=template&id=476f04b4&scoped=true& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history.vue?vue&type=template&id=476f04b4&scoped=true&\");\n\n\n//# sourceURL=webpack://slim/./src/components/history.vue?"); + +/***/ }), + /***/ "./src/components/home.vue?vue&type=template&id=957c9522&scoped=true&": /*!****************************************************************************!*\ !*** ./src/components/home.vue?vue&type=template&id=957c9522&scoped=true& ***! @@ -4495,6 +4614,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod /***/ }), +/***/ "./src/style/vgt-table.css?vue&type=style&index=0&id=3792bd4e&scoped=true&lang=css&": +/*!******************************************************************************************!*\ + !*** ./src/style/vgt-table.css?vue&type=style&index=0&id=3792bd4e&scoped=true&lang=css& ***! + \******************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_vgt_table_css_vue_type_style_index_0_id_3792bd4e_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-style-loader/index.js!../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!./vgt-table.css?vue&type=style&index=0&id=3792bd4e&scoped=true&lang=css& */ \"./node_modules/vue-style-loader/index.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./src/style/vgt-table.css?vue&type=style&index=0&id=3792bd4e&scoped=true&lang=css&\");\n/* harmony import */ var _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_vgt_table_css_vue_type_style_index_0_id_3792bd4e_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_vgt_table_css_vue_type_style_index_0_id_3792bd4e_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n/* harmony reexport (unknown) */ for(const __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_vgt_table_css_vue_type_style_index_0_id_3792bd4e_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== \"default\") __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = () => _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_vgt_table_css_vue_type_style_index_0_id_3792bd4e_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__[__WEBPACK_IMPORT_KEY__]\n/* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);\n\n\n//# sourceURL=webpack://slim/./src/style/vgt-table.css?"); + +/***/ }), + +/***/ "./src/style/vgt-table.css?vue&type=style&index=0&id=899ba7ec&scoped=true&lang=css&": +/*!******************************************************************************************!*\ + !*** ./src/style/vgt-table.css?vue&type=style&index=0&id=899ba7ec&scoped=true&lang=css& ***! + \******************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_vgt_table_css_vue_type_style_index_0_id_899ba7ec_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-style-loader/index.js!../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!./vgt-table.css?vue&type=style&index=0&id=899ba7ec&scoped=true&lang=css& */ \"./node_modules/vue-style-loader/index.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./src/style/vgt-table.css?vue&type=style&index=0&id=899ba7ec&scoped=true&lang=css&\");\n/* harmony import */ var _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_vgt_table_css_vue_type_style_index_0_id_899ba7ec_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_vgt_table_css_vue_type_style_index_0_id_899ba7ec_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n/* harmony reexport (unknown) */ for(const __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_vgt_table_css_vue_type_style_index_0_id_899ba7ec_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== \"default\") __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = () => _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_vgt_table_css_vue_type_style_index_0_id_899ba7ec_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__[__WEBPACK_IMPORT_KEY__]\n/* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);\n\n\n//# sourceURL=webpack://slim/./src/style/vgt-table.css?"); + +/***/ }), + /***/ "./src/style/vgt-table.css?vue&type=style&index=0&id=f8155dfc&scoped=true&lang=css&": /*!******************************************************************************************!*\ !*** ./src/style/vgt-table.css?vue&type=style&index=0&id=f8155dfc&scoped=true&lang=css& ***! @@ -4656,7 +4797,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"current-downloads-wrapper\" }, [\n _c(\"div\", { staticClass: \"row horizontal-scroll\" }, [\n _c(\n \"div\",\n { staticClass: \"vgt-table-styling col-md-12 top-15\" },\n [\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.history.length > 0,\n expression: \"history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.filterHistory,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n \"column-filter-options\": {\n enabled: true\n },\n styleClass: \"vgt-table condensed\"\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n [\"Snatched\", \"Failed\"].includes(\n props.row.statusName\n )\n ? [\n _c(\"img\", {\n staticClass: \"addQTip\",\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\",\n title: props.row.provider.name,\n onError:\n \"this.onerror=null;this.src='images/providers/missing.png';\"\n }\n })\n ]\n : _vm._e(),\n _vm._v(\" \"),\n props.row.statusName === \"Downloaded\"\n ? _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.releaseGroup !== -1\n ? props.row.releaseGroup\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.row.statusName === \"Subtitled\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/subtitles/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\",\n title: props.row.provider.name\n }\n })\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.provider.name) +\n \"\\n \"\n )\n ])\n ],\n 2\n )\n : props.column.label === \"Release\" &&\n props.row.statusName === \"Subtitled\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n props.row.resource !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n props.row.resource +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: props.row.resource,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n : _c(\"img\", {\n staticClass: \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n props.row.resource +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: props.row.resource,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n : props.column.label === \"Release\"\n ? _c(\n \"span\",\n [\n _c(\"span\", [\n _vm._v(\n _vm._s(props.formattedRow[props.column.field])\n )\n ]),\n _vm._v(\" \"),\n props.row.partOfBatch\n ? _c(\"font-awesome-icon\", {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.right\",\n value:\n \"This release is part of a batch or releases\",\n expression:\n \"'This release is part of a batch or releases'\",\n modifiers: { right: true }\n }\n ],\n attrs: { icon: \"images\" }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Client Status\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.right\",\n value: props.formattedRow[\n props.column.field\n ].status.join(\", \"),\n expression:\n \"props.formattedRow[props.column.field].status.join(', ')\",\n modifiers: { right: true }\n }\n ]\n },\n [\n _vm._v(\n _vm._s(\n props.formattedRow[\n props.column.field\n ].string.join(\", \")\n )\n )\n ]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/current-downloads.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"current-downloads-wrapper\" }, [\n _c(\"div\", { staticClass: \"row horizontal-scroll\" }, [\n _c(\n \"div\",\n { staticClass: \"vgt-table-styling col-md-12 top-15\" },\n [\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.history.length > 0,\n expression: \"history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.filterHistory,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n \"column-filter-options\": {\n enabled: true\n },\n styleClass: \"vgt-table condensed\"\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n [\"Snatched\", \"Failed\"].includes(\n props.row.statusName\n )\n ? [\n _c(\"img\", {\n staticClass: \"addQTip\",\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\",\n title: props.row.provider.name,\n onError:\n \"this.onerror=null;this.src='images/providers/missing.png';\"\n }\n })\n ]\n : _vm._e(),\n _vm._v(\" \"),\n props.row.statusName === \"Downloaded\"\n ? _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.releaseGroup !== -1\n ? props.row.releaseGroup\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.row.statusName === \"Subtitled\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/subtitles/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\",\n title: props.row.provider.name\n }\n })\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.provider.name) +\n \"\\n \"\n )\n ])\n ],\n 2\n )\n : props.column.label === \"Release\" &&\n props.row.statusName === \"Subtitled\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n props.row.resource !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n props.row.resource +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: props.row.resource,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n : _c(\"img\", {\n staticClass: \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n props.row.resource +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: props.row.resource,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n : props.column.label === \"Release\"\n ? _c(\n \"span\",\n [\n _c(\"span\", [\n _vm._v(\n _vm._s(props.formattedRow[props.column.field])\n )\n ]),\n _vm._v(\" \"),\n props.row.partOfBatch\n ? _c(\"font-awesome-icon\", {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.right\",\n value:\n \"This release is part of a batch of releases\",\n expression:\n \"'This release is part of a batch of releases'\",\n modifiers: { right: true }\n }\n ],\n attrs: { icon: \"images\" }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Client Status\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.right\",\n value: props.formattedRow[\n props.column.field\n ].status.join(\", \"),\n expression:\n \"props.formattedRow[props.column.field].status.join(', ')\",\n modifiers: { right: true }\n }\n ]\n },\n [\n _vm._v(\n _vm._s(\n props.formattedRow[\n props.column.field\n ].string.join(\", \")\n )\n )\n ]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/current-downloads.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -4667,7 +4808,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"display-show-template\", class: _vm.theme },\n [\n _c(\"vue-snotify\"),\n _vm._v(\" \"),\n _vm.show.id.slug\n ? _c(\"backstretch\", { attrs: { slug: _vm.show.id.slug } })\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"series-id\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"indexer-name\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"series-slug\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"show-header\", {\n ref: \"show-header\",\n attrs: { type: \"show\", slug: _vm.showSlug },\n on: {\n reflow: _vm.reflowLayout,\n update: _vm.statusQualityUpdate,\n \"update-overview-status\": function($event) {\n _vm.filterByOverviewStatus = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 displayShow horizontal-scroll\" },\n [\n _vm.show.seasons\n ? _c(\"vue-good-table\", {\n ref: \"table-seasons\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.orderSeasons,\n groupOptions: {\n enabled: true,\n mode: \"span\",\n customChildObject: \"episodes\"\n },\n \"pagination-options\": {\n enabled: _vm.layout.show.pagination.enable,\n perPage: _vm.paginationPerPage,\n perPageDropdown: _vm.perPageDropdown\n },\n \"search-options\": {\n enabled: true,\n trigger: \"enter\",\n skipDiacritics: false,\n placeholder: \"Search episodes\"\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: _vm.getSortBy(\"episode\", \"desc\")\n },\n selectOptions: {\n enabled: true,\n selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row\n selectionInfoClass: \"select-info\",\n selectionText: \"episodes selected\",\n clearSelectionText: \"clear\",\n selectAllByGroup: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n \"column-filter-options\": {\n enabled: true\n }\n },\n on: {\n \"on-selected-rows-change\": function($event) {\n _vm.selectedEpisodes = $event.selectedRows\n },\n \"on-per-page-change\": function($event) {\n return _vm.updatePaginationPerPage($event.currentPerPage)\n },\n \"on-page-change\": _vm.onPageChange\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-header-row\",\n fn: function(props) {\n return [\n _c(\n \"h3\",\n { staticClass: \"season-header toggle collapse\" },\n [\n _c(\"app-link\", {\n attrs: { name: \"season-\" + props.row.season }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.season > 0\n ? \"Season \" + props.row.season\n : \"Specials\"\n ) +\n \"\\n \"\n ),\n _vm._v(\" \"),\n _vm.anyEpisodeNotUnaired(props.row)\n ? _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n href:\n \"home/snatchSelection?showslug=\" +\n _vm.show.id.slug +\n \"&season=\" +\n props.row.season +\n \"&episode=1&manual_search_type=season\"\n }\n },\n [\n _vm.config\n ? _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src:\n \"images/manualsearch-white.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"season-scene-exception\",\n attrs: {\n \"data-season\":\n props.row.season > 0\n ? props.row.season\n : \"Specials\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"img\",\n _vm._b(\n {},\n \"img\",\n _vm.getSeasonExceptions(props.row.season),\n false\n )\n )\n ],\n 1\n )\n ]\n }\n },\n {\n key: \"table-footer-row\",\n fn: function(ref) {\n var headerRow = ref.headerRow\n return [\n _c(\n \"tr\",\n {\n staticClass: \"seasoncols border-bottom shadow\",\n attrs: {\n colspan: \"9999\",\n id: \"season-\" + headerRow.season + \"-footer\"\n }\n },\n [\n _c(\n \"th\",\n {\n staticClass: \"col-footer\",\n attrs: { colspan: \"15\", align: \"left\" }\n },\n [\n _vm._v(\n \"Season contains \" +\n _vm._s(headerRow.episodes.length) +\n \" episodes with total filesize: \" +\n _vm._s(_vm.addFileSize(headerRow))\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"tr\", { staticClass: \"spacer\" })\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field == \"content.hasNfo\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasNfo\n ? \"nfo.gif\"\n : \"nfo-no.gif\"),\n alt: props.row.content.hasNfo ? \"Y\" : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.field == \"content.hasTbn\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasTbn\n ? \"tbn.gif\"\n : \"tbn-no.gif\"),\n alt: props.row.content.hasTbn ? \"Y\" : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.label == \"Episode\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n class: {\n addQTip: props.row.file.location !== \"\"\n },\n attrs: {\n title:\n props.row.file.location !== \"\"\n ? props.row.file.location\n : \"\"\n }\n },\n [_vm._v(_vm._s(props.row.episode))]\n )\n ])\n : props.column.label == \"Scene\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneSeasonXEpisode form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode,\n size: \"6\",\n maxlength: \"8\",\n \"data-for-season\": props.row.season,\n \"data-for-episode\": props.row.episode,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.season +\n \"_\" +\n props.row.episode,\n title:\n \"Change this value if scene numbering differs from the indexer episode numbering. Generally used for non-anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode\n }\n })\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneAbsolute form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n \"\" +\n props.formattedRow[props.column.field],\n size: \"6\",\n maxlength: \"8\",\n \"data-for-absolute\":\n props.row.absoluteNumber,\n id:\n \"sceneAbsolute_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.absoluteNumber,\n title:\n \"Change this value if scene absolute numbering differs from the indexer absolute numbering. Generally used for anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n }\n })\n ])\n : props.column.label == \"Title\"\n ? _c(\n \"span\",\n [\n props.row.description !== \"\"\n ? _c(\"plot-info\", {\n attrs: {\n description: props.row.description,\n \"show-slug\": _vm.show.id.slug,\n season: props.row.season,\n episode: props.row.episode\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.title) +\n \"\\n \"\n )\n ],\n 1\n )\n : props.column.label == \"File\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: { title: props.row.file.location }\n },\n [_vm._v(_vm._s(props.row.file.name))]\n )\n ])\n : props.column.label == \"Subtitles\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n [\n \"Archived\",\n \"Downloaded\",\n \"Ignored\",\n \"Skipped\"\n ].includes(props.row.status)\n ? _c(\n \"div\",\n { staticClass: \"subtitles\" },\n _vm._l(props.row.subtitles, function(\n flag\n ) {\n return _c(\"div\", { key: flag }, [\n flag !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: flag,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row,\n flag\n )\n }\n }\n })\n : _c(\"img\", {\n staticClass: \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: flag,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n }),\n 0\n )\n : _vm._e()\n ])\n : props.column.label == \"Status\"\n ? _c(\"span\", [\n _c(\n \"div\",\n { staticClass: \"pull-left\" },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.status) +\n \"\\n \"\n ),\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: {\n quality: props.row.quality\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.status !== \"Unaired\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n staticStyle: {\n \"margin-left\": \"5px\"\n },\n attrs: {\n title: props.row.watched\n ? \"This episode has been flagged as watched\"\n : \"\",\n src:\n \"images/\" +\n (props.row.watched\n ? \"\"\n : \"not\") +\n \"watched.png\",\n width: \"16\",\n height: \"16\"\n },\n on: {\n click: function($event) {\n return _vm.updateEpisodeWatched(\n props.row,\n !props.row.watched\n )\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n : props.column.field == \"search\"\n ? _c(\"span\", [\n _c(\n \"div\",\n { staticClass: \"full-width\" },\n [\n _c(\"img\", {\n ref: \"search-\" + props.row.slug,\n staticClass: \"epForcedSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n src: \"images/search16.png\",\n height: \"16\",\n alt: _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\",\n title: _vm.retryDownload(props.row)\n ? \"Retry Download\"\n : \"Forced Seach\"\n },\n on: {\n click: function($event) {\n return _vm.queueSearch(props.row)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n href:\n \"home/snatchSelection?showslug=\" +\n _vm.show.id.slug +\n \"&season=\" +\n props.row.season +\n \"&episode=\" +\n props.row.episode\n }\n },\n [\n _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n attrs: {\n src: \"images/closed_captioning.png\",\n height: \"16\",\n alt: \"search subtitles\",\n title: \"Search Subtitles\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row\n )\n }\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"mobile\" }, [\n _c(\n \"select\",\n {\n staticClass:\n \"form-control input-sm mobile-select\",\n attrs: { name: \"search-select\" },\n on: {\n change: function($event) {\n return _vm.mobileSelectSearch(\n $event,\n props.row\n )\n }\n }\n },\n [\n _c(\n \"option\",\n {\n attrs: {\n disabled: \"\",\n selected: \"\",\n value: \"search action\"\n }\n },\n [_vm._v(\"search action\")]\n ),\n _vm._v(\" \"),\n _c(\n \"option\",\n { attrs: { value: \"forced\" } },\n [\n _vm._v(\n _vm._s(\n _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\"\n )\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"option\",\n { attrs: { value: \"manual\" } },\n [_vm._v(\"manual\")]\n ),\n _vm._v(\" \"),\n _c(\n \"option\",\n { attrs: { value: \"subtitle\" } },\n [_vm._v(\"subtitle\")]\n )\n ]\n )\n ])\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label == \"Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Scene Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 854605323\n )\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.layout.show.specials && _vm.specials && _vm.specials.length > 0\n ? _c(\"vue-good-table\", {\n ref: \"table-specials\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.specials,\n groupOptions: {\n enabled: true,\n mode: \"span\",\n customChildObject: \"episodes\"\n },\n \"pagination-options\": {\n enabled: false\n },\n \"search-options\": {\n enabled: true,\n trigger: \"enter\",\n skipDiacritics: false,\n placeholder: \"Search specials\"\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: _vm.getSortBy(\"episode\", \"desc\")\n },\n selectOptions: {\n enabled: true,\n selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row\n selectionInfoClass: \"select-info\",\n selectionText: \"episodes selected\",\n clearSelectionText: \"clear\",\n selectAllByGroup: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n \"column-filter-options\": {\n enabled: false\n }\n },\n on: {\n \"on-selected-rows-change\": function($event) {\n _vm.selectedEpisodes = $event.selectedRows\n }\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-header-row\",\n fn: function(props) {\n return [\n _c(\n \"h3\",\n { staticClass: \"season-header toggle collapse\" },\n [\n _c(\"app-link\", {\n attrs: { name: \"season-\" + props.row.season }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.season > 0\n ? \"Season \" + props.row.season\n : \"Specials\"\n ) +\n \"\\n \"\n ),\n _vm._v(\" \"),\n _vm.anyEpisodeNotUnaired(props.row)\n ? _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n href:\n \"home/snatchSelection?showslug=\" +\n _vm.show.id.slug +\n \"&season=\" +\n props.row.season +\n \"&episode=1&manual_search_type=season\"\n }\n },\n [\n _vm.config\n ? _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src:\n \"images/manualsearch-white.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"season-scene-exception\",\n attrs: {\n \"data-season\":\n props.row.season > 0\n ? props.row.season\n : \"Specials\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"img\",\n _vm._b(\n {},\n \"img\",\n _vm.getSeasonExceptions(props.row.season),\n false\n )\n )\n ],\n 1\n )\n ]\n }\n },\n {\n key: \"table-footer-row\",\n fn: function(ref) {\n var headerRow = ref.headerRow\n return [\n _c(\n \"tr\",\n {\n staticClass: \"seasoncols border-bottom shadow\",\n attrs: {\n colspan: \"9999\",\n id: \"season-\" + headerRow.season + \"-footer\"\n }\n },\n [\n _c(\n \"th\",\n {\n staticClass: \"col-footer\",\n attrs: { colspan: \"15\", align: \"left\" }\n },\n [\n _vm._v(\n \"Season contains \" +\n _vm._s(headerRow.episodes.length) +\n \" episodes with total filesize: \" +\n _vm._s(_vm.addFileSize(headerRow))\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"tr\", { staticClass: \"spacer\" })\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field == \"content.hasNfo\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasNfo\n ? \"nfo.gif\"\n : \"nfo-no.gif\"),\n alt: props.row.content.hasNfo ? \"Y\" : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.field == \"content.hasTbn\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasTbn\n ? \"tbn.gif\"\n : \"tbn-no.gif\"),\n alt: props.row.content.hasTbn ? \"Y\" : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.label == \"Episode\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n class: {\n addQTip: props.row.file.location !== \"\"\n },\n attrs: {\n title:\n props.row.file.location !== \"\"\n ? props.row.file.location\n : \"\"\n }\n },\n [_vm._v(_vm._s(props.row.episode))]\n )\n ])\n : props.column.label == \"Scene\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneSeasonXEpisode form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode,\n size: \"6\",\n maxlength: \"8\",\n \"data-for-season\": props.row.season,\n \"data-for-episode\": props.row.episode,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.season +\n \"_\" +\n props.row.episode,\n title:\n \"Change this value if scene numbering differs from the indexer episode numbering. Generally used for non-anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode\n }\n })\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneAbsolute form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n \"\" +\n props.formattedRow[props.column.field],\n size: \"6\",\n maxlength: \"8\",\n \"data-for-absolute\":\n props.row.absoluteNumber,\n id:\n \"sceneAbsolute_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.absoluteNumber,\n title:\n \"Change this value if scene absolute numbering differs from the indexer absolute numbering. Generally used for anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n }\n })\n ])\n : props.column.label == \"Title\"\n ? _c(\n \"span\",\n [\n props.row.description !== \"\"\n ? _c(\"plot-info\", {\n attrs: {\n description: props.row.description,\n \"show-slug\": _vm.show.id.slug,\n season: props.row.season,\n episode: props.row.episode\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.title) +\n \"\\n \"\n )\n ],\n 1\n )\n : props.column.label == \"File\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: { title: props.row.file.location }\n },\n [_vm._v(_vm._s(props.row.file.name))]\n )\n ])\n : props.column.label == \"Subtitles\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n [\n \"Archived\",\n \"Downloaded\",\n \"Ignored\",\n \"Skipped\"\n ].includes(props.row.status)\n ? _c(\n \"div\",\n { staticClass: \"subtitles\" },\n _vm._l(props.row.subtitles, function(\n flag\n ) {\n return _c(\"div\", { key: flag }, [\n flag !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"{flag}\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row,\n flag\n )\n }\n }\n })\n : _c(\"img\", {\n staticClass: \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"flag\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n }),\n 0\n )\n : _vm._e()\n ])\n : props.column.label == \"Status\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\n \"div\",\n { staticClass: \"pull-left\" },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.status) +\n \"\\n \"\n ),\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n staticClass: \"quality-margins\",\n attrs: {\n quality: props.row.quality\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.status !== \"Unaired\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.watched\n ? \"This episode has been flagged as watched\"\n : \"\",\n src:\n \"images/\" +\n (props.row.watched\n ? \"\"\n : \"not\") +\n \"watched.png\",\n width: \"16\"\n },\n on: {\n click: function($event) {\n return _vm.updateEpisodeWatched(\n props.row,\n !props.row.watched\n )\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n : props.column.field == \"search\"\n ? _c(\"span\", [\n _c(\n \"div\",\n { staticClass: \"full-width\" },\n [\n _c(\"img\", {\n ref: \"search-\" + props.row.slug,\n staticClass: \"epForcedSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n src: \"images/search16.png\",\n height: \"16\",\n alt: _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\",\n title: _vm.retryDownload(props.row)\n ? \"Retry Download\"\n : \"Forced Seach\"\n },\n on: {\n click: function($event) {\n return _vm.queueSearch(props.row)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n href:\n \"home/snatchSelection?showslug=\" +\n _vm.show.id.slug +\n \"&season=\" +\n props.row.season +\n \"&episode=\" +\n props.row.episode\n }\n },\n [\n _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n attrs: {\n src: \"images/closed_captioning.png\",\n height: \"16\",\n alt: \"search subtitles\",\n title: \"Search Subtitles\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row\n )\n }\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"mobile\" }, [\n _c(\n \"select\",\n {\n staticClass:\n \"form-control input-sm mobile-select\",\n attrs: { name: \"search-select\" },\n on: {\n change: function($event) {\n return _vm.mobileSelectSearch(\n $event,\n props.row\n )\n }\n }\n },\n [\n _c(\n \"option\",\n {\n attrs: {\n disabled: \"\",\n selected: \"\",\n value: \"search action\"\n }\n },\n [_vm._v(\"search action\")]\n ),\n _vm._v(\" \"),\n _c(\n \"option\",\n { attrs: { value: \"forced\" } },\n [\n _vm._v(\n _vm._s(\n _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\"\n )\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"option\",\n { attrs: { value: \"manual\" } },\n [_vm._v(\"manual\")]\n ),\n _vm._v(\" \"),\n _c(\n \"option\",\n { attrs: { value: \"subtitle\" } },\n [_vm._v(\"subtitle\")]\n )\n ]\n )\n ])\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label == \"Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Scene Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 2936697235\n )\n })\n : _vm._e()\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-start-backlog-search\",\n height: \"auto\",\n width: \"80%\"\n },\n on: { \"before-open\": _vm.beforeBacklogSearchModalClose }\n },\n [\n _c(\"transition\", { attrs: { name: \"modal\" } }, [\n _c(\"div\", { staticClass: \"modal-mask\" }, [\n _c(\"div\", { staticClass: \"modal-wrapper\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-hidden\": \"true\"\n }\n },\n [_vm._v(\"×\")]\n ),\n _vm._v(\" \"),\n _c(\"h4\", { staticClass: \"modal-title\" }, [\n _vm._v(\"Start search?\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [\n _vm._v(\n \"Some episodes have been changed to 'Wanted'. Do you want to trigger a backlog search for these \" +\n _vm._s(_vm.backlogSearchEpisodes.length) +\n \" episode(s)\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n return _vm.$modal.hide(\"query-start-backlog-search\")\n }\n }\n },\n [_vm._v(\"No\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search(_vm.backlogSearchEpisodes, \"backlog\")\n _vm.$modal.hide(\"query-start-backlog-search\")\n }\n }\n },\n [_vm._v(\"Yes\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-mark-failed-and-search\",\n height: \"auto\",\n width: \"80%\"\n },\n on: { \"before-open\": _vm.beforeFailedSearchModalClose }\n },\n [\n _c(\"transition\", { attrs: { name: \"modal\" } }, [\n _c(\"div\", { staticClass: \"modal-mask\" }, [\n _c(\"div\", { staticClass: \"modal-wrapper\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _vm._v(\n \"\\n Mark episode as failed and search?\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [_vm._v(\"Starting to search for the episode\")]),\n _vm._v(\" \"),\n _vm.failedSearchEpisodes &&\n _vm.failedSearchEpisodes.length === 1\n ? _c(\"p\", [\n _vm._v(\n \"Would you also like to mark episode \" +\n _vm._s(_vm.failedSearchEpisodes[0].slug) +\n ' as \"failed\"? This will make sure the episode cannot be downloaded again'\n )\n ])\n : _vm.failedSearchEpisodes\n ? _c(\"p\", [\n _vm._v(\n \"Would you also like to mark episodes \" +\n _vm._s(\n _vm.failedSearchEpisodes\n .map(function(ep) {\n return ep.slug\n })\n .join(\", \")\n ) +\n ' as \"failed\"? This will make sure the episode cannot be downloaded again'\n )\n ])\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search(_vm.failedSearchEpisodes, \"backlog\")\n _vm.$modal.hide(\"query-mark-failed-and-search\")\n }\n }\n },\n [_vm._v(\"No\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search(_vm.failedSearchEpisodes, \"failed\")\n _vm.$modal.hide(\"query-mark-failed-and-search\")\n }\n }\n },\n [_vm._v(\"Yes\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n return _vm.$modal.hide(\n \"query-mark-failed-and-search\"\n )\n }\n }\n },\n [_vm._v(\"Cancel\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/display-show.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"display-show-template\", class: _vm.theme },\n [\n _c(\"vue-snotify\"),\n _vm._v(\" \"),\n _vm.show.id.slug\n ? _c(\"backstretch\", { attrs: { slug: _vm.show.id.slug } })\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"series-id\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"indexer-name\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"series-slug\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"show-header\", {\n ref: \"show-header\",\n attrs: { type: \"show\", slug: _vm.showSlug },\n on: {\n reflow: _vm.reflowLayout,\n update: _vm.statusQualityUpdate,\n \"update-overview-status\": function($event) {\n _vm.filterByOverviewStatus = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 displayShow horizontal-scroll\" },\n [\n _vm.show.seasons\n ? _c(\"vue-good-table\", {\n ref: \"table-seasons\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.orderSeasons,\n groupOptions: {\n enabled: true,\n mode: \"span\"\n },\n \"pagination-options\": {\n enabled: _vm.layout.show.pagination.enable,\n perPage: _vm.paginationPerPage,\n perPageDropdown: _vm.perPageDropdown\n },\n \"search-options\": {\n enabled: true,\n trigger: \"enter\",\n skipDiacritics: false,\n placeholder: \"Search episodes\"\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: _vm.getSortBy(\"episode\", \"desc\")\n },\n selectOptions: {\n enabled: true,\n selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row\n selectionInfoClass: \"select-info\",\n selectionText: \"episodes selected\",\n clearSelectionText: \"clear\",\n selectAllByGroup: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n \"column-filter-options\": {\n enabled: true\n }\n },\n on: {\n \"on-selected-rows-change\": function($event) {\n _vm.selectedEpisodes = $event.selectedRows\n },\n \"on-per-page-change\": function($event) {\n return _vm.updatePaginationPerPage($event.currentPerPage)\n },\n \"on-page-change\": _vm.onPageChange\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-header-row\",\n fn: function(props) {\n return [\n _c(\n \"h3\",\n { staticClass: \"season-header toggle collapse\" },\n [\n _c(\"app-link\", {\n attrs: { name: \"season-\" + props.row.season }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.season > 0\n ? \"Season \" + props.row.season\n : \"Specials\"\n ) +\n \"\\n \"\n ),\n _vm._v(\" \"),\n _vm.anyEpisodeNotUnaired(props.row)\n ? _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n href:\n \"home/snatchSelection?showslug=\" +\n _vm.show.id.slug +\n \"&season=\" +\n props.row.season +\n \"&episode=1&manual_search_type=season\"\n }\n },\n [\n _vm.config\n ? _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src:\n \"images/manualsearch-white.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"season-scene-exception\",\n attrs: {\n \"data-season\":\n props.row.season > 0\n ? props.row.season\n : \"Specials\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"img\",\n _vm._b(\n {},\n \"img\",\n _vm.getSeasonExceptions(props.row.season),\n false\n )\n )\n ],\n 1\n )\n ]\n }\n },\n {\n key: \"table-footer-row\",\n fn: function(ref) {\n var headerRow = ref.headerRow\n return [\n _c(\n \"tr\",\n {\n staticClass: \"seasoncols border-bottom shadow\",\n attrs: {\n colspan: \"9999\",\n id: \"season-\" + headerRow.season + \"-footer\"\n }\n },\n [\n _c(\n \"th\",\n {\n staticClass: \"col-footer\",\n attrs: { colspan: \"15\", align: \"left\" }\n },\n [\n _vm._v(\n \"Season contains \" +\n _vm._s(headerRow.children.length) +\n \" episodes with total filesize: \" +\n _vm._s(_vm.addFileSize(headerRow))\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"tr\", { staticClass: \"spacer\" })\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field == \"content.hasNfo\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasNfo\n ? \"nfo.gif\"\n : \"nfo-no.gif\"),\n alt: props.row.content.hasNfo ? \"Y\" : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.field == \"content.hasTbn\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasTbn\n ? \"tbn.gif\"\n : \"tbn-no.gif\"),\n alt: props.row.content.hasTbn ? \"Y\" : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.label == \"Episode\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n class: {\n addQTip: props.row.file.location !== \"\"\n },\n attrs: {\n title:\n props.row.file.location !== \"\"\n ? props.row.file.location\n : \"\"\n }\n },\n [_vm._v(_vm._s(props.row.episode))]\n )\n ])\n : props.column.label == \"Scene\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneSeasonXEpisode form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode,\n size: \"6\",\n maxlength: \"8\",\n \"data-for-season\": props.row.season,\n \"data-for-episode\": props.row.episode,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.season +\n \"_\" +\n props.row.episode,\n title:\n \"Change this value if scene numbering differs from the indexer episode numbering. Generally used for non-anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode\n }\n })\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneAbsolute form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n \"\" +\n props.formattedRow[props.column.field],\n size: \"6\",\n maxlength: \"8\",\n \"data-for-absolute\":\n props.row.absoluteNumber,\n id:\n \"sceneAbsolute_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.absoluteNumber,\n title:\n \"Change this value if scene absolute numbering differs from the indexer absolute numbering. Generally used for anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n }\n })\n ])\n : props.column.label == \"Title\"\n ? _c(\n \"span\",\n [\n props.row.description !== \"\"\n ? _c(\"plot-info\", {\n attrs: {\n description: props.row.description,\n \"show-slug\": _vm.show.id.slug,\n season: props.row.season,\n episode: props.row.episode\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.title) +\n \"\\n \"\n )\n ],\n 1\n )\n : props.column.label == \"File\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: { title: props.row.file.location }\n },\n [_vm._v(_vm._s(props.row.file.name))]\n )\n ])\n : props.column.label == \"Subtitles\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n [\n \"Archived\",\n \"Downloaded\",\n \"Ignored\",\n \"Skipped\"\n ].includes(props.row.status)\n ? _c(\n \"div\",\n { staticClass: \"subtitles\" },\n _vm._l(props.row.subtitles, function(\n flag\n ) {\n return _c(\"div\", { key: flag }, [\n flag !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: flag,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row,\n flag\n )\n }\n }\n })\n : _c(\"img\", {\n staticClass: \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: flag,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n }),\n 0\n )\n : _vm._e()\n ])\n : props.column.label == \"Status\"\n ? _c(\"span\", [\n _c(\n \"div\",\n { staticClass: \"pull-left\" },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.status) +\n \"\\n \"\n ),\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: {\n quality: props.row.quality\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.status !== \"Unaired\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n staticStyle: {\n \"margin-left\": \"5px\"\n },\n attrs: {\n title: props.row.watched\n ? \"This episode has been flagged as watched\"\n : \"\",\n src:\n \"images/\" +\n (props.row.watched\n ? \"\"\n : \"not\") +\n \"watched.png\",\n width: \"16\",\n height: \"16\"\n },\n on: {\n click: function($event) {\n return _vm.updateEpisodeWatched(\n props.row,\n !props.row.watched\n )\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n : props.column.field == \"search\"\n ? _c(\"span\", [\n _c(\n \"div\",\n { staticClass: \"full-width\" },\n [\n _c(\"img\", {\n ref: \"search-\" + props.row.slug,\n staticClass: \"epForcedSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n src: \"images/search16.png\",\n height: \"16\",\n alt: _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\",\n title: _vm.retryDownload(props.row)\n ? \"Retry Download\"\n : \"Forced Seach\"\n },\n on: {\n click: function($event) {\n return _vm.queueSearch(props.row)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n href:\n \"home/snatchSelection?showslug=\" +\n _vm.show.id.slug +\n \"&season=\" +\n props.row.season +\n \"&episode=\" +\n props.row.episode\n }\n },\n [\n _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n attrs: {\n src: \"images/closed_captioning.png\",\n height: \"16\",\n alt: \"search subtitles\",\n title: \"Search Subtitles\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row\n )\n }\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"mobile\" }, [\n _c(\n \"select\",\n {\n staticClass:\n \"form-control input-sm mobile-select\",\n attrs: { name: \"search-select\" },\n on: {\n change: function($event) {\n return _vm.mobileSelectSearch(\n $event,\n props.row\n )\n }\n }\n },\n [\n _c(\n \"option\",\n {\n attrs: {\n disabled: \"\",\n selected: \"\",\n value: \"search action\"\n }\n },\n [_vm._v(\"search action\")]\n ),\n _vm._v(\" \"),\n _c(\n \"option\",\n { attrs: { value: \"forced\" } },\n [\n _vm._v(\n _vm._s(\n _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\"\n )\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"option\",\n { attrs: { value: \"manual\" } },\n [_vm._v(\"manual\")]\n ),\n _vm._v(\" \"),\n _c(\n \"option\",\n { attrs: { value: \"subtitle\" } },\n [_vm._v(\"subtitle\")]\n )\n ]\n )\n ])\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label == \"Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Scene Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 2040946698\n )\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.layout.show.specials && _vm.specials && _vm.specials.length > 0\n ? _c(\"vue-good-table\", {\n ref: \"table-specials\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.specials,\n groupOptions: {\n enabled: true,\n mode: \"span\",\n customChildObject: \"episodes\"\n },\n \"pagination-options\": {\n enabled: false\n },\n \"search-options\": {\n enabled: true,\n trigger: \"enter\",\n skipDiacritics: false,\n placeholder: \"Search specials\"\n },\n \"sort-options\": {\n enabled: true,\n multipleColumns: true,\n initialSortBy: _vm.getSortBy(\"episode\", \"desc\") // From mixin manage-cookie.js\n },\n selectOptions: {\n enabled: true,\n selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row\n selectionInfoClass: \"select-info\",\n selectionText: \"episodes selected\",\n clearSelectionText: \"clear\",\n selectAllByGroup: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n \"column-filter-options\": {\n enabled: false\n }\n },\n on: {\n \"on-selected-rows-change\": function($event) {\n _vm.selectedEpisodes = $event.selectedRows\n }\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-header-row\",\n fn: function(props) {\n return [\n _c(\n \"h3\",\n { staticClass: \"season-header toggle collapse\" },\n [\n _c(\"app-link\", {\n attrs: { name: \"season-\" + props.row.season }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.season > 0\n ? \"Season \" + props.row.season\n : \"Specials\"\n ) +\n \"\\n \"\n ),\n _vm._v(\" \"),\n _vm.anyEpisodeNotUnaired(props.row)\n ? _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n href:\n \"home/snatchSelection?showslug=\" +\n _vm.show.id.slug +\n \"&season=\" +\n props.row.season +\n \"&episode=1&manual_search_type=season\"\n }\n },\n [\n _vm.config\n ? _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src:\n \"images/manualsearch-white.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"season-scene-exception\",\n attrs: {\n \"data-season\":\n props.row.season > 0\n ? props.row.season\n : \"Specials\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"img\",\n _vm._b(\n {},\n \"img\",\n _vm.getSeasonExceptions(props.row.season),\n false\n )\n )\n ],\n 1\n )\n ]\n }\n },\n {\n key: \"table-footer-row\",\n fn: function(ref) {\n var headerRow = ref.headerRow\n return [\n _c(\n \"tr\",\n {\n staticClass: \"seasoncols border-bottom shadow\",\n attrs: {\n colspan: \"9999\",\n id: \"season-\" + headerRow.season + \"-footer\"\n }\n },\n [\n _c(\n \"th\",\n {\n staticClass: \"col-footer\",\n attrs: { colspan: \"15\", align: \"left\" }\n },\n [\n _vm._v(\n \"Season contains \" +\n _vm._s(headerRow.children.length) +\n \" episodes with total filesize: \" +\n _vm._s(_vm.addFileSize(headerRow))\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"tr\", { staticClass: \"spacer\" })\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field == \"content.hasNfo\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasNfo\n ? \"nfo.gif\"\n : \"nfo-no.gif\"),\n alt: props.row.content.hasNfo ? \"Y\" : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.field == \"content.hasTbn\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasTbn\n ? \"tbn.gif\"\n : \"tbn-no.gif\"),\n alt: props.row.content.hasTbn ? \"Y\" : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.label == \"Episode\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n class: {\n addQTip: props.row.file.location !== \"\"\n },\n attrs: {\n title:\n props.row.file.location !== \"\"\n ? props.row.file.location\n : \"\"\n }\n },\n [_vm._v(_vm._s(props.row.episode))]\n )\n ])\n : props.column.label == \"Scene\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneSeasonXEpisode form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode,\n size: \"6\",\n maxlength: \"8\",\n \"data-for-season\": props.row.season,\n \"data-for-episode\": props.row.episode,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.season +\n \"_\" +\n props.row.episode,\n title:\n \"Change this value if scene numbering differs from the indexer episode numbering. Generally used for non-anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode\n }\n })\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneAbsolute form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n \"\" +\n props.formattedRow[props.column.field],\n size: \"6\",\n maxlength: \"8\",\n \"data-for-absolute\":\n props.row.absoluteNumber,\n id:\n \"sceneAbsolute_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.absoluteNumber,\n title:\n \"Change this value if scene absolute numbering differs from the indexer absolute numbering. Generally used for anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n }\n })\n ])\n : props.column.label == \"Title\"\n ? _c(\n \"span\",\n [\n props.row.description !== \"\"\n ? _c(\"plot-info\", {\n attrs: {\n description: props.row.description,\n \"show-slug\": _vm.show.id.slug,\n season: props.row.season,\n episode: props.row.episode\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.title) +\n \"\\n \"\n )\n ],\n 1\n )\n : props.column.label == \"File\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: { title: props.row.file.location }\n },\n [_vm._v(_vm._s(props.row.file.name))]\n )\n ])\n : props.column.label == \"Subtitles\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n [\n \"Archived\",\n \"Downloaded\",\n \"Ignored\",\n \"Skipped\"\n ].includes(props.row.status)\n ? _c(\n \"div\",\n { staticClass: \"subtitles\" },\n _vm._l(props.row.subtitles, function(\n flag\n ) {\n return _c(\"div\", { key: flag }, [\n flag !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"{flag}\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row,\n flag\n )\n }\n }\n })\n : _c(\"img\", {\n staticClass: \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"flag\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n }),\n 0\n )\n : _vm._e()\n ])\n : props.column.label == \"Status\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\n \"div\",\n { staticClass: \"pull-left\" },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.status) +\n \"\\n \"\n ),\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n staticClass: \"quality-margins\",\n attrs: {\n quality: props.row.quality\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.status !== \"Unaired\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.watched\n ? \"This episode has been flagged as watched\"\n : \"\",\n src:\n \"images/\" +\n (props.row.watched\n ? \"\"\n : \"not\") +\n \"watched.png\",\n width: \"16\"\n },\n on: {\n click: function($event) {\n return _vm.updateEpisodeWatched(\n props.row,\n !props.row.watched\n )\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n : props.column.field == \"search\"\n ? _c(\"span\", [\n _c(\n \"div\",\n { staticClass: \"full-width\" },\n [\n _c(\"img\", {\n ref: \"search-\" + props.row.slug,\n staticClass: \"epForcedSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n src: \"images/search16.png\",\n height: \"16\",\n alt: _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\",\n title: _vm.retryDownload(props.row)\n ? \"Retry Download\"\n : \"Forced Seach\"\n },\n on: {\n click: function($event) {\n return _vm.queueSearch(props.row)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n href:\n \"home/snatchSelection?showslug=\" +\n _vm.show.id.slug +\n \"&season=\" +\n props.row.season +\n \"&episode=\" +\n props.row.episode\n }\n },\n [\n _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n attrs: {\n src: \"images/closed_captioning.png\",\n height: \"16\",\n alt: \"search subtitles\",\n title: \"Search Subtitles\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row\n )\n }\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"mobile\" }, [\n _c(\n \"select\",\n {\n staticClass:\n \"form-control input-sm mobile-select\",\n attrs: { name: \"search-select\" },\n on: {\n change: function($event) {\n return _vm.mobileSelectSearch(\n $event,\n props.row\n )\n }\n }\n },\n [\n _c(\n \"option\",\n {\n attrs: {\n disabled: \"\",\n selected: \"\",\n value: \"search action\"\n }\n },\n [_vm._v(\"search action\")]\n ),\n _vm._v(\" \"),\n _c(\n \"option\",\n { attrs: { value: \"forced\" } },\n [\n _vm._v(\n _vm._s(\n _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\"\n )\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"option\",\n { attrs: { value: \"manual\" } },\n [_vm._v(\"manual\")]\n ),\n _vm._v(\" \"),\n _c(\n \"option\",\n { attrs: { value: \"subtitle\" } },\n [_vm._v(\"subtitle\")]\n )\n ]\n )\n ])\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label == \"Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Scene Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 622958994\n )\n })\n : _vm._e()\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-start-backlog-search\",\n height: \"auto\",\n width: \"80%\"\n },\n on: { \"before-open\": _vm.beforeBacklogSearchModalClose }\n },\n [\n _c(\"transition\", { attrs: { name: \"modal\" } }, [\n _c(\"div\", { staticClass: \"modal-mask\" }, [\n _c(\"div\", { staticClass: \"modal-wrapper\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-hidden\": \"true\"\n }\n },\n [_vm._v(\"×\")]\n ),\n _vm._v(\" \"),\n _c(\"h4\", { staticClass: \"modal-title\" }, [\n _vm._v(\"Start search?\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [\n _vm._v(\n \"Some episodes have been changed to 'Wanted'. Do you want to trigger a backlog search for these \" +\n _vm._s(_vm.backlogSearchEpisodes.length) +\n \" episode(s)\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n return _vm.$modal.hide(\"query-start-backlog-search\")\n }\n }\n },\n [_vm._v(\"No\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search(_vm.backlogSearchEpisodes, \"backlog\")\n _vm.$modal.hide(\"query-start-backlog-search\")\n }\n }\n },\n [_vm._v(\"Yes\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-mark-failed-and-search\",\n height: \"auto\",\n width: \"80%\"\n },\n on: { \"before-open\": _vm.beforeFailedSearchModalClose }\n },\n [\n _c(\"transition\", { attrs: { name: \"modal\" } }, [\n _c(\"div\", { staticClass: \"modal-mask\" }, [\n _c(\"div\", { staticClass: \"modal-wrapper\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _vm._v(\n \"\\n Mark episode as failed and search?\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [_vm._v(\"Starting to search for the episode\")]),\n _vm._v(\" \"),\n _vm.failedSearchEpisodes &&\n _vm.failedSearchEpisodes.length === 1\n ? _c(\"p\", [\n _vm._v(\n \"Would you also like to mark episode \" +\n _vm._s(_vm.failedSearchEpisodes[0].slug) +\n ' as \"failed\"? This will make sure the episode cannot be downloaded again'\n )\n ])\n : _vm.failedSearchEpisodes\n ? _c(\"p\", [\n _vm._v(\n \"Would you also like to mark episodes \" +\n _vm._s(\n _vm.failedSearchEpisodes\n .map(function(ep) {\n return ep.slug\n })\n .join(\", \")\n ) +\n ' as \"failed\"? This will make sure the episode cannot be downloaded again'\n )\n ])\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search(_vm.failedSearchEpisodes, \"backlog\")\n _vm.$modal.hide(\"query-mark-failed-and-search\")\n }\n }\n },\n [_vm._v(\"No\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search(_vm.failedSearchEpisodes, \"failed\")\n _vm.$modal.hide(\"query-mark-failed-and-search\")\n }\n }\n },\n [_vm._v(\"Yes\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n return _vm.$modal.hide(\n \"query-mark-failed-and-search\"\n )\n }\n }\n },\n [_vm._v(\"Cancel\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/display-show.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -4935,6 +5076,39 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history-compact.vue?vue&type=template&id=899ba7ec&scoped=true&": +/*!******************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history-compact.vue?vue&type=template&id=899ba7ec&scoped=true& ***! + \******************************************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"history-wrapper-compact vgt-table-styling\" },\n [\n _c(\"vue-good-table\", {\n attrs: {\n mode: \"remote\",\n columns: _vm.columns,\n rows: _vm.remoteHistory.rows,\n totalRows: _vm.remoteHistory.totalRows,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n multipleColumns: false,\n initialSortBy: _vm.getSortFromCookie()\n },\n \"pagination-options\": {\n enabled: true,\n perPage: _vm.remoteHistory.perPage,\n perPageDropdown: _vm.perPageDropdown,\n dropdownAllowAll: false,\n position: \"both\"\n },\n styleClass: \"vgt-table condensed\"\n },\n on: {\n \"on-page-change\": _vm.onPageChange,\n \"on-per-page-change\": _vm.onPerPageChange,\n \"on-sort-change\": _vm.onSortChange,\n \"on-column-filter\": _vm.onColumnFilter\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Episode\"\n ? _c(\n \"span\",\n { staticClass: \"episode-title\" },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"home/displayShow?showslug=\" +\n props.row.showSlug\n }\n },\n [_vm._v(_vm._s(props.row.episodeTitle))]\n )\n ],\n 1\n )\n : props.column.label === \"Snatched\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n _vm._l(_vm.sortDate(props.row.rows), function(row) {\n return _c(\n \"div\",\n { key: row.id },\n [\n row.statusName === \"Snatched\"\n ? [\n _c(\"img\", {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.right\",\n value:\n row.provider.name +\n \": \" +\n row.resource +\n \" (\" +\n row.actionDate +\n \")\",\n expression:\n \"`${row.provider.name}: ${row.resource} (${row.actionDate})`\",\n modifiers: { right: true }\n }\n ],\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n row.provider.id +\n \".png\",\n alt: row.provider.name,\n width: \"16\",\n height: \"16\",\n onError:\n \"this.onerror=null;this.src='images/providers/missing.png';\"\n }\n }),\n _vm._v(\" \"),\n row.manuallySearched\n ? _c(\"img\", {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.right\",\n value:\n \"Manual searched episode: \" +\n row.resource +\n \" (\" +\n row.actionDate +\n \")\",\n expression:\n \"`Manual searched episode: ${row.resource} (${row.actionDate})`\",\n modifiers: { right: true }\n }\n ],\n staticStyle: {\n \"vertical-align\": \"middle\"\n },\n attrs: {\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n row.properTags\n ? _c(\"img\", {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.right\",\n value:\n row.properTags\n .split(/[ |]+/)\n .join(\", \") +\n \": \" +\n row.resource +\n \" (\" +\n row.actionDate +\n \")\",\n expression:\n \"`${row.properTags.split(/[ |]+/).join(', ')}: ${row.resource} (${row.actionDate})`\",\n modifiers: { right: true }\n }\n ],\n staticStyle: {\n \"vertical-align\": \"middle\"\n },\n attrs: {\n src: \"images/info32.png\",\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e()\n ]\n : row.statusName === \"Failed\"\n ? _c(\"img\", {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.right\",\n value:\n row.provider.name +\n \" download failed: \" +\n row.resource +\n \" (\" +\n row.actionDate +\n \")\",\n expression:\n \"`${row.provider.name} download failed: ${row.resource} (${row.actionDate})`\",\n modifiers: { right: true }\n }\n ],\n staticStyle: { \"vertical-align\": \"middle\" },\n attrs: {\n src: \"images/no16.png\",\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e()\n ],\n 2\n )\n }),\n 0\n )\n : props.column.label === \"Downloaded\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n _vm._l(_vm.sortDate(props.row.rows), function(row) {\n return _c(\n \"div\",\n { key: row.id },\n [\n [\"Downloaded\", \"Archived\"].includes(row.statusName)\n ? [\n row.releaseGroup\n ? _c(\n \"span\",\n {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.right\",\n value: _vm.getFileBaseName(\n row.resource\n ),\n expression:\n \"getFileBaseName(row.resource)\",\n modifiers: { right: true }\n }\n ],\n staticStyle: { cursor: \"help\" }\n },\n [\n _c(\"i\", [\n _vm._v(_vm._s(row.releaseGroup))\n ])\n ]\n )\n : _c(\n \"span\",\n {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.right\",\n value: _vm.getFileBaseName(\n row.resource\n ),\n expression:\n \"getFileBaseName(row.resource)\",\n modifiers: { right: true }\n }\n ],\n staticStyle: { cursor: \"help\" }\n },\n [_c(\"i\", [_vm._v(\"Unknown\")])]\n )\n ]\n : _vm._e()\n ],\n 2\n )\n }),\n 0\n )\n : props.column.label === \"Subtitled\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n _vm._l(_vm.sortDate(props.row.rows), function(row) {\n return _c(\n \"div\",\n {\n key: row.id,\n staticStyle: { \"margin-right\": \"5px\" }\n },\n [\n row.statusName === \"Subtitled\"\n ? [\n _c(\"img\", {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.right\",\n value:\n row.provider.name +\n \": \" +\n _vm.getFileBaseName(row.resource),\n expression:\n \"`${row.provider.name}: ${getFileBaseName(row.resource)}`\",\n modifiers: { right: true }\n }\n ],\n staticStyle: { \"vertical-align\": \"middle\" },\n attrs: {\n src:\n \"images/subtitles/\" +\n row.provider.name +\n \".png\",\n width: \"16\",\n height: \"16\",\n alt: row.provider.name\n }\n }),\n _vm._v(\" \"),\n _c(\n \"span\",\n {\n staticStyle: {\n \"vertical-align\": \"middle\"\n }\n },\n [_vm._v(\" / \")]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n staticStyle: {\n \"vertical-align\": \"middle !important\"\n },\n attrs: {\n width: \"16\",\n height: \"11\",\n src:\n \"images/subtitles/flags/\" +\n row.resource +\n \".png\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ]\n : _vm._e()\n ],\n 2\n )\n }),\n 0\n )\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/history-compact.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history-detailed.vue?vue&type=template&id=3792bd4e&scoped=true&": +/*!*******************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history-detailed.vue?vue&type=template&id=3792bd4e&scoped=true& ***! + \*******************************************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"history-detailed-wrapper vgt-table-styling\" },\n [\n _c(\"vue-good-table\", {\n ref: \"detailed-history\",\n attrs: {\n mode: \"remote\",\n columns: _vm.columns,\n rows: _vm.remoteHistory.rows,\n totalRows: _vm.remoteHistory.totalRows,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n multipleColumns: false,\n initialSortBy: _vm.getSortFromCookie()\n },\n \"pagination-options\": {\n enabled: true,\n perPage: _vm.remoteHistory.perPage,\n perPageDropdown: _vm.perPageDropdown,\n dropdownAllowAll: false,\n position: \"both\"\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n styleClass: \"vgt-table condensed\"\n },\n on: {\n \"on-page-change\": _vm.onPageChange,\n \"on-per-page-change\": _vm.onPerPageChange,\n \"on-sort-change\": _vm.onSortChange,\n \"on-column-filter\": _vm.onColumnFilter\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Episode\"\n ? _c(\n \"span\",\n { staticClass: \"episode-title\" },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"home/displayShow?showslug=\" +\n props.row.showSlug\n }\n },\n [_vm._v(_vm._s(props.row.episodeTitle))]\n )\n ],\n 1\n )\n : props.column.label === \"Action\"\n ? _c(\n \"span\",\n { staticClass: \"align-center status-name\" },\n [\n _c(\n \"span\",\n {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.right\",\n value: props.row.resource,\n expression: \"props.row.resource\",\n modifiers: { right: true }\n }\n ]\n },\n [_vm._v(_vm._s(props.row.statusName))]\n ),\n _vm._v(\" \"),\n props.row.partOfBatch\n ? _c(\"font-awesome-icon\", {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.right\",\n value:\n \"This release is part of a batch of releases\",\n expression:\n \"'This release is part of a batch of releases'\",\n modifiers: { right: true }\n }\n ],\n attrs: { icon: \"images\" }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n [\"Snatched\", \"Failed\"].includes(props.row.statusName)\n ? [\n _c(\"img\", {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.right\",\n value: props.row.provider.name,\n expression: \"props.row.provider.name\",\n modifiers: { right: true }\n }\n ],\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\",\n title: props.row.provider.name,\n onError:\n \"this.onerror=null;this.src='images/providers/missing.png';\"\n }\n })\n ]\n : _vm._e(),\n _vm._v(\" \"),\n props.row.statusName === \"Downloaded\"\n ? _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.releaseGroup !== -1\n ? props.row.releaseGroup\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.row.statusName === \"Subtitled\"\n ? _c(\"img\", {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.right\",\n value: props.row.provider.name,\n expression: \"props.row.provider.name\",\n modifiers: { right: true }\n }\n ],\n staticClass: \"addQTip\",\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/subtitles/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\",\n title: props.row.provider.name\n }\n })\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.provider.name) +\n \"\\n \"\n )\n ])\n ],\n 2\n )\n : props.column.label === \"Client Status\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n props.row.clientStatus\n ? _c(\n \"span\",\n {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.right\",\n value: props.row.clientStatus.status.join(\n \", \"\n ),\n expression:\n \"props.row.clientStatus.status.join(', ')\",\n modifiers: { right: true }\n }\n ]\n },\n [\n _vm._v(\n _vm._s(props.row.clientStatus.string.join(\", \"))\n )\n ]\n )\n : _vm._e()\n ])\n : props.column.label === \"Release\" &&\n props.row.statusName === \"Subtitled\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n props.row.resource !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n props.row.resource +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: props.row.resource,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n : _c(\"img\", {\n staticClass: \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n props.row.resource +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: props.row.resource,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"column-filter\",\n fn: function(ref) {\n var column = ref.column\n return [\n column.field === \"quality\"\n ? _c(\"span\", [\n _c(\n \"select\",\n {\n staticClass:\n \"form-control form-control-inline input-sm\",\n on: { input: _vm.updateQualityFilter }\n },\n [\n _c(\"option\", { attrs: { value: \"\" } }, [\n _vm._v(\"Filter Quality\")\n ]),\n _vm._v(\" \"),\n _vm._l(_vm.consts.qualities.values, function(option) {\n return _c(\n \"option\",\n {\n key: option.key,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.name))]\n )\n })\n ],\n 2\n )\n ])\n : column.field === \"size\"\n ? _c(\"span\", [\n _c(\"input\", {\n staticClass: \"'form-control input-sm vgt-input\",\n attrs: { placeholder: \"ex. `< 1024` (MB)\" },\n on: { input: _vm.updateSizeFilter }\n })\n ])\n : column.field === \"clientStatus\"\n ? _c(\n \"span\",\n [\n _c(\"multiselect\", {\n staticStyle: { \"margin-top\": \"5px\" },\n attrs: {\n value: _vm.selectedClientStatusValue,\n multiple: true,\n options: _vm.consts.clientStatuses,\n \"track-by\": \"value\",\n label: \"name\"\n },\n on: { input: _vm.updateClientStatusFilter }\n })\n ],\n 1\n )\n : _vm._e()\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/history-detailed.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history.vue?vue&type=template&id=476f04b4&scoped=true&": +/*!**********************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history.vue?vue&type=template&id=476f04b4&scoped=true& ***! + \**********************************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"history-wrapper\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-6 pull-right\" }, [\n _c(\"div\", { staticClass: \"layout-controls pull-right\" }, [\n _c(\"div\", { staticClass: \"show-option\" }, [\n _c(\"span\", [\n _vm._v(\" Layout:\\n \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout,\n expression: \"layout\"\n }\n ],\n staticClass: \"form-control form-control-inline input-sm\",\n attrs: { name: \"layout\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.layout = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.layoutOptions, function(option) {\n return _c(\n \"option\",\n { key: option.value, domProps: { value: option.value } },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n )\n ])\n ])\n ])\n ])\n ]),\n _vm._v(\" \"),\n _vm.layout\n ? _c(\n \"div\",\n {\n staticClass: \"row horizontal-scroll\",\n class: { fanartBackground: _vm.stateLayout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15\" },\n [\n _vm.layout === \"detailed\"\n ? _c(\"history-detailed\")\n : _c(\"history-compact\")\n ],\n 1\n )\n ]\n )\n : _vm._e()\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/home.vue?vue&type=template&id=957c9522&scoped=true&": /*!*******************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/home.vue?vue&type=template&id=957c9522&scoped=true& ***! @@ -5630,6 +5804,26 @@ eval("// style-loader: Adds some css to the DOM by adding a