aboutsummaryrefslogtreecommitdiffstats
path: root/apps/settings/js/federationscopemenu.js
diff options
context:
space:
mode:
Diffstat (limited to 'apps/settings/js/federationscopemenu.js')
-rw-r--r--apps/settings/js/federationscopemenu.js143
1 files changed, 143 insertions, 0 deletions
diff --git a/apps/settings/js/federationscopemenu.js b/apps/settings/js/federationscopemenu.js
new file mode 100644
index 00000000000..20974caa762
--- /dev/null
+++ b/apps/settings/js/federationscopemenu.js
@@ -0,0 +1,143 @@
+/**
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+/* global OC, Handlebars */
+(function() {
+
+ /**
+ * Construct a new FederationScopeMenu instance
+ * @constructs FederationScopeMenu
+ * @memberof OC.Settings
+ * @param {object} options
+ * @param {array.<string>} [options.excludedScopes] array of excluded scopes
+ */
+ var FederationScopeMenu = OC.Backbone.View.extend({
+ tagName: 'div',
+ className: 'federationScopeMenu popovermenu bubble menu menu-center',
+ field: undefined,
+ _scopes: undefined,
+ _excludedScopes: [],
+
+ initialize: function(options) {
+ this.field = options.field;
+ this._scopes = [
+ {
+ name: 'v2-private',
+ displayName: t('settings', 'Private'),
+ tooltip: t('settings', 'Only visible to people matched via phone number integration through Talk on mobile'),
+ iconClass: 'icon-phone',
+ active: false
+ },
+ {
+ name: 'v2-local',
+ displayName: t('settings', 'Local'),
+ tooltip: t('settings', 'Only visible to people on this instance and guests'),
+ iconClass: 'icon-password',
+ active: false
+ },
+ {
+ name: 'v2-federated',
+ displayName: t('settings', 'Federated'),
+ tooltip: t('settings', 'Only synchronize to trusted servers'),
+ iconClass: 'icon-contacts-dark',
+ active: false
+ },
+ {
+ name: 'v2-published',
+ displayName: t('settings', 'Published'),
+ tooltip: t('settings', 'Synchronize to trusted servers and the global and public address book'),
+ iconClass: 'icon-link',
+ active: false
+ }
+ ];
+
+ if (options.excludedScopes && options.excludedScopes.length) {
+ this._excludedScopes = options.excludedScopes
+ }
+ },
+
+ /**
+ * Current context
+ *
+ * @type OCA.Files.FileActionContext
+ */
+ _context: null,
+
+ events: {
+ 'click a.action': '_onSelectScope',
+ 'keydown a.action': '_onSelectScopeKeyboard'
+ },
+
+ /**
+ * Event handler whenever an action has been clicked within the menu
+ *
+ * @param {Object} event event object
+ */
+ _onSelectScope: function(event) {
+ var $target = $(event.currentTarget);
+ if (!$target.hasClass('menuitem')) {
+ $target = $target.closest('.menuitem');
+ }
+
+ this.trigger('select:scope', $target.data('action'));
+
+ OC.hideMenus();
+ },
+
+ _onSelectScopeKeyboard: function(event) {
+ if (event.keyCode === 13 || event.keyCode === 32) {
+ // Enter and space can be used to select a scope
+ event.preventDefault();
+ this._onSelectScope(event);
+ }
+ },
+
+ /**
+ * Renders the menu with the currently set items
+ */
+ render: function() {
+ this.$el.html(OC.Settings.Templates['federationscopemenu']({
+ items: this._scopes
+ }));
+ },
+
+ /**
+ * Displays the menu
+ */
+ show: function(context) {
+ this._context = context;
+ var currentlyActiveValue = $('#'+context.target.closest('form').id).find('input[type="hidden"]')[0].value;
+
+ for(var i in this._scopes) {
+ if (this._scopes[i].name === currentlyActiveValue) {
+ this._scopes[i].active = true;
+ } else {
+ this._scopes[i].active = false;
+ }
+
+ var isExcludedScope = this._excludedScopes.includes(this._scopes[i].name)
+ if (isExcludedScope && !this._scopes[i].active) {
+ this._scopes[i].hidden = true
+ } else if (isExcludedScope && this._scopes[i].active) {
+ this._scopes[i].hidden = false
+ this._scopes[i].disabled = true
+ } else {
+ this._scopes[i].hidden = false
+ this._scopes[i].disabled = false
+ }
+ }
+
+ this.render();
+ this.$el.removeClass('hidden');
+
+ OC.showMenu(null, this.$el);
+ }
+ });
+
+ OC.Settings = OC.Settings || {};
+ OC.Settings.FederationScopeMenu = FederationScopeMenu;
+
+})();