Initial commit: Minimal Profile app for Nextcloud 33
This commit is contained in:
78
README.md
Normal file
78
README.md
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# Minimal Profile
|
||||||
|
|
||||||
|
A Nextcloud 33 app that hides profile fields to create a minimal user profile.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Hide profile fields like pronouns, social links, and more
|
||||||
|
- Works on personal settings page
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
1. Copy the `minimalprofile` folder to your Nextcloud `apps/` directory
|
||||||
|
2. Enable the app:
|
||||||
|
```bash
|
||||||
|
occ app:enable minimalprofile
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Set hidden fields using OCC config command
|
||||||
|
|
||||||
|
Hide the pronouns field:
|
||||||
|
```bash
|
||||||
|
occ config:app:set minimalprofile hidden_fields --value='["pronouns"]'
|
||||||
|
```
|
||||||
|
|
||||||
|
Hide multiple fields:
|
||||||
|
```bash
|
||||||
|
occ config:app:set minimalprofile hidden_fields --value='["pronouns","role","headline"]'
|
||||||
|
```
|
||||||
|
|
||||||
|
### View hidden fields
|
||||||
|
```bash
|
||||||
|
occ config:app:get minimalprofile hidden_fields
|
||||||
|
```
|
||||||
|
|
||||||
|
### Show all fields (reset)
|
||||||
|
```bash
|
||||||
|
occ config:app:delete minimalprofile hidden_fields
|
||||||
|
```
|
||||||
|
|
||||||
|
## Available Fields
|
||||||
|
|
||||||
|
| Field | Description |
|
||||||
|
|-------|-------------|
|
||||||
|
| `pronouns` | User pronouns (e.g., she/her) |
|
||||||
|
| `role` | Job title / role |
|
||||||
|
| `headline` | Personal tagline |
|
||||||
|
| `biography` | User bio |
|
||||||
|
| `organisation` | Organization |
|
||||||
|
| `phone` | Phone number |
|
||||||
|
| `address` | Physical address |
|
||||||
|
| `birthdate` | Birthdate |
|
||||||
|
| `website` | Website URL |
|
||||||
|
| `twitter` | Twitter handle |
|
||||||
|
| `fediverse` | Fediverse handle |
|
||||||
|
| `location` | Location |
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
Hide just pronouns:
|
||||||
|
```bash
|
||||||
|
occ config:app:set minimalprofile hidden_fields --value='["pronouns"]'
|
||||||
|
```
|
||||||
|
|
||||||
|
Hide pronouns, role, and headline:
|
||||||
|
```bash
|
||||||
|
occ config:app:set minimalprofile hidden_fields --value='["pronouns","role","headline"]'
|
||||||
|
```
|
||||||
|
|
||||||
|
Hide all extra social fields:
|
||||||
|
```bash
|
||||||
|
occ config:app:set minimalprofile hidden_fields --value='["pronouns","role","headline","biography","website","twitter","fediverse"]'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Compatibility
|
||||||
|
|
||||||
|
- Nextcloud 33
|
||||||
20
appinfo/info.xml
Normal file
20
appinfo/info.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<info xmlns="http://nextcloud.org/ns">
|
||||||
|
<id>minimalprofile</id>
|
||||||
|
<name>Minimal Profile</name>
|
||||||
|
<summary>Hides profile fields to create a minimal user profile</summary>
|
||||||
|
<description>Allows administrators to hide profile fields like pronouns, social links, etc.</description>
|
||||||
|
<version>1.0.0</version>
|
||||||
|
<licence>AGPL</licence>
|
||||||
|
<author>Your Name</author>
|
||||||
|
<namespace>MinimalProfile</namespace>
|
||||||
|
<categories>
|
||||||
|
<category>settings</category>
|
||||||
|
</categories>
|
||||||
|
<dependencies>
|
||||||
|
<nextcloud min-version="33" max-version="33"/>
|
||||||
|
</dependencies>
|
||||||
|
<scripts>
|
||||||
|
<script>minimalprofile</script>
|
||||||
|
</scripts>
|
||||||
|
</info>
|
||||||
4
appinfo/routes.xml
Normal file
4
appinfo/routes.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<routes>
|
||||||
|
<route url="/api/v1/hidden-fields" method="GET" controller="OCA\MinimalProfile\Controller\ApiController:getHiddenFields"/>
|
||||||
|
</routes>
|
||||||
21
composer.json
Normal file
21
composer.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "nextcloud/minimalprofile",
|
||||||
|
"description": "Hides profile fields to create a minimal user profile",
|
||||||
|
"type": "nextcloud-app",
|
||||||
|
"license": "AGPL-3.0-or-later",
|
||||||
|
"require": {
|
||||||
|
"nextcloud/ocp": "dev-master"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"nextcloud/coding-standard": "^1.2.0"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"OCA\\MinimalProfile\\": "lib/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"cs:check": "php-cs-fixer fix --dry-run --diff",
|
||||||
|
"cs:fix": "php-cs-fixer fix"
|
||||||
|
}
|
||||||
|
}
|
||||||
53
js/minimalprofile.js
Normal file
53
js/minimalprofile.js
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var fieldSelectors = {
|
||||||
|
'pronouns': 'input[id="account-property-pronouns"]',
|
||||||
|
'role': 'input[id="account-property-role"]',
|
||||||
|
'headline': 'input[id="account-property-headline"]',
|
||||||
|
'biography': 'input[id="account-property-biography"]',
|
||||||
|
'organisation': 'input[id="account-property-organisation"]',
|
||||||
|
'phone': 'input[id="account-property-phone"]',
|
||||||
|
'address': 'input[id="account-property-address"]',
|
||||||
|
'birthdate': 'input[id="account-property-birthdate"]',
|
||||||
|
'website': 'input[id="account-property-website"]',
|
||||||
|
'twitter': 'input[id="account-property-twitter"]',
|
||||||
|
'fediverse': 'input[id="account-property-fediverse"]',
|
||||||
|
'location': 'input[id="account-property-location"]'
|
||||||
|
};
|
||||||
|
|
||||||
|
function hideFields(hiddenFields) {
|
||||||
|
hiddenFields.forEach(function(field) {
|
||||||
|
var selector = fieldSelectors[field];
|
||||||
|
if (selector) {
|
||||||
|
var elements = document.querySelectorAll(selector);
|
||||||
|
elements.forEach(function(el) {
|
||||||
|
var parent = el.parentElement;
|
||||||
|
while (parent && !parent.classList.contains('personal-settings-setting-box')) {
|
||||||
|
parent = parent.parentElement;
|
||||||
|
if (!parent) return;
|
||||||
|
}
|
||||||
|
if (parent && parent.classList.contains('personal-settings-setting-box')) {
|
||||||
|
parent.style.display = 'none';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
OCP.registerLoadEndpoint(function() {
|
||||||
|
var req = new XMLHttpRequest();
|
||||||
|
req.onload = function() {
|
||||||
|
if (req.status === 200) {
|
||||||
|
try {
|
||||||
|
var data = JSON.parse(req.responseText);
|
||||||
|
if (data.hiddenFields && data.hiddenFields.length > 0) {
|
||||||
|
hideFields(data.hiddenFields);
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
req.open('GET', OC.generateUrl('/apps/minimalprofile/api/v1/hidden-fields'));
|
||||||
|
req.send();
|
||||||
|
});
|
||||||
|
})();
|
||||||
25
lib/AppInfo/Application.php
Normal file
25
lib/AppInfo/Application.php
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace OCA\MinimalProfile\AppInfo;
|
||||||
|
|
||||||
|
use OCP\AppFramework\App;
|
||||||
|
use OCP\AppFramework\Bootstrap\IBootContext;
|
||||||
|
use OCP\AppFramework\Bootstrap\IBootstrap;
|
||||||
|
use OCP\AppFramework\Bootstrap\IRegistrationContext;
|
||||||
|
|
||||||
|
class Application extends App implements IBootstrap {
|
||||||
|
|
||||||
|
public const APP_ID = 'minimalprofile';
|
||||||
|
|
||||||
|
public function __construct(array $urlParams = []) {
|
||||||
|
parent::__construct(self::APP_ID, $urlParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function register(IRegistrationContext $context): void {
|
||||||
|
}
|
||||||
|
|
||||||
|
public function boot(IBootContext $context): void {
|
||||||
|
}
|
||||||
|
}
|
||||||
30
lib/Controller/ApiController.php
Normal file
30
lib/Controller/ApiController.php
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace OCA\MinimalProfile\Controller;
|
||||||
|
|
||||||
|
use OCP\AppFramework\Controller;
|
||||||
|
use OCP\AppFramework\Http\JSONResponse;
|
||||||
|
use OCP\IConfig;
|
||||||
|
use OCP\IRequest;
|
||||||
|
|
||||||
|
class ApiController extends Controller {
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
string $appName,
|
||||||
|
IRequest $request,
|
||||||
|
private IConfig $config,
|
||||||
|
) {
|
||||||
|
parent::__construct($appName, $request);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getHiddenFields(): JSONResponse {
|
||||||
|
$value = $this->config->getAppValue('minimalprofile', 'hidden_fields', '');
|
||||||
|
$hiddenFields = $value !== '' ? json_decode($value, true) ?? [] : [];
|
||||||
|
|
||||||
|
return new JSONResponse([
|
||||||
|
'hiddenFields' => $hiddenFields,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user