Merge pull request #14578 from nextcloud/enh/force_enable_apps
Force enable apps
This commit is contained in:
commit
03dc79f665
|
@ -90,7 +90,7 @@ class APIController extends OCSController {
|
|||
]);
|
||||
}
|
||||
|
||||
$this->appFetcher->setVersion($newVersion, 'future-apps.json');
|
||||
$this->appFetcher->setVersion($newVersion, 'future-apps.json', false);
|
||||
|
||||
// Apps available on the app store for that version
|
||||
$availableApps = array_map(function(array $app) {
|
||||
|
|
|
@ -45,8 +45,6 @@ class Admin implements ISettings {
|
|||
private $groupManager;
|
||||
/** @var IDateTimeFormatter */
|
||||
private $dateTimeFormatter;
|
||||
/** @var IUserSession */
|
||||
private $session;
|
||||
/** @var IFactory */
|
||||
private $l10nFactory;
|
||||
|
||||
|
@ -55,14 +53,12 @@ class Admin implements ISettings {
|
|||
UpdateChecker $updateChecker,
|
||||
IGroupManager $groupManager,
|
||||
IDateTimeFormatter $dateTimeFormatter,
|
||||
IUserSession $session,
|
||||
IFactory $l10nFactory
|
||||
) {
|
||||
$this->config = $config;
|
||||
$this->updateChecker = $updateChecker;
|
||||
$this->groupManager = $groupManager;
|
||||
$this->dateTimeFormatter = $dateTimeFormatter;
|
||||
$this->session = $session;
|
||||
$this->l10nFactory = $l10nFactory;
|
||||
}
|
||||
|
||||
|
|
|
@ -39,8 +39,6 @@ use OCP\Util;
|
|||
use Test\TestCase;
|
||||
|
||||
class AdminTest extends TestCase {
|
||||
/** @var IUserSession|\PHPUnit_Framework_MockObject_MockObject */
|
||||
protected $userSession;
|
||||
/** @var IFactory|\PHPUnit_Framework_MockObject_MockObject */
|
||||
protected $l10nFactory;
|
||||
/** @var Admin */
|
||||
|
@ -61,11 +59,10 @@ class AdminTest extends TestCase {
|
|||
$this->updateChecker = $this->createMock(UpdateChecker::class);
|
||||
$this->groupManager = $this->createMock(IGroupManager::class);
|
||||
$this->dateTimeFormatter = $this->createMock(IDateTimeFormatter::class);
|
||||
$this->userSession = $this->createMock(IUserSession::class);
|
||||
$this->l10nFactory = $this->createMock(IFactory::class);
|
||||
|
||||
$this->admin = new Admin(
|
||||
$this->config, $this->updateChecker, $this->groupManager, $this->dateTimeFormatter, $this->userSession, $this->l10nFactory
|
||||
$this->config, $this->updateChecker, $this->groupManager, $this->dateTimeFormatter, $this->l10nFactory
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -40,6 +40,9 @@ class AppFetcher extends Fetcher {
|
|||
/** @var CompareVersion */
|
||||
private $compareVersion;
|
||||
|
||||
/** @var bool */
|
||||
private $ignoreMaxVersion;
|
||||
|
||||
/**
|
||||
* @param Factory $appDataFactory
|
||||
* @param IClientService $clientService
|
||||
|
@ -65,6 +68,7 @@ class AppFetcher extends Fetcher {
|
|||
$this->fileName = 'apps.json';
|
||||
$this->setEndpoint();
|
||||
$this->compareVersion = $compareVersion;
|
||||
$this->ignoreMaxVersion = true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -97,7 +101,7 @@ class AppFetcher extends Fetcher {
|
|||
$minFulfilled = $this->compareVersion->isCompatible($ncVersion, $min, '>=');
|
||||
$maxFulfilled = $max !== '' &&
|
||||
$this->compareVersion->isCompatible($ncVersion, $max, '<=');
|
||||
if ($minFulfilled && $maxFulfilled) {
|
||||
if ($minFulfilled && ($this->ignoreMaxVersion || $maxFulfilled)) {
|
||||
$releases[] = $release;
|
||||
}
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
|
@ -106,6 +110,11 @@ class AppFetcher extends Fetcher {
|
|||
}
|
||||
}
|
||||
|
||||
if (empty($releases)) {
|
||||
// Remove apps that don't have a matching release
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get the highest version
|
||||
$versions = [];
|
||||
foreach($releases as $release) {
|
||||
|
@ -113,20 +122,15 @@ class AppFetcher extends Fetcher {
|
|||
}
|
||||
usort($versions, 'version_compare');
|
||||
$versions = array_reverse($versions);
|
||||
$compatible = false;
|
||||
if(isset($versions[0])) {
|
||||
$highestVersion = $versions[0];
|
||||
foreach ($releases as $release) {
|
||||
if ((string)$release['version'] === (string)$highestVersion) {
|
||||
$compatible = true;
|
||||
$response['data'][$dataKey]['releases'] = [$release];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!$compatible) {
|
||||
unset($response['data'][$dataKey]);
|
||||
}
|
||||
}
|
||||
|
||||
$response['data'] = array_values($response['data']);
|
||||
|
@ -134,22 +138,18 @@ class AppFetcher extends Fetcher {
|
|||
}
|
||||
|
||||
private function setEndpoint() {
|
||||
$versionArray = explode('.', $this->getVersion());
|
||||
$this->endpointUrl = sprintf(
|
||||
'https://apps.nextcloud.com/api/v1/platform/%d.%d.%d/apps.json',
|
||||
$versionArray[0],
|
||||
$versionArray[1],
|
||||
$versionArray[2]
|
||||
);
|
||||
$this->endpointUrl = 'https://apps.nextcloud.com/api/v1/apps.json';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $version
|
||||
* @param string $fileName
|
||||
* @param bool $ignoreMaxVersion
|
||||
*/
|
||||
public function setVersion(string $version, string $fileName = 'apps.json') {
|
||||
public function setVersion(string $version, string $fileName = 'apps.json', bool $ignoreMaxVersion = true) {
|
||||
parent::setVersion($version);
|
||||
$this->fileName = $fileName;
|
||||
$this->ignoreMaxVersion = $ignoreMaxVersion;
|
||||
$this->setEndpoint();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
|
||||
namespace OC\App;
|
||||
|
||||
use OCP\IConfig;
|
||||
use OCP\IL10N;
|
||||
|
||||
class DependencyAnalyzer {
|
||||
|
@ -53,7 +54,7 @@ class DependencyAnalyzer {
|
|||
* @param array $app
|
||||
* @returns array of missing dependencies
|
||||
*/
|
||||
public function analyze(array $app) {
|
||||
public function analyze(array $app, bool $ignoreMax = false) {
|
||||
$this->appInfo = $app;
|
||||
if (isset($app['dependencies'])) {
|
||||
$dependencies = $app['dependencies'];
|
||||
|
@ -67,10 +68,24 @@ class DependencyAnalyzer {
|
|||
$this->analyzeCommands($dependencies),
|
||||
$this->analyzeLibraries($dependencies),
|
||||
$this->analyzeOS($dependencies),
|
||||
$this->analyzeOC($dependencies, $app)
|
||||
$this->analyzeOC($dependencies, $app, $ignoreMax)
|
||||
);
|
||||
}
|
||||
|
||||
public function isMarkedCompatible(array $app): bool {
|
||||
if (isset($app['dependencies'])) {
|
||||
$dependencies = $app['dependencies'];
|
||||
} else {
|
||||
$dependencies = [];
|
||||
}
|
||||
|
||||
$maxVersion = $this->getMaxVersion($dependencies, $app);
|
||||
if ($maxVersion === null) {
|
||||
return true;
|
||||
}
|
||||
return !$this->compareBigger($this->platform->getOcVersion(), $maxVersion);
|
||||
}
|
||||
|
||||
/**
|
||||
* Truncates both versions to the lowest common version, e.g.
|
||||
* 5.1.2.3 and 5.1 will be turned into 5.1 and 5.1,
|
||||
|
@ -293,7 +308,7 @@ class DependencyAnalyzer {
|
|||
* @param array $appInfo
|
||||
* @return array
|
||||
*/
|
||||
private function analyzeOC(array $dependencies, array $appInfo) {
|
||||
private function analyzeOC(array $dependencies, array $appInfo, bool $ignoreMax) {
|
||||
$missing = [];
|
||||
$minVersion = null;
|
||||
if (isset($dependencies['nextcloud']['@attributes']['min-version'])) {
|
||||
|
@ -305,21 +320,14 @@ class DependencyAnalyzer {
|
|||
} elseif (isset($appInfo['require'])) {
|
||||
$minVersion = $appInfo['require'];
|
||||
}
|
||||
$maxVersion = null;
|
||||
if (isset($dependencies['nextcloud']['@attributes']['max-version'])) {
|
||||
$maxVersion = $dependencies['nextcloud']['@attributes']['max-version'];
|
||||
} elseif (isset($dependencies['owncloud']['@attributes']['max-version'])) {
|
||||
$maxVersion = $dependencies['owncloud']['@attributes']['max-version'];
|
||||
} elseif (isset($appInfo['requiremax'])) {
|
||||
$maxVersion = $appInfo['requiremax'];
|
||||
}
|
||||
$maxVersion = $this->getMaxVersion($dependencies, $appInfo);
|
||||
|
||||
if (!is_null($minVersion)) {
|
||||
if ($this->compareSmaller($this->platform->getOcVersion(), $minVersion)) {
|
||||
$missing[] = (string)$this->l->t('Server version %s or higher is required.', [$this->toVisibleVersion($minVersion)]);
|
||||
}
|
||||
}
|
||||
if (!is_null($maxVersion)) {
|
||||
if (!$ignoreMax && !is_null($maxVersion)) {
|
||||
if ($this->compareBigger($this->platform->getOcVersion(), $maxVersion)) {
|
||||
$missing[] = (string)$this->l->t('Server version %s or lower is required.', [$this->toVisibleVersion($maxVersion)]);
|
||||
}
|
||||
|
@ -327,6 +335,20 @@ class DependencyAnalyzer {
|
|||
return $missing;
|
||||
}
|
||||
|
||||
private function getMaxVersion(array $dependencies, array $appInfo): ?string {
|
||||
if (isset($dependencies['nextcloud']['@attributes']['max-version'])) {
|
||||
return $dependencies['nextcloud']['@attributes']['max-version'];
|
||||
}
|
||||
if (isset($dependencies['owncloud']['@attributes']['max-version'])) {
|
||||
return $dependencies['owncloud']['@attributes']['max-version'];
|
||||
}
|
||||
if (isset($appInfo['requiremax'])) {
|
||||
return $appInfo['requiremax'];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Map the internal version number to the Nextcloud version
|
||||
*
|
||||
|
|
|
@ -112,8 +112,11 @@ class Installer {
|
|||
);
|
||||
}
|
||||
|
||||
$ignoreMaxApps = $this->config->getSystemValue('app_install_overwrite', []);
|
||||
$ignoreMax = in_array($appId, $ignoreMaxApps);
|
||||
|
||||
$version = implode('.', \OCP\Util::getVersion());
|
||||
if (!\OC_App::isAppCompatible($version, $info)) {
|
||||
if (!\OC_App::isAppCompatible($version, $info, $ignoreMax)) {
|
||||
throw new \Exception(
|
||||
// TODO $l
|
||||
$l->t('App "%s" cannot be installed because it is not compatible with this version of the server.',
|
||||
|
@ -123,7 +126,7 @@ class Installer {
|
|||
}
|
||||
|
||||
// check for required dependencies
|
||||
\OC_App::checkAppDependencies($this->config, $l, $info);
|
||||
\OC_App::checkAppDependencies($this->config, $l, $info, $ignoreMax);
|
||||
\OC_App::registerAutoloading($appId, $basedir);
|
||||
|
||||
//install the database
|
||||
|
|
|
@ -826,7 +826,7 @@ class OC_App {
|
|||
*
|
||||
* @return boolean true if compatible, otherwise false
|
||||
*/
|
||||
public static function isAppCompatible(string $ocVersion, array $appInfo): bool {
|
||||
public static function isAppCompatible(string $ocVersion, array $appInfo, bool $ignoreMax = false): bool {
|
||||
$requireMin = '';
|
||||
$requireMax = '';
|
||||
if (isset($appInfo['dependencies']['nextcloud']['@attributes']['min-version'])) {
|
||||
|
@ -854,7 +854,7 @@ class OC_App {
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!empty($requireMax)
|
||||
if (!$ignoreMax && !empty($requireMax)
|
||||
&& version_compare(self::adjustVersionParts($ocVersion, $requireMax), $requireMax, '>')
|
||||
) {
|
||||
return false;
|
||||
|
@ -1090,9 +1090,9 @@ class OC_App {
|
|||
* @param array $info
|
||||
* @throws \Exception
|
||||
*/
|
||||
public static function checkAppDependencies(\OCP\IConfig $config, \OCP\IL10N $l, array $info) {
|
||||
public static function checkAppDependencies(\OCP\IConfig $config, \OCP\IL10N $l, array $info, bool $ignoreMax) {
|
||||
$dependencyAnalyzer = new DependencyAnalyzer(new Platform($config), $l);
|
||||
$missing = $dependencyAnalyzer->analyze($info);
|
||||
$missing = $dependencyAnalyzer->analyze($info, $ignoreMax);
|
||||
if (!empty($missing)) {
|
||||
$missingMsg = implode(PHP_EOL, $missing);
|
||||
throw new \Exception(
|
||||
|
|
|
@ -274,13 +274,17 @@ class AppSettingsController extends Controller {
|
|||
$appData['licence'] = $appData['license'];
|
||||
}
|
||||
|
||||
$ignoreMaxApps = $this->config->getSystemValue('app_install_overwrite', []);
|
||||
$ignoreMax = in_array($appData['id'], $ignoreMaxApps);
|
||||
|
||||
// analyse dependencies
|
||||
$missing = $dependencyAnalyzer->analyze($appData);
|
||||
$missing = $dependencyAnalyzer->analyze($appData, $ignoreMax);
|
||||
$appData['canInstall'] = empty($missing);
|
||||
$appData['missingDependencies'] = $missing;
|
||||
|
||||
$appData['missingMinOwnCloudVersion'] = !isset($appData['dependencies']['nextcloud']['@attributes']['min-version']);
|
||||
$appData['missingMaxOwnCloudVersion'] = !isset($appData['dependencies']['nextcloud']['@attributes']['max-version']);
|
||||
$appData['isCompatible'] = $dependencyAnalyzer->isMarkedCompatible($appData);
|
||||
|
||||
return $appData;
|
||||
}, $apps);
|
||||
|
@ -315,6 +319,9 @@ class AppSettingsController extends Controller {
|
|||
}
|
||||
}
|
||||
|
||||
if (!isset($app['releases'][0]['rawPlatformVersionSpec'])) {
|
||||
continue;
|
||||
}
|
||||
$nextCloudVersion = $versionParser->getVersion($app['releases'][0]['rawPlatformVersionSpec']);
|
||||
$nextCloudVersionDependencies = [];
|
||||
if($nextCloudVersion->getMinimumVersion() !== '') {
|
||||
|
@ -544,4 +551,16 @@ class AppSettingsController extends Controller {
|
|||
return ($a < $b) ? -1 : 1;
|
||||
}
|
||||
|
||||
public function force(string $appId): JSONResponse {
|
||||
$appId = OC_App::cleanAppId($appId);
|
||||
|
||||
$ignoreMaxApps = $this->config->getSystemValue('app_install_overwrite', []);
|
||||
if (!in_array($appId, $ignoreMaxApps, true)) {
|
||||
$ignoreMaxApps[] = $appId;
|
||||
$this->config->setSystemValue('app_install_overwrite', $ignoreMaxApps);
|
||||
}
|
||||
|
||||
return new JSONResponse();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -115,6 +115,7 @@ __webpack_require__.r(__webpack_exports__);
|
|||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
|
||||
|
||||
|
@ -563,6 +564,7 @@ __webpack_require__.r(__webpack_exports__);
|
|||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
|
||||
|
||||
|
@ -730,12 +732,28 @@ __webpack_require__.r(__webpack_exports__);
|
|||
|
||||
return t('settings', 'Enable');
|
||||
},
|
||||
forceEnableButtonText: function forceEnableButtonText() {
|
||||
if (this.app.needsDownload) {
|
||||
return t('settings', 'Enable untested app');
|
||||
}
|
||||
|
||||
return t('settings', 'Enable untested app');
|
||||
},
|
||||
enableButtonTooltip: function enableButtonTooltip() {
|
||||
if (this.app.needsDownload) {
|
||||
return t('settings', 'The app will be downloaded from the app store');
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
forceEnableButtonTooltip: function forceEnableButtonTooltip() {
|
||||
var base = t('settings', 'This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected.');
|
||||
|
||||
if (this.app.needsDownload) {
|
||||
return base + ' ' + t('settings', 'The app will be downloaded from the app store');
|
||||
}
|
||||
|
||||
return base;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
|
@ -788,6 +806,16 @@ __webpack_require__.r(__webpack_exports__);
|
|||
groups: currentGroups
|
||||
});
|
||||
},
|
||||
forceEnable: function forceEnable(appId) {
|
||||
this.$store.dispatch('forceEnableApp', {
|
||||
appId: appId,
|
||||
groups: []
|
||||
}).then(function (response) {
|
||||
OC.Settings.Apps.rebuildNavigation();
|
||||
}).catch(function (error) {
|
||||
OC.Notification.show(error);
|
||||
});
|
||||
},
|
||||
enable: function enable(appId) {
|
||||
this.$store.dispatch('enableApp', {
|
||||
appId: appId,
|
||||
|
@ -1186,10 +1214,40 @@ vue__WEBPACK_IMPORTED_MODULE_2__["default"].use(vue_localstorage__WEBPACK_IMPORT
|
|||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./settings/src/components/appDetails.vue?vue&type=template&id=02f2d131&":
|
||||
/*!*************************************************************************************************************************************************************************************************************!*\
|
||||
!*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./settings/src/components/appDetails.vue?vue&type=template&id=02f2d131& ***!
|
||||
\*************************************************************************************************************************************************************************************************************/
|
||||
/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./settings/src/components/appDetails.vue?vue&type=style&index=0&id=02f2d131&scoped=true&lang=css&":
|
||||
/*!**********************************************************************************************************************************************************************************************************************************************************!*\
|
||||
!*** ./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options!./settings/src/components/appDetails.vue?vue&type=style&index=0&id=02f2d131&scoped=true&lang=css& ***!
|
||||
\**********************************************************************************************************************************************************************************************************************************************************/
|
||||
/*! no static exports found */
|
||||
/***/ (function(module, exports, __webpack_require__) {
|
||||
|
||||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js")(false);
|
||||
// Module
|
||||
exports.push([module.i, "\n.force[data-v-02f2d131] {\n\tbackground: var(--color-main-background);\n\tborder-color: var(--color-error);\n\tcolor: var(--color-error);\n}\n.force[data-v-02f2d131]:hover,\n.force[data-v-02f2d131]:active {\n\tbackground: var(--color-error);\n\tborder-color: var(--color-error) !important;\n\tcolor: var(--color-main-background);\n}\n", ""]);
|
||||
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./settings/src/components/appList/appItem.vue?vue&type=style&index=0&id=09ee4a84&scoped=true&lang=css&":
|
||||
/*!***************************************************************************************************************************************************************************************************************************************************************!*\
|
||||
!*** ./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options!./settings/src/components/appList/appItem.vue?vue&type=style&index=0&id=09ee4a84&scoped=true&lang=css& ***!
|
||||
\***************************************************************************************************************************************************************************************************************************************************************/
|
||||
/*! no static exports found */
|
||||
/***/ (function(module, exports, __webpack_require__) {
|
||||
|
||||
exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js")(false);
|
||||
// Module
|
||||
exports.push([module.i, "\n.force[data-v-09ee4a84] {\n\tbackground: var(--color-main-background);\n\tborder-color: var(--color-error);\n\tcolor: var(--color-error);\n}\n.force[data-v-09ee4a84]:hover,\n.force[data-v-09ee4a84]:active {\n\tbackground: var(--color-error);\n\tborder-color: var(--color-error) !important;\n\tcolor: var(--color-main-background);\n}\n", ""]);
|
||||
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./settings/src/components/appDetails.vue?vue&type=template&id=02f2d131&scoped=true&":
|
||||
/*!*************************************************************************************************************************************************************************************************************************!*\
|
||||
!*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./settings/src/components/appDetails.vue?vue&type=template&id=02f2d131&scoped=true& ***!
|
||||
\*************************************************************************************************************************************************************************************************************************/
|
||||
/*! exports provided: render, staticRenderFns */
|
||||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||
|
||||
|
@ -1387,7 +1445,7 @@ var render = function() {
|
|||
})
|
||||
: _vm._e(),
|
||||
_vm._v(" "),
|
||||
!_vm.app.active
|
||||
!_vm.app.active && (_vm.app.canInstall || _vm.app.isCompatible)
|
||||
? _c("input", {
|
||||
directives: [
|
||||
{
|
||||
|
@ -1413,6 +1471,29 @@ var render = function() {
|
|||
}
|
||||
}
|
||||
})
|
||||
: !_vm.app.active
|
||||
? _c("input", {
|
||||
directives: [
|
||||
{
|
||||
name: "tooltip",
|
||||
rawName: "v-tooltip.auto",
|
||||
value: _vm.forceEnableButtonTooltip,
|
||||
expression: "forceEnableButtonTooltip",
|
||||
modifiers: { auto: true }
|
||||
}
|
||||
],
|
||||
staticClass: "enable force",
|
||||
attrs: {
|
||||
type: "button",
|
||||
value: _vm.forceEnableButtonText,
|
||||
disabled: _vm.installing || _vm.loading(_vm.app.id)
|
||||
},
|
||||
on: {
|
||||
click: function($event) {
|
||||
return _vm.forceEnable(_vm.app.id)
|
||||
}
|
||||
}
|
||||
})
|
||||
: _vm._e()
|
||||
]),
|
||||
_vm._v(" "),
|
||||
|
@ -1867,10 +1948,10 @@ render._withStripped = true
|
|||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./settings/src/components/appList/appItem.vue?vue&type=template&id=09ee4a84&":
|
||||
/*!******************************************************************************************************************************************************************************************************************!*\
|
||||
!*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./settings/src/components/appList/appItem.vue?vue&type=template&id=09ee4a84& ***!
|
||||
\******************************************************************************************************************************************************************************************************************/
|
||||
/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./settings/src/components/appList/appItem.vue?vue&type=template&id=09ee4a84&scoped=true&":
|
||||
/*!******************************************************************************************************************************************************************************************************************************!*\
|
||||
!*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./settings/src/components/appList/appItem.vue?vue&type=template&id=09ee4a84&scoped=true& ***!
|
||||
\******************************************************************************************************************************************************************************************************************************/
|
||||
/*! exports provided: render, staticRenderFns */
|
||||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||
|
||||
|
@ -2068,7 +2149,7 @@ var render = function() {
|
|||
})
|
||||
: _vm._e(),
|
||||
_vm._v(" "),
|
||||
!_vm.app.active
|
||||
!_vm.app.active && (_vm.app.canInstall || _vm.app.isCompatible)
|
||||
? _c("input", {
|
||||
directives: [
|
||||
{
|
||||
|
@ -2095,6 +2176,30 @@ var render = function() {
|
|||
}
|
||||
}
|
||||
})
|
||||
: !_vm.app.active
|
||||
? _c("input", {
|
||||
directives: [
|
||||
{
|
||||
name: "tooltip",
|
||||
rawName: "v-tooltip.auto",
|
||||
value: _vm.forceEnableButtonTooltip,
|
||||
expression: "forceEnableButtonTooltip",
|
||||
modifiers: { auto: true }
|
||||
}
|
||||
],
|
||||
staticClass: "enable force",
|
||||
attrs: {
|
||||
type: "button",
|
||||
value: _vm.forceEnableButtonText,
|
||||
disabled: _vm.installing || _vm.loading(_vm.app.id)
|
||||
},
|
||||
on: {
|
||||
click: function($event) {
|
||||
$event.stopPropagation()
|
||||
return _vm.forceEnable(_vm.app.id)
|
||||
}
|
||||
}
|
||||
})
|
||||
: _vm._e()
|
||||
])
|
||||
]
|
||||
|
@ -2216,6 +2321,48 @@ render._withStripped = true
|
|||
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./node_modules/vue-style-loader/index.js!./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./settings/src/components/appDetails.vue?vue&type=style&index=0&id=02f2d131&scoped=true&lang=css&":
|
||||
/*!******************************************************************************************************************************************************************************************************************************************************************************************!*\
|
||||
!*** ./node_modules/vue-style-loader!./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options!./settings/src/components/appDetails.vue?vue&type=style&index=0&id=02f2d131&scoped=true&lang=css& ***!
|
||||
\******************************************************************************************************************************************************************************************************************************************************************************************/
|
||||
/*! no static exports found */
|
||||
/***/ (function(module, exports, __webpack_require__) {
|
||||
|
||||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||||
|
||||
// load the styles
|
||||
var content = __webpack_require__(/*! !../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/vue-loader/lib??vue-loader-options!./appDetails.vue?vue&type=style&index=0&id=02f2d131&scoped=true&lang=css& */ "./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./settings/src/components/appDetails.vue?vue&type=style&index=0&id=02f2d131&scoped=true&lang=css&");
|
||||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||||
if(content.locals) module.exports = content.locals;
|
||||
// add the styles to the DOM
|
||||
var add = __webpack_require__(/*! ../../../node_modules/vue-style-loader/lib/addStylesClient.js */ "./node_modules/vue-style-loader/lib/addStylesClient.js").default
|
||||
var update = add("ea375ae0", content, false, {});
|
||||
// Hot Module Replacement
|
||||
if(false) {}
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./node_modules/vue-style-loader/index.js!./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./settings/src/components/appList/appItem.vue?vue&type=style&index=0&id=09ee4a84&scoped=true&lang=css&":
|
||||
/*!***********************************************************************************************************************************************************************************************************************************************************************************************!*\
|
||||
!*** ./node_modules/vue-style-loader!./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options!./settings/src/components/appList/appItem.vue?vue&type=style&index=0&id=09ee4a84&scoped=true&lang=css& ***!
|
||||
\***********************************************************************************************************************************************************************************************************************************************************************************************/
|
||||
/*! no static exports found */
|
||||
/***/ (function(module, exports, __webpack_require__) {
|
||||
|
||||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||||
|
||||
// load the styles
|
||||
var content = __webpack_require__(/*! !../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib??vue-loader-options!./appItem.vue?vue&type=style&index=0&id=09ee4a84&scoped=true&lang=css& */ "./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./settings/src/components/appList/appItem.vue?vue&type=style&index=0&id=09ee4a84&scoped=true&lang=css&");
|
||||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||||
if(content.locals) module.exports = content.locals;
|
||||
// add the styles to the DOM
|
||||
var add = __webpack_require__(/*! ../../../../node_modules/vue-style-loader/lib/addStylesClient.js */ "./node_modules/vue-style-loader/lib/addStylesClient.js").default
|
||||
var update = add("732d0d00", content, false, {});
|
||||
// Hot Module Replacement
|
||||
if(false) {}
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./settings/src/components/appDetails.vue":
|
||||
|
@ -2227,9 +2374,11 @@ render._withStripped = true
|
|||
|
||||
"use strict";
|
||||
__webpack_require__.r(__webpack_exports__);
|
||||
/* harmony import */ var _appDetails_vue_vue_type_template_id_02f2d131___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./appDetails.vue?vue&type=template&id=02f2d131& */ "./settings/src/components/appDetails.vue?vue&type=template&id=02f2d131&");
|
||||
/* harmony import */ var _appDetails_vue_vue_type_template_id_02f2d131_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./appDetails.vue?vue&type=template&id=02f2d131&scoped=true& */ "./settings/src/components/appDetails.vue?vue&type=template&id=02f2d131&scoped=true&");
|
||||
/* harmony import */ var _appDetails_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./appDetails.vue?vue&type=script&lang=js& */ "./settings/src/components/appDetails.vue?vue&type=script&lang=js&");
|
||||
/* empty/unused harmony star reexport *//* 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");
|
||||
/* empty/unused harmony star reexport *//* harmony import */ var _appDetails_vue_vue_type_style_index_0_id_02f2d131_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./appDetails.vue?vue&type=style&index=0&id=02f2d131&scoped=true&lang=css& */ "./settings/src/components/appDetails.vue?vue&type=style&index=0&id=02f2d131&scoped=true&lang=css&");
|
||||
/* 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");
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -2237,13 +2386,13 @@ __webpack_require__.r(__webpack_exports__);
|
|||
|
||||
/* normalize component */
|
||||
|
||||
var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__["default"])(
|
||||
var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__["default"])(
|
||||
_appDetails_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"],
|
||||
_appDetails_vue_vue_type_template_id_02f2d131___WEBPACK_IMPORTED_MODULE_0__["render"],
|
||||
_appDetails_vue_vue_type_template_id_02f2d131___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
|
||||
_appDetails_vue_vue_type_template_id_02f2d131_scoped_true___WEBPACK_IMPORTED_MODULE_0__["render"],
|
||||
_appDetails_vue_vue_type_template_id_02f2d131_scoped_true___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
|
||||
false,
|
||||
null,
|
||||
null,
|
||||
"02f2d131",
|
||||
null
|
||||
|
||||
)
|
||||
|
@ -2269,19 +2418,35 @@ __webpack_require__.r(__webpack_exports__);
|
|||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./settings/src/components/appDetails.vue?vue&type=template&id=02f2d131&":
|
||||
/*!*******************************************************************************!*\
|
||||
!*** ./settings/src/components/appDetails.vue?vue&type=template&id=02f2d131& ***!
|
||||
\*******************************************************************************/
|
||||
/***/ "./settings/src/components/appDetails.vue?vue&type=style&index=0&id=02f2d131&scoped=true&lang=css&":
|
||||
/*!*********************************************************************************************************!*\
|
||||
!*** ./settings/src/components/appDetails.vue?vue&type=style&index=0&id=02f2d131&scoped=true&lang=css& ***!
|
||||
\*********************************************************************************************************/
|
||||
/*! no static exports found */
|
||||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||
|
||||
"use strict";
|
||||
__webpack_require__.r(__webpack_exports__);
|
||||
/* harmony import */ var _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_appDetails_vue_vue_type_style_index_0_id_02f2d131_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/vue-style-loader!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/vue-loader/lib??vue-loader-options!./appDetails.vue?vue&type=style&index=0&id=02f2d131&scoped=true&lang=css& */ "./node_modules/vue-style-loader/index.js!./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./settings/src/components/appDetails.vue?vue&type=style&index=0&id=02f2d131&scoped=true&lang=css&");
|
||||
/* harmony import */ var _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_appDetails_vue_vue_type_style_index_0_id_02f2d131_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_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_appDetails_vue_vue_type_style_index_0_id_02f2d131_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__);
|
||||
/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_appDetails_vue_vue_type_style_index_0_id_02f2d131_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_appDetails_vue_vue_type_style_index_0_id_02f2d131_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));
|
||||
/* harmony default export */ __webpack_exports__["default"] = (_node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_appDetails_vue_vue_type_style_index_0_id_02f2d131_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0___default.a);
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./settings/src/components/appDetails.vue?vue&type=template&id=02f2d131&scoped=true&":
|
||||
/*!*******************************************************************************************!*\
|
||||
!*** ./settings/src/components/appDetails.vue?vue&type=template&id=02f2d131&scoped=true& ***!
|
||||
\*******************************************************************************************/
|
||||
/*! exports provided: render, staticRenderFns */
|
||||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||
|
||||
"use strict";
|
||||
__webpack_require__.r(__webpack_exports__);
|
||||
/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_appDetails_vue_vue_type_template_id_02f2d131___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/vue-loader/lib??vue-loader-options!./appDetails.vue?vue&type=template&id=02f2d131& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./settings/src/components/appDetails.vue?vue&type=template&id=02f2d131&");
|
||||
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_appDetails_vue_vue_type_template_id_02f2d131___WEBPACK_IMPORTED_MODULE_0__["render"]; });
|
||||
/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_appDetails_vue_vue_type_template_id_02f2d131_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/vue-loader/lib??vue-loader-options!./appDetails.vue?vue&type=template&id=02f2d131&scoped=true& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./settings/src/components/appDetails.vue?vue&type=template&id=02f2d131&scoped=true&");
|
||||
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_appDetails_vue_vue_type_template_id_02f2d131_scoped_true___WEBPACK_IMPORTED_MODULE_0__["render"]; });
|
||||
|
||||
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_appDetails_vue_vue_type_template_id_02f2d131___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
|
||||
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_appDetails_vue_vue_type_template_id_02f2d131_scoped_true___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
|
||||
|
||||
|
||||
|
||||
|
@ -2365,9 +2530,11 @@ __webpack_require__.r(__webpack_exports__);
|
|||
|
||||
"use strict";
|
||||
__webpack_require__.r(__webpack_exports__);
|
||||
/* harmony import */ var _appItem_vue_vue_type_template_id_09ee4a84___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./appItem.vue?vue&type=template&id=09ee4a84& */ "./settings/src/components/appList/appItem.vue?vue&type=template&id=09ee4a84&");
|
||||
/* harmony import */ var _appItem_vue_vue_type_template_id_09ee4a84_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./appItem.vue?vue&type=template&id=09ee4a84&scoped=true& */ "./settings/src/components/appList/appItem.vue?vue&type=template&id=09ee4a84&scoped=true&");
|
||||
/* harmony import */ var _appItem_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./appItem.vue?vue&type=script&lang=js& */ "./settings/src/components/appList/appItem.vue?vue&type=script&lang=js&");
|
||||
/* empty/unused harmony star reexport *//* 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");
|
||||
/* empty/unused harmony star reexport *//* harmony import */ var _appItem_vue_vue_type_style_index_0_id_09ee4a84_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./appItem.vue?vue&type=style&index=0&id=09ee4a84&scoped=true&lang=css& */ "./settings/src/components/appList/appItem.vue?vue&type=style&index=0&id=09ee4a84&scoped=true&lang=css&");
|
||||
/* 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");
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -2375,13 +2542,13 @@ __webpack_require__.r(__webpack_exports__);
|
|||
|
||||
/* normalize component */
|
||||
|
||||
var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__["default"])(
|
||||
var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__["default"])(
|
||||
_appItem_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"],
|
||||
_appItem_vue_vue_type_template_id_09ee4a84___WEBPACK_IMPORTED_MODULE_0__["render"],
|
||||
_appItem_vue_vue_type_template_id_09ee4a84___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
|
||||
_appItem_vue_vue_type_template_id_09ee4a84_scoped_true___WEBPACK_IMPORTED_MODULE_0__["render"],
|
||||
_appItem_vue_vue_type_template_id_09ee4a84_scoped_true___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
|
||||
false,
|
||||
null,
|
||||
null,
|
||||
"09ee4a84",
|
||||
null
|
||||
|
||||
)
|
||||
|
@ -2407,19 +2574,35 @@ __webpack_require__.r(__webpack_exports__);
|
|||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./settings/src/components/appList/appItem.vue?vue&type=template&id=09ee4a84&":
|
||||
/*!************************************************************************************!*\
|
||||
!*** ./settings/src/components/appList/appItem.vue?vue&type=template&id=09ee4a84& ***!
|
||||
\************************************************************************************/
|
||||
/***/ "./settings/src/components/appList/appItem.vue?vue&type=style&index=0&id=09ee4a84&scoped=true&lang=css&":
|
||||
/*!**************************************************************************************************************!*\
|
||||
!*** ./settings/src/components/appList/appItem.vue?vue&type=style&index=0&id=09ee4a84&scoped=true&lang=css& ***!
|
||||
\**************************************************************************************************************/
|
||||
/*! no static exports found */
|
||||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||
|
||||
"use strict";
|
||||
__webpack_require__.r(__webpack_exports__);
|
||||
/* harmony import */ var _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_appItem_vue_vue_type_style_index_0_id_09ee4a84_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/vue-style-loader!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib??vue-loader-options!./appItem.vue?vue&type=style&index=0&id=09ee4a84&scoped=true&lang=css& */ "./node_modules/vue-style-loader/index.js!./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./settings/src/components/appList/appItem.vue?vue&type=style&index=0&id=09ee4a84&scoped=true&lang=css&");
|
||||
/* harmony import */ var _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_appItem_vue_vue_type_style_index_0_id_09ee4a84_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_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_appItem_vue_vue_type_style_index_0_id_09ee4a84_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__);
|
||||
/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_appItem_vue_vue_type_style_index_0_id_09ee4a84_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_appItem_vue_vue_type_style_index_0_id_09ee4a84_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));
|
||||
/* harmony default export */ __webpack_exports__["default"] = (_node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_appItem_vue_vue_type_style_index_0_id_09ee4a84_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0___default.a);
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./settings/src/components/appList/appItem.vue?vue&type=template&id=09ee4a84&scoped=true&":
|
||||
/*!************************************************************************************************!*\
|
||||
!*** ./settings/src/components/appList/appItem.vue?vue&type=template&id=09ee4a84&scoped=true& ***!
|
||||
\************************************************************************************************/
|
||||
/*! exports provided: render, staticRenderFns */
|
||||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||
|
||||
"use strict";
|
||||
__webpack_require__.r(__webpack_exports__);
|
||||
/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_appItem_vue_vue_type_template_id_09ee4a84___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/vue-loader/lib??vue-loader-options!./appItem.vue?vue&type=template&id=09ee4a84& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./settings/src/components/appList/appItem.vue?vue&type=template&id=09ee4a84&");
|
||||
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_appItem_vue_vue_type_template_id_09ee4a84___WEBPACK_IMPORTED_MODULE_0__["render"]; });
|
||||
/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_appItem_vue_vue_type_template_id_09ee4a84_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/vue-loader/lib??vue-loader-options!./appItem.vue?vue&type=template&id=09ee4a84&scoped=true& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./settings/src/components/appList/appItem.vue?vue&type=template&id=09ee4a84&scoped=true&");
|
||||
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_appItem_vue_vue_type_template_id_09ee4a84_scoped_true___WEBPACK_IMPORTED_MODULE_0__["render"]; });
|
||||
|
||||
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_appItem_vue_vue_type_template_id_09ee4a84___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
|
||||
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_appItem_vue_vue_type_template_id_09ee4a84_scoped_true___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
|
||||
|
||||
|
||||
|
||||
|
|
9582
settings/js/vue-3.js
9582
settings/js/vue-3.js
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -59,6 +59,7 @@ $application->registerRoutes($this, [
|
|||
['name' => 'AppSettings#uninstallApp', 'url' => '/settings/apps/uninstall/{appId}', 'verb' => 'GET'],
|
||||
['name' => 'AppSettings#viewApps', 'url' => '/settings/apps/{category}', 'verb' => 'GET', 'defaults' => ['category' => '']],
|
||||
['name' => 'AppSettings#viewApps', 'url' => '/settings/apps/{category}/{id}', 'verb' => 'GET', 'defaults' => ['category' => '', 'id' => '']],
|
||||
['name' => 'AppSettings#force', 'url' => '/settings/apps/force', 'verb' => 'POST'],
|
||||
|
||||
['name' => 'Users#setDisplayName', 'url' => '/settings/users/{username}/displayName', 'verb' => 'POST'],
|
||||
['name' => 'Users#setEMailAddress', 'url' => '/settings/users/{id}/mailAddress', 'verb' => 'PUT'],
|
||||
|
|
|
@ -50,7 +50,8 @@
|
|||
<input v-if="app.update" class="update primary" type="button" :value="t('settings', 'Update to {version}', {version: app.update})" v-on:click="update(app.id)" :disabled="installing || loading(app.id)"/>
|
||||
<input v-if="app.canUnInstall" class="uninstall" type="button" :value="t('settings', 'Remove')" v-on:click="remove(app.id)" :disabled="installing || loading(app.id)"/>
|
||||
<input v-if="app.active" class="enable" type="button" :value="t('settings','Disable')" v-on:click="disable(app.id)" :disabled="installing || loading(app.id)" />
|
||||
<input v-if="!app.active" class="enable primary" type="button" :value="enableButtonText" v-on:click="enable(app.id)" v-tooltip.auto="enableButtonTooltip" :disabled="!app.canInstall || installing || loading(app.id)" />
|
||||
<input v-if="!app.active && (app.canInstall || app.isCompatible)" class="enable primary" type="button" :value="enableButtonText" v-on:click="enable(app.id)" v-tooltip.auto="enableButtonTooltip" :disabled="!app.canInstall || installing || loading(app.id)" />
|
||||
<input v-else-if="!app.active" class="enable force" type="button" :value="forceEnableButtonText" v-on:click="forceEnable(app.id)" v-tooltip.auto="forceEnableButtonTooltip" :disabled="installing || loading(app.id)" />
|
||||
</div>
|
||||
<div class="app-groups">
|
||||
<div class="groups-enable" v-if="app.active && canLimitToGroups(app)">
|
||||
|
@ -226,3 +227,17 @@ export default {
|
|||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.force {
|
||||
background: var(--color-main-background);
|
||||
border-color: var(--color-error);
|
||||
color: var(--color-error);
|
||||
}
|
||||
.force:hover,
|
||||
.force:active {
|
||||
background: var(--color-error);
|
||||
border-color: var(--color-error) !important;
|
||||
color: var(--color-main-background);
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -54,7 +54,8 @@
|
|||
<input v-if="app.update" class="update primary" type="button" :value="t('settings', 'Update to {update}', {update:app.update})" v-on:click.stop="update(app.id)" :disabled="installing || loading(app.id)" />
|
||||
<input v-if="app.canUnInstall" class="uninstall" type="button" :value="t('settings', 'Remove')" v-on:click.stop="remove(app.id)" :disabled="installing || loading(app.id)" />
|
||||
<input v-if="app.active" class="enable" type="button" :value="t('settings','Disable')" v-on:click.stop="disable(app.id)" :disabled="installing || loading(app.id)" />
|
||||
<input v-if="!app.active" class="enable" type="button" :value="enableButtonText" v-on:click.stop="enable(app.id)" v-tooltip.auto="enableButtonTooltip" :disabled="!app.canInstall || installing || loading(app.id)" />
|
||||
<input v-if="!app.active && (app.canInstall || app.isCompatible)" class="enable" type="button" :value="enableButtonText" v-on:click.stop="enable(app.id)" v-tooltip.auto="enableButtonTooltip" :disabled="!app.canInstall || installing || loading(app.id)" />
|
||||
<input v-else-if="!app.active" class="enable force" type="button" :value="forceEnableButtonText" v-on:click.stop="forceEnable(app.id)" v-tooltip.auto="forceEnableButtonTooltip" :disabled="installing || loading(app.id)" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
@ -116,3 +117,17 @@
|
|||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.force {
|
||||
background: var(--color-main-background);
|
||||
border-color: var(--color-error);
|
||||
color: var(--color-error);
|
||||
}
|
||||
.force:hover,
|
||||
.force:active {
|
||||
background: var(--color-error);
|
||||
border-color: var(--color-error) !important;
|
||||
color: var(--color-main-background);
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -42,15 +42,28 @@
|
|||
},
|
||||
enableButtonText() {
|
||||
if (this.app.needsDownload) {
|
||||
return t('settings','Download and enable');
|
||||
return t('settings', 'Download and enable');
|
||||
}
|
||||
return t('settings','Enable');
|
||||
return t('settings', 'Enable');
|
||||
},
|
||||
forceEnableButtonText() {
|
||||
if (this.app.needsDownload) {
|
||||
return t('settings', 'Enable untested app');
|
||||
}
|
||||
return t('settings', 'Enable untested app');
|
||||
},
|
||||
enableButtonTooltip() {
|
||||
if (this.app.needsDownload) {
|
||||
return t('settings','The app will be downloaded from the app store');
|
||||
}
|
||||
return false;
|
||||
},
|
||||
forceEnableButtonTooltip() {
|
||||
const base = t('settings', 'This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected.');
|
||||
if (this.app.needsDownload) {
|
||||
return base + ' ' + t('settings','The app will be downloaded from the app store');
|
||||
}
|
||||
return base;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
|
@ -90,6 +103,11 @@
|
|||
}
|
||||
this.$store.dispatch('enableApp', { appId: this.app.id, groups: currentGroups});
|
||||
},
|
||||
forceEnable(appId) {
|
||||
this.$store.dispatch('forceEnableApp', { appId: appId, groups: [] })
|
||||
.then((response) => { OC.Settings.Apps.rebuildNavigation(); })
|
||||
.catch((error) => { OC.Notification.show(error)});
|
||||
},
|
||||
enable(appId) {
|
||||
this.$store.dispatch('enableApp', { appId: appId, groups: [] })
|
||||
.then((response) => { OC.Settings.Apps.rebuildNavigation(); })
|
||||
|
|
|
@ -21,11 +21,15 @@
|
|||
*/
|
||||
|
||||
import Vue from 'vue';
|
||||
import VTooltip from 'v-tooltip';
|
||||
import { sync } from 'vuex-router-sync';
|
||||
|
||||
import App from './App.vue';
|
||||
import router from './router';
|
||||
import store from './store';
|
||||
|
||||
Vue.use(VTooltip);
|
||||
|
||||
sync(store, router);
|
||||
|
||||
// CSP config for webpack dynamic chunk loading
|
||||
|
|
|
@ -213,6 +213,32 @@ const actions = {
|
|||
})
|
||||
}).catch((error) => context.commit('API_FAILURE', { appId, error }));
|
||||
},
|
||||
forceEnableApp(context, { appId, groups }) {
|
||||
let apps;
|
||||
if (Array.isArray(appId)) {
|
||||
apps = appId;
|
||||
} else {
|
||||
apps = [appId];
|
||||
}
|
||||
return api.requireAdmin().then(() => {
|
||||
context.commit('startLoading', apps);
|
||||
context.commit('startLoading', 'install');
|
||||
return api.post(OC.generateUrl(`settings/apps/force`), {appId})
|
||||
.then((response) => {
|
||||
// TODO: find a cleaner solution
|
||||
location.reload();
|
||||
})
|
||||
.catch((error) => {
|
||||
context.commit('stopLoading', apps);
|
||||
context.commit('stopLoading', 'install');
|
||||
context.commit('setError', {
|
||||
appId: apps,
|
||||
error: error.response.data.data.message
|
||||
});
|
||||
context.commit('APPS_API_FAILURE', { appId, error});
|
||||
})
|
||||
}).catch((error) => context.commit('API_FAILURE', { appId, error }));
|
||||
},
|
||||
disableApp(context, { appId }) {
|
||||
let apps;
|
||||
if (Array.isArray(appId)) {
|
||||
|
|
|
@ -75,11 +75,6 @@ EOD;
|
|||
$this->compareVersion = new CompareVersion();
|
||||
$this->logger = $this->createMock(ILogger::class);
|
||||
|
||||
$this->config
|
||||
->expects($this->at(0))
|
||||
->method('getSystemValue')
|
||||
->with('version')
|
||||
->willReturn('11.0.0.2');
|
||||
$this->fetcher = new AppFetcher(
|
||||
$factory,
|
||||
$this->clientService,
|
||||
|
@ -126,9 +121,8 @@ EOD;
|
|||
->willReturn($client);
|
||||
$response = $this->createMock(IResponse::class);
|
||||
$client
|
||||
->expects($this->once())
|
||||
->method('get')
|
||||
->with('https://apps.nextcloud.com/api/v1/platform/11.0.0/apps.json')
|
||||
->with('https://apps.nextcloud.com/api/v1/apps.json')
|
||||
->willReturn($response);
|
||||
$response
|
||||
->expects($this->once())
|
||||
|
@ -1940,10 +1934,8 @@ EJL3BaQAQaASSsvFrcozYxrQG4VzEg==
|
|||
|
||||
$file
|
||||
->expects($this->at(0))
|
||||
->method('putContent')
|
||||
->with(json_encode($dataToPut));
|
||||
->method('putContent');
|
||||
$file
|
||||
->expects($this->at(1))
|
||||
->method('getContent')
|
||||
->willReturn(json_encode($expected));
|
||||
|
||||
|
@ -1956,6 +1948,8 @@ EJL3BaQAQaASSsvFrcozYxrQG4VzEg==
|
|||
->will($this->returnCallback(function($var, $default) {
|
||||
if ($var === 'appstoreenabled') {
|
||||
return false;
|
||||
} else if ($var === 'version') {
|
||||
return '11.0.0.2';
|
||||
}
|
||||
return $default;
|
||||
}));
|
||||
|
@ -1973,6 +1967,8 @@ EJL3BaQAQaASSsvFrcozYxrQG4VzEg==
|
|||
->will($this->returnCallback(function($var, $default) {
|
||||
if ($var === 'has_internet_connection') {
|
||||
return false;
|
||||
} else if ($var === 'version') {
|
||||
return '11.0.0.2';
|
||||
}
|
||||
return $default;
|
||||
}));
|
||||
|
|
Loading…
Reference in New Issue