mirror of
https://github.com/flarum/framework.git
synced 2025-01-28 01:13:00 +08:00
Add README documentation to ExtensionPage (#3094)
Co-authored-by: Alexander Skvortsov <sasha.skvortsov109@gmail.com>
This commit is contained in:
parent
530bcb24c5
commit
ddeaf37f49
|
@ -11,6 +11,7 @@ import LoadingModal from './LoadingModal';
|
||||||
import ExtensionPermissionGrid from './ExtensionPermissionGrid';
|
import ExtensionPermissionGrid from './ExtensionPermissionGrid';
|
||||||
import isExtensionEnabled from '../utils/isExtensionEnabled';
|
import isExtensionEnabled from '../utils/isExtensionEnabled';
|
||||||
import AdminPage from './AdminPage';
|
import AdminPage from './AdminPage';
|
||||||
|
import ReadmeModal from './ReadmeModal';
|
||||||
|
|
||||||
export default class ExtensionPage extends AdminPage {
|
export default class ExtensionPage extends AdminPage {
|
||||||
oninit(vnode) {
|
oninit(vnode) {
|
||||||
|
@ -196,6 +197,22 @@ export default class ExtensionPage extends AdminPage {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const extension = this.extension;
|
||||||
|
items.add(
|
||||||
|
'readme',
|
||||||
|
Button.component(
|
||||||
|
{
|
||||||
|
icon: 'fab fa-readme',
|
||||||
|
class: 'Readme-link',
|
||||||
|
onclick() {
|
||||||
|
app.modal.show(ReadmeModal, { extension });
|
||||||
|
},
|
||||||
|
},
|
||||||
|
app.translator.trans('core.admin.extension.readme.button_label')
|
||||||
|
),
|
||||||
|
10
|
||||||
|
);
|
||||||
|
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
50
framework/core/js/src/admin/components/ReadmeModal.js
Normal file
50
framework/core/js/src/admin/components/ReadmeModal.js
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
import app from '../../admin/app';
|
||||||
|
import Modal from '../../common/components/Modal';
|
||||||
|
import LoadingIndicator from '../../common/components/LoadingIndicator';
|
||||||
|
import Placeholder from '../../common/components/Placeholder';
|
||||||
|
import ExtensionReadme from '../models/ExtensionReadme';
|
||||||
|
|
||||||
|
export default class ReadmeModal extends Modal {
|
||||||
|
oninit(vnode) {
|
||||||
|
super.oninit(vnode);
|
||||||
|
|
||||||
|
app.store.models['extension-readmes'] = ExtensionReadme;
|
||||||
|
|
||||||
|
this.name = this.attrs.extension.id;
|
||||||
|
this.extName = this.attrs.extension.extra['flarum-extension'].title;
|
||||||
|
|
||||||
|
this.loading = true;
|
||||||
|
|
||||||
|
this.loadReadme();
|
||||||
|
}
|
||||||
|
|
||||||
|
className() {
|
||||||
|
return 'ReadmeModal Modal--large';
|
||||||
|
}
|
||||||
|
|
||||||
|
title() {
|
||||||
|
return app.translator.trans('core.admin.extension.readme.title', {
|
||||||
|
extName: this.extName,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
content() {
|
||||||
|
const text = app.translator.trans('core.admin.extension.readme.no_readme');
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="container">
|
||||||
|
{this.loading ? (
|
||||||
|
<div className="ReadmeModal-loading">{LoadingIndicator.component()}</div>
|
||||||
|
) : (
|
||||||
|
<div>{this.readme.content() ? m.trust(this.readme.content()) : Placeholder.component({ text })}</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async loadReadme() {
|
||||||
|
this.readme = await app.store.find('extension-readmes', this.name);
|
||||||
|
this.loading = false;
|
||||||
|
m.redraw();
|
||||||
|
}
|
||||||
|
}
|
5
framework/core/js/src/admin/models/ExtensionReadme.js
Normal file
5
framework/core/js/src/admin/models/ExtensionReadme.js
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import Model from '../../common/Model';
|
||||||
|
|
||||||
|
export default class ExtensionReadme extends Model {
|
||||||
|
content = Model.attribute('content');
|
||||||
|
}
|
|
@ -11,4 +11,5 @@
|
||||||
@import "admin/AppearancePage";
|
@import "admin/AppearancePage";
|
||||||
@import "admin/MailPage";
|
@import "admin/MailPage";
|
||||||
@import "admin/NoJs";
|
@import "admin/NoJs";
|
||||||
@import "admin/UsersListPage.less";
|
@import "admin/ReadmeModal";
|
||||||
|
@import "admin/UsersListPage";
|
||||||
|
|
|
@ -149,3 +149,20 @@
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin-left: 8px;
|
margin-left: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.Readme-link {
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
color: @muted-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ReadmeModal {
|
||||||
|
.Modal-header {
|
||||||
|
background: @control-bg;
|
||||||
|
color: @muted-color
|
||||||
|
}
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
5
framework/core/less/admin/ReadmeModal.less
Normal file
5
framework/core/less/admin/ReadmeModal.less
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
.ReadmeModal {
|
||||||
|
.Placeholder {
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
}
|
|
@ -131,6 +131,10 @@ core:
|
||||||
open_modal: Open Settings
|
open_modal: Open Settings
|
||||||
permissions_title: Permissions
|
permissions_title: Permissions
|
||||||
purge_button: Purge
|
purge_button: Purge
|
||||||
|
readme:
|
||||||
|
button_label: README
|
||||||
|
no_readme: This extension does not appear to have a README file
|
||||||
|
title: "{extName} documentation"
|
||||||
|
|
||||||
# These translations are used in the secondary header.
|
# These translations are used in the secondary header.
|
||||||
header:
|
header:
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Flarum.
|
||||||
|
*
|
||||||
|
* For detailed copyright and license information, please view the
|
||||||
|
* LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Flarum\Api\Controller;
|
||||||
|
|
||||||
|
use Flarum\Api\Serializer\ExtensionReadmeSerializer;
|
||||||
|
use Flarum\Extension\ExtensionManager;
|
||||||
|
use Flarum\Http\RequestUtil;
|
||||||
|
use Illuminate\Support\Arr;
|
||||||
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
|
use Tobscure\JsonApi\Document;
|
||||||
|
|
||||||
|
class ShowExtensionReadmeController extends AbstractShowController
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var ExtensionManager
|
||||||
|
*/
|
||||||
|
protected $extensions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public $serializer = ExtensionReadmeSerializer::class;
|
||||||
|
|
||||||
|
public function __construct(ExtensionManager $extensions)
|
||||||
|
{
|
||||||
|
$this->extensions = $extensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function data(ServerRequestInterface $request, Document $document)
|
||||||
|
{
|
||||||
|
$extensionName = Arr::get($request->getQueryParams(), 'name');
|
||||||
|
|
||||||
|
RequestUtil::getActor($request)->assertAdmin();
|
||||||
|
|
||||||
|
return $this->extensions->getExtension($extensionName);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Flarum.
|
||||||
|
*
|
||||||
|
* For detailed copyright and license information, please view the
|
||||||
|
* LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Flarum\Api\Serializer;
|
||||||
|
|
||||||
|
class ExtensionReadmeSerializer extends AbstractSerializer
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function getDefaultAttributes($extension)
|
||||||
|
{
|
||||||
|
$attributes = [
|
||||||
|
'content' => $extension->getReadme()
|
||||||
|
];
|
||||||
|
|
||||||
|
return $attributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getId($extension)
|
||||||
|
{
|
||||||
|
return $extension->getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getType($extension)
|
||||||
|
{
|
||||||
|
return 'extension-readmes';
|
||||||
|
}
|
||||||
|
}
|
|
@ -265,6 +265,13 @@ return function (RouteCollection $map, RouteHandlerFactory $route) {
|
||||||
$route->toController(Controller\UninstallExtensionController::class)
|
$route->toController(Controller\UninstallExtensionController::class)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Get readme for an extension
|
||||||
|
$map->get(
|
||||||
|
'/extension-readmes/{name}',
|
||||||
|
'extension-readmes.show',
|
||||||
|
$route->toController(Controller\ShowExtensionReadmeController::class)
|
||||||
|
);
|
||||||
|
|
||||||
// Update settings
|
// Update settings
|
||||||
$map->post(
|
$map->post(
|
||||||
'/settings',
|
'/settings',
|
||||||
|
|
|
@ -19,6 +19,7 @@ use Illuminate\Filesystem\Filesystem;
|
||||||
use Illuminate\Support\Arr;
|
use Illuminate\Support\Arr;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
|
use s9e\TextFormatter\Bundles\Fatdown;
|
||||||
use Throwable;
|
use Throwable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -525,4 +526,28 @@ class Extension implements Arrayable
|
||||||
'links' => $this->getLinks(),
|
'links' => $this->getLinks(),
|
||||||
], $this->composerJson);
|
], $this->composerJson);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the rendered contents of the extension README file as a HTML string.
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getReadme(): ?string
|
||||||
|
{
|
||||||
|
$content = null;
|
||||||
|
|
||||||
|
if (file_exists($file = "$this->path/README.md")) {
|
||||||
|
$content = file_get_contents($file);
|
||||||
|
} elseif (file_exists($file = "$this->path/README")) {
|
||||||
|
$content = file_get_contents($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($content) {
|
||||||
|
$xml = Fatdown::parse($content);
|
||||||
|
|
||||||
|
return Fatdown::render($xml);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user