From 3887851d4bca8fb6560f3e855c6b29d7ac13c31a Mon Sep 17 00:00:00 2001 From: Dean Campbell Date: Thu, 15 Oct 2020 22:03:25 -0700 Subject: [PATCH 1/4] feat(electron): add dl count and version Add download count as a column to the get addons page. Add addon version below the addon name. --- .../addon-providers/curse-addon-provider.ts | 21 +- .../addon-providers/tukui-addon-provider.ts | 1 + ...otential-addon-table-column.component.html | 2 +- .../src/app/models/wowup/potential-addon.ts | 1 + .../get-addons/get-addons.component.html | 14 +- .../pages/get-addons/get-addons.component.ts | 3 +- .../services/addons/addon.provider.factory.ts | 7 +- wowup-electron/src/assets/i18n/de.json | 3 +- wowup-electron/src/assets/i18n/en.json | 3 +- wowup-electron/src/assets/i18n/es.json | 3 +- wowup-electron/src/assets/i18n/fr.json | 3 +- wowup-electron/src/assets/i18n/it.json | 3 +- wowup-electron/src/assets/i18n/pt.json | 227 +++++++++--------- wowup-electron/src/assets/i18n/ru.json | 3 +- wowup-electron/src/assets/i18n/zh.json | 3 +- 15 files changed, 167 insertions(+), 130 deletions(-) diff --git a/wowup-electron/src/app/addon-providers/curse-addon-provider.ts b/wowup-electron/src/app/addon-providers/curse-addon-provider.ts index 352fe074..d2234c32 100644 --- a/wowup-electron/src/app/addon-providers/curse-addon-provider.ts +++ b/wowup-electron/src/app/addon-providers/curse-addon-provider.ts @@ -24,6 +24,7 @@ import { CurseFile } from "common/curse/curse-file"; import { CurseReleaseType } from "common/curse/curse-release-type"; import { CurseGetFeaturedResponse } from "app/models/curse/curse-get-featured-response"; import * as CircuitBreaker from "opossum"; +import { WowUpService } from "app/services/wowup/wowup.service"; const API_URL = "https://addons-ecs.forgesvc.net/api/v2"; @@ -45,7 +46,8 @@ export class CurseAddonProvider implements AddonProvider { constructor( private _httpClient: HttpClient, private _cachingService: CachingService, - private _electronService: ElectronService + private _electronService: ElectronService, + private _wowUpService: WowUpService, ) { this._circuitBreaker = new CircuitBreaker( (action) => this.sendRequest(action), @@ -276,7 +278,7 @@ export class CurseAddonProvider implements AddonProvider { return this.filterFeaturedAddons(addons, clientType); }), map((filteredAddons) => { - return filteredAddons.map((addon) => this.getPotentialAddon(addon)); + return filteredAddons.map((addon) => this.getPotentialAddon(addon, clientType)); }) ); } @@ -313,7 +315,7 @@ export class CurseAddonProvider implements AddonProvider { continue; } - searchResults.push(this.getPotentialAddon(result)); + searchResults.push(this.getPotentialAddon(result, clientType)); } return searchResults; @@ -387,7 +389,17 @@ export class CurseAddonProvider implements AddonProvider { throw new Error("Method not implemented."); } - private getPotentialAddon(result: CurseSearchResult): PotentialAddon { + private getPotentialAddon(result: CurseSearchResult, clientType: WowClientType): PotentialAddon { + const clientTypeStr = this.getGameVersionFlavor(clientType); + let latestFile = _.orderBy(result.latestFiles, 'id', 'desc') + .find(file => + file.gameVersionFlavor === clientTypeStr && + this.getChannelType(file.releaseType) === this._wowUpService.getDefaultAddonChannel(clientType) + ); + if (!latestFile) { + latestFile = _.first(result.latestFiles); + } + return { author: this.getAuthor(result), downloadCount: result.downloadCount, @@ -398,6 +410,7 @@ export class CurseAddonProvider implements AddonProvider { thumbnailUrl: this.getThumbnailUrl(result), summary: result.summary, screenshotUrls: this.getScreenshotUrls(result), + version: latestFile.displayName }; } diff --git a/wowup-electron/src/app/addon-providers/tukui-addon-provider.ts b/wowup-electron/src/app/addon-providers/tukui-addon-provider.ts index 085ad0af..4c615a2a 100644 --- a/wowup-electron/src/app/addon-providers/tukui-addon-provider.ts +++ b/wowup-electron/src/app/addon-providers/tukui-addon-provider.ts @@ -197,6 +197,7 @@ export class TukUiAddonProvider implements AddonProvider { providerName: this.name, thumbnailUrl: addon.screenshot_url, summary: addon.small_desc, + version: addon.version }; } diff --git a/wowup-electron/src/app/components/potential-addon-table-column/potential-addon-table-column.component.html b/wowup-electron/src/app/components/potential-addon-table-column/potential-addon-table-column.component.html index a021d3db..65e2351a 100644 --- a/wowup-electron/src/app/components/potential-addon-table-column/potential-addon-table-column.component.html +++ b/wowup-electron/src/app/components/potential-addon-table-column/potential-addon-table-column.component.html @@ -3,6 +3,6 @@
{{addon.name}} -
{{addon.downloadCount | downloadCount}} downloads
+
{{addon?.version}}
diff --git a/wowup-electron/src/app/models/wowup/potential-addon.ts b/wowup-electron/src/app/models/wowup/potential-addon.ts index fa4f67a6..a2bea729 100644 --- a/wowup-electron/src/app/models/wowup/potential-addon.ts +++ b/wowup-electron/src/app/models/wowup/potential-addon.ts @@ -9,4 +9,5 @@ export interface PotentialAddon { downloadCount: number; summary?: string; screenshotUrls?: string[]; + version?: string; } diff --git a/wowup-electron/src/app/pages/get-addons/get-addons.component.html b/wowup-electron/src/app/pages/get-addons/get-addons.component.html index a0722be0..b586081f 100644 --- a/wowup-electron/src/app/pages/get-addons/get-addons.component.html +++ b/wowup-electron/src/app/pages/get-addons/get-addons.component.html @@ -36,7 +36,8 @@
- +
+ + + + diff --git a/wowup-electron/src/app/pages/get-addons/get-addons.component.ts b/wowup-electron/src/app/pages/get-addons/get-addons.component.ts index 2f4def4e..ca2e753d 100644 --- a/wowup-electron/src/app/pages/get-addons/get-addons.component.ts +++ b/wowup-electron/src/app/pages/get-addons/get-addons.component.ts @@ -37,8 +37,9 @@ export class GetAddonsComponent implements OnInit, OnDestroy { columns: ColumnState[] = [ { name: "name", display: "Addon", visible: true }, + { name: "downloadCount", display: "Downloads", visible: true }, { name: "author", display: "Author", visible: true }, - { name: "provider", display: "Provider", visible: true }, + { name: "providerName", display: "Provider", visible: true }, { name: "status", display: "Status", visible: true }, ]; diff --git a/wowup-electron/src/app/services/addons/addon.provider.factory.ts b/wowup-electron/src/app/services/addons/addon.provider.factory.ts index 55d5cbf7..f1bc2f49 100644 --- a/wowup-electron/src/app/services/addons/addon.provider.factory.ts +++ b/wowup-electron/src/app/services/addons/addon.provider.factory.ts @@ -11,6 +11,7 @@ import { CachingService } from "../caching/caching-service"; import { ElectronService } from "../electron/electron.service"; import { FileService } from "../files/file.service"; import { SessionService } from "../session/session.service"; +import { WowUpService } from "../wowup/wowup.service"; @Injectable({ providedIn: "root", @@ -21,7 +22,8 @@ export class AddonProviderFactory { private _electronService: ElectronService, private _httpClient: HttpClient, private _sessionService: SessionService, - private _fileService: FileService + private _fileService: FileService, + private _wowUpService: WowUpService, ) {} public getAddonProvider(providerType: T & AddonProvider) { @@ -39,7 +41,8 @@ export class AddonProviderFactory { return new CurseAddonProvider( this._httpClient, this._cachingService, - this._electronService + this._electronService, + this._wowUpService ); } diff --git a/wowup-electron/src/assets/i18n/de.json b/wowup-electron/src/assets/i18n/de.json index fb48d421..df02b4b3 100644 --- a/wowup-electron/src/assets/i18n/de.json +++ b/wowup-electron/src/assets/i18n/de.json @@ -14,7 +14,8 @@ "ADDON_COLUMN_HEADER": "Addon", "AUTHOR_COLUMN_HEADER": "Autor", "PROVIDER_COLUMN_HEADER": "Anbieter", - "STATUS_COLUMN_HEADER": "Status" + "STATUS_COLUMN_HEADER": "Status", + "DOWNLOAD_COUNT_COLUMN_HEADER": "TEXT_ELEMENT" } }, "HOME": { diff --git a/wowup-electron/src/assets/i18n/en.json b/wowup-electron/src/assets/i18n/en.json index 685d8b46..27aa0426 100644 --- a/wowup-electron/src/assets/i18n/en.json +++ b/wowup-electron/src/assets/i18n/en.json @@ -14,7 +14,8 @@ "ADDON_COLUMN_HEADER": "Addon", "AUTHOR_COLUMN_HEADER": "Author", "PROVIDER_COLUMN_HEADER": "Provider", - "STATUS_COLUMN_HEADER": "Status" + "STATUS_COLUMN_HEADER": "Status", + "DOWNLOAD_COUNT_COLUMN_HEADER": "Downloads" } }, "HOME": { diff --git a/wowup-electron/src/assets/i18n/es.json b/wowup-electron/src/assets/i18n/es.json index 47f03cfc..63e1adb5 100644 --- a/wowup-electron/src/assets/i18n/es.json +++ b/wowup-electron/src/assets/i18n/es.json @@ -14,7 +14,8 @@ "ADDON_COLUMN_HEADER": "Addon", "AUTHOR_COLUMN_HEADER": "Autor", "PROVIDER_COLUMN_HEADER": "Proveedor", - "STATUS_COLUMN_HEADER": "Estado" + "STATUS_COLUMN_HEADER": "Estado", + "DOWNLOAD_COUNT_COLUMN_HEADER": "TEXT_ELEMENT" } }, "HOME": { diff --git a/wowup-electron/src/assets/i18n/fr.json b/wowup-electron/src/assets/i18n/fr.json index 6c4b0a94..b7cf05f9 100644 --- a/wowup-electron/src/assets/i18n/fr.json +++ b/wowup-electron/src/assets/i18n/fr.json @@ -14,7 +14,8 @@ "ADDON_COLUMN_HEADER": "Addon", "AUTHOR_COLUMN_HEADER": "Auteur", "PROVIDER_COLUMN_HEADER": "Fournisseur", - "STATUS_COLUMN_HEADER": "Statut" + "STATUS_COLUMN_HEADER": "Statut", + "DOWNLOAD_COUNT_COLUMN_HEADER": "TEXT_ELEMENT" } }, "HOME": { diff --git a/wowup-electron/src/assets/i18n/it.json b/wowup-electron/src/assets/i18n/it.json index c525f452..412001f2 100644 --- a/wowup-electron/src/assets/i18n/it.json +++ b/wowup-electron/src/assets/i18n/it.json @@ -14,7 +14,8 @@ "ADDON_COLUMN_HEADER": "Addon", "AUTHOR_COLUMN_HEADER": "Autore", "PROVIDER_COLUMN_HEADER": "Provveditore", - "STATUS_COLUMN_HEADER": "Stato" + "STATUS_COLUMN_HEADER": "Stato", + "DOWNLOAD_COUNT_COLUMN_HEADER": "TEXT_ELEMENT" } }, "HOME": { diff --git a/wowup-electron/src/assets/i18n/pt.json b/wowup-electron/src/assets/i18n/pt.json index ef0a484c..af1df0c8 100644 --- a/wowup-electron/src/assets/i18n/pt.json +++ b/wowup-electron/src/assets/i18n/pt.json @@ -1,124 +1,125 @@ { - "PAGES": { - "ABOUT": { - "CHANGE_LOG_SECTION_LABEL": "Registro de Alterações", - "TITLE": "WowUp.io", - "WEBSITE_LINK_LABEL": "Conheça o nosso site!" - }, - "GET_ADDONS": { - "CLIENT_TYPE_SELECT_LABEL": "World of Warcraft", - "REFRESH_BUTTON": "Atualizar", - "INSTALL_FROM_URL_BUTTON": "Instalar pela URL", - "SEARCH_LABEL": "Procurar", - "TABLE": { - "ADDON_COLUMN_HEADER": "Addon", - "AUTHOR_COLUMN_HEADER": "Autor", - "PROVIDER_COLUMN_HEADER": "Provedor", - "STATUS_COLUMN_HEADER": "Estado" - } - }, - "HOME": { - "TITLE": "App funciona!", - "GO_TO_DETAIL": "Ir para Detalhes", - "MY_ADDONS_TAB_TITLE": "Meus Addons", - "GET_ADDONS_TAB_TITLE": "Obtenha Addons", - "ABOUT_TAB_TITLE": "Sobre", - "OPTIONS_TAB_TITLE": "Opções" - }, - "MY_ADDONS": { - "CHECK_UPDATES_BUTTON": "Verificar Atualizações", - "CHECK_UPDATES_BUTTON_TOOLTIP": "Verificar atualizações recentes", - "CLIENT_TYPE_SELECT_LABEL": "World of Warcraft", - "RESCAN_FOLDERS_BUTTON": "Re-escanear pastas", - "RESCAN_FOLDERS_BUTTON_TOOLTIP": "Procura por Addons instalados", - "UPDATE_ALL_BUTTON": "Actualizar todos", - "UPDATE_ALL_BUTTON_TOOLTIP": "Atualizar todos os Addons", - "TABLE": { - "ADDON_COLUMN_HEADER": "Addon", - "ADDON_INSTALL_BUTTON": "Instalar", - "ADDON_UPDATE_BUTTON": "Atualizar", - "AUTHOR_COLUMN_HEADER": "Autor", - "AUTO_UPDATE_ICON_TOOLTIP": "Atualização automática habilitada", - "GAME_VERSION_COLUMN_HEADER": "Versão do Jogo", - "LATEST_VERSION_COLUMN_HEADER": "Ultima versão", - "PROVIDER_COLUMN_HEADER": "Provedor", - "STATUS_COLUMN_HEADER": "Estado" - }, - "ADDON_CONTEXT_MENU": { - "IGNORE_ADDON_BUTTON": "Ignorar", - "AUTO_UPDATE_ADDON_BUTTON": "Atualização Automática", - "CHANNEL_SUBMENT_TITLE": "Canal", - "SHOW_FOLDER": "SHOW_FOLDER", - "REINSTALL_ADDON_BUTTON": "Reinstalar", - "REMOVE_ADDON_BUTTON": "Remover", - "STABLE_ADDON_CHANNEL": "Estável", - "BETA_ADDON_CHANNEL": "Beta", - "ALPHA_ADDON_CHANNEL": "Alfa" - }, - "COLUMNS_CONTEXT_MENU": { - "TITLE": "Exibir Colunas" - }, - "UPDATE_ALL_CONTEXT_MENU": { - "UPDATE_RETAIL_CLASSIC_BUTTON": "Atualizar Retail/Clássico", - "UPDATE_ALL_CLIENTS_BUTTON": "Atualizar todos os clientes" - } - }, - "OPTIONS": { - "APPLICATION": { - "MINIMIZE_ON_CLOSE_LABEL": "Minimizar ao Fechar", - "MINIMIZE_ON_CLOSE_DESCRIPTION": "Ao fechar a janela do WowUp, minimize para a bandeja do sistema.", - "TELEMETRY_DESCRIPTION": "Ajude a melhorar o WowUp enviando dados e/ou erros de instalação anônimamente.", - "TELEMETRY_LABEL": "Telemetria", - "TITLE": "Aplicativo" - }, - "DEBUG": { - "DEBUG_DATA_BUTTON": "Esvaziar log de depuração de dados", - "DEBUG_DATA_DESCRIPTION": "Registra os dados de depuração e ajuda a diagnosticar problemas potenciais. Apenas por o curiosidade, isso pode ser encontrado em seu último arquivo de registro.", - "DEBUG_DATA_LABEL": "Depurar Dados", - "LOG_FILES_BUTTON": "Mostrar Arquivos de Registro", - "LOG_FILES_DESCRIPTION": "Abre a pasta que contém seus últimos arquivos de registro.", - "LOG_FILES_LABEL": "Arquivos de Registro", - "TITLE": "Depurar" - }, - "WOW": { - "AUTO_UPDATE_DESCRIPTION": "Addons recém-instalados serão definidos para atualizar automáticamente por padrão", - "AUTO_UPDATE_LABEL": "Atualização Automática", - "TITLE": "World of Warcraft", - "DEFAULT_ADDON_CHANNEL_LABEL": "Canal de Addon Padrão", - "DEFAULT_ADDON_CHANNEL_SELECT_LABEL": "Canal de Addon", - "RESCAN_CLIENTS_BUTTON": "Re-escanear", - "RESCAN_CLIENTS_LABEL": "Reescanear World of Warcraft instalados" - } + "PAGES": { + "ABOUT": { + "CHANGE_LOG_SECTION_LABEL": "Registro de Alterações", + "TITLE": "WowUp.io", + "WEBSITE_LINK_LABEL": "Conheça o nosso site!" + }, + "GET_ADDONS": { + "CLIENT_TYPE_SELECT_LABEL": "World of Warcraft", + "REFRESH_BUTTON": "Atualizar", + "INSTALL_FROM_URL_BUTTON": "Instalar pela URL", + "SEARCH_LABEL": "Procurar", + "TABLE": { + "ADDON_COLUMN_HEADER": "Addon", + "AUTHOR_COLUMN_HEADER": "Autor", + "PROVIDER_COLUMN_HEADER": "Provedor", + "STATUS_COLUMN_HEADER": "Estado", + "DOWNLOAD_COUNT_COLUMN_HEADER": "TEXT_ELEMENT" } }, - "DIALOGS": { - "ADDON_DETAILS": { - "VIEW_IN_BROWSER_BUTTON": "Visualizar no navegador" + "HOME": { + "TITLE": "App funciona!", + "GO_TO_DETAIL": "Ir para Detalhes", + "MY_ADDONS_TAB_TITLE": "Meus Addons", + "GET_ADDONS_TAB_TITLE": "Obtenha Addons", + "ABOUT_TAB_TITLE": "Sobre", + "OPTIONS_TAB_TITLE": "Opções" + }, + "MY_ADDONS": { + "CHECK_UPDATES_BUTTON": "Verificar Atualizações", + "CHECK_UPDATES_BUTTON_TOOLTIP": "Verificar atualizações recentes", + "CLIENT_TYPE_SELECT_LABEL": "World of Warcraft", + "RESCAN_FOLDERS_BUTTON": "Re-escanear pastas", + "RESCAN_FOLDERS_BUTTON_TOOLTIP": "Procura por Addons instalados", + "UPDATE_ALL_BUTTON": "Actualizar todos", + "UPDATE_ALL_BUTTON_TOOLTIP": "Atualizar todos os Addons", + "TABLE": { + "ADDON_COLUMN_HEADER": "Addon", + "ADDON_INSTALL_BUTTON": "Instalar", + "ADDON_UPDATE_BUTTON": "Atualizar", + "AUTHOR_COLUMN_HEADER": "Autor", + "AUTO_UPDATE_ICON_TOOLTIP": "Atualização automática habilitada", + "GAME_VERSION_COLUMN_HEADER": "Versão do Jogo", + "LATEST_VERSION_COLUMN_HEADER": "Ultima versão", + "PROVIDER_COLUMN_HEADER": "Provedor", + "STATUS_COLUMN_HEADER": "Estado" }, - "ALERT": { - "POSITIVE_BUTTON": "Ok" + "ADDON_CONTEXT_MENU": { + "IGNORE_ADDON_BUTTON": "Ignorar", + "AUTO_UPDATE_ADDON_BUTTON": "Atualização Automática", + "CHANNEL_SUBMENT_TITLE": "Canal", + "SHOW_FOLDER": "SHOW_FOLDER", + "REINSTALL_ADDON_BUTTON": "Reinstalar", + "REMOVE_ADDON_BUTTON": "Remover", + "STABLE_ADDON_CHANNEL": "Estável", + "BETA_ADDON_CHANNEL": "Beta", + "ALPHA_ADDON_CHANNEL": "Alfa" }, - "CONFIRM": { - "NEGATIVE_BUTTON": "Não", - "POSITIVE_BUTTON": "Sim" + "COLUMNS_CONTEXT_MENU": { + "TITLE": "Exibir Colunas" }, - "INSTALL_FROM_URL": { - "ADDON_URL_INPUT_LABEL": "Addon URL", - "ADDON_URL_INPUT_PLACEHOLDER": "Ex. GitHub ou WowInterface URL", - "CLOSE_BUTTON": "Fechar", - "IMPORT_BUTTON": "Importar", - "INSTALL_BUTTON": "Instalar", - "INSTALL_SUCCESS_LABEL": "Instalado!", - "TITLE": "Instalar Addon pela URL", - "DESCRIPTION": "Se você deseja instalar um addon diretamente de uma URL, cole-a abaixo para iniciar.", - "SUPPORTED_SOURCES": "Suporta WowInterface e GitHub*" + "UPDATE_ALL_CONTEXT_MENU": { + "UPDATE_RETAIL_CLASSIC_BUTTON": "Atualizar Retail/Clássico", + "UPDATE_ALL_CLIENTS_BUTTON": "Atualizar todos os clientes" + } + }, + "OPTIONS": { + "APPLICATION": { + "MINIMIZE_ON_CLOSE_LABEL": "Minimizar ao Fechar", + "MINIMIZE_ON_CLOSE_DESCRIPTION": "Ao fechar a janela do WowUp, minimize para a bandeja do sistema.", + "TELEMETRY_DESCRIPTION": "Ajude a melhorar o WowUp enviando dados e/ou erros de instalação anônimamente.", + "TELEMETRY_LABEL": "Telemetria", + "TITLE": "Aplicativo" }, - "TELEMETRY": { - "DESCRIPTION": "Ajude-nos a melhorar o WowUp enviando dados e/ou erros de instalação do aplicativo anônimamente?", - "NEGATIVE_BUTTON": "Não obrigado", - "POSITIVE_BUTTON": "Claro!", - "TITLE": "Telemetria do WowUp" + "DEBUG": { + "DEBUG_DATA_BUTTON": "Esvaziar log de depuração de dados", + "DEBUG_DATA_DESCRIPTION": "Registra os dados de depuração e ajuda a diagnosticar problemas potenciais. Apenas por o curiosidade, isso pode ser encontrado em seu último arquivo de registro.", + "DEBUG_DATA_LABEL": "Depurar Dados", + "LOG_FILES_BUTTON": "Mostrar Arquivos de Registro", + "LOG_FILES_DESCRIPTION": "Abre a pasta que contém seus últimos arquivos de registro.", + "LOG_FILES_LABEL": "Arquivos de Registro", + "TITLE": "Depurar" + }, + "WOW": { + "AUTO_UPDATE_DESCRIPTION": "Addons recém-instalados serão definidos para atualizar automáticamente por padrão", + "AUTO_UPDATE_LABEL": "Atualização Automática", + "TITLE": "World of Warcraft", + "DEFAULT_ADDON_CHANNEL_LABEL": "Canal de Addon Padrão", + "DEFAULT_ADDON_CHANNEL_SELECT_LABEL": "Canal de Addon", + "RESCAN_CLIENTS_BUTTON": "Re-escanear", + "RESCAN_CLIENTS_LABEL": "Reescanear World of Warcraft instalados" } } + }, + "DIALOGS": { + "ADDON_DETAILS": { + "VIEW_IN_BROWSER_BUTTON": "Visualizar no navegador" + }, + "ALERT": { + "POSITIVE_BUTTON": "Ok" + }, + "CONFIRM": { + "NEGATIVE_BUTTON": "Não", + "POSITIVE_BUTTON": "Sim" + }, + "INSTALL_FROM_URL": { + "ADDON_URL_INPUT_LABEL": "Addon URL", + "ADDON_URL_INPUT_PLACEHOLDER": "Ex. GitHub ou WowInterface URL", + "CLOSE_BUTTON": "Fechar", + "IMPORT_BUTTON": "Importar", + "INSTALL_BUTTON": "Instalar", + "INSTALL_SUCCESS_LABEL": "Instalado!", + "TITLE": "Instalar Addon pela URL", + "DESCRIPTION": "Se você deseja instalar um addon diretamente de uma URL, cole-a abaixo para iniciar.", + "SUPPORTED_SOURCES": "Suporta WowInterface e GitHub*" + }, + "TELEMETRY": { + "DESCRIPTION": "Ajude-nos a melhorar o WowUp enviando dados e/ou erros de instalação do aplicativo anônimamente?", + "NEGATIVE_BUTTON": "Não obrigado", + "POSITIVE_BUTTON": "Claro!", + "TITLE": "Telemetria do WowUp" + } } +} \ No newline at end of file diff --git a/wowup-electron/src/assets/i18n/ru.json b/wowup-electron/src/assets/i18n/ru.json index c12cce69..61963814 100644 --- a/wowup-electron/src/assets/i18n/ru.json +++ b/wowup-electron/src/assets/i18n/ru.json @@ -14,7 +14,8 @@ "ADDON_COLUMN_HEADER": "Модификация", "AUTHOR_COLUMN_HEADER": "Автор", "PROVIDER_COLUMN_HEADER": "Источник", - "STATUS_COLUMN_HEADER": "Статус" + "STATUS_COLUMN_HEADER": "Статус", + "DOWNLOAD_COUNT_COLUMN_HEADER": "TEXT_ELEMENT" } }, "HOME": { diff --git a/wowup-electron/src/assets/i18n/zh.json b/wowup-electron/src/assets/i18n/zh.json index 55d11d02..b7b55d5d 100644 --- a/wowup-electron/src/assets/i18n/zh.json +++ b/wowup-electron/src/assets/i18n/zh.json @@ -14,7 +14,8 @@ "ADDON_COLUMN_HEADER": "Addon", "AUTHOR_COLUMN_HEADER": "作者", "PROVIDER_COLUMN_HEADER": "提供商", - "STATUS_COLUMN_HEADER": "状态" + "STATUS_COLUMN_HEADER": "状态", + "DOWNLOAD_COUNT_COLUMN_HEADER": "TEXT_ELEMENT" } }, "HOME": { From e9c0031d3323a298b9347ad317191256db30dcc0 Mon Sep 17 00:00:00 2001 From: jliddev Date: Fri, 16 Oct 2020 16:44:43 -0500 Subject: [PATCH 2/4] Text color ;) --- .../potential-addon-table-column.component.html | 2 +- .../potential-addon-table-column.component.scss | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/wowup-electron/src/app/components/potential-addon-table-column/potential-addon-table-column.component.html b/wowup-electron/src/app/components/potential-addon-table-column/potential-addon-table-column.component.html index 65e2351a..f12920d0 100644 --- a/wowup-electron/src/app/components/potential-addon-table-column/potential-addon-table-column.component.html +++ b/wowup-electron/src/app/components/potential-addon-table-column/potential-addon-table-column.component.html @@ -3,6 +3,6 @@
{{addon.name}} -
{{addon?.version}}
+
{{addon?.version}}
diff --git a/wowup-electron/src/app/components/potential-addon-table-column/potential-addon-table-column.component.scss b/wowup-electron/src/app/components/potential-addon-table-column/potential-addon-table-column.component.scss index e8e1d927..b8eed7c9 100644 --- a/wowup-electron/src/app/components/potential-addon-table-column/potential-addon-table-column.component.scss +++ b/wowup-electron/src/app/components/potential-addon-table-column/potential-addon-table-column.component.scss @@ -33,4 +33,8 @@ color: $white-2; } } + + .addon-version { + color: $white-2; + } } From 6e408fc014d3b743185ba1a534c8055f7582b231 Mon Sep 17 00:00:00 2001 From: Dean Campbell Date: Fri, 16 Oct 2020 16:02:28 -0700 Subject: [PATCH 3/4] Remove addon provider dependency on wowup service --- .../src/app/addon-providers/addon-provider.ts | 4 ++-- .../addon-providers/curse-addon-provider.ts | 18 ++++++++++-------- .../pages/get-addons/get-addons.component.ts | 7 +++++-- .../services/addons/addon.provider.factory.ts | 7 ++----- .../src/app/services/addons/addon.service.ts | 10 ++++++---- 5 files changed, 25 insertions(+), 21 deletions(-) diff --git a/wowup-electron/src/app/addon-providers/addon-provider.ts b/wowup-electron/src/app/addon-providers/addon-provider.ts index da3d649f..dbd962d0 100644 --- a/wowup-electron/src/app/addon-providers/addon-provider.ts +++ b/wowup-electron/src/app/addon-providers/addon-provider.ts @@ -12,9 +12,9 @@ export interface AddonProvider { getAll(clientType: WowClientType, addonIds: string[]): Promise; - getFeaturedAddons(clientType: WowClientType): Observable; + getFeaturedAddons(clientType: WowClientType, channelType?: AddonChannelType): Observable; - searchByQuery(query: string, clientType: WowClientType): Promise; + searchByQuery(query: string, clientType: WowClientType, channelType?: AddonChannelType): Promise; searchByUrl(addonUri: URL, clientType: WowClientType): Promise; diff --git a/wowup-electron/src/app/addon-providers/curse-addon-provider.ts b/wowup-electron/src/app/addon-providers/curse-addon-provider.ts index d2234c32..37cd5506 100644 --- a/wowup-electron/src/app/addon-providers/curse-addon-provider.ts +++ b/wowup-electron/src/app/addon-providers/curse-addon-provider.ts @@ -46,8 +46,7 @@ export class CurseAddonProvider implements AddonProvider { constructor( private _httpClient: HttpClient, private _cachingService: CachingService, - private _electronService: ElectronService, - private _wowUpService: WowUpService, + private _electronService: ElectronService ) { this._circuitBreaker = new CircuitBreaker( (action) => this.sendRequest(action), @@ -272,13 +271,14 @@ export class CurseAddonProvider implements AddonProvider { return addonResults; } - getFeaturedAddons(clientType: WowClientType): Observable { + getFeaturedAddons(clientType: WowClientType, channelType?: AddonChannelType): Observable { + channelType = typeof channelType === 'undefined' ? AddonChannelType.Stable : channelType; return from(this.getFeaturedAddonList()).pipe( map((addons) => { return this.filterFeaturedAddons(addons, clientType); }), map((filteredAddons) => { - return filteredAddons.map((addon) => this.getPotentialAddon(addon, clientType)); + return filteredAddons.map((addon) => this.getPotentialAddon(addon, clientType, channelType)); }) ); } @@ -304,8 +304,10 @@ export class CurseAddonProvider implements AddonProvider { async searchByQuery( query: string, - clientType: WowClientType + clientType: WowClientType, + channelType?: AddonChannelType ): Promise { + channelType = typeof channelType === 'undefined' ? AddonChannelType.Stable : channelType; var searchResults: PotentialAddon[] = []; var response = await this.getSearchResults(query); @@ -315,7 +317,7 @@ export class CurseAddonProvider implements AddonProvider { continue; } - searchResults.push(this.getPotentialAddon(result, clientType)); + searchResults.push(this.getPotentialAddon(result, clientType, channelType)); } return searchResults; @@ -389,12 +391,12 @@ export class CurseAddonProvider implements AddonProvider { throw new Error("Method not implemented."); } - private getPotentialAddon(result: CurseSearchResult, clientType: WowClientType): PotentialAddon { + private getPotentialAddon(result: CurseSearchResult, clientType: WowClientType, channelType: AddonChannelType): PotentialAddon { const clientTypeStr = this.getGameVersionFlavor(clientType); let latestFile = _.orderBy(result.latestFiles, 'id', 'desc') .find(file => file.gameVersionFlavor === clientTypeStr && - this.getChannelType(file.releaseType) === this._wowUpService.getDefaultAddonChannel(clientType) + this.getChannelType(file.releaseType) === channelType ); if (!latestFile) { latestFile = _.first(result.latestFiles); diff --git a/wowup-electron/src/app/pages/get-addons/get-addons.component.ts b/wowup-electron/src/app/pages/get-addons/get-addons.component.ts index ca2e753d..c6556834 100644 --- a/wowup-electron/src/app/pages/get-addons/get-addons.component.ts +++ b/wowup-electron/src/app/pages/get-addons/get-addons.component.ts @@ -15,6 +15,7 @@ import { map } from "rxjs/operators"; import { MatTableDataSource } from "@angular/material/table"; import { MatSort } from "@angular/material/sort"; import * as _ from "lodash"; +import { WowUpService } from "app/services/wowup/wowup.service"; @Component({ selector: "app-get-addons", @@ -55,6 +56,7 @@ export class GetAddonsComponent implements OnInit, OnDestroy { private _addonService: AddonService, private _sessionService: SessionService, private _dialog: MatDialog, + private _wowUpService: WowUpService, public electronService: ElectronService, public warcraftService: WarcraftService ) { @@ -134,7 +136,8 @@ export class GetAddonsComponent implements OnInit, OnDestroy { let searchResults = await this._addonService.search( this.query, - this.selectedClient + this.selectedClient, + this._wowUpService.getDefaultAddonChannel(this.selectedClient) ); searchResults = this.filterInstalledAddons(searchResults); @@ -159,7 +162,7 @@ export class GetAddonsComponent implements OnInit, OnDestroy { this.isBusy = true; - this._addonService.getFeaturedAddons(clientType).subscribe({ + this._addonService.getFeaturedAddons(clientType, this._wowUpService.getDefaultAddonChannel(clientType)).subscribe({ next: (addons) => { addons = this.filterInstalledAddons(addons); this.formatAddons(addons); diff --git a/wowup-electron/src/app/services/addons/addon.provider.factory.ts b/wowup-electron/src/app/services/addons/addon.provider.factory.ts index f1bc2f49..55d5cbf7 100644 --- a/wowup-electron/src/app/services/addons/addon.provider.factory.ts +++ b/wowup-electron/src/app/services/addons/addon.provider.factory.ts @@ -11,7 +11,6 @@ import { CachingService } from "../caching/caching-service"; import { ElectronService } from "../electron/electron.service"; import { FileService } from "../files/file.service"; import { SessionService } from "../session/session.service"; -import { WowUpService } from "../wowup/wowup.service"; @Injectable({ providedIn: "root", @@ -22,8 +21,7 @@ export class AddonProviderFactory { private _electronService: ElectronService, private _httpClient: HttpClient, private _sessionService: SessionService, - private _fileService: FileService, - private _wowUpService: WowUpService, + private _fileService: FileService ) {} public getAddonProvider(providerType: T & AddonProvider) { @@ -41,8 +39,7 @@ export class AddonProviderFactory { return new CurseAddonProvider( this._httpClient, this._cachingService, - this._electronService, - this._wowUpService + this._electronService ); } diff --git a/wowup-electron/src/app/services/addons/addon.service.ts b/wowup-electron/src/app/services/addons/addon.service.ts index 294e685f..158aa00e 100644 --- a/wowup-electron/src/app/services/addons/addon.service.ts +++ b/wowup-electron/src/app/services/addons/addon.service.ts @@ -58,10 +58,11 @@ export class AddonService { public async search( query: string, - clientType: WowClientType + clientType: WowClientType, + channelType: AddonChannelType ): Promise { var searchTasks = this._addonProviders.map((p) => - p.searchByQuery(query, clientType) + p.searchByQuery(query, clientType, channelType) ); var searchResults = await Promise.all(searchTasks); @@ -528,10 +529,11 @@ export class AddonService { } public getFeaturedAddons( - clientType: WowClientType + clientType: WowClientType, + channelType: AddonChannelType, ): Observable { return forkJoin( - this._addonProviders.map((p) => p.getFeaturedAddons(clientType)) + this._addonProviders.map((p) => p.getFeaturedAddons(clientType, channelType)) ).pipe( map((results) => { return _.orderBy(results.flat(1), ["downloadCount"]).reverse(); From bec3bbca4b6b399eb43a3d745b4586de0157ef9e Mon Sep 17 00:00:00 2001 From: Dean Campbell Date: Fri, 16 Oct 2020 23:23:49 -0700 Subject: [PATCH 4/4] Refresh get addons on channel type change --- .../addon-providers/curse-addon-provider.ts | 1 - .../pages/get-addons/get-addons.component.ts | 21 ++++++++++++++++--- .../src/app/services/wowup/wowup.service.ts | 1 + 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/wowup-electron/src/app/addon-providers/curse-addon-provider.ts b/wowup-electron/src/app/addon-providers/curse-addon-provider.ts index bff7c9b8..87e9686f 100644 --- a/wowup-electron/src/app/addon-providers/curse-addon-provider.ts +++ b/wowup-electron/src/app/addon-providers/curse-addon-provider.ts @@ -24,7 +24,6 @@ import { CurseFile } from "common/curse/curse-file"; import { CurseReleaseType } from "common/curse/curse-release-type"; import { CurseGetFeaturedResponse } from "app/models/curse/curse-get-featured-response"; import * as CircuitBreaker from "opossum"; -import { WowUpService } from "app/services/wowup/wowup.service"; const API_URL = "https://addons-ecs.forgesvc.net/api/v2"; const HUB_API_URL = "https://hub.dev.wowup.io"; diff --git a/wowup-electron/src/app/pages/get-addons/get-addons.component.ts b/wowup-electron/src/app/pages/get-addons/get-addons.component.ts index c6556834..08959037 100644 --- a/wowup-electron/src/app/pages/get-addons/get-addons.component.ts +++ b/wowup-electron/src/app/pages/get-addons/get-addons.component.ts @@ -11,11 +11,14 @@ import { AddonService } from "app/services/addons/addon.service"; import { SessionService } from "app/services/session/session.service"; import { WarcraftService } from "app/services/warcraft/warcraft.service"; import { BehaviorSubject, Subject, Subscription } from "rxjs"; -import { map } from "rxjs/operators"; +import { filter, map } from "rxjs/operators"; import { MatTableDataSource } from "@angular/material/table"; import { MatSort } from "@angular/material/sort"; import * as _ from "lodash"; import { WowUpService } from "app/services/wowup/wowup.service"; +import { defaultChannelKeySuffix } from "../../../constants"; +import { getEnumName } from "app/utils/enum.utils"; +import { AddonChannelType } from "app/models/wowup/addon-channel-type"; @Component({ selector: "app-get-addons", @@ -33,6 +36,8 @@ export class GetAddonsComponent implements OnInit, OnDestroy { private readonly _destroyed$ = new Subject(); private subscriptions: Subscription[] = []; private isSelectedTab: boolean = false; + private channelType: AddonChannelType = AddonChannelType.Stable; + private channelTypeKey: string = ''; public dataSource = new MatTableDataSource([]); @@ -73,6 +78,8 @@ export class GetAddonsComponent implements OnInit, OnDestroy { .pipe( map((clientType) => { this.selectedClient = clientType; + this.channelType = this._wowUpService.getDefaultAddonChannel(this.selectedClient); + this.channelTypeKey = `${getEnumName(WowClientType, this.selectedClient)}${defaultChannelKeySuffix}`.toLowerCase(); this.loadPopularAddons(this.selectedClient); }) ) @@ -94,10 +101,18 @@ export class GetAddonsComponent implements OnInit, OnDestroy { } ); + const channelTypeSubscription = this._wowUpService.preferenceChange$ + .pipe(filter(change => change.key === this.channelTypeKey)) + .subscribe(change => { + this.channelType = parseInt(change.value, 10) as AddonChannelType; + this.onSearch(); + }); + this.subscriptions = [ selectedClientSubscription, addonRemovedSubscription, displayAddonSubscription, + channelTypeSubscription ]; } @@ -137,7 +152,7 @@ export class GetAddonsComponent implements OnInit, OnDestroy { let searchResults = await this._addonService.search( this.query, this.selectedClient, - this._wowUpService.getDefaultAddonChannel(this.selectedClient) + this.channelType ); searchResults = this.filterInstalledAddons(searchResults); @@ -162,7 +177,7 @@ export class GetAddonsComponent implements OnInit, OnDestroy { this.isBusy = true; - this._addonService.getFeaturedAddons(clientType, this._wowUpService.getDefaultAddonChannel(clientType)).subscribe({ + this._addonService.getFeaturedAddons(clientType, this.channelType).subscribe({ next: (addons) => { addons = this.filterInstalledAddons(addons); this.formatAddons(addons); diff --git a/wowup-electron/src/app/services/wowup/wowup.service.ts b/wowup-electron/src/app/services/wowup/wowup.service.ts index 02092ba9..5072b653 100644 --- a/wowup-electron/src/app/services/wowup/wowup.service.ts +++ b/wowup-electron/src/app/services/wowup/wowup.service.ts @@ -116,6 +116,7 @@ export class WowUpService { public setDefaultAddonChannel(clientType: WowClientType, channelType: AddonChannelType) { const key = this.getClientDefaultAddonChannelKey(clientType); this._preferenceStorageService.set(key, channelType); + this._preferenceChangeSrc.next({ key, value: channelType.toString() }) } public getDefaultAutoUpdate(clientType: WowClientType): boolean {
{{'PAGES.GET_ADDONS.TABLE.ADDON_COLUMN_HEADER' | translate}} @@ -47,7 +48,16 @@ - + + + {{'PAGES.GET_ADDONS.TABLE.DOWNLOAD_COUNT_COLUMN_HEADER' | translate}} + + {{element.downloadCount | downloadCount}} + {{'PAGES.GET_ADDONS.TABLE.PROVIDER_COLUMN_HEADER' | translate}}