Commit 89ac92fb authored by Yassine Doghri's avatar Yassine Doghri
Browse files

feat(plugins): add settings page for podcast and episode if defined in the plugin's manifest

- rename options to settings
parent 3d8aedf9
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -109,7 +109,7 @@ class Autoload extends AutoloadConfig
     *
     * @var list<string>
     */
    public $helpers = ['auth', 'setting', 'icons'];
    public $helpers = ['auth', 'setting', 'icons', 'plugins'];

    public function __construct()
    {
+1 −0
Original line number Diff line number Diff line
@@ -20,4 +20,5 @@ return [
    'video-clips-create' => 'New video clip',
    'soundbites-list' => 'Soundbites',
    'soundbites-create' => 'New soundbite',
    'plugins' => 'Plugins',
];
+1 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ return [
    'episodes' => 'Episodes',
    'episode-list' => 'All episodes',
    'episode-create' => 'New episode',
    'plugins' => 'Plugins',
    'analytics' => 'Analytics',
    'podcast-analytics' => 'Audience overview',
    'podcast-analytics-webpages' => 'Web pages visits',
+15 −15
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ use RuntimeException;
 * @property string[] $keywords
 * @property string[] $hooks
 * @property string $iconSrc
 * @property array{settings:array{key:string,name:string,description:string}[],podcast:array{key:string,name:string,description:string}[],episode:array{key:string,name:string,description:string}[]} $options
 * @property array{general:array{key:string,name:string,description:string}[],podcast:array{key:string,name:string,description:string}[],episode:array{key:string,name:string,description:string}[]} $settings
 */
abstract class BasePlugin implements PluginInterface
{
@@ -147,24 +147,24 @@ abstract class BasePlugin implements PluginInterface

        $validation = service('validation');

        if (array_key_exists('options', $manifest)) {
            $optionRules = [
        if (array_key_exists('settings', $manifest)) {
            $fieldRules = [
                'key'         => 'required|alpha_numeric',
                'name'        => 'required|max_length[32]',
                'description' => 'permit_empty|max_length[128]',
            ];
            $defaultOption = [
            $defaultField = [
                'key'         => '',
                'name'        => '',
                'description' => '',
            ];
            $validation->setRules($optionRules);
            foreach ($manifest['options'] as $key => $options) {
                foreach ($options as $key2 => $option) {
                    $manifest['options'][$key][$key2] = array_merge($defaultOption, $option);
            $validation->setRules($fieldRules);
            foreach ($manifest['settings'] as $key => $settings) {
                foreach ($settings as $key2 => $fields) {
                    $manifest['settings'][$key][$key2] = array_merge($defaultField, $fields);

                    if (! $validation->run($manifest['options'][$key][$key2])) {
                        dd($this->key, $manifest['options'][$key][$key2], $validation->getErrors());
                    if (! $validation->run($manifest['settings'][$key][$key2])) {
                        dd($this->key, $manifest['settings'][$key][$key2], $validation->getErrors());
                    }
                }
            }
@@ -183,7 +183,7 @@ abstract class BasePlugin implements PluginInterface
            'website'      => 'valid_url_strict',
            'keywords.*'   => 'permit_empty|in_list[seo,podcasting20,analytics]',
            'hooks.*'      => 'permit_empty|in_list[' . implode(',', Plugins::HOOKS) . ']',
            'options'      => 'permit_empty',
            'settings'     => 'permit_empty',
        ];

        $validation->setRules($rules);
@@ -200,8 +200,8 @@ abstract class BasePlugin implements PluginInterface
            'website'     => '',
            'hooks'       => [],
            'keywords'    => [],
            'options'     => [
                'settings' => [],
            'settings'    => [
                'general' => [],
                'podcast' => [],
                'episode' => [],
            ],
+27 −7
Original line number Diff line number Diff line
@@ -13,26 +13,46 @@ $routes->group(
    ],
    static function ($routes): void {
        $routes->group('plugins', static function ($routes): void {
            $routes->get('/', 'PluginsController::installed', [
            $routes->get('/', 'PluginController::installed', [
                'as'     => 'plugins-installed',
                'filter' => 'permission:plugins.manage',
            ]);
            $routes->get('(:segment)', 'PluginsController::settings/$1', [
                'as'     => 'plugins-settings',
            $routes->get('(:segment)', 'PluginController::generalSettings/$1', [
                'as'     => 'plugins-general-settings',
                'filter' => 'permission:plugins.manage',
            ]);
            $routes->post('(:segment)', 'PluginsController::settingsAction/$1', [
                'as'     => 'plugins-settings-action',
            $routes->post('(:segment)', 'PluginController::generalSettingsAction/$1', [
                'as'     => 'plugins-general-settings-action',
                'filter' => 'permission:plugins.manage',
            ]);
            $routes->post('activate/(:segment)', 'PluginsController::activate/$1', [
            $routes->post('activate/(:segment)', 'PluginController::activate/$1', [
                'as'     => 'plugins-activate',
                'filter' => 'permission:plugins.manage',
            ]);
            $routes->post('deactivate/(:segment)', 'PluginsController::deactivate/$1', [
            $routes->post('deactivate/(:segment)', 'PluginController::deactivate/$1', [
                'as'     => 'plugins-deactivate',
                'filter' => 'permission:plugins.manage',
            ]);
        });
        $routes->group('podcasts/(:num)/plugins', static function ($routes): void {
            $routes->get('(:segment)', 'PluginController::podcastSettings/$1/$2', [
                'as'     => 'plugins-podcast-settings',
                'filter' => 'permission:podcast#.edit',
            ]);
            $routes->post('(:segment)', 'PluginController::podcastSettingsAction/$1/$2', [
                'as'     => 'plugins-podcast-settings-action',
                'filter' => 'permission:podcast#.edit',
            ]);
        });
        $routes->group('podcasts/(:num)/episodes/(:num)/plugins', static function ($routes): void {
            $routes->get('(:segment)', 'PluginController::episodeSettings/$1/$2/$3', [
                'as'     => 'plugins-episode-settings',
                'filter' => 'permission:podcast#.edit',
            ]);
            $routes->post('(:segment)', 'PluginController::episodeSettingsAction/$1/$2/$3', [
                'as'     => 'plugins-episode-settings-action',
                'filter' => 'permission:podcast#.edit',
            ]);
        });
    }
);
Loading