summaryrefslogtreecommitdiffstats
path: root/core/src/OCP
diff options
context:
space:
mode:
authorChristoph Wurst <christoph@winzerhof-wurst.at>2019-01-29 14:50:05 +0100
committerChristoph Wurst <christoph@winzerhof-wurst.at>2019-01-30 13:56:01 +0100
commit9a46c9ed31785c66f3d89f4760452d66f9674321 (patch)
treeb5f3ca6bab9fb10b03c5ea7453cae2d1c1b47b8e /core/src/OCP
parentfda74eb9b9e6e0da4dbe222d2d9a1ceddaf60d59 (diff)
downloadnextcloud-server-9a46c9ed31785c66f3d89f4760452d66f9674321.tar.gz
nextcloud-server-9a46c9ed31785c66f3d89f4760452d66f9674321.zip
Move OCP.AppCOnfig, OCP.Comments and OCP.WhatsNew to the server bundle
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
Diffstat (limited to 'core/src/OCP')
-rw-r--r--core/src/OCP/appconfig.js116
-rw-r--r--core/src/OCP/comments.js51
-rw-r--r--core/src/OCP/index.js10
-rw-r--r--core/src/OCP/whatsnew.js132
4 files changed, 307 insertions, 2 deletions
diff --git a/core/src/OCP/appconfig.js b/core/src/OCP/appconfig.js
new file mode 100644
index 00000000000..9c5b063566f
--- /dev/null
+++ b/core/src/OCP/appconfig.js
@@ -0,0 +1,116 @@
+/**
+ * @copyright Copyright (c) 2016 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/>.
+ *
+ */
+
+import $ from 'jquery'
+
+import OC from '../OC/index'
+
+/**
+ * @param {string} method
+ * @param {string} endpoint
+ * @param {Object} [options]
+ * @param {Object} [options.data]
+ * @param {function} [options.success]
+ * @param {function} [options.error]
+ * @internal
+ */
+function call (method, endpoint, options) {
+ if ((method === 'post' || method === 'delete') && OC.PasswordConfirmation.requiresPasswordConfirmation()) {
+ OC.PasswordConfirmation.requirePasswordConfirmation(_.bind(call, this, method, endpoint, options));
+ return;
+ }
+
+ options = options || {};
+ $.ajax({
+ type: method.toUpperCase(),
+ url: OC.linkToOCS('apps/provisioning_api/api/v1', 2) + 'config/apps' + endpoint,
+ data: options.data || {},
+ success: options.success,
+ error: options.error
+ });
+}
+
+/**
+ * @param {Object} [options]
+ * @param {function} [options.success]
+ * @since 11.0.0
+ */
+export function getApps (options) {
+ call('get', '', options);
+}
+
+/**
+ * @param {string} app
+ * @param {Object} [options]
+ * @param {function} [options.success]
+ * @param {function} [options.error]
+ * @since 11.0.0
+ */
+export function getKeys (app, options) {
+ call('get', '/' + app, options);
+}
+
+/**
+ * @param {string} app
+ * @param {string} key
+ * @param {string|function} defaultValue
+ * @param {Object} [options]
+ * @param {function} [options.success]
+ * @param {function} [options.error]
+ * @since 11.0.0
+ */
+export function getValue (app, key, defaultValue, options) {
+ options = options || {};
+ options.data = {
+ defaultValue: defaultValue
+ };
+
+ call('get', '/' + app + '/' + key, options);
+}
+
+/**
+ * @param {string} app
+ * @param {string} key
+ * @param {string} value
+ * @param {Object} [options]
+ * @param {function} [options.success]
+ * @param {function} [options.error]
+ * @since 11.0.0
+ */
+export function setValue (app, key, value, options) {
+ options = options || {};
+ options.data = {
+ value: value
+ };
+
+ call('post', '/' + app + '/' + key, options);
+}
+
+/**
+ * @param {string} app
+ * @param {string} key
+ * @param {Object} [options]
+ * @param {function} [options.success]
+ * @param {function} [options.error]
+ * @since 11.0.0
+ */
+export function deleteKey (app, key, options) {
+ call('delete', '/' + app + '/' + key, options);
+}
diff --git a/core/src/OCP/comments.js b/core/src/OCP/comments.js
new file mode 100644
index 00000000000..1500e1937c3
--- /dev/null
+++ b/core/src/OCP/comments.js
@@ -0,0 +1,51 @@
+/**
+ * @copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de>
+ *
+ * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ */
+
+import $ from 'jquery'
+
+/*
+ * Detects links:
+ * Either the http(s) protocol is given or two strings, basically limited to ascii with the last
+ * word being at least one digit long,
+ * followed by at least another character
+ *
+ * The downside: anything not ascii is excluded. Not sure how common it is in areas using different
+ * alphabets… the upside: fake domains with similar looking characters won't be formatted as links
+ */
+const urlRegex = /(\s|^)(https?:\/\/)?((?:[-A-Z0-9+_]+\.)+[-A-Z]+(?:\/[-A-Z0-9+&@#%?=~_|!:,.;()]*)*)(\s|$)/ig;
+
+export function plainToRich (content) {
+ return this.formatLinksRich(content);
+}
+
+export function richToPlain (content) {
+ return this.formatLinksPlain(content);
+}
+
+export function formatLinksRich (content) {
+ return content.replace(urlRegex, function (_, leadingSpace, protocol, url, trailingSpace) {
+ let linkText = url;
+ if (!protocol) {
+ protocol = 'https://';
+ } else if (protocol === 'http://') {
+ linkText = protocol + url;
+ }
+
+ return leadingSpace + '<a class="external" target="_blank" rel="noopener noreferrer" href="' + protocol + url + '">' + linkText + '</a>' + trailingSpace;
+ });
+}
+
+export function formatLinksPlain (content) {
+ const $content = $('<div></div>').html(content);
+ $content.find('a').each(function () {
+ const $this = $(this);
+ $this.html($this.attr('href'));
+ });
+ return $content.html();
+}
diff --git a/core/src/OCP/index.js b/core/src/OCP/index.js
index f4137d6ce54..6ec38668e72 100644
--- a/core/src/OCP/index.js
+++ b/core/src/OCP/index.js
@@ -1,11 +1,17 @@
/**
*
*/
-import loader from './loader'
+import * as AppConfig from './appconfig'
+import * as Comments from './comments'
import initialState from './initialstate'
+import Loader from './loader'
+import * as WhatsNew from './whatsnew'
/** @namespace OCP */
export default {
- Loader: loader,
+ AppConfig,
+ Comments,
InitialState: initialState,
+ Loader,
+ WhatsNew,
};
diff --git a/core/src/OCP/whatsnew.js b/core/src/OCP/whatsnew.js
new file mode 100644
index 00000000000..837cb23217c
--- /dev/null
+++ b/core/src/OCP/whatsnew.js
@@ -0,0 +1,132 @@
+/**
+ * @copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de>
+ *
+ * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ */
+
+import _ from 'underscore'
+import $ from 'jquery'
+
+import OC from '../OC/index'
+
+export function query (options) {
+ options = options || {};
+ var dismissOptions = options.dismiss || {};
+ $.ajax({
+ type: 'GET',
+ url: options.url || OC.linkToOCS('core', 2) + 'whatsnew?format=json',
+ success: options.success || function (data, statusText, xhr) {
+ onQuerySuccess(data, statusText, xhr, dismissOptions);
+ },
+ error: options.error || onQueryError
+ });
+}
+
+export function dismiss (version, options) {
+ options = options || {};
+ $.ajax({
+ type: 'POST',
+ url: options.url || OC.linkToOCS('core', 2) + 'whatsnew',
+ data: {version: encodeURIComponent(version)},
+ success: options.success || onDismissSuccess,
+ error: options.error || onDismissError
+ });
+ // remove element immediately
+ $('.whatsNewPopover').remove();
+}
+
+function onQuerySuccess (data, statusText, xhr, dismissOptions) {
+ console.debug('querying Whats New data was successful: ' + statusText);
+ console.debug(data);
+
+ if (xhr.status !== 200) {
+ return;
+ }
+
+ var item, menuItem, text, icon;
+
+ var div = document.createElement('div');
+ div.classList.add('popovermenu', 'open', 'whatsNewPopover', 'menu-left');
+
+ var list = document.createElement('ul');
+
+ // header
+ item = document.createElement('li');
+ menuItem = document.createElement('span');
+ menuItem.className = "menuitem";
+
+ text = document.createElement('span');
+ text.innerText = t('core', 'New in') + ' ' + data['ocs']['data']['product'];
+ text.className = 'caption';
+ menuItem.appendChild(text);
+
+ icon = document.createElement('span');
+ icon.className = 'icon-close';
+ icon.onclick = function () {
+ dismiss(data['ocs']['data']['version'], dismissOptions);
+ };
+ menuItem.appendChild(icon);
+
+ item.appendChild(menuItem);
+ list.appendChild(item);
+
+ // Highlights
+ for (var i in data['ocs']['data']['whatsNew']['regular']) {
+ var whatsNewTextItem = data['ocs']['data']['whatsNew']['regular'][i];
+ item = document.createElement('li');
+
+ menuItem = document.createElement('span');
+ menuItem.className = "menuitem";
+
+ icon = document.createElement('span');
+ icon.className = 'icon-checkmark';
+ menuItem.appendChild(icon);
+
+ text = document.createElement('p');
+ text.innerHTML = _.escape(whatsNewTextItem);
+ menuItem.appendChild(text);
+
+ item.appendChild(menuItem);
+ list.appendChild(item);
+ }
+
+ // Changelog URL
+ if (!_.isUndefined(data['ocs']['data']['changelogURL'])) {
+ item = document.createElement('li');
+
+ menuItem = document.createElement('a');
+ menuItem.href = data['ocs']['data']['changelogURL'];
+ menuItem.rel = 'noreferrer noopener';
+ menuItem.target = '_blank';
+
+ icon = document.createElement('span');
+ icon.className = 'icon-link';
+ menuItem.appendChild(icon);
+
+ text = document.createElement('span');
+ text.innerText = t('core', 'View changelog');
+ menuItem.appendChild(text);
+
+ item.appendChild(menuItem);
+ list.appendChild(item);
+ }
+
+ div.appendChild(list);
+ document.body.appendChild(div);
+}
+
+function onQueryError (x, t, e) {
+ console.debug('querying Whats New Data resulted in an error: ' + t + e);
+ console.debug(x);
+}
+
+function onDismissSuccess (data) {
+ //noop
+}
+
+function onDismissError (data) {
+ console.debug('dismissing Whats New data resulted in an error: ' + data);
+} \ No newline at end of file