diff options
author | Joas Schilling <coding@schilljs.com> | 2018-01-30 17:06:40 +0100 |
---|---|---|
committer | Joas Schilling <coding@schilljs.com> | 2018-02-22 10:17:42 +0100 |
commit | 308c7db3339a1edbcccddb0ba25356d980ce88e9 (patch) | |
tree | ec9ae1576ce8bfd675c729677d2a2451ab4bc7d8 /apps/updatenotification/js-src | |
parent | b12b391d7c4875fde4851c748dfb610a1b32d2e4 (diff) | |
download | nextcloud-server-308c7db3339a1edbcccddb0ba25356d980ce88e9.tar.gz nextcloud-server-308c7db3339a1edbcccddb0ba25356d980ce88e9.zip |
Move updatenotifications to webpack with .vue file
Signed-off-by: Joas Schilling <coding@schilljs.com>
Diffstat (limited to 'apps/updatenotification/js-src')
-rw-r--r-- | apps/updatenotification/js-src/app.js | 45 | ||||
-rw-r--r-- | apps/updatenotification/js-src/components/root.vue | 188 | ||||
-rw-r--r-- | apps/updatenotification/js-src/init.js | 31 | ||||
-rw-r--r-- | apps/updatenotification/js-src/webpack.config.js | 55 |
4 files changed, 319 insertions, 0 deletions
diff --git a/apps/updatenotification/js-src/app.js b/apps/updatenotification/js-src/app.js new file mode 100644 index 00000000000..349c5c6c7bb --- /dev/null +++ b/apps/updatenotification/js-src/app.js @@ -0,0 +1,45 @@ +/** + * @copyright (c) 2018 Joas Schilling <coding@schilljs.com> + * + * @author Joas Schilling <coding@schilljs.com> + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + */ + +/* global $, define */ + +define(function (require) { + "use strict"; + + return { + + + /** @type {number|null} */ + interval: null, + + /** @type {Vue|null} */ + vm: null, + + /** + * Initialise the app + */ + initialise: function() { + var data = JSON.parse($('#updatenotification').attr('data-json')); + var Vue = require('vue'); + this.vm = new Vue(require('./components/root.vue')); + + this.vm.newVersionString = data.newVersionString; + this.vm.lastCheckedDate = data.lastChecked; + this.vm.isUpdateChecked = data.isUpdateChecked; + this.vm.updaterEnabled = data.updaterEnabled; + this.vm.downloadLink = data.downloadLink; + this.vm.isNewVersionAvailable = data.isNewVersionAvailable; + this.vm.updateServerURL = data.updateServerURL; + this.vm.currentChannel = data.currentChannel; + this.vm.channels = data.channels; + this.vm.notifyGroups = data.notifyGroups; + this.vm.isDefaultUpdateServerURL = data.isDefaultUpdateServerURL; + } + }; +}); diff --git a/apps/updatenotification/js-src/components/root.vue b/apps/updatenotification/js-src/components/root.vue new file mode 100644 index 00000000000..5f41ce3ec58 --- /dev/null +++ b/apps/updatenotification/js-src/components/root.vue @@ -0,0 +1,188 @@ +<template> + <div id="updatenotification" class="followupsection"> + <p> + <template v-if="isNewVersionAvailable"> + <strong>{{newVersionAvailableString}}</strong> + <input v-if="updaterEnabled" type="button" @click="clickUpdaterButton" id="oca_updatenotification_button" :value="l_open_updater"> + <a v-if="downloadLink" :href="downloadLink" class="button" :class="{ hidden: !updaterEnabled }">{{l_download_now}}</a> + </template> + <template v-else-if="!isUpdateChecked">{{l_check_in_progress}}</template> + <template v-else> + {{l_up_to_date}} + <span class="icon-info svg" :title="lastCheckedOnString"></span> + </template> + + <template v-if="!isDefaultUpdateServerURL"> + <br /> + <em>{{l_non_default_updater}} <code>{{updateServerURL}}</code></em> + </template> + </p> + + <p> + <label for="release-channel">{{l_update_channel}}</label> + <select id="release-channel" v-model="currentChannel" @change="changeReleaseChannel"> + <option v-for="channel in channels" :value="channel">{{channel}}</option> + </select> + <span id="channel_save_msg" class="msg"></span><br /> + <em>{{l_update_channel_newer}}</em><br /> + <em>{{l_update_channel_delay}}</em> + </p> + + <p id="oca_updatenotification_groups"> + {{l_notify_groups}} + <input name="oca_updatenotification_groups_list" type="hidden" id="oca_updatenotification_groups_list" @change="saveNotifyGroups" :value="notifyGroups" style="width: 400px"><br /> + <em v-if="currentChannel === 'daily' || currentChannel === 'git'">{{l_only_app_updates}}</em> + <em v-if="currentChannel === 'daily'">{{l_update_channel_daily}}</em> + <em v-if="currentChannel === 'git'">{{l_update_channel_git}}</em> + </p> + </div> +</template> + +<script> + export default { + name: "root", + + el: '#updatenotification', + + data: function () { + return { + newVersionString: '', + lastCheckedDate: '', + isUpdateChecked: false, + updaterEnabled: true, + downloadLink: '', + isNewVersionAvailable: false, + updateServerURL: '', + currentChannel: '', + channels: [], + notifyGroups: '', + isDefaultUpdateServerURL: true + }; + }, + + _$el: null, + _$releaseChannel: null, + _$notifyGroups: null, + + computed: { + l_check_in_progress: function() { + return t('updatenotification', 'The update check is not yet finished. Please refresh the page.'); + }, + l_download_now: function() { + return t('updatenotification', 'Download now'); + }, + l_non_default_updater: function() { + return t('updatenotification', 'A non-default update server is in use to be checked for updates:'); + }, + l_notify_groups: function() { + return t('updatenotification', 'Notify members of the following groups about available updates:'); + }, + l_only_app_updates: function() { + return t('updatenotification', 'Only notification for app updates are available.'); + }, + l_open_updater: function() { + return t('updatenotification', 'Open updater'); + }, + l_up_to_date: function() { + return t('updatenotification', 'Your version is up to date.'); + }, + l_update_channel: function() { + return t('updatenotification', 'Update channel:'); + }, + l_update_channel_daily: function() { + return t('updatenotification', 'The selected update channel makes dedicated notifications for the server obsolete.'); + }, + l_update_channel_git: function() { + return t('updatenotification', 'The selected update channel does not support updates of the server.'); + }, + l_update_channel_newer: function() { + return t('updatenotification', 'You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel.'); + }, + l_update_channel_delay: function() { + return t('updatenotification', 'Note that after a new release it can take some time before it shows up here. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found.'); + }, + newVersionAvailableString: function() { + return t('updatenotification', 'A new version is available: {newVersionString}', { + newVersionString: this.newVersionString + }); + }, + lastCheckedOnString: function() { + return t('updatenotification', 'Checked on {lastCheckedDate}', { + lastCheckedDate: this.lastCheckedDate + }); + } + }, + + methods: { + /** + * Creates a new authentication token and loads the updater URL + */ + clickUpdaterButton: function() { + $.ajax({ + url: OC.generateUrl('/apps/updatenotification/credentials') + }).success(function(data) { + $.ajax({ + url: OC.getRootPath()+'/updater/', + headers: { + 'X-Updater-Auth': data + }, + method: 'POST', + success: function(data){ + if(data !== 'false') { + var body = $('body'); + $('head').remove(); + body.html(data); + + // Eval the script elements in the response + var dom = $(data); + dom.filter('script').each(function() { + eval(this.text || this.textContent || this.innerHTML || ''); + }); + + body.removeAttr('id'); + body.attr('id', 'body-settings'); + } + }, + error: function() { + OC.Notification.showTemporary(t('updatenotification', 'Could not start updater, please try the manual update')); + this.updaterEnabled = false; + }.bind(this) + }); + }.bind(this)); + }, + changeReleaseChannel: function() { + this.currentChannel = this._$releaseChannel.val(); + + $.ajax({ + url: OC.generateUrl('/apps/updatenotification/channel'), + type: 'POST', + data: { + 'channel': this.currentChannel + }, + success: function (data) { + OC.msg.finishedAction('#channel_save_msg', data); + } + }); + }, + saveNotifyGroups: function(e) { + var groups = e.val || []; + groups = JSON.stringify(groups); + OCP.AppConfig.setValue('updatenotification', 'notify_groups', groups); + } + }, + + mounted: function () { + this._$el = $(this.$el); + this._$releaseChannel = this._$el.find('#release-channel'); + this._$notifyGroups = this._$el.find('#oca_updatenotification_groups_list'); + this._$notifyGroups.on('change', function () { + this.$emit('input'); + }.bind(this)); + }, + + updated: function () { + OC.Settings.setupGroupsSelect(this._$notifyGroups); + this._$el.find('.icon-info').tooltip({placement: 'right'}); + } + } +</script> diff --git a/apps/updatenotification/js-src/init.js b/apps/updatenotification/js-src/init.js new file mode 100644 index 00000000000..7730affb527 --- /dev/null +++ b/apps/updatenotification/js-src/init.js @@ -0,0 +1,31 @@ +/** + * @copyright Copyright (c) 2018 Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +/* global define, $ */ + +define(function(require) { + 'use strict'; + + var App = require('./app'); + + $(function() { + App.initialise(); + }); +}); diff --git a/apps/updatenotification/js-src/webpack.config.js b/apps/updatenotification/js-src/webpack.config.js new file mode 100644 index 00000000000..30bdd5efb5c --- /dev/null +++ b/apps/updatenotification/js-src/webpack.config.js @@ -0,0 +1,55 @@ +var path = require('path'); +var webpack = require('webpack'); + +module.exports = { + entry: './js-src/init.js', + output: { + path: path.resolve(__dirname, '../js'), + publicPath: '/', + filename: 'merged.js' + }, + module: { + rules: [ + { + test: /\.vue$/, + loader: 'vue-loader', + options: { + loaders: { + }, + esModule: false + // other vue-loader options go here + } + } + ] + }, + resolve: { + alias: { + 'vue': process.env.NODE_ENV === 'production' ? 'vue/dist/vue.min.js' : 'vue/dist/vue.js' + } + }, + performance: { + hints: false + }, + devtool: '#eval-source-map' +}; + +if (process.env.NODE_ENV === 'production') { + module.exports.devtool = '#source-map'; + // http://vue-loader.vuejs.org/en/workflow/production.html + module.exports.plugins = (module.exports.plugins || []).concat([ + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: '"production"' + } + }), + new webpack.optimize.UglifyJsPlugin({ + sourceMap: true, + compress: { + warnings: false + } + }), + new webpack.LoaderOptionsPlugin({ + minimize: true + }) + ]); +} |