summaryrefslogtreecommitdiffstats
path: root/apps/updatenotification/js-src
diff options
context:
space:
mode:
authorJoas Schilling <coding@schilljs.com>2018-01-30 17:06:40 +0100
committerJoas Schilling <coding@schilljs.com>2018-02-22 10:17:42 +0100
commit308c7db3339a1edbcccddb0ba25356d980ce88e9 (patch)
treeec9ae1576ce8bfd675c729677d2a2451ab4bc7d8 /apps/updatenotification/js-src
parentb12b391d7c4875fde4851c748dfb610a1b32d2e4 (diff)
downloadnextcloud-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.js45
-rw-r--r--apps/updatenotification/js-src/components/root.vue188
-rw-r--r--apps/updatenotification/js-src/init.js31
-rw-r--r--apps/updatenotification/js-src/webpack.config.js55
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
+ })
+ ]);
+}