Continued the upgrade to proper router link and added navigationItem router linkTo capability

Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
This commit is contained in:
John Molakvoæ (skjnldsv) 2018-04-14 10:34:40 +02:00
parent 2963fdc879
commit 45f1efe953
No known key found for this signature in database
GPG Key ID: 60C25B8C072916CF
13 changed files with 74 additions and 376 deletions

View File

@ -1,157 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Joas Schilling <coding@schilljs.com>
* @author Lukas Reschke <lukas@statuscode.ch>
* @author Morris Jobke <hey@morrisjobke.de>
*
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* 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, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
namespace OC\Settings\Controller;
use OC\AppFramework\Http;
use OC\Group\MetaData;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\DataResponse;
use OCP\IGroup;
use OCP\IGroupManager;
use OCP\IL10N;
use OCP\IRequest;
use OCP\IUserSession;
/**
* @package OC\Settings\Controller
*/
class GroupsController extends Controller {
/** @var IGroupManager */
private $groupManager;
/** @var IL10N */
private $l10n;
/** @var IUserSession */
private $userSession;
/** @var bool */
private $isAdmin;
/**
* @param string $appName
* @param IRequest $request
* @param IGroupManager $groupManager
* @param IUserSession $userSession
* @param bool $isAdmin
* @param IL10N $l10n
*/
public function __construct($appName,
IRequest $request,
IGroupManager $groupManager,
IUserSession $userSession,
$isAdmin,
IL10N $l10n) {
parent::__construct($appName, $request);
$this->groupManager = $groupManager;
$this->userSession = $userSession;
$this->isAdmin = $isAdmin;
$this->l10n = $l10n;
}
/**
* @NoAdminRequired
*
* @param string $pattern
* @param bool $filterGroups
* @param int $sortGroups
* @return DataResponse
*/
public function index($pattern = '', $filterGroups = false, $sortGroups = MetaData::SORT_USERCOUNT) {
$groupPattern = $filterGroups ? $pattern : '';
$groupsInfo = new MetaData(
$this->userSession->getUser()->getUID(),
$this->isAdmin,
$this->groupManager,
$this->userSession
);
$groupsInfo->setSorting($sortGroups);
list($adminGroups, $groups) = $groupsInfo->get($groupPattern, $pattern);
return new DataResponse(
array(
'data' => array('adminGroups' => $adminGroups, 'groups' => $groups)
)
);
}
/**
* @PasswordConfirmationRequired
* @param string $id
* @return DataResponse
*/
public function create($id) {
if($this->groupManager->groupExists($id)) {
return new DataResponse(
array(
'message' => (string)$this->l10n->t('Group already exists.')
),
Http::STATUS_CONFLICT
);
}
$group = $this->groupManager->createGroup($id);
if($group instanceof IGroup) {
return new DataResponse(['groupname' => $group->getDisplayName()], Http::STATUS_CREATED);
}
return new DataResponse(
array(
'status' => 'error',
'data' => array(
'message' => (string)$this->l10n->t('Unable to add group.')
)
),
Http::STATUS_FORBIDDEN
);
}
/**
* @PasswordConfirmationRequired
* @param string $id
* @return DataResponse
*/
public function destroy($id) {
$group = $this->groupManager->get($id);
if ($group) {
if ($group->delete()) {
return new DataResponse(
array(
'status' => 'success',
'data' => ['groupname' => $group->getDisplayName()]
),
Http::STATUS_NO_CONTENT
);
}
}
return new DataResponse(
array(
'status' => 'error',
'data' => array(
'message' => (string)$this->l10n->t('Unable to delete group.')
),
),
Http::STATUS_FORBIDDEN
);
}
}

View File

