message: Number of missing dependencies are shown.
  Added a button to download dependencies one at a time.
  This is avoidable if downloaded using the "download with dependencies" button.
diff: <li>
  <a @click="view = 'installed'; searchFilter = ''" :class="[view === 'installed' ? 'is-active' : '']">Installed</a>
  <ul v-if="view === 'installed'">
  - <li><input v-model='searchFilter' class="input" type="text" placeholder="Search installed mods"/></li>
  + <li><input v-model='searchFilter' class="input" type="text" placeholder="Search mods"/></li>
  </ul>
  </li>
  <li>
  <a @click="view = 'online'; searchFilter = ''" :class="[view === 'online' ? 'is-active' : '']">Online</a>
  <ul v-if="view === 'online'">
  - <li><input v-model='searchFilter' class='input' type='text' placeholder='Search available mods'/></li>
  + <li><input v-model='searchFilter' class='input' type='text' placeholder='Search mods'/></li>
  </ul>
  </li>
  </ul>
  <span class='card-header-icon has-tooltip-left' data-tooltip='An update is available' v-if="!isLatest(key)">
  <i class='fas fa-cloud-upload-alt'></i>
  </span>
  + <span class='card-header-icon has-tooltip-left' :data-tooltip="`Missing ${getMissingDependencies(key).length} dependencies`" v-if="getMissingDependencies(key).length > 0">
  + <i class='fas fa-exclamation-circle'></i>
  + </span>
  </template>
  <a class='card-footer-item' @click="uninstallMod(key)">Uninstall</a>
  <template>
  <a class='card-footer-item' @click="enableMod(key)" v-else>Enable</a>
  </template>
  <a class='card-footer-item' v-if="!isLatest(key)" @click="updateMod(key)">Update</a>
  + <a class='card-footer-item' v-if="getMissingDependencies(key).length > 0" @click="downloadDependency(getMissingDependencies(key)[0])">Download Dependency</a>
  </expandable-card>
  </div>
  </template>
  @@ -195,6 +199,7 @@ import ModLinker from '../r2mm/manager/ModLinker';
  import ModBridge from '../r2mm/mods/ModBridge';
  import * as fs from 'fs-extra';
  +import { isUndefined } from 'util';
  const settings = new ManagerSettings();
  settings.load();
  @@ -499,6 +504,29 @@ export default class Manager extends Vue {
  }
  }
  + getMissingDependencies(vueMod: any): string[] {
  + const mod: Mod = new Mod().fromReactive(vueMod);
  + return mod.getDependencies().filter((dependency: string) => {
  + // Include in filter is mod isn't found.
  + return isUndefined(this.localModList.find((localMod: Mod) => dependency.toLowerCase().startsWith(localMod.getFullName().toLowerCase())))
  + });
  + }
  +
  + downloadDependency(missingDependency: string) {
  + const mod: ThunderstoreMod | undefined = this.thunderstoreModList.find((tsMod: ThunderstoreMod) => missingDependency.toLowerCase().startsWith(tsMod.getFullName().toLowerCase()));
  + if (isUndefined(mod)) {
  + return;
  + }
  + this.selectedThunderstoreMod = mod;
  + this.selectedVersion = mod.getVersions()[0].getVersionNumber().toString();
  + this.versionNumbers = mod.getVersions()
  + .map((version: ThunderstoreVersion) => version.getVersionNumber().toString());
  + const modal: Element | null = document.getElementById('downloadModal');
  + if (modal !== null) {
  + modal.className = 'modal is-active';
  + }
  + }
  +
  launchModded() {
  this.prepareLaunch();
  if (settings.riskOfRain2Directory !== null && fs.existsSync(settings.riskOfRain2Directory)) {
  