@ -170,15 +170,16 @@ class UsersController extends Controller {
public function usersListByGroup() {
return $this->usersList();
}
/**
* @NoCSRFRequired
* @NoAdminRequired
*
* Display users list template
*
* @return TemplateResponse
*/
public function usersList() {
/**
* @NoCSRFRequired
* @NoAdminRequired
*
* Display users list template
*
* @return TemplateResponse
*/
public function usersList() {
$user = $this->userSession->getUser();
$uid = $user->getUID();
@ -243,7 +244,7 @@ class UsersController extends Controller {
$disabledUsers = $isLDAPUsed ? 0 : $this->userManager->countDisabledUsers();
$disabledUsersGroup = [
'id' => '_disabled',
'id' => 'disabled',
'name' => 'Disabled users',
'usercount' => $disabledUsers
];
@ -261,10 +262,9 @@ class UsersController extends Controller {
\OC::$server->getEventDispatcher()->dispatch('OC\Settings\Users::loadAdditionalScripts');
/* TOTAL USERS COUNT */
function addition($v, $w) {
return $v+$w;
}
$userCount = array_reduce($this->userManager->countUsers(), 'addition', 0);
$userCount = array_reduce($this->userManager->countUsers(), function($v, $w) {
return $v + (int)$w;
}, 0);
/* LANGUAGES */
$languages = $this->l10nFactory->getLanguages();

View File

@ -1263,13 +1263,13 @@ doesnotexist:-o-prefocus, .strengthify-wrapper {
/* Hack to override the javascript orderBy */
#usergrouplist > li {
order: 4;
&#_everyone {
&#everyone {
order:1;
}
&#admin {
order:2;
}
&#_disabled {
&#disabled {
order:3;
}
}

File diff suppressed because one or more lines are too long

View File

@ -5,11 +5,17 @@
<div v-if="item.bullet" class="app-navigation-entry-bullet" :style="{ backgroundColor: item.bullet }"></div>
<!-- Main link -->
<a :href="(item.href) ? item.href : '#' " @click="toggleCollapse" :class="item.icon" >
<a v-if="item.href" :href="(item.href) ? item.href : '#' " @click="toggleCollapse" :class="item.icon" >
<img v-if="item.iconUrl" :alt="item.text" :src="item.iconUrl">
{{item.text}}
</a>
<!-- Router link if specified. href OR router -->
<router-link :to="item.router" v-else-if="item.router" :class="item.icon" >
<img v-if="item.iconUrl" :alt="item.text" :src="item.iconUrl">
{{item.text}}
</router-link>
<!-- Popover, counter and button(s) -->
<div v-if="item.utils" class="app-navigation-entry-utils">
<ul>

View File

@ -156,11 +156,11 @@ export default {
return this.$store.getters.getServerData;
},
filteredUsers() {
if (this.$route.hash === '#group_disabled') {
if (this.selectedGroup === 'disabled') {
let disabledUsers = this.users.filter(user => user.enabled !== true);
if (disabledUsers.length===0 && this.$refs.infiniteLoading && this.$refs.infiniteLoading.isComplete) {
// disabled group is empty, redirection to all users
window.location.hash = '#group_everyone';
this.$router.push('users');
this.$refs.infiniteLoading.$emit('$InfiniteLoading:reset');
}
return disabledUsers;
@ -169,7 +169,7 @@ export default {
},
groups() {
// data provided php side + remove the disabled group
return this.$store.getters.getGroups.filter(group => group.id !== '_disabled');
return this.$store.getters.getGroups.filter(group => group.id !== 'disabled');
},
subAdminsGroups() {
// data provided php side

View File

@ -11,7 +11,7 @@ Vue.prototype.t = t;
Vue.prototype.OC = OC;
Vue.prototype.oc_userconfig = oc_userconfig;
window.app = new Vue({
const app = new Vue({
router,
store,
render: h => h(App)

View File

@ -15,14 +15,14 @@ Vue.use(Router);
export default new Router({
mode: 'history',
base: window.location.pathname,
parseQuery: function(query) {console.log(query);},
routes: [{
path: '/settings/users',
path: '(/index.php)?/settings/users',
component: Users,
props: true,
name: 'users',
children: [{
path: ':selectedGroup',
name: 'group',
component: Users
},
]

View File

@ -37,6 +37,8 @@ export default {
* .then((response) => {API success})
* .catch((error) => {throw error;});
* }).catch((error) => {requireAdmin OR API failure});
*
* @returns {Promise}
*/
requireAdmin() {
return new Promise(function(resolve, reject) {

View File

@ -90,7 +90,7 @@ const mutations = {
enableDisableUser(state, { userid, enabled }) {
state.users.find(user => user.id == userid).enabled = enabled;
// increment or not
state.groups.find(group => group.id == '_disabled').usercount += enabled ? -1 : 1;
state.groups.find(group => group.id == 'disabled').usercount += enabled ? -1 : 1;
state.userCount += enabled ? 1 : -1;
console.log(enabled);
},
@ -144,7 +144,7 @@ const actions = {
* @param {int} options.limit List number to return from offset
* @param {string} options.search Search amongst users
* @param {string} options.group Get users from group
* @returns {Promise}
* @returns Promise
*/
getUsers(context, { offset, limit, search, group }) {
search = typeof search === 'string' ? search : '';
@ -179,7 +179,7 @@ const actions = {
* @param {Object} options
* @param {int} options.offset List offset to request
* @param {int} options.limit List number to return from offset
* @returns {Promise}
* @returns Promise
*/
getUsersFromList(context, { offset, limit, search }) {
search = typeof search === 'string' ? search : '';
@ -201,7 +201,7 @@ const actions = {
* @param {Object} options
* @param {int} options.offset List offset to request
* @param {int} options.limit List number to return from offset
* @returns {Promise}
* @returns Promise
*/
getUsersFromGroup(context, { groupid, offset, limit }) {
return api.get(OC.linkToOCS(`cloud/users/${groupid}/details?offset=${offset}&limit=${limit}`, 2))
@ -221,7 +221,7 @@ const actions = {
*
* @param {Object} context
* @param {string} gid Group id
* @returns {Promise}
* @returns Promise
*/
addGroup(context, gid) {
return api.requireAdmin().then((response) => {
@ -236,7 +236,7 @@ const actions = {
*
* @param {Object} context
* @param {string} gid Group id
* @returns {Promise}
* @returns Promise
*/
removeGroup(context, gid) {
return api.requireAdmin().then((response) => {
@ -253,7 +253,7 @@ const actions = {
* @param {Object} options
* @param {string} options.userid User id
* @param {string} options.gid Group id
* @returns {Promise}
* @returns Promise
*/
addUserGroup(context, { userid, gid }) {
return api.requireAdmin().then((response) => {
@ -270,7 +270,7 @@ const actions = {
* @param {Object} options
* @param {string} options.userid User id
* @param {string} options.gid Group id
* @returns {Promise}
* @returns Promise
*/
removeUserGroup(context, { userid, gid }) {
return api.requireAdmin().then((response) => {
@ -287,7 +287,7 @@ const actions = {
* @param {Object} options
* @param {string} options.userid User id
* @param {string} options.gid Group id
* @returns {Promise}
* @returns Promise
*/
addUserSubAdmin(context, { userid, gid }) {
return api.requireAdmin().then((response) => {
@ -304,7 +304,7 @@ const actions = {
* @param {Object} options
* @param {string} options.userid User id
* @param {string} options.gid Group id
* @returns {Promise}
* @returns Promise
*/
removeUserSubAdmin(context, { userid, gid }) {
return api.requireAdmin().then((response) => {
@ -319,7 +319,7 @@ const actions = {
*
* @param {Object} context
* @param {string} userid User id
* @returns {Promise}
* @returns Promise
*/
deleteUser(context, { userid }) {
return api.requireAdmin().then((response) => {
@ -340,7 +340,7 @@ const actions = {
* @param {string} options.groups User groups
* @param {string} options.subadmin User subadmin groups
* @param {string} options.quota User email
* @returns {Promise}
* @returns Promise
*/
addUser({context, dispatch}, { userid, password, email, groups, subadmin, quota, language }) {
return api.requireAdmin().then((response) => {
@ -355,7 +355,7 @@ const actions = {
*
* @param {Object} context
* @param {string} userid User id
* @returns {Promise}
* @returns Promise
*/
addUserData(context, userid) {
return api.requireAdmin().then((response) => {
@ -371,7 +371,7 @@ const actions = {
* @param {Object} options
* @param {string} options.userid User id
* @param {boolean} options.enabled User enablement status
* @returns {Promise}
* @returns Promise
*/
enableDisableUser(context, { userid, enabled = true }) {
let userStatus = enabled ? 'enable' : 'disable';
@ -390,7 +390,7 @@ const actions = {
* @param {string} options.userid User id
* @param {string} options.key User field to edit
* @param {string} options.value Value of the change
* @returns {Promise}
* @returns Promise
*/
setUserData(context, { userid, key, value }) {
let allowedEmpty = ['email', 'displayname'];

View File

@ -129,17 +129,21 @@ export default {
groups = groups.map(group => {
let item = {};
item.id = group.id.replace(' ', '_');
item.classes = [];
item.href = '#group'+group.id.replace(' ', '_');
item.text = group.name;
item.utils = {counter: group.usercount};
if (item.id !== 'admin' && item.id !== '_disabled') {
// add delete button
item.classes = []; // empty classes, active will be set later
item.router = { // router link to
name: 'group',
params: {selectedGroup: group.id}
};
item.text = group.name; // group name
item.utils = {counter: group.usercount}; // users count
if (item.id !== 'admin' && item.id !== 'disabled') {
// add delete button on real groups
let self = this;
item.utils.actions = [{
icon: 'icon-delete',
text: t('settings', 'Remove group'),
action: function(){}
action: () => {}
}];
};
return item;
@ -147,28 +151,29 @@ export default {
// Adjust data
let adminGroup = groups.find(group => group.id == 'admin');
let disabledGroup = groups.find(group => group.id == '_disabled');
let disabledGroupIndex = groups.findIndex(group => group.id == 'disabled');
let disabledGroup = groups[disabledGroupIndex];
if (adminGroup.text) {
adminGroup.text = t('settings', 'Admins'); // rename admin group
}
if (disabledGroup.text) {
disabledGroup.text = t('settings', 'Disabled users'); // rename disabled group
if (disabledGroup.utils.counter === 0) {
groups.splice(groups.findIndex(group => group.id == '_disabled'), 1); // remove disabled if empty
groups.splice(disabledGroupIndex, 1); // remove disabled if empty
}
}
// Add everyone group
groups.unshift({
id: '_everyone',
id: 'everyone',
classes: [],
href:'#group_everyone',
router: {name:'users'},
text: t('settings', 'Everyone'),
utils: {counter: this.userCount}
});
// Set current group as active
let activeGroup = groups.findIndex(group => group.href === this.$route.hash);
let activeGroup = groups.findIndex(group => group.id === this.selectedGroup);
if (activeGroup >= 0) {
groups[activeGroup].classes.push('active');
} else {

View File

@ -10,10 +10,8 @@
* then serve this file as template and include your data into
* the $serverData template variable
*
* $tmpl = new OC_Template('settings', 'settings', 'user');
* $tmpl->assign('serverData', $serverData);
* $tmpl->printPage();
* return new TemplateResponse('settings', 'settings', ['serverData' => $serverData]);
*
*/
script('settings', 'main');

View File

@ -1,156 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
* @author Bart Visscher <bartv@thisnet.nl>
* @author Clark Tomlinson <fallen013@gmail.com>
* @author Daniel Molkentin <daniel@molkentin.de>
* @author Georg Ehrke <oc.list@georgehrke.com>
* @author Jakob Sack <mail@jakobsack.de>
* @author Joas Schilling <coding@schilljs.com>
* @author Jörn Friedrich Dreyer <jfd@butonic.de>
* @author Lukas Reschke <lukas@statuscode.ch>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Robin Appelman <robin@icewind.nl>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Stephan Peijnik <speijnik@anexia-it.com>
* @author Thomas Müller <thomas.mueller@tmit.eu>
* @author Thomas Pulzer <t.pulzer@kniel.de>
* @author John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
*
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* 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, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
OC_Util::checkSubAdminUser();
\OC::$server->getNavigationManager()->setActiveEntry('core_users');
$userManager = \OC::$server->getUserManager();
$groupManager = \OC::$server->getGroupManager();
$appManager = \OC::$server->getAppManager();
$config = \OC::$server->getConfig();
$l10nFactory = \OC::$server->getL10NFactory();
/* SORT OPTION: SORT_USERCOUNT or SORT_GROUPNAME */
$sortGroupsBy = \OC\Group\MetaData::SORT_USERCOUNT;
if ($config->getSystemValue('sort_groups_by_name', false)) {
$sortGroupsBy = \OC\Group\MetaData::SORT_GROUPNAME;
} else {
$isLDAPUsed = false;
if ($appManager->isEnabledForUser('user_ldap')) {
$isLDAPUsed =
$groupManager->isBackendUsed('\OCA\User_LDAP\Group_LDAP')
|| $groupManager->isBackendUsed('\OCA\User_LDAP\Group_Proxy');
if ($isLDAPUsed) {
// LDAP user count can be slow, so we sort by group name here
$sortGroupsBy = \OC\Group\MetaData::SORT_GROUPNAME;
}
}
}
/* ENCRYPTION CONFIG */
$isEncryptionEnabled = \OC::$server->getEncryptionManager()->isEnabled();
$useMasterKey = $config->getAppValue('encryption', 'useMasterKey', true);
// If masterKey enabled, then you can change password. This is to avoid data loss!
$canChangePassword = ($isEncryptionEnabled && $useMasterKey) || $useMasterKey;
/* GROUPS */
$uid = \OC_User::getUser();
$isAdmin = \OC_User::isAdminUser($uid);
$groupsInfo = new \OC\Group\MetaData(
$uid,
$isAdmin,
$groupManager,
\OC::$server->getUserSession()
);
$groupsInfo->setSorting($sortGroupsBy);
list($adminGroup, $groups) = $groupsInfo->get();
if ($isAdmin) {
$subAdmins = \OC::$server->getGroupManager()->getSubAdmin()->getAllSubAdmins();
// New class returns IUser[] so convert back
$result = [];
foreach ($subAdmins as $subAdmin) {
$result[] = [
'gid' => $subAdmin['group']->getGID(),
'uid' => $subAdmin['user']->getUID(),
];
}
$subAdmins = $result;
} else {
/* Retrieve group IDs from $groups array, so we can pass that information into OC_Group::displayNamesInGroups() */
$gids = array();
foreach($groups as $group) {
if (isset($group['id'])) {
$gids[] = $group['id'];
}
}
$subAdmins = false;
}
$disabledUsers = $isLDAPUsed ? 0 : $userManager->countDisabledUsers();
$disabledUsersGroup = [
'id' => '_disabled',
'name' => 'Disabled users',
'usercount' => $disabledUsers
];
$allGroups = array_merge_recursive($adminGroup, $groups);
/* QUOTAS PRESETS */
$quotaPreset = $config->getAppValue('files', 'quota_preset', '1 GB, 5 GB, 10 GB');
$quotaPreset = explode(',', $quotaPreset);
foreach ($quotaPreset as &$preset) {
$preset = trim($preset);
}
$quotaPreset = array_diff($quotaPreset, array('default', 'none'));
$defaultQuota = $config->getAppValue('files', 'default_quota', 'none');
\OC::$server->getEventDispatcher()->dispatch('OC\Settings\Users::loadAdditionalScripts');
/* TOTAL USERS COUNT */
function addition($v, $w) {
return $v+$w;
}
$userCount = array_reduce($userManager->countUsers(), 'addition', 0);
/* LANGUAGES */
$languages = $l10nFactory->getLanguages();
/* FINAL DATA */
$serverData = array();
// groups
$serverData['groups'] = array_merge_recursive($adminGroup, [$disabledUsersGroup], $groups);
$serverData['subadmingroups'] = $groups;
// Various data
$serverData['subadmins'] = $subAdmins;
$serverData['sortGroups'] = $sortGroupsBy;
$serverData['quotaPreset'] = $quotaPreset;
$serverData['userCount'] = $userCount-$disabledUsers;
$serverData['languages'] = $languages;
$serverData['defaultLanguage'] = $config->getSystemValue('default_language', 'en');
// Settings
$serverData['defaultQuota'] = $defaultQuota;
$serverData['canChangePassword'] = $canChangePassword;
// print template + vue + serve data
$tmpl = new OC_Template('settings', 'settings', 'user');
$tmpl->assign('serverData', $serverData);
$tmpl->printPage();